Skip to content

Commit a7ab525

Browse files
authored
Private Producer Connection Size + Estimated Consumption (#146)
* Private Producer Connection Size * Set beta tag
1 parent dbfd5ef commit a7ab525

File tree

3 files changed

+81
-24
lines changed

3 files changed

+81
-24
lines changed

custom_components/iec/coordinator.py

Lines changed: 78 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from datetime import datetime, timedelta
77
from typing import cast, Any # noqa: UP035
88
from collections import Counter
9+
from uuid import UUID
910

1011
import pytz
1112
from homeassistant.components.recorder import get_instance
@@ -26,6 +27,7 @@
2627
from iec_api.models.device import Device, Devices
2728
from iec_api.models.exceptions import IECError
2829
from iec_api.models.jwt import JWT
30+
from iec_api.models.meter_reading import MeterReading
2931
from iec_api.models.remote_reading import ReadingResolution, RemoteReading, FutureConsumptionInfo, RemoteReadingResponse
3032

3133
from .commons import find_reading_by_date
@@ -64,13 +66,16 @@ def __init__(
6466
self._entry_data = config_entry.data
6567
self._today_readings = {}
6668
self._devices_by_contract_id = {}
69+
self._last_meter_reading = {}
6770
self._devices_by_meter_id = {}
6871
self._delivery_tariff_by_pahse = {}
6972
self._distribution_tariff_by_pahse = {}
7073
self._power_size_by_connection_size = {}
7174
self._kwh_tariff: float | None = None
7275
self._kva_tariff: float | None = None
7376
self._readings = {}
77+
self._account_id: str | None = None
78+
self._connection_size: str | None = None
7479
self.api = IecClient(
7580
self._entry_data[CONF_USER_ID],
7681
session=aiohttp_client.async_get_clientsession(hass, family=socket.AF_INET)
@@ -107,6 +112,29 @@ async def _get_devices_by_device_id(self, meter_id) -> Devices:
107112
_LOGGER.exception(f"Failed fetching device details by meter id {meter_id}", e)
108113
return devices
109114

115+
async def _get_last_meter_reading(self, bp_number, contract_id, meter_id) -> MeterReading:
116+
key = (contract_id, int(meter_id))
117+
last_meter_reading = self._last_meter_reading.get(key)
118+
if not last_meter_reading:
119+
try:
120+
meter_readings = await self.api.get_last_meter_reading(bp_number, contract_id)
121+
122+
for reading in meter_readings.last_meters:
123+
reading_meter_id = int(reading.serial_number)
124+
if len(reading.meter_readings) > 0:
125+
readings = reading.meter_readings
126+
readings.sort(key=lambda rdng: rdng.reading_date, reverse=True)
127+
last_meter_reading = readings[0]
128+
_LOGGER.debug(f"Last Reading for contract {contract_id}, Meter {reading_meter_id}: "
129+
f"{last_meter_reading}")
130+
reading_key = (contract_id, reading_meter_id)
131+
self._last_meter_reading[reading_key] = last_meter_reading
132+
else:
133+
_LOGGER.debug(f"No Reading found for contract {contract_id}, Meter {reading_meter_id}")
134+
except IECError as e:
135+
_LOGGER.exception(f"Failed fetching device details by meter id {meter_id}", e)
136+
return self._last_meter_reading.get(key)
137+
110138
async def _get_kwh_tariff(self) -> float:
111139
if not self._kwh_tariff:
112140
try:
@@ -143,6 +171,23 @@ async def _get_distribution_tariff(self, phase) -> float:
143171
_LOGGER.exception(f"Failed fetching Distribution Tariff by phase {phase}", e)
144172
return distribution_tariff or 0.0
145173

174+
async def _get_account_id(self) -> UUID | None:
175+
if not self._account_id:
176+
try:
177+
account = await self.api.get_default_account()
178+
self._account_id = account.id
179+
except IECError as e:
180+
_LOGGER.exception("Failed fetching Account", e)
181+
return self._account_id
182+
183+
async def _get_connection_size(self, account_id) -> str | None:
184+
if not self._connection_size:
185+
try:
186+
self._connection_size = await self.api.get_masa_connection_size_from_masa(account_id)
187+
except IECError as e:
188+
_LOGGER.exception("Failed fetching Masa Connection Size", e)
189+
return self._connection_size
190+
146191
async def _get_power_size(self, connection_size) -> float:
147192
power_size = self._power_size_by_connection_size.get(connection_size)
148193
if not power_size:
@@ -374,34 +419,46 @@ async def _async_update_data(
374419
else:
375420
_LOGGER.debug("Failed fetching FutureConsumption, data in IEC API is corrupted")
376421

377-
if not is_private_producer:
422+
if is_private_producer:
423+
last_meter_reading = await self._get_last_meter_reading(self._bp_number, contract_id,
424+
device.device_number)
425+
last_meter_read = last_meter_reading.reading
426+
last_meter_read_date = last_meter_reading.reading_date.date()
427+
428+
account_id = await self._get_account_id()
429+
connection_size = await self._get_connection_size(account_id)
430+
phase_count_str = connection_size.split("X")[0] \
431+
if connection_size.find("X") != -1 else "1"
432+
phase_count = int(phase_count_str)
433+
434+
else:
378435
devices_by_id: Devices = await self._get_devices_by_device_id(device.device_number)
379-
last_meter_read = int(devices_by_id.counter_devices[0].last_mr)
436+
last_meter_read = devices_by_id.counter_devices[0].last_mr
380437
last_meter_read_date = devices_by_id.counter_devices[0].last_mr_date
381438
phase_count = devices_by_id.counter_devices[0].connection_size.phase
382439
connection_size = (devices_by_id.counter_devices[0].
383-
connection_size.representative_connection_size)
440+
connection_size.representative_connection_size)
384441

385-
distribution_tariff = await self._get_distribution_tariff(phase_count)
386-
delivery_tariff = await self._get_delivery_tariff(phase_count)
387-
power_size = await self._get_power_size(connection_size)
442+
distribution_tariff = await self._get_distribution_tariff(phase_count)
443+
delivery_tariff = await self._get_delivery_tariff(phase_count)
444+
power_size = await self._get_power_size(connection_size)
388445

389-
estimated_bill, fixed_price, consumption_price, total_days, delivery_price, distribution_price, \
446+
estimated_bill, fixed_price, consumption_price, total_days, delivery_price, distribution_price, \
390447
total_kva_price, estimated_kwh_consumption = (
391-
self._calculate_estimated_bill(device.device_number, future_consumption,
392-
last_meter_read, last_meter_read_date,
393-
kwh_tariff, kva_tariff, distribution_tariff,
394-
delivery_tariff, power_size, last_invoice))
395-
396-
estimated_bill_dict = {
397-
TOTAL_EST_BILL_ATTR_NAME: estimated_bill,
398-
EST_BILL_DAYS_ATTR_NAME: total_days,
399-
EST_BILL_CONSUMPTION_PRICE_ATTR_NAME: consumption_price,
400-
EST_BILL_DELIVERY_PRICE_ATTR_NAME: delivery_price,
401-
EST_BILL_DISTRIBUTION_PRICE_ATTR_NAME: distribution_price,
402-
EST_BILL_TOTAL_KVA_PRICE_ATTR_NAME: total_kva_price,
403-
EST_BILL_KWH_CONSUMPTION_ATTR_NAME: estimated_kwh_consumption
404-
}
448+
self._calculate_estimated_bill(device.device_number, future_consumption,
449+
last_meter_read, last_meter_read_date,
450+
kwh_tariff, kva_tariff, distribution_tariff,
451+
delivery_tariff, power_size, last_invoice))
452+
453+
estimated_bill_dict = {
454+
TOTAL_EST_BILL_ATTR_NAME: estimated_bill,
455+
EST_BILL_DAYS_ATTR_NAME: total_days,
456+
EST_BILL_CONSUMPTION_PRICE_ATTR_NAME: consumption_price,
457+
EST_BILL_DELIVERY_PRICE_ATTR_NAME: delivery_price,
458+
EST_BILL_DISTRIBUTION_PRICE_ATTR_NAME: distribution_price,
459+
EST_BILL_TOTAL_KVA_PRICE_ATTR_NAME: total_kva_price,
460+
EST_BILL_KWH_CONSUMPTION_ATTR_NAME: estimated_kwh_consumption
461+
}
405462

406463
data[str(contract_id)] = {CONTRACT_DICT_NAME: contracts.get(contract_id),
407464
INVOICE_DICT_NAME: last_invoice,

custom_components/iec/manifest.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@
1010
"iot_class": "cloud_polling",
1111
"issue_tracker": "https://github.com/guykh/iec-custom-component/issues",
1212
"loggers": ["iec_api"],
13-
"requirements": ["iec-api==0.3.1"],
14-
"version": "0.0.30"
13+
"requirements": ["iec-api==0.4.1"],
14+
"version": "0.0.31-beta"
1515
}

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
colorlog>=6.8.2
22
homeassistant==2024.2.0
3-
iec-api==0.3.1
3+
iec-api==0.4.1
44
pip>=21.0
55
ruff>=0.5.6

0 commit comments

Comments
 (0)