Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions custom_components/tauron_amiplus/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,19 @@
TYPE_AMOUNT_PAYMENT = f"{TYPE_AMOUNT}_PAYMENT"

DEFAULT_UPDATE_INTERVAL = timedelta(hours=8, minutes=30)


def get_zone_count(tariff: str) -> int:
if tariff is None:
return 1
tariff_upper = tariff.upper().strip()
if tariff_upper.startswith("G13"):
return 3
if tariff_upper.startswith("G12"):
return 2
return 1


SENSOR_TYPES_YAML = {
TYPE_CONSUMPTION_READING: {
"name": "Current consumption reading",
Expand Down
49 changes: 45 additions & 4 deletions custom_components/tauron_amiplus/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
CONST_LAST_12_MONTHS, CONST_MONTHLY, CONST_READING, CONST_URL_SERVICE, CONST_YEARLY, DEFAULT_NAME,
DOMAIN, SENSOR_TYPES, SENSOR_TYPES_YAML, TYPE_BALANCED_CONFIGURABLE, TYPE_BALANCED_DAILY,
TYPE_BALANCED_LAST_12_MONTHS, TYPE_BALANCED_MONTHLY, TYPE_BALANCED_YEARLY,
TYPE_AMOUNT, TYPE_AMOUNT_PAYMENT)
TYPE_AMOUNT, TYPE_AMOUNT_PAYMENT, get_zone_count)
from .coordinator import TauronAmiplusUpdateCoordinator
from .typing_helpers import TauronAmiplusConfigEntry

Expand Down Expand Up @@ -86,6 +86,7 @@ async def async_setup_entry(hass, entry: TauronAmiplusConfigEntry, async_add_ent
if not show_configurable:
sensor_types = {k: v for k, v in sensor_types.items() if not k.endswith(CONST_CONFIGURABLE)}

zone_count = get_zone_count(tariff)
for sensor_type, sensor_type_config in sensor_types.items():
sensors.append(
TauronAmiplusConfigFlowSensor(
Expand All @@ -98,6 +99,20 @@ async def async_setup_entry(hass, entry: TauronAmiplusConfigEntry, async_add_ent
meter_name
)
)
if zone_count > 1 and not sensor_type.startswith(CONST_BALANCED):
for zone_id in range(1, zone_count + 1):
sensors.append(
TauronAmiplusConfigFlowSensor(
coordinator,
sensor_type_config["name"],
meter_id,
sensor_type,
sensor_type_config["state_class"],
tariff,
meter_name,
zone_id=str(zone_id)
)
)

async_add_entities(sensors, True)

Expand All @@ -116,6 +131,8 @@ def __init__(self, coordinator: TauronAmiplusUpdateCoordinator, name: str, meter
self._tariff = None
self._params = {}
self._state = None
self._zone_id = None
self._zone_name = None

@property
def name(self):
Expand Down Expand Up @@ -193,11 +210,27 @@ def _handle_coordinator_update(self) -> None:

def update_reading(self, json_data):
reading = json_data["data"][-1]
if self._zone_id is not None:
key = f"S{self._zone_id}"
if key in reading and reading[key] is not None:
self._state = float(reading[key])
self._params = {"date": reading["Date"]}
return
self._state = reading["C"]
partials = {s: reading[s] for s in ["S1", "S2", "S3"] if s in reading and reading[s] is not None}
self._params = {"date": reading["Date"], **partials}

def update_values(self, json_data):
if self._zone_id is not None:
zones = json_data["data"].get("zones", {})
zones_name = json_data["data"].get("zonesName", {})
if self._zone_id in zones:
self._state = round(zones[self._zone_id], 3)
if self._zone_id in zones_name:
self._zone_name = zones_name[self._zone_id]
_, _, data_range = TauronAmiplusSensor.get_data_from_json(json_data)
self._params = {"data_range": data_range} if data_range else {}
return
total, zones, data_range = TauronAmiplusSensor.get_data_from_json(json_data)
self._state = total
self._params = {**zones, "data_range": data_range}
Expand Down Expand Up @@ -282,11 +315,12 @@ def log(self, msg):
class TauronAmiplusConfigFlowSensor(TauronAmiplusSensor):

def __init__(self, coordinator: TauronAmiplusUpdateCoordinator, name: str, meter_id: str, sensor_type: str,
state_class: SensorStateClass, tariff: str, meter_name: str):
state_class: SensorStateClass, tariff: str, meter_name: str, zone_id: str = None):
"""Initialize the sensor."""
super().__init__(coordinator, name, meter_id, sensor_type, state_class)
self._tariff = tariff
self._meter_name = meter_name
self._zone_id = zone_id

@property
def device_info(self):
Expand All @@ -302,9 +336,16 @@ def device_info(self):

@property
def name(self):
return f"{DEFAULT_NAME} {self._meter_name} {self._client_name}"
base = f"{DEFAULT_NAME} {self._meter_name} {self._client_name}"
if self._zone_id is None:
return base
zone_label = self._zone_name or f"Zone {self._zone_id}"
return f"{base} {zone_label}"

@property
def unique_id(self):
"""Return a unique ID."""
return f"tauron-{self._meter_id}-{self._sensor_type.lower()}"
base = f"tauron-{self._meter_id}-{self._sensor_type.lower()}"
if self._zone_id is None:
return base
return f"{base}-zone-{self._zone_id}"