From c9037948de5751b7b3d38a499dcb163bd72960f5 Mon Sep 17 00:00:00 2001 From: Nero <95982029+nero150@users.noreply.github.com> Date: Wed, 18 Mar 2026 18:38:10 +0100 Subject: [PATCH] Add files via upload --- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 2703 bytes .../__pycache__/binary_sensor.cpython-313.pyc | Bin 0 -> 4815 bytes .../__pycache__/config_flow.cpython-313.pyc | Bin 0 -> 14273 bytes .../__pycache__/const.cpython-313.pyc | Bin 0 -> 710 bytes .../__pycache__/coordinator.cpython-313.pyc | Bin 0 -> 9604 bytes .../__pycache__/dlms_parser.cpython-313.pyc | Bin 0 -> 17974 bytes .../__pycache__/sensor.cpython-313.pyc | Bin 0 -> 13036 bytes custom_components/xt211_han/manifest.json | 2 +- custom_components/xt211_han/sensor.py | 109 ++++++++++++++---- 9 files changed, 89 insertions(+), 22 deletions(-) create mode 100644 custom_components/xt211_han/__pycache__/__init__.cpython-313.pyc create mode 100644 custom_components/xt211_han/__pycache__/binary_sensor.cpython-313.pyc create mode 100644 custom_components/xt211_han/__pycache__/config_flow.cpython-313.pyc create mode 100644 custom_components/xt211_han/__pycache__/const.cpython-313.pyc create mode 100644 custom_components/xt211_han/__pycache__/coordinator.cpython-313.pyc create mode 100644 custom_components/xt211_han/__pycache__/dlms_parser.cpython-313.pyc create mode 100644 custom_components/xt211_han/__pycache__/sensor.cpython-313.pyc diff --git a/custom_components/xt211_han/__pycache__/__init__.cpython-313.pyc b/custom_components/xt211_han/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffd9c41fd8aa8b383f76d435a859b02e5cc7f5a9 GIT binary patch literal 2703 zcmb_eOKcNI7@qa6?cMbQ=Vg*W(j^bVCTUD)(vlXnaY#aJ2Pay`6(xw3iPw(XWY?PA z6oPsP<$xj~rIkRX5>k8Up`3c@p{jal0I90fLtG=-j0B_tRB;1^9(wD{+8c)uICZ6+ z`R1R0{`u$eeY+bT4-fEj`N7YbU+e%pBn|7KOMu!~!{9220SIDL%od@-HfR$FrXw_@ zam_@SupQb>n?2$PJE1eoLN?4nF3dyTv^yfMup7EDcE;FsRK5+JLZn@jo@Pj)??%{QA3&*J?F&} zQ-^wcg|T2%$f$;rh6y91sX|JF!k9L%2ti%X=te>{dY+JoB86NDRn-jBO^=fHQB6%{ z(j%$?7exkfM<=4A^4LUdstlvS<0EA_IU!9Uc5*IZ;P~@+tcT38ImHvQJkf^S!y}`? z`1q7;4s{Gq91n)bOg=N$qnZYj88u;OaK=_yCEzf=2mrOwhOMnYz^4@l(iR5`O64=P z+N7Rltkyx$Uydq(X{Tk4gE+NQtZCNrz!&FLKIZKrey{eCJXV}aJ?*vdw9i6TZZT?r zQEexL9dp`TOL@L(YjmaVz%Xu;>M9ls^_M{i-}PC%Q=d{->8Ra}_Y?1?-}0)|QbPq> zC{9f`TG-0?<#^M3Eg$I(3svfv?f=^G{_=SXAWgF%n!@kkJ9LT?nW#u3W>(V;#AG#y zOEodCobT9~5|{XgABr%utMRi8T!xys1J7W?_CcPO&M~$UUOqH_Lz|apwE3*2;y8N6Eg;JoHDkzfPj(SiZArhB9~AHuHTczk$Hfz{ z1d0rMDRd!JVCr*B{dNDh)pwY-N7XGw)?M^eubf;yd7aC7T6VxIr?6T0r*cf)7s^-amuik_U+3!z{JtE&FVD9YnASC>wa9x5d{d5ZD)5JM z{NbPKZgY7)Twua$O!yJwx-@=ayvX(zS31k)UcbmxxWMBTOMlI%iQvQfbnfFh07NdiSY0uQKTdmw$~}r^rnuH zJ0p=|+k?44?$5Tz`W~pZxa~l>FHvtYo2cQo=e5k<)Tqj!oiqtEdsCHO#cY+1)0^46 ziL=>Jg}1G_sxq&Ic3yLAi$2HcHh|fD2ERv4MpIFdgGBC1G^{0vXdLpEZ|dxVk<`wr za5pjfOU4CtPD>=^Z27aKL!xMi&T3hafkdNV6DgXBl`A`IpXlUtF_{EN#0yow5Xbj%{OU`%FuBkb_+jA2z>gp1x{egO26J75zt;WMyxN@anp}$9cUBj@4F&IkocBQ9 z+gV^c*VxW=e`CQf=KNy8KbZ4l_dmG2Un=;drOjkV%d?C+KenCUY1h}xJ!{`NCXBs=d^S>qo&c`S^Ra! zT2%glcv0S<8MWpm7u_fcrzw|2Jt6tTqU!CAP=O>vWXECg7$U5tLnr5C3NYfZ?2hAH z6o^<^CfbfuBp)W^h>b*J6B6}Be~Qx58hNT^XP7X4eSd_=gS_M*OCi!%KPwb zY$HD^dK4E=X^Numg1}?Y@(_3*gT4nKln0@Ep!;voaSw>=d{u$p^C!RO+E|`%UvjQ{ i>Q>}s`Pyuuxi8n;x909&;+{KdDBnNbEL8^yMgIeIg)Aii literal 0 HcmV?d00001 diff --git a/custom_components/xt211_han/__pycache__/binary_sensor.cpython-313.pyc b/custom_components/xt211_han/__pycache__/binary_sensor.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..980d25c8a352a6fd46288d9669f1f1a3e9b50401 GIT binary patch literal 4815 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 literal 0 HcmV?d00001 diff --git a/custom_components/xt211_han/__pycache__/config_flow.cpython-313.pyc b/custom_components/xt211_han/__pycache__/config_flow.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b83f94b6cf3ec47d0a8380ba66532cf389ab071 GIT binary patch literal 14273 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 G`+ouDQiP-c literal 0 HcmV?d00001 diff --git a/custom_components/xt211_han/__pycache__/const.cpython-313.pyc b/custom_components/xt211_han/__pycache__/const.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f9cf8ff46e1acc5ae53b4c283da96a6a72861d4 GIT binary patch literal 710 zcmYLGO>f#j5M2W?HnuT=s;YWIRjVpJgpyP}Rh29PB2r=yL#p<)vcLpO!A9eyN^)}V zz4k}+)O)Y}13l8c6sad}k@y4MHD4q7&3iNBx7yj2Wfh2suYZ3AKNLd#NwE!~(^z#y z`bK~t0RhFhXNMBKm$xP!9oj)SOgnwC}BzDLpa3p zb@`}r|GW`}G4nzeS4R<6KlV@R^=jL3t3k;8YxGzUg~wdKWui{UUdVIfC}uo2jZk3d zO?<9S$6oBmJTDR*efD{tc^HgFF*ne^@$Tp#nuRR*^^A~veRlv?>RdTp%KI%d5^@s6 zN0zDp_o%}2ln$c-rCdGhTsr42*Bc$TMcWkldV)2KF>#VneL4Nj&}=!;j{kJSe9 z<&LL!TzfZ(hO-<0J-!s4a-(q|;32Ch${+G-p+8F0g;`GY`5uao6Ju^aNz64=s=rBT mVOOMnnwSqNG3`W~8^uHu+$zd{tqsVgC7WgnUo?CnPWul>?9-?K literal 0 HcmV?d00001 diff --git a/custom_components/xt211_han/__pycache__/coordinator.cpython-313.pyc b/custom_components/xt211_han/__pycache__/coordinator.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7f806de9721b4b011f38794b40ecbaa2a621da1 GIT binary patch literal 9604 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 aRr}njd(HRcd+s~mOI7XpH9;(0_kRJSf`2vu literal 0 HcmV?d00001 diff --git a/custom_components/xt211_han/__pycache__/dlms_parser.cpython-313.pyc b/custom_components/xt211_han/__pycache__/dlms_parser.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93e2afce7e1b62ec167131dd7fd8147fffc2026d GIT binary patch literal 17974 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 literal 0 HcmV?d00001 diff --git a/custom_components/xt211_han/__pycache__/sensor.cpython-313.pyc b/custom_components/xt211_han/__pycache__/sensor.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc57d81ec1c2ca1f98b0345eb1d19df8148a5791 GIT binary patch literal 13036 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 X9sQBz0fGF31C{Fve?cJ64(`7JI9Yg< literal 0 HcmV?d00001 diff --git a/custom_components/xt211_han/manifest.json b/custom_components/xt211_han/manifest.json index ed994ac..7c52326 100644 --- a/custom_components/xt211_han/manifest.json +++ b/custom_components/xt211_han/manifest.json @@ -1,7 +1,7 @@ { "domain": "xt211_han", "name": "XT211 HAN (RS485 via Ethernet)", - "version": "0.7.6", + "version": "0.7.7", "documentation": "https://github.com/nero150/xt211-han-ha", "issue_tracker": "https://github.com/nero150/xt211-han-ha/issues", "dependencies": [], diff --git a/custom_components/xt211_han/sensor.py b/custom_components/xt211_han/sensor.py index ed92a74..ec7977e 100644 --- a/custom_components/xt211_han/sensor.py +++ b/custom_components/xt211_han/sensor.py @@ -41,14 +41,23 @@ SENSOR_META: dict[str, dict] = { }, } -TEXT_OBIS = { +SERIAL_OBIS = ("0-0:96.1.1.255", "0-0:96.1.0.255") +PRECREATED_TEXT_ENTITIES = { + "serial_number": { + "name": "Výrobní číslo", + "obises": SERIAL_OBIS, + "entity_category": EntityCategory.DIAGNOSTIC, + }, + "current_tariff": { + "name": "Aktuální tarif", + "obises": ("0-0:96.14.0.255",), + "entity_category": EntityCategory.DIAGNOSTIC, + }, +} +DYNAMIC_TEXT_OBIS = { "0-0:42.0.0.255", - "0-0:96.1.0.255", - "0-0:96.1.1.255", - "0-0:96.14.0.255", "0-0:96.13.0.255", } - BINARY_OBIS = { "0-0:96.3.10.255", "0-1:96.3.10.255", @@ -58,6 +67,7 @@ BINARY_OBIS = { "0-5:96.3.10.255", "0-6:96.3.10.255", } +TEXT_OBIS = set().union(*(spec["obises"] for spec in PRECREATED_TEXT_ENTITIES.values()), DYNAMIC_TEXT_OBIS) def _device_info(entry: ConfigEntry) -> DeviceInfo: @@ -76,15 +86,10 @@ def build_enabled_obis(entry: ConfigEntry) -> set[str]: relay_count = int(entry.data.get(CONF_RELAY_COUNT, RELAYS_4)) enabled_obis: set[str] = { - "0-0:42.0.0.255", - "0-0:96.1.0.255", - "0-0:96.1.1.255", - "0-0:96.14.0.255", - "0-0:96.13.0.255", - "0-0:96.3.10.255", "0-0:17.0.0.255", "1-0:1.7.0.255", "1-0:1.8.0.255", + *TEXT_OBIS, } relay_obis = { @@ -95,6 +100,7 @@ def build_enabled_obis(entry: ConfigEntry) -> set[str]: 5: "0-5:96.3.10.255", 6: "0-6:96.3.10.255", } + enabled_obis.add("0-0:96.3.10.255") for idx in range(1, relay_count + 1): enabled_obis.add(relay_obis[idx]) @@ -124,11 +130,15 @@ async def async_setup_entry( entities = [ XT211SensorEntity(coordinator, entry, obis, meta) for obis, meta in OBIS_DESCRIPTIONS.items() - if obis in enabled_obis and obis not in BINARY_OBIS + if obis in enabled_obis and obis not in BINARY_OBIS and obis not in TEXT_OBIS ] + entities.extend( + XT211AliasedTextSensorEntity(coordinator, entry, key, spec) + for key, spec in PRECREATED_TEXT_ENTITIES.items() + ) async_add_entities(entities) - registered_obis = {entity._obis for entity in entities} + registered_obis = {entity._obis for entity in entities if hasattr(entity, "_obis")} @callback def _on_update() -> None: @@ -138,6 +148,12 @@ async def async_setup_entry( for obis, data in coordinator.data.items(): if obis in registered_obis or obis not in enabled_obis or obis in BINARY_OBIS: continue + if obis in DYNAMIC_TEXT_OBIS: + registered_obis.add(obis) + new_entities.append(XT211DynamicTextSensorEntity(coordinator, entry, obis, data)) + continue + if obis in TEXT_OBIS: + continue registered_obis.add(obis) new_entities.append(XT211SensorEntity(coordinator, entry, obis, data)) if new_entities: @@ -156,14 +172,11 @@ class XT211SensorEntity(CoordinatorEntity[XT211Coordinator], SensorEntity): self._entry = entry self._obis = obis self._wh_to_kwh = sensor_type == "energy" - self._text = obis in TEXT_OBIS self._attr_unique_id = f"{entry.entry_id}_{obis}" self._attr_name = meta.get("name", obis) - self._attr_device_class = None if self._text else sensor_meta["device_class"] - self._attr_state_class = None if self._text else sensor_meta["state_class"] - self._attr_native_unit_of_measurement = None if self._text else (sensor_meta["unit"] or meta.get("unit")) - if self._text: - self._attr_entity_category = EntityCategory.DIAGNOSTIC + self._attr_device_class = sensor_meta["device_class"] + self._attr_state_class = sensor_meta["state_class"] + self._attr_native_unit_of_measurement = sensor_meta["unit"] or meta.get("unit") @property def device_info(self) -> DeviceInfo: @@ -175,8 +188,6 @@ class XT211SensorEntity(CoordinatorEntity[XT211Coordinator], SensorEntity): if obj is None: return None value = obj.get("value") - if self._text: - return None if value is None else str(value) try: number = float(value) except (TypeError, ValueError): @@ -188,3 +199,59 @@ class XT211SensorEntity(CoordinatorEntity[XT211Coordinator], SensorEntity): @property def available(self) -> bool: return self.coordinator.data is not None + + +class XT211AliasedTextSensorEntity(CoordinatorEntity[XT211Coordinator], SensorEntity): + _attr_has_entity_name = True + + def __init__(self, coordinator: XT211Coordinator, entry: ConfigEntry, key: str, spec: dict) -> None: + super().__init__(coordinator) + self._entry = entry + self._obises = tuple(spec["obises"]) + self._attr_unique_id = f"{entry.entry_id}_{key}" + self._attr_name = spec["name"] + self._attr_entity_category = spec.get("entity_category") + + @property + def device_info(self) -> DeviceInfo: + return _device_info(self._entry) + + @property + def native_value(self) -> str | None: + data = self.coordinator.data or {} + for obis in self._obises: + obj = data.get(obis) + if obj and obj.get("value") is not None: + return str(obj.get("value")) + return None + + @property + def available(self) -> bool: + return self.coordinator.data is not None + + +class XT211DynamicTextSensorEntity(CoordinatorEntity[XT211Coordinator], SensorEntity): + _attr_has_entity_name = True + _attr_entity_category = EntityCategory.DIAGNOSTIC + + def __init__(self, coordinator: XT211Coordinator, entry: ConfigEntry, obis: str, meta: dict) -> None: + super().__init__(coordinator) + self._entry = entry + self._obis = obis + self._attr_unique_id = f"{entry.entry_id}_{obis}" + self._attr_name = meta.get("name", obis) + + @property + def device_info(self) -> DeviceInfo: + return _device_info(self._entry) + + @property + def native_value(self) -> str | None: + obj = (self.coordinator.data or {}).get(self._obis) + if obj is None or obj.get("value") is None: + return None + return str(obj.get("value")) + + @property + def available(self) -> bool: + return self.coordinator.data is not None