Firefly refactor entities (#153292)

This commit is contained in:
Erwin Douna
2025-10-15 20:33:38 +02:00
committed by GitHub
parent 57dccd1474
commit 148a13361f
7 changed files with 574 additions and 169 deletions
+54 -9
View File
@@ -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}"
)
@@ -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"
+112 -71
View File
@@ -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
@@ -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"
}
}
}
}
+1
View File
@@ -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",
)
@@ -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': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.MONETARY: 'monetary'>,
'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': <SensorStateClass.TOTAL: 'total'>,
'unit_of_measurement': 'AMS',
}),
'context': <ANY>,
'entity_id': 'sensor.firefly_iii_test_credit_card',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '-250.00',
})
# ---
# name: test_all_entities[sensor.firefly_iii_test_lunch-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.TOTAL: 'total'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'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': <SensorDeviceClass.MONETARY: 'monetary'>,
'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': <SensorStateClass.TOTAL: 'total'>,
'unit_of_measurement': 'AMS',
}),
'context': <ANY>,
'entity_id': 'sensor.credit_card_account_balance',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '-250.00',
})
# ---
# name: test_all_entities[sensor.credit_card_account_role-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.credit_card_account_role',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'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': <ANY>,
'entity_id': 'sensor.credit_card_account_role',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'creditCard',
})
# ---
# name: test_all_entities[sensor.credit_card_account_type-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.credit_card_account_type',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'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': <ANY>,
'entity_id': 'sensor.credit_card_account_type',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'liability',
})
# ---
# name: test_all_entities[sensor.lunch_earned_spent-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.TOTAL: 'total'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': None,
'entity_id': 'sensor.lunch_earned_spent',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.MONETARY: 'monetary'>,
'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': <SensorStateClass.TOTAL: 'total'>,
'unit_of_measurement': 'AMS',
}),
'context': <ANY>,
'entity_id': 'sensor.firefly_iii_test_lunch',
'entity_id': 'sensor.lunch_earned_spent',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'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': <SensorDeviceClass.MONETARY: 'monetary'>,
'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': <SensorStateClass.TOTAL: 'total'>,
'unit_of_measurement': 'AMS',
}),
'context': <ANY>,
'entity_id': 'sensor.firefly_iii_test_my_checking_account',
'entity_id': 'sensor.my_checking_account_account_balance',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'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': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.my_checking_account_account_role',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'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': <ANY>,
'entity_id': 'sensor.my_checking_account_account_role',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'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': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.my_checking_account_account_type',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'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': <ANY>,
'entity_id': 'sensor.my_checking_account_account_type',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'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': <SensorDeviceClass.MONETARY: 'monetary'>,
'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': <SensorStateClass.TOTAL: 'total'>,
'unit_of_measurement': 'AMS',
}),
'context': <ANY>,
'entity_id': 'sensor.firefly_iii_test_savings_account',
'entity_id': 'sensor.savings_account_account_balance',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '5000.00',
})
# ---
# name: test_all_entities[sensor.savings_account_account_role-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.savings_account_account_role',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'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': <ANY>,
'entity_id': 'sensor.savings_account_account_role',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'savingsAsset',
})
# ---
# name: test_all_entities[sensor.savings_account_account_type-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.savings_account_account_type',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'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': <ANY>,
'entity_id': 'sensor.savings_account_account_type',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': 'expense',
})
# ---
+2 -1
View File
@@ -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