mirror of
https://github.com/home-assistant/core.git
synced 2026-05-03 19:41:15 +02:00
Firefly refactor entities (#153292)
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
})
|
||||
# ---
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user