Upgrade dsmr-parser to 1.4.2 (#121929)

This commit is contained in:
Joakim Plate 2024-07-30 16:51:02 +02:00 committed by GitHub
parent 4994e46ad0
commit b3f7f379df
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 195 additions and 165 deletions

View File

@ -7,5 +7,5 @@
"integration_type": "hub",
"iot_class": "local_push",
"loggers": ["dsmr_parser"],
"requirements": ["dsmr-parser==1.3.1"]
"requirements": ["dsmr-parser==1.4.2"]
}

View File

@ -4,10 +4,11 @@ from __future__ import annotations
import asyncio
from asyncio import CancelledError
from collections.abc import Callable
from collections.abc import Callable, Generator
from contextlib import suppress
from dataclasses import dataclass
from datetime import timedelta
from enum import IntEnum
from functools import partial
from dsmr_parser.clients.protocol import create_dsmr_reader, create_tcp_dsmr_reader
@ -15,7 +16,7 @@ from dsmr_parser.clients.rfxtrx_protocol import (
create_rfxtrx_dsmr_reader,
create_rfxtrx_tcp_dsmr_reader,
)
from dsmr_parser.objects import DSMRObject, Telegram
from dsmr_parser.objects import DSMRObject, MbusDevice, Telegram
import serial
from homeassistant.components.sensor import (
@ -77,6 +78,13 @@ class DSMRSensorEntityDescription(SensorEntityDescription):
obis_reference: str
class MbusDeviceType(IntEnum):
"""Types of mbus devices (13757-3:2013)."""
GAS = 3
WATER = 7
SENSORS: tuple[DSMRSensorEntityDescription, ...] = (
DSMRSensorEntityDescription(
key="timestamp",
@ -318,7 +326,7 @@ SENSORS: tuple[DSMRSensorEntityDescription, ...] = (
DSMRSensorEntityDescription(
key="belgium_max_current_per_phase",
translation_key="max_current_per_phase",
obis_reference="BELGIUM_MAX_CURRENT_PER_PHASE",
obis_reference="FUSE_THRESHOLD_L1",
dsmr_versions={"5B"},
device_class=SensorDeviceClass.CURRENT,
entity_registry_enabled_default=False,
@ -377,38 +385,36 @@ SENSORS: tuple[DSMRSensorEntityDescription, ...] = (
),
)
def create_mbus_entity(
mbus: int, mtype: int, telegram: Telegram
) -> DSMRSensorEntityDescription | None:
"""Create a new MBUS Entity."""
if mtype == 3 and hasattr(telegram, f"BELGIUM_MBUS{mbus}_METER_READING2"):
return DSMRSensorEntityDescription(
key=f"mbus{mbus}_gas_reading",
SENSORS_MBUS_DEVICE_TYPE: dict[int, tuple[DSMRSensorEntityDescription, ...]] = {
MbusDeviceType.GAS: (
DSMRSensorEntityDescription(
key="gas_reading",
translation_key="gas_meter_reading",
obis_reference=f"BELGIUM_MBUS{mbus}_METER_READING2",
obis_reference="MBUS_METER_READING",
is_gas=True,
device_class=SensorDeviceClass.GAS,
state_class=SensorStateClass.TOTAL_INCREASING,
)
if mtype == 7 and (hasattr(telegram, f"BELGIUM_MBUS{mbus}_METER_READING1")):
return DSMRSensorEntityDescription(
key=f"mbus{mbus}_water_reading",
),
),
MbusDeviceType.WATER: (
DSMRSensorEntityDescription(
key="water_reading",
translation_key="water_meter_reading",
obis_reference=f"BELGIUM_MBUS{mbus}_METER_READING1",
obis_reference="MBUS_METER_READING",
is_water=True,
device_class=SensorDeviceClass.WATER,
state_class=SensorStateClass.TOTAL_INCREASING,
)
return None
),
),
}
def device_class_and_uom(
telegram: dict[str, DSMRObject],
data: Telegram | MbusDevice,
entity_description: DSMRSensorEntityDescription,
) -> tuple[SensorDeviceClass | None, str | None]:
"""Get native unit of measurement from telegram,."""
dsmr_object = getattr(telegram, entity_description.obis_reference)
dsmr_object = getattr(data, entity_description.obis_reference)
uom: str | None = getattr(dsmr_object, "unit") or None
with suppress(ValueError):
if entity_description.device_class == SensorDeviceClass.GAS and (
@ -460,37 +466,60 @@ def rename_old_gas_to_mbus(
dev_reg.async_remove_device(device_id)
def is_supported_description(
data: Telegram | MbusDevice,
description: DSMRSensorEntityDescription,
dsmr_version: str,
) -> bool:
"""Check if this is a supported description for this telegram."""
return hasattr(data, description.obis_reference) and (
description.dsmr_versions is None or dsmr_version in description.dsmr_versions
)
def create_mbus_entities(
hass: HomeAssistant, telegram: Telegram, entry: ConfigEntry
) -> list[DSMREntity]:
hass: HomeAssistant, telegram: Telegram, entry: ConfigEntry, dsmr_version: str
) -> Generator[DSMREntity]:
"""Create MBUS Entities."""
entities = []
for idx in range(1, 5):
if (
device_type := getattr(telegram, f"BELGIUM_MBUS{idx}_DEVICE_TYPE", None)
) is None:
mbus_devices: list[MbusDevice] = getattr(telegram, "MBUS_DEVICES", [])
for device in mbus_devices:
if (device_type := getattr(device, "MBUS_DEVICE_TYPE", None)) is None:
continue
if (type_ := int(device_type.value)) not in (3, 7):
continue
if identifier := getattr(
telegram, f"BELGIUM_MBUS{idx}_EQUIPMENT_IDENTIFIER", None
):
type_ = int(device_type.value)
if identifier := getattr(device, "MBUS_EQUIPMENT_IDENTIFIER", None):
serial_ = identifier.value
rename_old_gas_to_mbus(hass, entry, serial_)
else:
serial_ = ""
if description := create_mbus_entity(idx, type_, telegram):
entities.append(
DSMREntity(
description,
entry,
telegram,
*device_class_and_uom(telegram, description), # type: ignore[arg-type]
serial_,
idx,
)
for description in SENSORS_MBUS_DEVICE_TYPE.get(type_, ()):
if not is_supported_description(device, description, dsmr_version):
continue
yield DSMREntity(
description,
entry,
telegram,
*device_class_and_uom(device, description), # type: ignore[arg-type]
serial_,
device.channel_id,
)
return entities
def get_dsmr_object(
telegram: Telegram | None, mbus_id: int, obis_reference: str
) -> DSMRObject | None:
"""Extract DSMR object from telegram."""
if not telegram:
return None
telegram_or_device: Telegram | MbusDevice | None = telegram
if mbus_id:
telegram_or_device = telegram.get_mbus_device_by_channel(mbus_id)
if telegram_or_device is None:
return None
return getattr(telegram_or_device, obis_reference, None)
async def async_setup_entry(
@ -510,8 +539,7 @@ async def async_setup_entry(
add_entities_handler()
add_entities_handler = None
if dsmr_version == "5B":
entities.extend(create_mbus_entities(hass, telegram, entry))
entities.extend(create_mbus_entities(hass, telegram, entry, dsmr_version))
entities.extend(
[
@ -522,12 +550,8 @@ async def async_setup_entry(
*device_class_and_uom(telegram, description), # type: ignore[arg-type]
)
for description in SENSORS
if (
description.dsmr_versions is None
or dsmr_version in description.dsmr_versions
)
if is_supported_description(telegram, description, dsmr_version)
and (not description.is_gas or CONF_SERIAL_ID_GAS in entry.data)
and hasattr(telegram, description.obis_reference)
]
)
async_add_entities(entities)
@ -723,6 +747,7 @@ class DSMREntity(SensorEntity):
identifiers={(DOMAIN, device_serial)},
name=device_name,
)
self._mbus_id = mbus_id
if mbus_id != 0:
if serial_id:
self._attr_unique_id = f"{device_serial}"
@ -737,20 +762,22 @@ class DSMREntity(SensorEntity):
self.telegram = telegram
if self.hass and (
telegram is None
or hasattr(telegram, self.entity_description.obis_reference)
or get_dsmr_object(
telegram, self._mbus_id, self.entity_description.obis_reference
)
):
self.async_write_ha_state()
def get_dsmr_object_attr(self, attribute: str) -> str | None:
"""Read attribute from last received telegram for this DSMR object."""
# Make sure telegram contains an object for this entities obis
if self.telegram is None or not hasattr(
self.telegram, self.entity_description.obis_reference
):
# Get the object
dsmr_object = get_dsmr_object(
self.telegram, self._mbus_id, self.entity_description.obis_reference
)
if dsmr_object is None:
return None
# Get the attribute value if the object has it
dsmr_object = getattr(self.telegram, self.entity_description.obis_reference)
attr: str | None = getattr(dsmr_object, attribute)
return attr

View File

@ -750,7 +750,7 @@ dremel3dpy==2.1.1
dropmqttapi==1.0.3
# homeassistant.components.dsmr
dsmr-parser==1.3.1
dsmr-parser==1.4.2
# homeassistant.components.dwd_weather_warnings
dwdwfsapi==1.0.7

View File

@ -640,7 +640,7 @@ dremel3dpy==2.1.1
dropmqttapi==1.0.3
# homeassistant.components.dsmr
dsmr-parser==1.3.1
dsmr-parser==1.4.2
# homeassistant.components.dwd_weather_warnings
dwdwfsapi==1.0.7

View File

@ -5,9 +5,9 @@ from decimal import Decimal
from unittest.mock import MagicMock
from dsmr_parser.obis_references import (
BELGIUM_MBUS1_DEVICE_TYPE,
BELGIUM_MBUS1_EQUIPMENT_IDENTIFIER,
BELGIUM_MBUS1_METER_READING2,
MBUS_DEVICE_TYPE,
MBUS_EQUIPMENT_IDENTIFIER,
MBUS_METER_READING,
)
from dsmr_parser.objects import CosemObject, MBusObject, Telegram
@ -67,20 +67,20 @@ async def test_migrate_gas_to_mbus(
telegram = Telegram()
telegram.add(
BELGIUM_MBUS1_DEVICE_TYPE,
MBUS_DEVICE_TYPE,
CosemObject((0, 1), [{"value": "003", "unit": ""}]),
"BELGIUM_MBUS1_DEVICE_TYPE",
"MBUS_DEVICE_TYPE",
)
telegram.add(
BELGIUM_MBUS1_EQUIPMENT_IDENTIFIER,
MBUS_EQUIPMENT_IDENTIFIER,
CosemObject(
(0, 1),
[{"value": "37464C4F32313139303333373331", "unit": ""}],
),
"BELGIUM_MBUS1_EQUIPMENT_IDENTIFIER",
"MBUS_EQUIPMENT_IDENTIFIER",
)
telegram.add(
BELGIUM_MBUS1_METER_READING2,
MBUS_METER_READING,
MBusObject(
(0, 1),
[
@ -88,7 +88,7 @@ async def test_migrate_gas_to_mbus(
{"value": Decimal(745.695), "unit": "m3"},
],
),
"BELGIUM_MBUS1_METER_READING2",
"MBUS_METER_READING",
)
assert await hass.config_entries.async_setup(mock_entry.entry_id)
@ -184,20 +184,20 @@ async def test_migrate_gas_to_mbus_exists(
telegram = Telegram()
telegram.add(
BELGIUM_MBUS1_DEVICE_TYPE,
MBUS_DEVICE_TYPE,
CosemObject((0, 0), [{"value": "003", "unit": ""}]),
"BELGIUM_MBUS1_DEVICE_TYPE",
"MBUS_DEVICE_TYPE",
)
telegram.add(
BELGIUM_MBUS1_EQUIPMENT_IDENTIFIER,
MBUS_EQUIPMENT_IDENTIFIER,
CosemObject(
(0, 1),
[{"value": "37464C4F32313139303333373331", "unit": ""}],
),
"BELGIUM_MBUS1_EQUIPMENT_IDENTIFIER",
"MBUS_EQUIPMENT_IDENTIFIER",
)
telegram.add(
BELGIUM_MBUS1_METER_READING2,
MBUS_METER_READING,
MBusObject(
(0, 1),
[
@ -205,7 +205,7 @@ async def test_migrate_gas_to_mbus_exists(
{"value": Decimal(745.695), "unit": "m3"},
],
),
"BELGIUM_MBUS1_METER_READING2",
"MBUS_METER_READING",
)
assert await hass.config_entries.async_setup(mock_entry.entry_id)

View File

@ -15,33 +15,20 @@ from dsmr_parser import obis_references
from dsmr_parser.obis_references import (
BELGIUM_CURRENT_AVERAGE_DEMAND,
BELGIUM_MAXIMUM_DEMAND_MONTH,
BELGIUM_MBUS1_DEVICE_TYPE,
BELGIUM_MBUS1_EQUIPMENT_IDENTIFIER,
BELGIUM_MBUS1_METER_READING1,
BELGIUM_MBUS1_METER_READING2,
BELGIUM_MBUS2_DEVICE_TYPE,
BELGIUM_MBUS2_EQUIPMENT_IDENTIFIER,
BELGIUM_MBUS2_METER_READING1,
BELGIUM_MBUS2_METER_READING2,
BELGIUM_MBUS3_DEVICE_TYPE,
BELGIUM_MBUS3_EQUIPMENT_IDENTIFIER,
BELGIUM_MBUS3_METER_READING1,
BELGIUM_MBUS3_METER_READING2,
BELGIUM_MBUS4_DEVICE_TYPE,
BELGIUM_MBUS4_EQUIPMENT_IDENTIFIER,
BELGIUM_MBUS4_METER_READING1,
BELGIUM_MBUS4_METER_READING2,
CURRENT_ELECTRICITY_USAGE,
ELECTRICITY_ACTIVE_TARIFF,
ELECTRICITY_EXPORTED_TOTAL,
ELECTRICITY_IMPORTED_TOTAL,
GAS_METER_READING,
HOURLY_GAS_METER_READING,
MBUS_DEVICE_TYPE,
MBUS_EQUIPMENT_IDENTIFIER,
MBUS_METER_READING,
)
from dsmr_parser.objects import CosemObject, MBusObject, Telegram
import pytest
from homeassistant.components.dsmr.sensor import SENSORS
from homeassistant.components.dsmr.sensor import SENSORS, SENSORS_MBUS_DEVICE_TYPE
from homeassistant.components.sensor import (
ATTR_OPTIONS,
ATTR_STATE_CLASS,
@ -562,20 +549,20 @@ async def test_belgian_meter(
"BELGIUM_MAXIMUM_DEMAND_MONTH",
)
telegram.add(
BELGIUM_MBUS1_DEVICE_TYPE,
MBUS_DEVICE_TYPE,
CosemObject((0, 1), [{"value": "003", "unit": ""}]),
"BELGIUM_MBUS1_DEVICE_TYPE",
"MBUS_DEVICE_TYPE",
)
telegram.add(
BELGIUM_MBUS1_EQUIPMENT_IDENTIFIER,
MBUS_EQUIPMENT_IDENTIFIER,
CosemObject(
(0, 1),
[{"value": "37464C4F32313139303333373331", "unit": ""}],
),
"BELGIUM_MBUS1_EQUIPMENT_IDENTIFIER",
"MBUS_EQUIPMENT_IDENTIFIER",
)
telegram.add(
BELGIUM_MBUS1_METER_READING2,
MBUS_METER_READING,
MBusObject(
(0, 1),
[
@ -583,23 +570,23 @@ async def test_belgian_meter(
{"value": Decimal(745.695), "unit": "m3"},
],
),
"BELGIUM_MBUS1_METER_READING2",
"MBUS_METER_READING",
)
telegram.add(
BELGIUM_MBUS2_DEVICE_TYPE,
MBUS_DEVICE_TYPE,
CosemObject((0, 2), [{"value": "007", "unit": ""}]),
"BELGIUM_MBUS2_DEVICE_TYPE",
"MBUS_DEVICE_TYPE",
)
telegram.add(
BELGIUM_MBUS2_EQUIPMENT_IDENTIFIER,
MBUS_EQUIPMENT_IDENTIFIER,
CosemObject(
(0, 2),
[{"value": "37464C4F32313139303333373332", "unit": ""}],
),
"BELGIUM_MBUS2_EQUIPMENT_IDENTIFIER",
"MBUS_EQUIPMENT_IDENTIFIER",
)
telegram.add(
BELGIUM_MBUS2_METER_READING1,
MBUS_METER_READING,
MBusObject(
(0, 2),
[
@ -607,23 +594,23 @@ async def test_belgian_meter(
{"value": Decimal(678.695), "unit": "m3"},
],
),
"BELGIUM_MBUS2_METER_READING1",
"MBUS_METER_READING",
)
telegram.add(
BELGIUM_MBUS3_DEVICE_TYPE,
MBUS_DEVICE_TYPE,
CosemObject((0, 3), [{"value": "003", "unit": ""}]),
"BELGIUM_MBUS3_DEVICE_TYPE",
"MBUS_DEVICE_TYPE",
)
telegram.add(
BELGIUM_MBUS3_EQUIPMENT_IDENTIFIER,
MBUS_EQUIPMENT_IDENTIFIER,
CosemObject(
(0, 3),
[{"value": "37464C4F32313139303333373333", "unit": ""}],
),
"BELGIUM_MBUS3_EQUIPMENT_IDENTIFIER",
"MBUS_EQUIPMENT_IDENTIFIER",
)
telegram.add(
BELGIUM_MBUS3_METER_READING2,
MBUS_METER_READING,
MBusObject(
(0, 3),
[
@ -631,23 +618,23 @@ async def test_belgian_meter(
{"value": Decimal(12.12), "unit": "m3"},
],
),
"BELGIUM_MBUS3_METER_READING2",
"MBUS_METER_READING",
)
telegram.add(
BELGIUM_MBUS4_DEVICE_TYPE,
MBUS_DEVICE_TYPE,
CosemObject((0, 4), [{"value": "007", "unit": ""}]),
"BELGIUM_MBUS4_DEVICE_TYPE",
"MBUS_DEVICE_TYPE",
)
telegram.add(
BELGIUM_MBUS4_EQUIPMENT_IDENTIFIER,
MBUS_EQUIPMENT_IDENTIFIER,
CosemObject(
(0, 4),
[{"value": "37464C4F32313139303333373334", "unit": ""}],
),
"BELGIUM_MBUS4_EQUIPMENT_IDENTIFIER",
"MBUS_EQUIPMENT_IDENTIFIER",
)
telegram.add(
BELGIUM_MBUS4_METER_READING1,
MBUS_METER_READING,
MBusObject(
(0, 4),
[
@ -655,7 +642,7 @@ async def test_belgian_meter(
{"value": Decimal(13.13), "unit": "m3"},
],
),
"BELGIUM_MBUS4_METER_READING1",
"MBUS_METER_READING",
)
telegram.add(
ELECTRICITY_ACTIVE_TARIFF,
@ -777,20 +764,20 @@ async def test_belgian_meter_alt(
telegram = Telegram()
telegram.add(
BELGIUM_MBUS1_DEVICE_TYPE,
MBUS_DEVICE_TYPE,
CosemObject((0, 1), [{"value": "007", "unit": ""}]),
"BELGIUM_MBUS1_DEVICE_TYPE",
"MBUS_DEVICE_TYPE",
)
telegram.add(
BELGIUM_MBUS1_EQUIPMENT_IDENTIFIER,
MBUS_EQUIPMENT_IDENTIFIER,
CosemObject(
(0, 1),
[{"value": "37464C4F32313139303333373331", "unit": ""}],
),
"BELGIUM_MBUS1_EQUIPMENT_IDENTIFIER",
"MBUS_EQUIPMENT_IDENTIFIER",
)
telegram.add(
BELGIUM_MBUS1_METER_READING1,
MBUS_METER_READING,
MBusObject(
(0, 1),
[
@ -798,23 +785,23 @@ async def test_belgian_meter_alt(
{"value": Decimal(123.456), "unit": "m3"},
],
),
"BELGIUM_MBUS1_METER_READING1",
"MBUS_METER_READING",
)
telegram.add(
BELGIUM_MBUS2_DEVICE_TYPE,
MBUS_DEVICE_TYPE,
CosemObject((0, 2), [{"value": "003", "unit": ""}]),
"BELGIUM_MBUS2_DEVICE_TYPE",
"MBUS_DEVICE_TYPE",
)
telegram.add(
BELGIUM_MBUS2_EQUIPMENT_IDENTIFIER,
MBUS_EQUIPMENT_IDENTIFIER,
CosemObject(
(0, 2),
[{"value": "37464C4F32313139303333373332", "unit": ""}],
),
"BELGIUM_MBUS2_EQUIPMENT_IDENTIFIER",
"MBUS_EQUIPMENT_IDENTIFIER",
)
telegram.add(
BELGIUM_MBUS2_METER_READING2,
MBUS_METER_READING,
MBusObject(
(0, 2),
[
@ -822,23 +809,23 @@ async def test_belgian_meter_alt(
{"value": Decimal(678.901), "unit": "m3"},
],
),
"BELGIUM_MBUS2_METER_READING2",
"MBUS_METER_READING",
)
telegram.add(
BELGIUM_MBUS3_DEVICE_TYPE,
MBUS_DEVICE_TYPE,
CosemObject((0, 3), [{"value": "007", "unit": ""}]),
"BELGIUM_MBUS3_DEVICE_TYPE",
"MBUS_DEVICE_TYPE",
)
telegram.add(
BELGIUM_MBUS3_EQUIPMENT_IDENTIFIER,
MBUS_EQUIPMENT_IDENTIFIER,
CosemObject(
(0, 3),
[{"value": "37464C4F32313139303333373333", "unit": ""}],
),
"BELGIUM_MBUS3_EQUIPMENT_IDENTIFIER",
"MBUS_EQUIPMENT_IDENTIFIER",
)
telegram.add(
BELGIUM_MBUS3_METER_READING1,
MBUS_METER_READING,
MBusObject(
(0, 3),
[
@ -846,23 +833,23 @@ async def test_belgian_meter_alt(
{"value": Decimal(12.12), "unit": "m3"},
],
),
"BELGIUM_MBUS3_METER_READING1",
"MBUS_METER_READING",
)
telegram.add(
BELGIUM_MBUS4_DEVICE_TYPE,
MBUS_DEVICE_TYPE,
CosemObject((0, 4), [{"value": "003", "unit": ""}]),
"BELGIUM_MBUS4_DEVICE_TYPE",
"MBUS_DEVICE_TYPE",
)
telegram.add(
BELGIUM_MBUS4_EQUIPMENT_IDENTIFIER,
MBUS_EQUIPMENT_IDENTIFIER,
CosemObject(
(0, 4),
[{"value": "37464C4F32313139303333373334", "unit": ""}],
),
"BELGIUM_MBUS4_EQUIPMENT_IDENTIFIER",
"MBUS_EQUIPMENT_IDENTIFIER",
)
telegram.add(
BELGIUM_MBUS4_METER_READING2,
MBUS_METER_READING,
MBusObject(
(0, 4),
[
@ -870,7 +857,7 @@ async def test_belgian_meter_alt(
{"value": Decimal(13.13), "unit": "m3"},
],
),
"BELGIUM_MBUS4_METER_READING2",
"MBUS_METER_READING",
)
mock_entry = MockConfigEntry(
@ -970,46 +957,46 @@ async def test_belgian_meter_mbus(
"ELECTRICITY_ACTIVE_TARIFF",
)
telegram.add(
BELGIUM_MBUS1_DEVICE_TYPE,
MBUS_DEVICE_TYPE,
CosemObject((0, 1), [{"value": "006", "unit": ""}]),
"BELGIUM_MBUS1_DEVICE_TYPE",
"MBUS_DEVICE_TYPE",
)
telegram.add(
BELGIUM_MBUS1_EQUIPMENT_IDENTIFIER,
MBUS_EQUIPMENT_IDENTIFIER,
CosemObject(
(0, 1),
[{"value": "37464C4F32313139303333373331", "unit": ""}],
),
"BELGIUM_MBUS1_EQUIPMENT_IDENTIFIER",
"MBUS_EQUIPMENT_IDENTIFIER",
)
telegram.add(
BELGIUM_MBUS2_DEVICE_TYPE,
MBUS_DEVICE_TYPE,
CosemObject((0, 2), [{"value": "003", "unit": ""}]),
"BELGIUM_MBUS2_DEVICE_TYPE",
"MBUS_DEVICE_TYPE",
)
telegram.add(
BELGIUM_MBUS2_EQUIPMENT_IDENTIFIER,
MBUS_EQUIPMENT_IDENTIFIER,
CosemObject(
(0, 2),
[{"value": "37464C4F32313139303333373332", "unit": ""}],
),
"BELGIUM_MBUS2_EQUIPMENT_IDENTIFIER",
"MBUS_EQUIPMENT_IDENTIFIER",
)
telegram.add(
BELGIUM_MBUS3_DEVICE_TYPE,
MBUS_DEVICE_TYPE,
CosemObject((0, 3), [{"value": "007", "unit": ""}]),
"BELGIUM_MBUS3_DEVICE_TYPE",
"MBUS_DEVICE_TYPE",
)
telegram.add(
BELGIUM_MBUS3_EQUIPMENT_IDENTIFIER,
MBUS_EQUIPMENT_IDENTIFIER,
CosemObject(
(0, 3),
[{"value": "37464C4F32313139303333373333", "unit": ""}],
),
"BELGIUM_MBUS3_EQUIPMENT_IDENTIFIER",
"MBUS_EQUIPMENT_IDENTIFIER",
)
telegram.add(
BELGIUM_MBUS3_METER_READING2,
MBUS_METER_READING,
MBusObject(
(0, 3),
[
@ -1017,15 +1004,15 @@ async def test_belgian_meter_mbus(
{"value": Decimal(12.12), "unit": "m3"},
],
),
"BELGIUM_MBUS3_METER_READING2",
"MBUS_METER_READING",
)
telegram.add(
BELGIUM_MBUS4_DEVICE_TYPE,
MBUS_DEVICE_TYPE,
CosemObject((0, 4), [{"value": "007", "unit": ""}]),
"BELGIUM_MBUS4_DEVICE_TYPE",
"MBUS_DEVICE_TYPE",
)
telegram.add(
BELGIUM_MBUS4_METER_READING1,
MBUS_METER_READING,
MBusObject(
(0, 4),
[
@ -1033,7 +1020,7 @@ async def test_belgian_meter_mbus(
{"value": Decimal(13.13), "unit": "m3"},
],
),
"BELGIUM_MBUS4_METER_READING1",
"MBUS_METER_READING",
)
mock_entry = MockConfigEntry(
@ -1057,20 +1044,32 @@ async def test_belgian_meter_mbus(
active_tariff = hass.states.get("sensor.electricity_meter_active_tariff")
assert active_tariff.state == "unknown"
# check if gas consumption mbus2 is parsed correctly
# check if gas consumption mbus1 is parsed correctly
gas_consumption = hass.states.get("sensor.gas_meter_gas_consumption")
assert gas_consumption is None
# check if water usage mbus3 is parsed correctly
water_consumption = hass.states.get("sensor.water_meter_water_consumption_2")
assert water_consumption is None
# check if gas consumption mbus4 is parsed correctly
# check if gas consumption mbus2 is parsed correctly
gas_consumption = hass.states.get("sensor.gas_meter_gas_consumption_2")
assert gas_consumption is None
# check if gas consumption mbus4 is parsed correctly
# check if water usage mbus3 is parsed correctly
water_consumption = hass.states.get("sensor.water_meter_water_consumption")
assert water_consumption
assert water_consumption.state == "12.12"
assert (
water_consumption.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.WATER
)
assert (
water_consumption.attributes.get(ATTR_STATE_CLASS)
== SensorStateClass.TOTAL_INCREASING
)
assert (
water_consumption.attributes.get(ATTR_UNIT_OF_MEASUREMENT)
== UnitOfVolume.CUBIC_METERS
)
# check if gas consumption mbus4 is parsed correctly
water_consumption = hass.states.get("sensor.water_meter_water_consumption_2")
assert water_consumption.state == "13.13"
assert (
water_consumption.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.WATER
@ -1526,3 +1525,7 @@ def test_all_obis_references_exists():
"""Verify that all attributes exist by name in database."""
for sensor in SENSORS:
assert hasattr(obis_references, sensor.obis_reference)
for sensors in SENSORS_MBUS_DEVICE_TYPE.values():
for sensor in sensors:
assert hasattr(obis_references, sensor.obis_reference)