Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
a98802437c
|
|||
|
708e287016
|
|||
|
d11eab8474
|
|||
|
eccffbbd55
|
|||
|
2b963a33ef
|
|||
|
1311f7a59b
|
|||
|
a226fa9268
|
|||
|
3bd8d293a2
|
|||
|
be30ad3a3c
|
|||
|
500384b1cd
|
@@ -11,6 +11,7 @@ matrix:
|
|||||||
- abstraction
|
- abstraction
|
||||||
- rules
|
- rules
|
||||||
- static
|
- static
|
||||||
|
- homekit
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
build-${APP}:
|
build-${APP}:
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
when:
|
when:
|
||||||
event: [tag]
|
event: [tag]
|
||||||
|
|
||||||
|
depends_on:
|
||||||
|
- namespace
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
apply_configuration:
|
apply_configuration:
|
||||||
image: quay.io/wollud1969/k8s-admin-helper:0.3.4
|
image: quay.io/wollud1969/k8s-admin-helper:0.3.4
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ when:
|
|||||||
exclude:
|
exclude:
|
||||||
- refs/tags/*-configchange
|
- refs/tags/*-configchange
|
||||||
|
|
||||||
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- build
|
- build
|
||||||
- namespace
|
- namespace
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ when:
|
|||||||
exclude:
|
exclude:
|
||||||
- refs/tags/*-configchange
|
- refs/tags/*-configchange
|
||||||
|
|
||||||
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- deploy
|
- deploy
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
when:
|
when:
|
||||||
event: [tag]
|
event: [tag]
|
||||||
ref:
|
|
||||||
exclude:
|
|
||||||
- refs/tags/*-configchange
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
create_namespace:
|
create_namespace:
|
||||||
|
|||||||
@@ -190,6 +190,7 @@ async def handle_abstract_set(
|
|||||||
vendor_message = json.dumps(vendor_payload)
|
vendor_message = json.dumps(vendor_payload)
|
||||||
|
|
||||||
logger.info(f"→ vendor SET {device_id}: {vendor_topic} ← {vendor_message}")
|
logger.info(f"→ vendor SET {device_id}: {vendor_topic} ← {vendor_message}")
|
||||||
|
logger.debug(f"MQTT message published on {vendor_topic}: {vendor_message}")
|
||||||
await mqtt_client.publish(vendor_topic, vendor_message, qos=1)
|
await mqtt_client.publish(vendor_topic, vendor_message, qos=1)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -375,10 +375,10 @@ def _transform_relay_shelly_to_abstract(payload: str) -> dict[str, Any]:
|
|||||||
return {"power": payload.strip()}
|
return {"power": payload.strip()}
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# HANDLER FUNCTIONS: relay - hottis_modbus technology
|
# HANDLER FUNCTIONS: relay - hottis_pv_modbus technology
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
||||||
def _transform_relay_hottis_modbus_to_vendor(payload: dict[str, Any]) -> str:
|
def _transform_relay_hottis_pv_modbus_to_vendor(payload: dict[str, Any]) -> str:
|
||||||
"""Transform abstract relay payload to Hottis Modbus format.
|
"""Transform abstract relay payload to Hottis Modbus format.
|
||||||
|
|
||||||
Hottis Modbus expects plain text 'on' or 'off' (not JSON).
|
Hottis Modbus expects plain text 'on' or 'off' (not JSON).
|
||||||
@@ -392,26 +392,32 @@ def _transform_relay_hottis_modbus_to_vendor(payload: dict[str, Any]) -> str:
|
|||||||
return power
|
return power
|
||||||
|
|
||||||
|
|
||||||
def _transform_relay_hottis_modbus_to_abstract(payload: str) -> dict[str, Any]:
|
def _transform_relay_hottis_pv_modbus_to_abstract(payload: str) -> dict[str, Any]:
|
||||||
"""Transform Hottis Modbus relay payload to abstract format.
|
def _transform_relay_hottis_pv_modbus_to_abstract(payload: str) -> dict[str, Any]:
|
||||||
|
"""Transform Hottis Modbus relay payload to abstract format.
|
||||||
|
|
||||||
|
Hottis Modbus sends JSON like:
|
||||||
|
{"status": "Ok", "timestamp": "...", "state": false, "cnt": 528}
|
||||||
|
|
||||||
|
We only care about the 'state' field:
|
||||||
|
- state: true -> power: 'on'
|
||||||
|
- state: false -> power: 'off'
|
||||||
|
"""
|
||||||
|
data = json.loads(payload)
|
||||||
|
|
||||||
|
state = data.get("state", False)
|
||||||
|
power = "on" if bool(state) else "off"
|
||||||
|
|
||||||
Hottis Modbus sends plain text 'on' or 'off' (not JSON).
|
|
||||||
- 'on'/'off' -> power: 'on'/'off'
|
|
||||||
|
|
||||||
Example:
|
|
||||||
- Hottis Modbus: 'on'
|
|
||||||
- Abstract: {'power': 'on'}
|
|
||||||
"""
|
|
||||||
return {"power": payload.strip()}
|
return {"power": payload.strip()}
|
||||||
|
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# HANDLER FUNCTIONS: three_phase_powermeter - hottis_modbus technology
|
# HANDLER FUNCTIONS: three_phase_powermeter - hottis_pv_modbus technology
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
||||||
def _transform_three_phase_powermeter_hottis_modbus_to_vendor(payload: dict[str, Any]) -> dict[str, Any]:
|
def _transform_three_phase_powermeter_hottis_pv_modbus_to_vendor(payload: dict[str, Any]) -> dict[str, Any]:
|
||||||
"""Transform abstract three_phase_powermeter payload to hottis_modbus format.
|
"""Transform abstract three_phase_powermeter payload to hottis_pv_modbus format.
|
||||||
|
|
||||||
energy: float = Field(..., description="Total energy in kWh")
|
energy: float = Field(..., description="Total energy in kWh")
|
||||||
total_power: float = Field(..., description="Total power in W")
|
total_power: float = Field(..., description="Total power in W")
|
||||||
phase1_power: float = Field(..., description="Power for phase 1 in W")
|
phase1_power: float = Field(..., description="Power for phase 1 in W")
|
||||||
@@ -444,14 +450,14 @@ def _transform_three_phase_powermeter_hottis_modbus_to_vendor(payload: dict[str,
|
|||||||
return vendor_payload
|
return vendor_payload
|
||||||
|
|
||||||
|
|
||||||
def _transform_three_phase_powermeter_hottis_modbus_to_abstract(payload: str) -> dict[str, Any]:
|
def _transform_three_phase_powermeter_hottis_pv_modbus_to_abstract(payload: str) -> dict[str, Any]:
|
||||||
"""Transform hottis_modbus three_phase_powermeter payload to abstract format.
|
"""Transform hottis_pv_modbus three_phase_powermeter payload to abstract format.
|
||||||
|
|
||||||
Transformations:
|
Transformations:
|
||||||
- Direct mapping of all power meter fields
|
- Direct mapping of all power meter fields
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
- hottis_modbus: {'energy': 123.45, 'total_power': 1500.0, 'phase1_power': 500.0, ...}
|
- hottis_pv_modbus: {'energy': 123.45, 'total_power': 1500.0, 'phase1_power': 500.0, ...}
|
||||||
- Abstract: {'energy': 123.45, 'total_power': 1500.0, 'phase1_power': 500.0, ...}
|
- Abstract: {'energy': 123.45, 'total_power': 1500.0, 'phase1_power': 500.0, ...}
|
||||||
"""
|
"""
|
||||||
payload = json.loads(payload)
|
payload = json.loads(payload)
|
||||||
@@ -579,12 +585,12 @@ TRANSFORM_HANDLERS: dict[tuple[str, str, str], TransformHandler] = {
|
|||||||
("relay", "zigbee2mqtt", "to_abstract"): _transform_relay_zigbee2mqtt_to_abstract,
|
("relay", "zigbee2mqtt", "to_abstract"): _transform_relay_zigbee2mqtt_to_abstract,
|
||||||
("relay", "shelly", "to_vendor"): _transform_relay_shelly_to_vendor,
|
("relay", "shelly", "to_vendor"): _transform_relay_shelly_to_vendor,
|
||||||
("relay", "shelly", "to_abstract"): _transform_relay_shelly_to_abstract,
|
("relay", "shelly", "to_abstract"): _transform_relay_shelly_to_abstract,
|
||||||
("relay", "hottis_modbus", "to_vendor"): _transform_relay_hottis_modbus_to_vendor,
|
("relay", "hottis_pv_modbus", "to_vendor"): _transform_relay_hottis_pv_modbus_to_vendor,
|
||||||
("relay", "hottis_modbus", "to_abstract"): _transform_relay_hottis_modbus_to_abstract,
|
("relay", "hottis_pv_modbus", "to_abstract"): _transform_relay_hottis_pv_modbus_to_abstract,
|
||||||
|
|
||||||
# Three-Phase Powermeter transformations
|
# Three-Phase Powermeter transformations
|
||||||
("three_phase_powermeter", "hottis_modbus", "to_vendor"): _transform_three_phase_powermeter_hottis_modbus_to_vendor,
|
("three_phase_powermeter", "hottis_pv_modbus", "to_vendor"): _transform_three_phase_powermeter_hottis_pv_modbus_to_vendor,
|
||||||
("three_phase_powermeter", "hottis_modbus", "to_abstract"): _transform_three_phase_powermeter_hottis_modbus_to_abstract,
|
("three_phase_powermeter", "hottis_pv_modbus", "to_abstract"): _transform_three_phase_powermeter_hottis_pv_modbus_to_abstract,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
services:
|
services:
|
||||||
homekit-bridge:
|
homekit-bridge:
|
||||||
build:
|
image: gitea.hottis.de/wn/home-automation/homekit:0.5.0
|
||||||
context: ../..
|
|
||||||
dockerfile: apps/homekit/Dockerfile
|
|
||||||
container_name: homekit-bridge
|
container_name: homekit-bridge
|
||||||
|
|
||||||
# Required for mDNS/Bonjour to work properly
|
# Required for mDNS/Bonjour to work properly
|
||||||
|
|||||||
@@ -730,8 +730,19 @@ devices:
|
|||||||
features:
|
features:
|
||||||
power: true
|
power: true
|
||||||
topics:
|
topics:
|
||||||
set: "shellies/LightKitchenSink/relay/0/command"
|
set: "shellies/shellyplug-s-DED4E4/relay/0/command"
|
||||||
state: "shellies/LightKitchenSink/relay/0"
|
state: "shellies/shellyplug-s-DED4E4/relay/0"
|
||||||
|
- device_id: putzlicht_kueche
|
||||||
|
name: Putzlicht
|
||||||
|
type: light
|
||||||
|
cap_version: "light@1.2.0"
|
||||||
|
technology: zigbee2mqtt
|
||||||
|
features:
|
||||||
|
power: true
|
||||||
|
brightness: true
|
||||||
|
topics:
|
||||||
|
state: "zigbee2mqtt/0xa4c138563834406c"
|
||||||
|
set: "zigbee2mqtt/0xa4c138563834406c/set"
|
||||||
- device_id: licht_schrank_esszimmer
|
- device_id: licht_schrank_esszimmer
|
||||||
name: Schrank
|
name: Schrank
|
||||||
type: relay
|
type: relay
|
||||||
@@ -777,12 +788,12 @@ devices:
|
|||||||
name: Car Outlet
|
name: Car Outlet
|
||||||
type: relay
|
type: relay
|
||||||
cap_version: "relay@1.0.0"
|
cap_version: "relay@1.0.0"
|
||||||
technology: hottis_modbus
|
technology: hottis_pv_modbus
|
||||||
features:
|
features:
|
||||||
power: true
|
power: true
|
||||||
topics:
|
topics:
|
||||||
set: "caroutlet/cmd"
|
set: "IoT/Car/Control"
|
||||||
state: "caroutlet/state"
|
state: "IoT/Car/Control/State"
|
||||||
|
|
||||||
- device_id: powermeter_caroutlet
|
- device_id: powermeter_caroutlet
|
||||||
name: Car Outlet
|
name: Car Outlet
|
||||||
|
|||||||
@@ -123,6 +123,10 @@ rooms:
|
|||||||
title: Küche Spüle
|
title: Küche Spüle
|
||||||
icon: 💡
|
icon: 💡
|
||||||
rank: 142
|
rank: 142
|
||||||
|
- device_id: putzlicht_kueche
|
||||||
|
title: Küche Putzlicht
|
||||||
|
icon: 💡
|
||||||
|
rank: 143
|
||||||
- device_id: thermostat_kueche
|
- device_id: thermostat_kueche
|
||||||
title: Kueche
|
title: Kueche
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
|
|||||||
Reference in New Issue
Block a user