From bd1f3bc8c920e86c84469f83252da7cecf2b4ba3 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Tue, 9 Dec 2025 11:57:49 +0100 Subject: [PATCH] Hottis PV Modbus sensor --- apps/abstraction/vendors/hottis_pv_modbus.py | 28 ++++++++++++++++++++ config/devices.yaml | 8 +++++- config/layout.yaml | 4 +++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/apps/abstraction/vendors/hottis_pv_modbus.py b/apps/abstraction/vendors/hottis_pv_modbus.py index a0a378a..772ae1a 100644 --- a/apps/abstraction/vendors/hottis_pv_modbus.py +++ b/apps/abstraction/vendors/hottis_pv_modbus.py @@ -30,6 +30,34 @@ def transform_relay_to_abstract(payload: str) -> dict[str, Any]: """ return {"power": payload.strip()} +def transform_contact_sensor_to_vendor(payload: dict[str, Any]) -> str: + """Transform abstract contact sensor payload to format. + + Contact sensors are read-only. + """ + logger.warning("Contact sensors are read-only - SET commands should not be used") + return json.dumps(payload) + + +def transform_contact_sensor_to_abstract(payload: str) -> dict[str, Any]: + """Transform contact sensor payload to abstract format. + + MAX! sends "true"/"false" (string or bool) on STATE topic. + + Transformations: + - "true" or True -> "open" (window/door open) + - "false" or False -> "closed" (window/door closed) + + Example: + - contact sensor: "off" + - Abstract: {"contact": "open"} + """ + contact_value = payload.strip().lower() == "off" + return { + "contact": "open" if contact_value else "closed" + } + + def transform_three_phase_powermeter_to_vendor(payload: dict[str, Any]) -> str: """Transform abstract three_phase_powermeter payload to hottis_pv_modbus format.""" diff --git a/config/devices.yaml b/config/devices.yaml index 7790145..49aa8af 100644 --- a/config/devices.yaml +++ b/config/devices.yaml @@ -860,7 +860,6 @@ devices: topics: set: "IoT/Car/Control" state: "IoT/Car/Control/State" - - device_id: powermeter_caroutlet name: Car Outlet type: three_phase_powermeter @@ -868,6 +867,13 @@ devices: technology: hottis_pv_modbus topics: state: "IoT/Car/Values" +- device_id: sensor_caroutlet + name: Car Outlet + type: contact + cap_version: contact_sensor@1.0.0 + technology: hottis_pv_modbus + topics: + state: IoT/Car/Feedback/State - device_id: schranklicht_flur_vor_kueche name: Schranklicht Flur vor Küche diff --git a/config/layout.yaml b/config/layout.yaml index aacf0c1..02bde6a 100644 --- a/config/layout.yaml +++ b/config/layout.yaml @@ -321,5 +321,9 @@ rooms: title: Ladestrom icon: 📊 rank: 320 + - device_id: sensor_caroutlet + title: Ladestrom + icon: 🪟 + rank: 330