From 148a13361f3dfb229c7ed36cb5962f89b7265680 Mon Sep 17 00:00:00 2001 From: Erwin Douna Date: Wed, 15 Oct 2025 20:33:38 +0200 Subject: [PATCH] Firefly refactor entities (#153292) --- .../components/firefly_iii/entity.py | 63 ++- .../components/firefly_iii/icons.json | 14 +- .../components/firefly_iii/sensor.py | 183 ++++--- .../components/firefly_iii/strings.json | 29 ++ tests/components/firefly_iii/conftest.py | 1 + .../firefly_iii/snapshots/test_sensor.ambr | 450 ++++++++++++++---- tests/components/firefly_iii/test_sensor.py | 3 +- 7 files changed, 574 insertions(+), 169 deletions(-) diff --git a/homeassistant/components/firefly_iii/entity.py b/homeassistant/components/firefly_iii/entity.py index 0281065a6e70..28003b661ae1 100644 --- a/homeassistant/components/firefly_iii/entity.py +++ b/homeassistant/components/firefly_iii/entity.py @@ -2,14 +2,14 @@ from __future__ import annotations +from pyfirefly.models import Account, Category from yarl import URL from homeassistant.const import CONF_URL from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo -from homeassistant.helpers.entity import EntityDescription from homeassistant.helpers.update_coordinator import CoordinatorEntity -from .const import DOMAIN, MANUFACTURER +from .const import DOMAIN, MANUFACTURER, NAME from .coordinator import FireflyDataUpdateCoordinator @@ -21,20 +21,65 @@ class FireflyBaseEntity(CoordinatorEntity[FireflyDataUpdateCoordinator]): def __init__( self, coordinator: FireflyDataUpdateCoordinator, - entity_description: EntityDescription, ) -> None: """Initialize a Firefly entity.""" super().__init__(coordinator) - - self.entity_description = entity_description self._attr_device_info = DeviceInfo( entry_type=DeviceEntryType.SERVICE, manufacturer=MANUFACTURER, + name=NAME, configuration_url=URL(coordinator.config_entry.data[CONF_URL]), + identifiers={(DOMAIN, f"{coordinator.config_entry.entry_id}_service")}, + ) + + +class FireflyAccountBaseEntity(FireflyBaseEntity): + """Base class for Firefly III account entity.""" + + def __init__( + self, + coordinator: FireflyDataUpdateCoordinator, + account: Account, + key: str, + ) -> None: + """Initialize a Firefly account entity.""" + super().__init__(coordinator) + self._account = account + self._attr_device_info = DeviceInfo( + entry_type=DeviceEntryType.SERVICE, + manufacturer=MANUFACTURER, + name=account.attributes.name, + configuration_url=f"{URL(coordinator.config_entry.data[CONF_URL])}/accounts/show/{account.id}", identifiers={ - ( - DOMAIN, - f"{coordinator.config_entry.entry_id}_{self.entity_description.key}", - ) + (DOMAIN, f"{coordinator.config_entry.entry_id}_account_{account.id}") }, ) + self._attr_unique_id = ( + f"{coordinator.config_entry.unique_id}_account_{account.id}_{key}" + ) + + +class FireflyCategoryBaseEntity(FireflyBaseEntity): + """Base class for Firefly III category entity.""" + + def __init__( + self, + coordinator: FireflyDataUpdateCoordinator, + category: Category, + key: str, + ) -> None: + """Initialize a Firefly category entity.""" + super().__init__(coordinator) + self._category = category + self._attr_device_info = DeviceInfo( + entry_type=DeviceEntryType.SERVICE, + manufacturer=MANUFACTURER, + name=category.attributes.name, + configuration_url=f"{URL(coordinator.config_entry.data[CONF_URL])}/categories/show/{category.id}", + identifiers={ + (DOMAIN, f"{coordinator.config_entry.entry_id}_category_{category.id}") + }, + ) + self._attr_unique_id = ( + f"{coordinator.config_entry.unique_id}_category_{category.id}_{key}" + ) diff --git a/homeassistant/components/firefly_iii/icons.json b/homeassistant/components/firefly_iii/icons.json index 9a8498041924..3007b6b8df67 100644 --- a/homeassistant/components/firefly_iii/icons.json +++ b/homeassistant/components/firefly_iii/icons.json @@ -2,13 +2,13 @@ "entity": { "sensor": { "account_type": { - "default": "mdi:bank", - "state": { - "expense": "mdi:cash-minus", - "revenue": "mdi:cash-plus", - "asset": "mdi:account-cash", - "liability": "mdi:hand-coin" - } + "default": "mdi:bank" + }, + "account_balance": { + "default": "mdi:currency-usd" + }, + "account_role": { + "default": "mdi:account-circle" }, "category": { "default": "mdi:label" diff --git a/homeassistant/components/firefly_iii/sensor.py b/homeassistant/components/firefly_iii/sensor.py index e6facfb6b948..7e6a8ec863c2 100644 --- a/homeassistant/components/firefly_iii/sensor.py +++ b/homeassistant/components/firefly_iii/sensor.py @@ -4,35 +4,33 @@ from __future__ import annotations from pyfirefly.models import Account, Category -from homeassistant.components.sensor import ( - SensorEntity, - SensorEntityDescription, - SensorStateClass, -) +from homeassistant.components.sensor import SensorEntity, SensorStateClass, StateType from homeassistant.components.sensor.const import SensorDeviceClass +from homeassistant.const import EntityCategory from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .coordinator import FireflyConfigEntry, FireflyDataUpdateCoordinator -from .entity import FireflyBaseEntity +from .entity import FireflyAccountBaseEntity, FireflyCategoryBaseEntity -ACCOUNT_SENSORS: tuple[SensorEntityDescription, ...] = ( - SensorEntityDescription( - key="account_type", - translation_key="account", - device_class=SensorDeviceClass.MONETARY, - state_class=SensorStateClass.TOTAL, - ), -) +ACCOUNT_ROLE_MAPPING = { + "defaultAsset": "default_asset", + "sharedAsset": "shared_asset", + "savingAsset": "saving_asset", + "ccAsset": "cc_asset", + "cashWalletAsset": "cash_wallet_asset", +} +ACCOUNT_TYPE_ICONS = { + "expense": "mdi:cash-minus", + "asset": "mdi:account-cash", + "revenue": "mdi:cash-plus", + "liability": "mdi:hand-coin", +} -CATEGORY_SENSORS: tuple[SensorEntityDescription, ...] = ( - SensorEntityDescription( - key="category", - translation_key="category", - device_class=SensorDeviceClass.MONETARY, - state_class=SensorStateClass.TOTAL, - ), -) +ACCOUNT_BALANCE = "account_balance" +ACCOUNT_ROLE = "account_role" +ACCOUNT_TYPE = "account_type" +CATEGORY = "category" async def async_setup_entry( @@ -40,94 +38,137 @@ async def async_setup_entry( entry: FireflyConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: - """Set up the Firefly III sensor platform.""" + """Set up Firefly III sensors.""" coordinator = entry.runtime_data - entities: list[SensorEntity] = [ - FireflyAccountEntity( - coordinator=coordinator, - entity_description=description, - account=account, + entities: list[SensorEntity] = [] + + for account in coordinator.data.accounts: + entities.append( + FireflyAccountBalanceSensor(coordinator, account, ACCOUNT_BALANCE) ) - for account in coordinator.data.accounts - for description in ACCOUNT_SENSORS - ] + entities.append(FireflyAccountRoleSensor(coordinator, account, ACCOUNT_ROLE)) + entities.append(FireflyAccountTypeSensor(coordinator, account, ACCOUNT_TYPE)) entities.extend( - FireflyCategoryEntity( - coordinator=coordinator, - entity_description=description, - category=category, - ) - for category in coordinator.data.category_details - for description in CATEGORY_SENSORS + [ + FireflyCategorySensor(coordinator, category, CATEGORY) + for category in coordinator.data.category_details + ] ) async_add_entities(entities) -class FireflyAccountEntity(FireflyBaseEntity, SensorEntity): - """Entity for Firefly III account.""" +class FireflyAccountBalanceSensor(FireflyAccountBaseEntity, SensorEntity): + """Account balance sensor.""" + + _attr_translation_key = "account_balance" + _attr_device_class = SensorDeviceClass.MONETARY + _attr_state_class = SensorStateClass.TOTAL def __init__( self, coordinator: FireflyDataUpdateCoordinator, - entity_description: SensorEntityDescription, account: Account, + key: str, ) -> None: - """Initialize Firefly account entity.""" - super().__init__(coordinator, entity_description) + """Initialize the account balance sensor.""" + super().__init__(coordinator, account, key) self._account = account - self._attr_unique_id = f"{coordinator.config_entry.unique_id}_{entity_description.key}_{account.id}" - self._attr_name = account.attributes.name self._attr_native_unit_of_measurement = ( coordinator.data.primary_currency.attributes.code ) - # Account type state doesn't go well with the icons.json. Need to fix it. - if account.attributes.type == "expense": - self._attr_icon = "mdi:cash-minus" - elif account.attributes.type == "asset": - self._attr_icon = "mdi:account-cash" - elif account.attributes.type == "revenue": - self._attr_icon = "mdi:cash-plus" - elif account.attributes.type == "liability": - self._attr_icon = "mdi:hand-coin" - else: - self._attr_icon = "mdi:bank" - @property - def native_value(self) -> str | None: - """Return the state of the sensor.""" + def native_value(self) -> StateType: + """Return current account balance.""" return self._account.attributes.current_balance -class FireflyCategoryEntity(FireflyBaseEntity, SensorEntity): - """Entity for Firefly III category.""" +class FireflyAccountRoleSensor(FireflyAccountBaseEntity, SensorEntity): + """Account role diagnostic sensor.""" + + _attr_translation_key = "account_role" + _attr_entity_category = EntityCategory.DIAGNOSTIC + _attr_entity_registry_enabled_default = True def __init__( self, coordinator: FireflyDataUpdateCoordinator, - entity_description: SensorEntityDescription, - category: Category, + account: Account, + key: str, ) -> None: - """Initialize Firefly category entity.""" - super().__init__(coordinator, entity_description) + """Initialize the account role sensor.""" + super().__init__(coordinator, account, key) + self._account = account + + @property + def native_value(self) -> StateType: + """Return account role.""" + + # An account can be empty and then should resort to Unknown + account_role: str | None = self._account.attributes.account_role + if account_role is None: + return None + + return ACCOUNT_ROLE_MAPPING.get(account_role, account_role) + + +class FireflyAccountTypeSensor(FireflyAccountBaseEntity, SensorEntity): + """Account type diagnostic sensor.""" + + _attr_translation_key = "account_type" + _attr_entity_category = EntityCategory.DIAGNOSTIC + _attr_entity_registry_enabled_default = True + + def __init__( + self, + coordinator: FireflyDataUpdateCoordinator, + account: Account, + key: str, + ) -> None: + """Initialize the account type sensor.""" + super().__init__(coordinator, account, key) + acc_type = account.attributes.type + self._attr_icon = ( + ACCOUNT_TYPE_ICONS.get(acc_type, "mdi:bank") + if acc_type is not None + else "mdi:bank" + ) + + @property + def native_value(self) -> StateType: + """Return account type.""" + return self._account.attributes.type + + +class FireflyCategorySensor(FireflyCategoryBaseEntity, SensorEntity): + """Category sensor.""" + + _attr_translation_key = "category" + _attr_device_class = SensorDeviceClass.MONETARY + _attr_state_class = SensorStateClass.TOTAL + + def __init__( + self, + coordinator: FireflyDataUpdateCoordinator, + category: Category, + key: str, + ) -> None: + """Initialize the category sensor.""" + super().__init__(coordinator, category, key) self._category = category - self._attr_unique_id = f"{coordinator.config_entry.unique_id}_{entity_description.key}_{category.id}" - self._attr_name = category.attributes.name self._attr_native_unit_of_measurement = ( coordinator.data.primary_currency.attributes.code ) @property - def native_value(self) -> float | None: - """Return the state of the sensor.""" + def native_value(self) -> StateType: + """Return net spent+earned value for this category in the period.""" spent_items = self._category.attributes.spent or [] earned_items = self._category.attributes.earned or [] - spent = sum(float(item.sum) for item in spent_items if item.sum is not None) earned = sum(float(item.sum) for item in earned_items if item.sum is not None) - if spent == 0 and earned == 0: return None return spent + earned diff --git a/homeassistant/components/firefly_iii/strings.json b/homeassistant/components/firefly_iii/strings.json index 4d5831d8d716..7ab733c6b0e7 100644 --- a/homeassistant/components/firefly_iii/strings.json +++ b/homeassistant/components/firefly_iii/strings.json @@ -45,5 +45,34 @@ "timeout_connect": { "message": "A timeout occurred while trying to connect to the Firefly instance: {error}" } + }, + "entity": { + "sensor": { + "account_balance": { + "name": "Account Balance" + }, + "account_role": { + "name": "Account Role", + "state": { + "default_asset": "Default asset", + "shared_asset": "Shared asset", + "saving_asset": "Saving asset", + "cc_asset": "Credit card asset", + "cash_wallet_asset": "Cash wallet asset" + } + }, + "account_type": { + "name": "Account Type", + "state": { + "asset": "Asset", + "expense": "Expense", + "revenue": "Revenue", + "liability": "Liability" + } + }, + "category": { + "name": "Earned/Spent" + } + } } } diff --git a/tests/components/firefly_iii/conftest.py b/tests/components/firefly_iii/conftest.py index 18250624ca73..7c9aa4c2bbdd 100644 --- a/tests/components/firefly_iii/conftest.py +++ b/tests/components/firefly_iii/conftest.py @@ -92,4 +92,5 @@ def mock_config_entry() -> MockConfigEntry: title="Firefly III test", data=MOCK_TEST_CONFIG, entry_id="firefly_iii_test_entry_123", + unique_id="firefly_iii_test_unique_id_123", ) diff --git a/tests/components/firefly_iii/snapshots/test_sensor.ambr b/tests/components/firefly_iii/snapshots/test_sensor.ambr index bccd54746ec6..143905fcfdb9 100644 --- a/tests/components/firefly_iii/snapshots/test_sensor.ambr +++ b/tests/components/firefly_iii/snapshots/test_sensor.ambr @@ -1,5 +1,5 @@ # serializer version: 1 -# name: test_all_entities[sensor.firefly_iii_test_credit_card-entry] +# name: test_all_entities[sensor.credit_card_account_balance-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ }), @@ -14,61 +14,7 @@ 'disabled_by': None, 'domain': 'sensor', 'entity_category': None, - 'entity_id': 'sensor.firefly_iii_test_credit_card', - 'has_entity_name': True, - 'hidden_by': None, - 'icon': None, - 'id': , - 'labels': set({ - }), - 'name': None, - 'options': dict({ - }), - 'original_device_class': , - 'original_icon': 'mdi:hand-coin', - 'original_name': 'Credit Card', - 'platform': 'firefly_iii', - 'previous_unique_id': None, - 'suggested_object_id': None, - 'supported_features': 0, - 'translation_key': 'account', - 'unique_id': 'None_account_type_4', - 'unit_of_measurement': 'AMS', - }) -# --- -# name: test_all_entities[sensor.firefly_iii_test_credit_card-state] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'monetary', - 'friendly_name': 'Firefly III test Credit Card', - 'icon': 'mdi:hand-coin', - 'state_class': , - 'unit_of_measurement': 'AMS', - }), - 'context': , - 'entity_id': 'sensor.firefly_iii_test_credit_card', - 'last_changed': , - 'last_reported': , - 'last_updated': , - 'state': '-250.00', - }) -# --- -# name: test_all_entities[sensor.firefly_iii_test_lunch-entry] - EntityRegistryEntrySnapshot({ - 'aliases': set({ - }), - 'area_id': None, - 'capabilities': dict({ - 'state_class': , - }), - 'config_entry_id': , - 'config_subentry_id': , - 'device_class': None, - 'device_id': , - 'disabled_by': None, - 'domain': 'sensor', - 'entity_category': None, - 'entity_id': 'sensor.firefly_iii_test_lunch', + 'entity_id': 'sensor.credit_card_account_balance', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -80,33 +26,183 @@ }), 'original_device_class': , 'original_icon': None, - 'original_name': 'Lunch', + 'original_name': 'Account Balance', + 'platform': 'firefly_iii', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'account_balance', + 'unique_id': 'firefly_iii_test_unique_id_123_account_4_account_balance', + 'unit_of_measurement': 'AMS', + }) +# --- +# name: test_all_entities[sensor.credit_card_account_balance-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'monetary', + 'friendly_name': 'Credit Card Account Balance', + 'state_class': , + 'unit_of_measurement': 'AMS', + }), + 'context': , + 'entity_id': 'sensor.credit_card_account_balance', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '-250.00', + }) +# --- +# name: test_all_entities[sensor.credit_card_account_role-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.credit_card_account_role', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Account Role', + 'platform': 'firefly_iii', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'account_role', + 'unique_id': 'firefly_iii_test_unique_id_123_account_4_account_role', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.credit_card_account_role-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Credit Card Account Role', + }), + 'context': , + 'entity_id': 'sensor.credit_card_account_role', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'creditCard', + }) +# --- +# name: test_all_entities[sensor.credit_card_account_type-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.credit_card_account_type', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': 'mdi:hand-coin', + 'original_name': 'Account Type', + 'platform': 'firefly_iii', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'account_type', + 'unique_id': 'firefly_iii_test_unique_id_123_account_4_account_type', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.credit_card_account_type-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Credit Card Account Type', + 'icon': 'mdi:hand-coin', + }), + 'context': , + 'entity_id': 'sensor.credit_card_account_type', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'liability', + }) +# --- +# name: test_all_entities[sensor.lunch_earned_spent-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'state_class': , + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.lunch_earned_spent', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Earned/Spent', 'platform': 'firefly_iii', 'previous_unique_id': None, 'suggested_object_id': None, 'supported_features': 0, 'translation_key': 'category', - 'unique_id': 'None_category_2', + 'unique_id': 'firefly_iii_test_unique_id_123_category_2_category', 'unit_of_measurement': 'AMS', }) # --- -# name: test_all_entities[sensor.firefly_iii_test_lunch-state] +# name: test_all_entities[sensor.lunch_earned_spent-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'monetary', - 'friendly_name': 'Firefly III test Lunch', + 'friendly_name': 'Lunch Earned/Spent', 'state_class': , 'unit_of_measurement': 'AMS', }), 'context': , - 'entity_id': 'sensor.firefly_iii_test_lunch', + 'entity_id': 'sensor.lunch_earned_spent', 'last_changed': , 'last_reported': , 'last_updated': , 'state': '-12300.0', }) # --- -# name: test_all_entities[sensor.firefly_iii_test_my_checking_account-entry] +# name: test_all_entities[sensor.my_checking_account_account_balance-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ }), @@ -121,7 +217,7 @@ 'disabled_by': None, 'domain': 'sensor', 'entity_category': None, - 'entity_id': 'sensor.firefly_iii_test_my_checking_account', + 'entity_id': 'sensor.my_checking_account_account_balance', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -132,35 +228,131 @@ 'options': dict({ }), 'original_device_class': , - 'original_icon': 'mdi:account-cash', - 'original_name': 'My checking account', + 'original_icon': None, + 'original_name': 'Account Balance', 'platform': 'firefly_iii', 'previous_unique_id': None, 'suggested_object_id': None, 'supported_features': 0, - 'translation_key': 'account', - 'unique_id': 'None_account_type_2', + 'translation_key': 'account_balance', + 'unique_id': 'firefly_iii_test_unique_id_123_account_2_account_balance', 'unit_of_measurement': 'AMS', }) # --- -# name: test_all_entities[sensor.firefly_iii_test_my_checking_account-state] +# name: test_all_entities[sensor.my_checking_account_account_balance-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'monetary', - 'friendly_name': 'Firefly III test My checking account', - 'icon': 'mdi:account-cash', + 'friendly_name': 'My checking account Account Balance', 'state_class': , 'unit_of_measurement': 'AMS', }), 'context': , - 'entity_id': 'sensor.firefly_iii_test_my_checking_account', + 'entity_id': 'sensor.my_checking_account_account_balance', 'last_changed': , 'last_reported': , 'last_updated': , 'state': '123.45', }) # --- -# name: test_all_entities[sensor.firefly_iii_test_savings_account-entry] +# name: test_all_entities[sensor.my_checking_account_account_role-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.my_checking_account_account_role', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Account Role', + 'platform': 'firefly_iii', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'account_role', + 'unique_id': 'firefly_iii_test_unique_id_123_account_2_account_role', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.my_checking_account_account_role-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'My checking account Account Role', + }), + 'context': , + 'entity_id': 'sensor.my_checking_account_account_role', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'default_asset', + }) +# --- +# name: test_all_entities[sensor.my_checking_account_account_type-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.my_checking_account_account_type', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': 'mdi:account-cash', + 'original_name': 'Account Type', + 'platform': 'firefly_iii', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'account_type', + 'unique_id': 'firefly_iii_test_unique_id_123_account_2_account_type', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.my_checking_account_account_type-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'My checking account Account Type', + 'icon': 'mdi:account-cash', + }), + 'context': , + 'entity_id': 'sensor.my_checking_account_account_type', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'asset', + }) +# --- +# name: test_all_entities[sensor.savings_account_account_balance-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ }), @@ -175,7 +367,7 @@ 'disabled_by': None, 'domain': 'sensor', 'entity_category': None, - 'entity_id': 'sensor.firefly_iii_test_savings_account', + 'entity_id': 'sensor.savings_account_account_balance', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -186,31 +378,127 @@ 'options': dict({ }), 'original_device_class': , - 'original_icon': 'mdi:cash-minus', - 'original_name': 'Savings Account', + 'original_icon': None, + 'original_name': 'Account Balance', 'platform': 'firefly_iii', 'previous_unique_id': None, 'suggested_object_id': None, 'supported_features': 0, - 'translation_key': 'account', - 'unique_id': 'None_account_type_3', + 'translation_key': 'account_balance', + 'unique_id': 'firefly_iii_test_unique_id_123_account_3_account_balance', 'unit_of_measurement': 'AMS', }) # --- -# name: test_all_entities[sensor.firefly_iii_test_savings_account-state] +# name: test_all_entities[sensor.savings_account_account_balance-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'monetary', - 'friendly_name': 'Firefly III test Savings Account', - 'icon': 'mdi:cash-minus', + 'friendly_name': 'Savings Account Account Balance', 'state_class': , 'unit_of_measurement': 'AMS', }), 'context': , - 'entity_id': 'sensor.firefly_iii_test_savings_account', + 'entity_id': 'sensor.savings_account_account_balance', 'last_changed': , 'last_reported': , 'last_updated': , 'state': '5000.00', }) # --- +# name: test_all_entities[sensor.savings_account_account_role-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.savings_account_account_role', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Account Role', + 'platform': 'firefly_iii', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'account_role', + 'unique_id': 'firefly_iii_test_unique_id_123_account_3_account_role', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.savings_account_account_role-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Savings Account Account Role', + }), + 'context': , + 'entity_id': 'sensor.savings_account_account_role', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'savingsAsset', + }) +# --- +# name: test_all_entities[sensor.savings_account_account_type-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': , + 'entity_id': 'sensor.savings_account_account_type', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': 'mdi:cash-minus', + 'original_name': 'Account Type', + 'platform': 'firefly_iii', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'account_type', + 'unique_id': 'firefly_iii_test_unique_id_123_account_3_account_type', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.savings_account_account_type-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Savings Account Account Type', + 'icon': 'mdi:cash-minus', + }), + 'context': , + 'entity_id': 'sensor.savings_account_account_type', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'expense', + }) +# --- diff --git a/tests/components/firefly_iii/test_sensor.py b/tests/components/firefly_iii/test_sensor.py index aa674c279103..bcc4907051a8 100644 --- a/tests/components/firefly_iii/test_sensor.py +++ b/tests/components/firefly_iii/test_sensor.py @@ -66,5 +66,6 @@ async def test_refresh_exceptions( async_fire_time_changed(hass, dt_util.utcnow()) await hass.async_block_till_done() - state = hass.states.get("sensor.firefly_iii_test_credit_card") + state = hass.states.get("sensor.credit_card_account_balance") + assert state is not None assert state.state == STATE_UNAVAILABLE