|
5 | 5 | import logging |
6 | 6 | from collections.abc import Callable |
7 | 7 | from dataclasses import dataclass |
8 | | -from datetime import datetime, timedelta, date |
| 8 | +from datetime import date, datetime, timedelta |
9 | 9 |
|
10 | 10 | from homeassistant.components.sensor import ( |
11 | 11 | SensorDeviceClass, |
|
14 | 14 | SensorStateClass, |
15 | 15 | ) |
16 | 16 | from homeassistant.config_entries import ConfigEntry |
17 | | -from homeassistant.const import UnitOfEnergy, UnitOfTime |
| 17 | +from homeassistant.const import EntityCategory, UnitOfEnergy, UnitOfTime |
18 | 18 | from homeassistant.core import HomeAssistant |
19 | 19 | from homeassistant.helpers.entity_platform import AddEntitiesCallback |
20 | 20 | from homeassistant.helpers.typing import StateType |
21 | 21 | from iec_api.models.invoice import Invoice |
22 | 22 | from iec_api.models.remote_reading import RemoteReading |
23 | 23 |
|
24 | | -from .commons import find_reading_by_date, IecEntityType, TIMEZONE |
| 24 | +from .commons import TIMEZONE, IecEntityType, find_reading_by_date |
25 | 25 | from .const import ( |
26 | | - DOMAIN, |
27 | | - ILS, |
28 | | - STATICS_DICT_NAME, |
29 | | - STATIC_KWH_TARIFF, |
30 | | - FUTURE_CONSUMPTIONS_DICT_NAME, |
31 | | - INVOICE_DICT_NAME, |
32 | | - ILS_PER_KWH, |
33 | | - DAILY_READINGS_DICT_NAME, |
34 | | - EMPTY_REMOTE_READING, |
| 26 | + ACCESS_TOKEN_EXPIRATION_TIME, |
| 27 | + ACCESS_TOKEN_ISSUED_AT, |
| 28 | + ATTRIBUTES_DICT_NAME, |
35 | 29 | CONTRACT_DICT_NAME, |
| 30 | + DAILY_READINGS_DICT_NAME, |
| 31 | + DOMAIN, |
36 | 32 | EMPTY_INVOICE, |
37 | | - ATTRIBUTES_DICT_NAME, |
38 | | - METER_ID_ATTR_NAME, |
39 | | - ESTIMATED_BILL_DICT_NAME, |
40 | | - TOTAL_EST_BILL_ATTR_NAME, |
41 | | - EST_BILL_DAYS_ATTR_NAME, |
| 33 | + EMPTY_REMOTE_READING, |
42 | 34 | EST_BILL_CONSUMPTION_PRICE_ATTR_NAME, |
| 35 | + EST_BILL_DAYS_ATTR_NAME, |
43 | 36 | EST_BILL_DELIVERY_PRICE_ATTR_NAME, |
44 | 37 | EST_BILL_DISTRIBUTION_PRICE_ATTR_NAME, |
45 | | - EST_BILL_TOTAL_KVA_PRICE_ATTR_NAME, |
46 | 38 | EST_BILL_KWH_CONSUMPTION_ATTR_NAME, |
| 39 | + EST_BILL_TOTAL_KVA_PRICE_ATTR_NAME, |
| 40 | + ESTIMATED_BILL_DICT_NAME, |
| 41 | + FUTURE_CONSUMPTIONS_DICT_NAME, |
| 42 | + ILS, |
| 43 | + ILS_PER_KWH, |
| 44 | + INVOICE_DICT_NAME, |
| 45 | + JWT_DICT_NAME, |
| 46 | + METER_ID_ATTR_NAME, |
| 47 | + STATIC_KWH_TARIFF, |
| 48 | + STATICS_DICT_NAME, |
| 49 | + TOTAL_EST_BILL_ATTR_NAME, |
47 | 50 | ) |
48 | 51 | from .coordinator import IecApiCoordinator |
49 | 52 | from .iec_entity import IecEntity |
@@ -120,6 +123,24 @@ def _get_reading_by_date( |
120 | 123 | return EMPTY_REMOTE_READING |
121 | 124 |
|
122 | 125 |
|
| 126 | +DIAGNOSTICS_SENSORS: tuple[IecEntityDescription, ...] = ( |
| 127 | + IecEntityDescription( |
| 128 | + key="access_token_expiry_time", |
| 129 | + device_class=SensorDeviceClass.TIMESTAMP, |
| 130 | + entity_category=EntityCategory.DIAGNOSTIC, |
| 131 | + value_fn=lambda data: datetime.fromtimestamp( |
| 132 | + data[ACCESS_TOKEN_EXPIRATION_TIME], tz=TIMEZONE |
| 133 | + ), |
| 134 | + ), |
| 135 | + IecEntityDescription( |
| 136 | + key="access_token_issued_at", |
| 137 | + device_class=SensorDeviceClass.TIMESTAMP, |
| 138 | + entity_category=EntityCategory.DIAGNOSTIC, |
| 139 | + value_fn=lambda data: datetime.fromtimestamp( |
| 140 | + data[ACCESS_TOKEN_ISSUED_AT], tz=TIMEZONE |
| 141 | + ), |
| 142 | + ), |
| 143 | +) |
123 | 144 | SMART_ELEC_SENSORS: tuple[IecEntityDescription, ...] = ( |
124 | 145 | IecMeterEntityDescription( |
125 | 146 | key="elec_forecasted_usage", |
@@ -350,6 +371,16 @@ async def async_setup_entry( |
350 | 371 | is_multi_contract=False, |
351 | 372 | ) |
352 | 373 | ) |
| 374 | + elif contract_key == JWT_DICT_NAME: |
| 375 | + for sensor_desc in DIAGNOSTICS_SENSORS: |
| 376 | + entities.append( |
| 377 | + IecSensor( |
| 378 | + coordinator, |
| 379 | + sensor_desc, |
| 380 | + JWT_DICT_NAME, |
| 381 | + is_multi_contract=False, |
| 382 | + ) |
| 383 | + ) |
353 | 384 | else: |
354 | 385 | if coordinator.data[contract_key][CONTRACT_DICT_NAME].smart_meter: |
355 | 386 | sensors_desc: tuple[IecEntityDescription, ...] = ( |
@@ -425,7 +456,7 @@ def __init__( |
425 | 456 | def native_value(self) -> StateType: |
426 | 457 | """Return the state.""" |
427 | 458 | if self.coordinator.data is not None: |
428 | | - if self.contract_id == STATICS_DICT_NAME: |
| 459 | + if self.contract_id in (STATICS_DICT_NAME, JWT_DICT_NAME): |
429 | 460 | return self.entity_description.value_fn( |
430 | 461 | self.coordinator.data.get(self.contract_id, self.meter_id) |
431 | 462 | ) |
|
0 commit comments