64 Commits

Author SHA1 Message Date
826d73990b grid fix 16 2025-11-20 21:32:42 +01:00
86587402b6 grid fix 15 2025-11-20 21:30:10 +01:00
110b903dc8 grid fix 14 2025-11-20 21:27:30 +01:00
a8f6ad800d grid fix 13 2025-11-20 21:25:42 +01:00
52a50e1cd4 grid fix 12 2025-11-20 21:25:05 +01:00
9d7e26677f grid fix 11 2025-11-20 18:33:50 +01:00
ebd459bfc1 grid fix 10 2025-11-20 18:29:51 +01:00
e49c5affe9 grid fix 9 2025-11-20 18:14:35 +01:00
5595cf4f37 grid fix 8 2025-11-20 18:13:55 +01:00
f61417a631 grid fix 7 2025-11-19 21:33:52 +01:00
6d62732d1d grid fix 6 2025-11-19 21:32:23 +01:00
73814df01e grid fix 5 2025-11-19 21:16:48 +01:00
4b7ac9b82b grid fix 4 2025-11-19 21:14:50 +01:00
850d810cb3 grid fix 3 2025-11-19 21:12:39 +01:00
5bdfbacc3c grid fix 2025-11-19 20:36:14 +01:00
3d9043b8fa device state setting fix 20 2025-11-19 15:17:55 +01:00
1890a83939 device state setting fix 19 2025-11-19 12:55:03 +01:00
23edd42fca device state setting fix 18 2025-11-19 12:34:39 +01:00
5fbaab3c11 device state setting fix 17 2025-11-19 12:19:51 +01:00
2eefbcd44b device state setting fix 16 2025-11-19 12:12:15 +01:00
d09caa9d92 device state setting fix 15 2025-11-19 12:09:45 +01:00
127b5857c3 device state setting fix 14 2025-11-19 12:02:27 +01:00
c2dcb733d8 device state setting fix 12 2025-11-19 11:24:32 +01:00
168b2c4b12 device state setting fix 11 2025-11-19 10:58:51 +01:00
66872703c1 device state setting fix 10 2025-11-19 10:55:05 +01:00
d4b44fa73e device state setting fix 9 2025-11-19 10:49:23 +01:00
87a86524d4 device state setting fix 8 2025-11-19 10:44:18 +01:00
91fdfde280 device state setting fix 7 2025-11-19 10:41:39 +01:00
d138d7bf0a device state setting fix 6 2025-11-19 10:36:45 +01:00
8b08ded0c6 device state setting fix 5 2025-11-19 10:31:07 +01:00
6a0601742a device state setting fix 4 2025-11-19 10:28:33 +01:00
99580f8ff9 device state setting fix 3 2025-11-19 10:20:46 +01:00
381f8521d4 device state setting fix 2 2025-11-19 10:16:39 +01:00
a382d58601 device state setting fix 2025-11-19 10:11:16 +01:00
0ca5ffaca0 device state fix 3 2025-11-19 09:40:47 +01:00
ec193a92f8 device state fix 2 2025-11-19 09:38:03 +01:00
c473ea341e device state fix 2025-11-19 09:35:27 +01:00
0b6b9a01fb refactored 7 2025-11-18 16:05:58 +01:00
734ee18e85 refactored 6 2025-11-18 16:03:20 +01:00
d9d17d37e5 refactored 5 2025-11-18 14:25:55 +01:00
29e2fd441b refactored 4 2025-11-18 14:25:09 +01:00
f902f40386 refactored 3 2025-11-18 14:12:08 +01:00
6483cf0740 refactored 2 2025-11-18 14:10:22 +01:00
2863f5f5a6 refactored 2025-11-18 12:59:14 +01:00
3e02decc02 new endpoints 6 2025-11-18 11:02:03 +01:00
3e9e388ddd new endpoints 5 2025-11-18 10:55:51 +01:00
1f6fe134d5 new endpoints 4 2025-11-18 10:41:24 +01:00
05884bb99a new endpoints 3 2025-11-18 10:36:43 +01:00
5d08ec970a new endpoints 2 2025-11-18 10:20:10 +01:00
732c333966 new endpoints 2025-11-18 09:38:32 +01:00
c685e65be5 new ui 14 2025-11-17 22:25:45 +01:00
2eb9d323de new ui 13 2025-11-17 22:14:31 +01:00
d9d2033dd7 new ui 12 2025-11-17 22:12:15 +01:00
04c8cc8577 new ui 11 2025-11-17 22:07:26 +01:00
e140227f7a new ui 10 2025-11-17 22:04:59 +01:00
cc25a22025 new ui 9 2025-11-17 22:00:56 +01:00
af6ab012dd new ui 8 2025-11-17 21:56:09 +01:00
a2c2ef7ddd new ui 7 2025-11-17 21:54:40 +01:00
ecf31c7f8b new ui 6 2025-11-17 21:52:24 +01:00
74d4fea695 new ui 5 2025-11-17 21:42:47 +01:00
c38fdab0ad new ui 4 2025-11-17 21:40:00 +01:00
094cef0bd7 new ui 3 2025-11-17 21:39:44 +01:00
1027b905b5 new ui 2 2025-11-17 21:36:25 +01:00
204a70a438 new ui 1 2025-11-17 21:33:15 +01:00
19 changed files with 3997 additions and 346 deletions

View File

@@ -199,7 +199,7 @@ async def handle_vendor_state(
device_id: str,
device_type: str,
device_technology: str,
payload: dict[str, Any],
payload: str,
redis_channel: str = "ui:updates"
) -> None:
"""Handle vendor STATE message and publish to abstract topic + Redis.
@@ -210,7 +210,7 @@ async def handle_vendor_state(
device_id: Device identifier
device_type: Device type (e.g., 'light', 'thermostat')
device_technology: Technology identifier (e.g., 'zigbee2mqtt')
payload: State payload (vendor-specific format)
payload: string Message payload
redis_channel: Redis channel for UI updates
"""
# Transform vendor-specific payload to abstract format
@@ -323,49 +323,18 @@ async def mqtt_worker(config: dict[str, Any], redis_client: aioredis.Redis) -> N
# Process messages
async for message in client.messages:
try:
last_activity = asyncio.get_event_loop().time()
topic = str(message.topic)
payload_str = message.payload.decode()
# Determine if message is from a MAX! device (requires plain text handling)
is_max_device = False
max_device_id = None
max_device_type = None
# Check if topic matches any MAX! device state topic
for device_id, device in devices.items():
if device.get("technology") == "max" and topic == device["topics"]["state"]:
is_max_device = True
max_device_id = device_id
max_device_type = device["type"]
break
# Check for Shelly relay (also sends plain text)
is_shelly_relay = False
shelly_device_id = None
shelly_device_type = None
for device_id, device in devices.items():
if device.get("technology") == "shelly" and device.get("type") == "relay":
if topic == device["topics"]["state"]:
is_shelly_relay = True
shelly_device_id = device_id
shelly_device_type = device["type"]
break
# Parse payload based on device technology
if is_max_device or is_shelly_relay:
# MAX! and Shelly send plain text, not JSON
payload = payload_str.strip()
else:
# All other technologies use JSON
try:
payload = json.loads(payload_str)
except json.JSONDecodeError:
logger.warning(f"Invalid JSON on {topic}: {payload_str}")
continue
retain = getattr(message, 'retain', None)
logger.debug(f"MQTT message received on ({retain=}) {topic}: {payload_str}")
# Check if this is an abstract SET message
if topic.startswith("home/") and topic.endswith("/set"):
payload = json.loads(payload_str)
# Extract device_type and device_id from topic
parts = topic.split("/")
if len(parts) == 4: # home/<type>/<id>/set
@@ -381,23 +350,6 @@ async def mqtt_worker(config: dict[str, Any], redis_client: aioredis.Redis) -> N
)
# Check if this is a vendor STATE message
else:
# For MAX! devices, we already identified them above
if is_max_device:
device = devices[max_device_id]
device_technology = device.get("technology", "unknown")
await handle_vendor_state(
client, redis_client, max_device_id, max_device_type,
device_technology, payload, redis_channel
)
# For Shelly relay devices, we already identified them above
elif is_shelly_relay:
device = devices[shelly_device_id]
device_technology = device.get("technology", "unknown")
await handle_vendor_state(
client, redis_client, shelly_device_id, shelly_device_type,
device_technology, payload, redis_channel
)
else:
# Find device by vendor state topic for other technologies
for device_id, device in devices.items():
@@ -405,9 +357,11 @@ async def mqtt_worker(config: dict[str, Any], redis_client: aioredis.Redis) -> N
device_technology = device.get("technology", "unknown")
await handle_vendor_state(
client, redis_client, device_id, device["type"],
device_technology, payload, redis_channel
device_technology, payload_str, redis_channel
)
break
except json.JSONDecodeError:
logger.error(f"Failed to decode JSON payload on topic {topic}: {payload_str}")
except asyncio.CancelledError:
logger.info("MQTT worker cancelled")

View File

@@ -7,6 +7,7 @@ This module implements a registry-pattern for vendor-specific transformations:
"""
import logging
import json
from typing import Any, Callable
logger = logging.getLogger(__name__)
@@ -24,11 +25,14 @@ def _transform_light_simulator_to_vendor(payload: dict[str, Any]) -> dict[str, A
return payload
def _transform_light_simulator_to_abstract(payload: dict[str, Any]) -> dict[str, Any]:
def _transform_light_simulator_to_abstract(payload: str) -> dict[str, Any]:
"""Transform simulator light payload to abstract format.
Simulator uses same format as abstract protocol (no transformation needed).
"""
payload = json.loads(payload)
return payload
@@ -40,11 +44,14 @@ def _transform_thermostat_simulator_to_vendor(payload: dict[str, Any]) -> dict[s
return payload
def _transform_thermostat_simulator_to_abstract(payload: dict[str, Any]) -> dict[str, Any]:
def _transform_thermostat_simulator_to_abstract(payload: str) -> dict[str, Any]:
"""Transform simulator thermostat payload to abstract format.
Simulator uses same format as abstract protocol (no transformation needed).
"""
payload = json.loads(payload)
return payload
@@ -80,7 +87,7 @@ def _transform_light_zigbee2mqtt_to_vendor(payload: dict[str, Any]) -> dict[str,
return vendor_payload
def _transform_light_zigbee2mqtt_to_abstract(payload: dict[str, Any]) -> dict[str, Any]:
def _transform_light_zigbee2mqtt_to_abstract(payload: str) -> dict[str, Any]:
"""Transform zigbee2mqtt light payload to abstract format.
Transformations:
@@ -91,7 +98,7 @@ def _transform_light_zigbee2mqtt_to_abstract(payload: dict[str, Any]) -> dict[st
- zigbee2mqtt: {'state': 'ON', 'brightness': 254}
- Abstract: {'power': 'on', 'brightness': 100}
"""
abstract_payload = payload.copy()
abstract_payload = json.loads(payload)
# Transform state -> power with lowercase values
if "state" in abstract_payload:
@@ -128,7 +135,7 @@ def _transform_thermostat_zigbee2mqtt_to_vendor(payload: dict[str, Any]) -> dict
return vendor_payload
def _transform_thermostat_zigbee2mqtt_to_abstract(payload: dict[str, Any]) -> dict[str, Any]:
def _transform_thermostat_zigbee2mqtt_to_abstract(payload: str) -> dict[str, Any]:
"""Transform zigbee2mqtt thermostat payload to abstract format.
Transformations:
@@ -140,6 +147,7 @@ def _transform_thermostat_zigbee2mqtt_to_abstract(payload: dict[str, Any]) -> di
- zigbee2mqtt: {'current_heating_setpoint': 15, 'local_temperature': 23, 'system_mode': 'heat'}
- Abstract: {'target': 15.0, 'current': 23.0, 'mode': 'heat'}
"""
payload = json.loads(payload)
abstract_payload = {}
# Extract target temperature
@@ -173,7 +181,7 @@ def _transform_contact_sensor_zigbee2mqtt_to_vendor(payload: dict[str, Any]) ->
return payload
def _transform_contact_sensor_zigbee2mqtt_to_abstract(payload: dict[str, Any]) -> dict[str, Any]:
def _transform_contact_sensor_zigbee2mqtt_to_abstract(payload: str) -> dict[str, Any]:
"""Transform zigbee2mqtt contact sensor payload to abstract format.
Transformations:
@@ -188,6 +196,7 @@ def _transform_contact_sensor_zigbee2mqtt_to_abstract(payload: dict[str, Any]) -
- zigbee2mqtt: {"contact": false, "battery": 100, "linkquality": 87}
- Abstract: {"contact": "open", "battery": 100, "linkquality": 87}
"""
payload = json.loads(payload)
abstract_payload = {}
# Transform contact state (inverted logic!)
@@ -226,7 +235,7 @@ def _transform_contact_sensor_max_to_vendor(payload: dict[str, Any]) -> dict[str
return payload
def _transform_contact_sensor_max_to_abstract(payload: str | bool | dict[str, Any]) -> dict[str, Any]:
def _transform_contact_sensor_max_to_abstract(payload: str) -> dict[str, Any]:
"""Transform MAX! (Homegear) contact sensor payload to abstract format.
MAX! sends "true"/"false" (string or bool) on STATE topic.
@@ -240,19 +249,7 @@ def _transform_contact_sensor_max_to_abstract(payload: str | bool | dict[str, An
- Abstract: {"contact": "open"}
"""
try:
# Handle string, bool, or dict input
if isinstance(payload, dict):
# If already a dict, extract contact field
contact_value = payload.get("contact", False)
elif isinstance(payload, str):
# Parse string to bool
contact_value = payload.strip().lower() == "true"
elif isinstance(payload, bool):
# Use bool directly
contact_value = payload
else:
logger.warning(f"MAX! contact sensor unexpected payload type: {type(payload)}, value: {payload}")
contact_value = False
# MAX! semantics: True = OPEN, False = CLOSED
return {
@@ -278,11 +275,12 @@ def _transform_temp_humidity_sensor_zigbee2mqtt_to_vendor(payload: dict[str, Any
return payload
def _transform_temp_humidity_sensor_zigbee2mqtt_to_abstract(payload: dict[str, Any]) -> dict[str, Any]:
def _transform_temp_humidity_sensor_zigbee2mqtt_to_abstract(payload: str) -> dict[str, Any]:
"""Transform zigbee2mqtt temp/humidity sensor payload to abstract format.
Passthrough - zigbee2mqtt provides temperature, humidity, battery, linkquality directly.
"""
payload = json.loads(payload)
return payload
@@ -290,20 +288,24 @@ def _transform_temp_humidity_sensor_zigbee2mqtt_to_abstract(payload: dict[str, A
# HANDLER FUNCTIONS: temp_humidity_sensor - MAX! technology
# ============================================================================
def _transform_temp_humidity_sensor_max_to_vendor(payload: dict[str, Any]) -> dict[str, Any]:
def _transform_temp_humidity_sensor_max_to_vendor(payload: str) -> dict[str, Any]:
"""Transform abstract temp/humidity sensor payload to MAX! format.
Temp/humidity sensors are read-only, so this should not be called for SET commands.
Returns payload as-is for compatibility.
"""
payload = json.loads(payload)
return payload
def _transform_temp_humidity_sensor_max_to_abstract(payload: dict[str, Any]) -> dict[str, Any]:
def _transform_temp_humidity_sensor_max_to_abstract(payload: str) -> dict[str, Any]:
"""Transform MAX! temp/humidity sensor payload to abstract format.
Passthrough - MAX! provides temperature, humidity, battery directly.
"""
payload = json.loads(payload)
return payload
@@ -326,12 +328,13 @@ def _transform_relay_zigbee2mqtt_to_vendor(payload: dict[str, Any]) -> dict[str,
return vendor_payload
def _transform_relay_zigbee2mqtt_to_abstract(payload: dict[str, Any]) -> dict[str, Any]:
def _transform_relay_zigbee2mqtt_to_abstract(payload: str) -> dict[str, Any]:
"""Transform zigbee2mqtt relay payload to abstract format.
Relay only has power on/off, same transformation as light.
- state: 'ON'/'OFF' -> power: 'on'/'off'
"""
payload = json.loads(payload)
abstract_payload = payload.copy()
if "state" in abstract_payload:
@@ -369,13 +372,8 @@ def _transform_relay_shelly_to_abstract(payload: str) -> dict[str, Any]:
- Shelly: 'on'
- Abstract: {'power': 'on'}
"""
# Shelly payload is a plain string, not a dict
if isinstance(payload, str):
return {"power": payload.strip()}
# Fallback if it's already a dict (shouldn't happen)
return payload
# ============================================================================
# HANDLER FUNCTIONS: max technology (Homegear MAX!)
@@ -412,7 +410,7 @@ def _transform_thermostat_max_to_vendor(payload: dict[str, Any]) -> str:
return "21"
def _transform_thermostat_max_to_abstract(payload: str | int | float) -> dict[str, Any]:
def _transform_thermostat_max_to_abstract(payload: str) -> dict[str, Any]:
"""Transform MAX! (Homegear) thermostat payload to abstract format.
MAX! sends only the integer temperature value (no JSON).
@@ -428,26 +426,14 @@ def _transform_thermostat_max_to_abstract(payload: str | int | float) -> dict[st
Note: MAX! doesn't send current temperature via SET_TEMPERATURE topic
"""
try:
# Handle both string and numeric input
if isinstance(payload, str):
target_temp = float(payload.strip())
elif isinstance(payload, (int, float)):
target_temp = float(payload)
else:
logger.warning(f"MAX! unexpected payload type: {type(payload)}, value: {payload}")
target_temp = 21.0
return {
"target": target_temp,
"mode": "heat" # MAX! is always in heating mode
}
except (ValueError, TypeError) as e:
logger.error(f"MAX! failed to parse temperature: {payload}, error: {e}")
return {
"target": 21.0,
"mode": "heat"
}
# ============================================================================
@@ -564,7 +550,7 @@ def transform_abstract_to_vendor(
def transform_vendor_to_abstract(
device_type: str,
device_technology: str,
vendor_payload: dict[str, Any]
vendor_payload: str
) -> dict[str, Any]:
"""Transform vendor-specific payload to abstract format.

View File

@@ -1,145 +1,3 @@
"""API main entry point.
API-Analyse für HomeKit-Bridge Kompatibilität
==============================================
1) GET /devices
Status: ✅ VORHANDEN (Zeile 325-343)
Aktuelles Response-Modell (DeviceInfo, Zeile 189-194):
{
"device_id": str, ✅ OK
"type": str, ✅ OK
"name": str, ⚠️ ABWEICHUNG: Erwartet wurde "short_name" (optional)
"features": dict ✅ OK
}
Bewertung:
- ✅ Liefert device_id, type, features wie erwartet
- ⚠️ Verwendet "name" statt "short_name"
- ✅ Fallback auf device_id wenn name nicht vorhanden
- Kompatibilität: HOCH - einfach "name" als "short_name" verwenden
2) GET /layout
Status: ✅ VORHANDEN (Zeile 354-387)
Aktuelles Response-Format:
{
"rooms": [
{
"name": "Schlafzimmer",
"devices": [
{
"device_id": "thermostat_wolfgang",
"title": "Thermostat Wolfgang", ← friendly_name
"icon": "thermometer",
"rank": 1
}
]
}
]
}
Mapping device_id -> room, friendly_name:
- room: Durch Iteration über rooms[].devices[] ableitbar
- friendly_name: Im Feld "title" enthalten
Bewertung:
- ✅ Alle erforderlichen Informationen vorhanden
- ⚠️ ABWEICHUNG: Verschachtelte Struktur (rooms -> devices)
- ⚠️ ABWEICHUNG: friendly_name heißt "title"
- Kompatibilität: HOCH - einfache Transformation möglich:
```python
for room in layout["rooms"]:
for device in room["devices"]:
mapping[device["device_id"]] = {
"room": room["name"],
"friendly_name": device["title"]
}
```
3) POST /devices/{device_id}/set
Status: ✅ VORHANDEN (Zeile 406-504)
Aktuelles Request-Modell (SetDeviceRequest, Zeile 182-185):
{
"type": str, ✅ OK - muss zum Gerätetyp passen
"payload": dict ✅ OK - abstraktes Kommando
}
Beispiel Light:
POST /devices/leselampe_esszimmer/set
{"type": "light", "payload": {"power": "on", "brightness": 80}}
Beispiel Thermostat:
POST /devices/thermostat_wolfgang/set
{"type": "thermostat", "payload": {"target": 21.0}}
Validierung:
- ✅ Type-spezifische Payload-Validierung (Zeile 437-487)
- ✅ Read-only Check → 405 METHOD_NOT_ALLOWED (Zeile 431-435)
- ✅ Ungültige Payload → 422 UNPROCESSABLE_ENTITY
- ✅ Device nicht gefunden → 404 NOT_FOUND
Bewertung:
- ✅ Exakt wie erwartet implementiert
- ✅ Alle geforderten Error Codes vorhanden
- Kompatibilität: PERFEKT
4) Realtime-Endpoint (SSE)
Status: ✅ VORHANDEN als GET /realtime (Zeile 608-632)
Implementierung:
- ✅ Server-Sent Events (media_type="text/event-stream")
- ✅ Redis Pub/Sub basiert (event_generator, Zeile 510-607)
- ✅ Safari-kompatibel (Heartbeats, Retry-Hints)
Aktuelles Event-Format (aus apps/abstraction/main.py:250-256):
{
"type": "state", ✅ OK
"device_id": str, ✅ OK
"payload": dict, ✅ OK - z.B. {"power":"on","brightness":80}
"ts": str ✅ OK - ISO-8601 format von datetime.now(timezone.utc)
}
Beispiel-Event:
{
"type": "state",
"device_id": "thermostat_wolfgang",
"payload": {"current": 19.5, "target": 21.0},
"ts": "2025-11-17T14:23:45.123456+00:00"
}
Bewertung:
- ✅ Alle geforderten Felder vorhanden
- ✅ Timestamp im korrekten Format
- ✅ SSE mit proper headers und error handling
- Kompatibilität: PERFEKT
ZUSAMMENFASSUNG
===============
Alle 4 geforderten Endpunkte sind implementiert!
Kompatibilität mit HomeKit-Bridge Anforderungen:
- GET /devices: HOCH (nur Name-Feld unterschiedlich)
- GET /layout: HOCH (Struktur-Transformation nötig)
- POST /devices/{id}/set: PERFEKT (1:1 wie gefordert)
- GET /realtime (SSE): PERFEKT (1:1 wie gefordert)
Erforderliche Anpassungen für Bridge:
1. GET /devices: "name" als "short_name" interpretieren ✓ trivial
2. GET /layout: Verschachtelte Struktur zu flat mapping umwandeln ✓ einfach
Keine Code-Änderungen in der API erforderlich!
Die Bridge kann die bestehenden Endpoints direkt nutzen.
"""
import asyncio
import json
import logging
@@ -179,9 +37,12 @@ from apps.api.resolvers import (
clear_room_cache,
)
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
# ============================================================================
# STATE CACHES
# ============================================================================
@@ -212,6 +73,48 @@ app.add_middleware(
allow_headers=["*"],
)
@app.get("/devices/{device_id}/layout")
async def get_device_layout(device_id: str):
"""Gibt die layout-spezifischen Informationen für ein einzelnes Gerät zurück."""
layout = load_layout()
for room in layout.rooms:
for device in room.devices:
if device.device_id == device_id:
return {
"device_id": device_id,
"room": room.name,
"title": device.title,
"icon": device.icon,
"rank": device.rank,
}
raise HTTPException(status_code=404, detail="Device layout not found")
@app.get("/devices/{device_id}/state")
async def get_device_state(device_id: str):
try:
logger.debug(f"Fetching state for device {device_id}")
state = device_states[device_id]
return state
except KeyError:
raise HTTPException(status_code=404, detail="Device state not found")
# --- Minimal-invasive: Einzelgerät-Layout-Endpunkt ---
@app.get("/devices/{device_id}/layout")
async def get_device_layout(device_id: str):
"""Gibt die layout-spezifischen Informationen für ein einzelnes Gerät zurück."""
layout = load_layout()
for room in layout.get("rooms", []):
for device in room.get("devices", []):
if device.get("device_id") == device_id:
# Rückgabe: Layout-Infos + Raumname
return {
"device_id": device_id,
"room": room.get("name"),
"title": device.get("title"),
"icon": device.get("icon"),
"rank": device.get("rank"),
}
raise HTTPException(status_code=404, detail="Device layout not found")
@app.on_event("startup")
async def startup_event():
@@ -462,6 +365,32 @@ async def publish_mqtt(topic: str, payload: dict[str, Any]) -> None:
await client.publish(topic, message, qos=1)
@app.get("/devices/states")
async def get_device_states() -> dict[str, dict[str, Any]]:
"""Get current states of all devices from in-memory cache.
Returns:
dict: Dictionary mapping device_id to state payload
"""
logger.debug("Fetching all device states")
return device_states
@app.get("/devices/{device_id}")
async def get_device(device_id: str) -> DeviceInfo:
logger.debug(f"Fetching info for device {device_id}")
devices = load_devices()
device = next((d for d in devices if d["device_id"] == device_id), None)
if not device:
raise HTTPException(status_code=404, detail="Device not found")
return DeviceInfo(
device_id=device["device_id"],
type=device["type"],
name=device.get("name", device["device_id"]),
features=device.get("features", {})
)
@app.get("/devices")
async def get_devices() -> list[DeviceInfo]:
"""Get list of available devices.
@@ -469,6 +398,7 @@ async def get_devices() -> list[DeviceInfo]:
Returns:
list: List of device information including features
"""
logger.debug("Fetching list of devices")
devices = load_devices()
return [
DeviceInfo(
@@ -481,15 +411,6 @@ async def get_devices() -> list[DeviceInfo]:
]
@app.get("/devices/states")
async def get_device_states() -> dict[str, dict[str, Any]]:
"""Get current states of all devices from in-memory cache.
Returns:
dict: Dictionary mapping device_id to state payload
"""
return device_states
@app.get("/layout")
async def get_layout() -> dict[str, Any]:

View File

@@ -77,6 +77,58 @@ async def index(request: Request) -> HTMLResponse:
return await dashboard(request)
@app.get("/rooms", response_class=HTMLResponse)
async def rooms(request: Request) -> HTMLResponse:
"""Render the rooms overview page.
Args:
request: The FastAPI request object
Returns:
HTMLResponse: Rendered rooms template
"""
return templates.TemplateResponse("rooms.html", {
"request": request,
"api_base": API_BASE
})
@app.get("/room/{room_name}", response_class=HTMLResponse)
async def room_detail(request: Request, room_name: str) -> HTMLResponse:
"""Render the room detail page with devices.
Args:
request: The FastAPI request object
room_name: Name of the room to display
Returns:
HTMLResponse: Rendered room template
"""
return templates.TemplateResponse("room.html", {
"request": request,
"api_base": API_BASE,
"room_name": room_name
})
@app.get("/device/{device_id}", response_class=HTMLResponse)
async def device_detail(request: Request, device_id: str) -> HTMLResponse:
"""Render the device detail page with controls.
Args:
request: The FastAPI request object
device_id: ID of the device to display
Returns:
HTMLResponse: Rendered device template
"""
return templates.TemplateResponse("device.html", {
"request": request,
"api_base": API_BASE,
"device_id": device_id
})
@app.get("/dashboard", response_class=HTMLResponse)
async def dashboard(request: Request) -> HTMLResponse:
"""Render the dashboard with rooms and devices.

188
apps/ui/redesign_ui.txt Normal file
View File

@@ -0,0 +1,188 @@
/**
Copilot-Aufgabe: Erzeuge eine neue Home-Dashboard-Seite mit Raum-Kacheln.
Ziel:
Die Seite soll alle Räume als kleine Kacheln darstellen. Auf dem iPhone
sollen immer zwei Kacheln nebeneinander passen. Jede Kachel zeigt:
- Raumname
- Icon (z. B. Wohnzimmer, Küche, Bad, etc.) basierend auf room_id oder einem Mapping
- Anzahl der Geräte im Raum
- Optional: Zusammenfassung wichtiger States (z.B. Anzahl offener Fenster, aktive Lichter)
Datenquelle:
- GET /layout → { "rooms": [{ "name": "...", "devices": [...] }] }
(Achtung: rooms ist ein Array, kein Dictionary!)
- GET /devices → Geräteliste für Feature-Checks
Interaktion:
- Beim Klick/Touch auf eine Raum-Kachel → Navigation zu /room/{room_name}
Layout-Anforderungen:
- 2-Spalten-Grid auf kleinen Screens (max-width ~ 600px)
- 34 Spalten auf größeren Screens
- Kachelgröße kompakt (ca. 140px x 110px)
- Icon ~32px
- Text ~1416px
- Responsive via CSS-Grid oder Flexbox
- Minimaler Einsatz von Tailwind (bevorzugt vanilla CSS)
Akzeptanzkriterien:
- Die Seite lädt alle Räume über die API (fetch).
- Räume werden in der Reihenfolge aus layout.yaml angezeigt.
- Jede Kachel zeigt: Icon + Raumname + Geräteanzahl.
- iPhone-Darstellung verifiziert: zwei Kacheln nebeneinander.
- Funktionierende Navigation zu /room/{room_name}.
- Die Komponente ist vollständig lauffähig.
- Fehlerbehandlung bei API-Fehlern implementiert.
*/
/**
Copilot-Aufgabe: Erzeuge eine Geräte-Grid-Ansicht für einen Raum.
Ziel:
Die Seite zeigt alle Geräte, die in diesem Raum laut layout.yaml liegen.
Die Darstellung erfolgt als kompakte Kacheln, ebenfalls 2 Spalten auf iPhone.
Datenquelle:
- GET /layout → Räume + device_id + title
- GET /devices → Typ + Features
- GET /devices/{id}/state (optional zur Initialisierung)
- Live-Updates: SSE /realtime
Auf einer Gerät-Kachel sollen erscheinen:
- passendes Icon (abhängig von type)
- title (aus layout)
- wichtigste Eigenschaft aus dem State:
- light: power on/off oder brightness in %
- thermostat: current temperature
- contact: open/closed
- temp_humidity: temperature und/oder humidity
- outlet: on/off
- cover: position %
Interaktion:
- Klick/Touch → Navigation zu /device/{device_id}
Akzeptanzkriterien:
- Der Raum wird anhand room_id aus der URL geladen.
- Geräte werden über Join(layout, devices) des Raums selektiert.
- Kacheln sind 2-spaltig auf iPhone.
- State wird initial geladen und per SSE aktualisiert.
- Navigation zu /device/{id} funktioniert.
- Icons passend zum Typ generiert.
*/
/**
Copilot-Aufgabe: Erzeuge eine Detailansicht für ein einzelnes Gerät.
Ziel:
Die Seite zeigt:
- Titel des Geräts (title aus layout)
- Raumname
- Gerätetyp
- State-Werte aus GET /devices/{id}/state
- Live-Updates via SSE
- Steuer-Elemente abhängig vom type + features:
- light: toggle, brightness-slider, optional color-picker
- thermostat: target-temp-slider
- outlet: toggle
- contact: nur Anzeige
- temp_humidity: nur Anzeigen von Temperatur/Humidity
- cover: position-slider und open/close/stop Buttons
API-Integration:
- Set-Kommandos senden via POST /devices/{id}/set
- Validierung: Nur unterstützte Features sichtbar machen
UI-Vorgaben:
- Kompakt, aber komplett
- Buttons gut für Touch erreichbar
- Slider in voller Breite
- Werte (temperature, humidity, battery) übersichtlich gruppiert
Akzeptanzkriterien:
- Device wird korrekt geladen (layout + devices + state).
- Steuerung funktioniert (light on/off, brightness, target temp etc.).
- SSE aktualisiert alle angezeigten Werte live.
- Fehler (z. B. POST /set nicht erreichbar) werden UI-seitig angezeigt.
*/
/**
Copilot-Aufgabe: Erzeuge einen API-Client für das UI.
Der Client soll bereitstellen:
- getLayout(): Layout-Daten
- getDevices(): Device-Basisdaten
- getDeviceState(device_id)
- setDeviceState(device_id, type, payload)
- connectRealtime(onEvent): SSE-Listener
Anforderungen:
- API_BASE aus .env oder UI-Konfiguration
- Fehlerbehandlung
- Timeout optional
- Types für:
- Room
- Device
- DeviceState
- RealtimeEvent
Akzeptanzkriterien:
- Der Client ist voll funktionsfähig und wird im UI genutzt.
- Ein Hook useRealtime(device_id) wird erzeugt.
- Ein Hook useRooms() and useDevices() existieren.
*/
/**
Copilot-Aufgabe: Erzeuge das UI-Routing.
Routen:
- "/" → Home (Räume)
- "/room/:roomId" → RoomView
- "/device/:deviceId" → DeviceView
Anforderungen:
- React Router v6 oder v7
- Layout-Komponente optional
- Loading/Fehlerzustände
- Responsive Verhalten beibehalten
Akzeptanzkriterien:
- Navigation funktioniert zwischen allen Seiten.
- Browser-Back funktioniert erwartungsgemäß.
- Routes unterstützen Refresh ohne Fehler.
*/
/**
Copilot-Aufgabe: Implementiere einen React-Hook useRealtime(deviceId: string | null).
Ziel:
- SSE-Stream /realtime abonnieren
- Nur Events für deviceId liefern
- onMessage → setState
- automatische Reconnects
- Fehlerlogging
Akzeptanz:
- Der Hook kann in RoomView & DeviceView genutzt werden.
- Live-Updates werden korrekt gemerged.
- Disconnect/Reload funktioniert sauber.
*/
/**
Copilot-Aufgabe: Erzeuge eine Icon-Komponente.
Ziel:
Basierend auf device.type und ggf. features ein passendes SVG ausliefern:
- light → Lightbulb
- thermostat → Thermostat
- contact → Door/Window-Sensor
- temp_humidity → Thermometer+Droplet
- outlet → Power-Plug
- cover → Blinds/Rollershutter
Akzeptanz:
- Icons skalieren sauber
- funktionieren in allen Kachel-Komponenten
*/

301
apps/ui/static/README.md Normal file
View File

@@ -0,0 +1,301 @@
# Home Automation API Client
Wiederverwendbare JavaScript-API-Client-Bibliothek für das Home Automation UI.
## Installation
Füge die folgenden Script-Tags in deine HTML-Seiten ein:
```html
<script src="/static/types.js"></script>
<script src="/static/api-client.js"></script>
```
## Konfiguration
Der API-Client nutzt `window.API_BASE`, das vom Backend gesetzt wird:
```javascript
window.API_BASE = '{{ api_base }}'; // Jinja2 template
```
## Verwendung
### Globale Instanz
Der API-Client erstellt automatisch eine globale Instanz `window.apiClient`:
```javascript
// Layout abrufen
const layout = await window.apiClient.getLayout();
// Geräte abrufen
const devices = await window.apiClient.getDevices();
// Gerätestatus abrufen
const state = await window.apiClient.getDeviceState('kitchen_light');
// Gerätesteuerung
await window.apiClient.setDeviceState('kitchen_light', 'light', {
power: true,
brightness: 80
});
```
### Verfügbare Methoden
#### `getLayout(): Promise<Layout>`
Lädt die Layout-Daten (Räume und ihre Geräte).
```javascript
const layout = await window.apiClient.getLayout();
// { rooms: [{name: "Küche", devices: ["kitchen_light", ...]}, ...] }
```
#### `getDevices(): Promise<Device[]>`
Lädt alle Geräte mit ihren Features.
```javascript
const devices = await window.apiClient.getDevices();
// [{device_id: "...", name: "...", type: "light", features: {...}}, ...]
```
#### `getDeviceState(deviceId): Promise<DeviceState>`
Lädt den aktuellen Status eines Geräts.
```javascript
const state = await window.apiClient.getDeviceState('kitchen_light');
// {power: true, brightness: 80, ...}
```
#### `getAllStates(): Promise<Object>`
Lädt alle Gerätestatus auf einmal.
```javascript
const states = await window.apiClient.getAllStates();
// {"kitchen_light": {power: true, ...}, "thermostat_1": {...}, ...}
```
#### `setDeviceState(deviceId, type, payload): Promise<void>`
Sendet einen Befehl an ein Gerät.
```javascript
// Licht einschalten
await window.apiClient.setDeviceState('kitchen_light', 'light', {
power: true,
brightness: 80
});
// Thermostat einstellen
await window.apiClient.setDeviceState('thermostat_1', 'thermostat', {
target_temp: 22.5
});
// Rollladen steuern
await window.apiClient.setDeviceState('cover_1', 'cover', {
position: 50
});
```
#### `getDeviceRoom(deviceId): Promise<{room: string}>`
Ermittelt den Raum eines Geräts.
```javascript
const { room } = await window.apiClient.getDeviceRoom('kitchen_light');
// {room: "Küche"}
```
#### `getScenes(): Promise<Scene[]>`
Lädt alle verfügbaren Szenen.
```javascript
const scenes = await window.apiClient.getScenes();
```
#### `activateScene(sceneId): Promise<void>`
Aktiviert eine Szene.
```javascript
await window.apiClient.activateScene('evening');
```
### Realtime-Updates (SSE)
#### `connectRealtime(onEvent, onError): EventSource`
Verbindet sich mit dem SSE-Stream für Live-Updates.
```javascript
window.apiClient.connectRealtime(
(event) => {
console.log('Update:', event.device_id, event.state);
// event = {device_id: "...", type: "state", state: {...}}
},
(error) => {
console.error('Connection error:', error);
}
);
```
#### `onDeviceUpdate(deviceId, callback): Function`
Registriert einen Listener für spezifische Geräte-Updates.
```javascript
// Für ein bestimmtes Gerät
const unsubscribe = window.apiClient.onDeviceUpdate('kitchen_light', (event) => {
console.log('Kitchen light changed:', event.state);
updateUI(event.state);
});
// Für alle Geräte
const unsubscribeAll = window.apiClient.onDeviceUpdate(null, (event) => {
console.log('Any device changed:', event.device_id, event.state);
});
// Später: Listener entfernen
unsubscribe();
```
#### `disconnectRealtime(): void`
Trennt die SSE-Verbindung und entfernt alle Listener.
```javascript
window.apiClient.disconnectRealtime();
```
### Helper-Methoden
#### `findDevice(devices, deviceId): Device|null`
Findet ein Gerät in einem Array.
```javascript
const devices = await window.apiClient.getDevices();
const device = window.apiClient.findDevice(devices, 'kitchen_light');
```
#### `findRoom(layout, roomName): Room|null`
Findet einen Raum im Layout.
```javascript
const layout = await window.apiClient.getLayout();
const room = window.apiClient.findRoom(layout, 'Küche');
```
#### `getDevicesForRoom(layout, devices, roomName): Device[]`
Gibt alle Geräte eines Raums zurück.
```javascript
const layout = await window.apiClient.getLayout();
const devices = await window.apiClient.getDevices();
const kitchenDevices = window.apiClient.getDevicesForRoom(layout, devices, 'Küche');
```
#### `api(path): string`
Konstruiert eine vollständige API-URL.
```javascript
const url = window.apiClient.api('/devices');
// "http://172.19.1.11:8001/devices"
```
### Backward Compatibility
Die globale `api()` Funktion ist weiterhin verfügbar:
```javascript
function api(url) {
return window.apiClient.api(url);
}
```
## Typen (JSDoc)
Die Datei `types.js` enthält JSDoc-Definitionen für alle API-Typen:
- `Room` - Raum mit Geräten
- `Layout` - Layout-Struktur
- `Device` - Gerätedaten
- `DeviceFeatures` - Geräte-Features
- `DeviceState` - Gerätestatus (Light, Thermostat, Contact, etc.)
- `RealtimeEvent` - SSE-Event-Format
- `Scene` - Szenen-Definition
- `*Payload` - Command-Payloads für verschiedene Gerätetypen
Diese ermöglichen IDE-Autocomplete und Type-Checking in modernen Editoren (VS Code, WebStorm).
## Beispiel: Vollständige Seite
```html
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>My Page</title>
<script src="/static/types.js"></script>
<script src="/static/api-client.js"></script>
</head>
<body>
<div id="status"></div>
<button id="toggle">Toggle Light</button>
<script>
window.API_BASE = 'http://172.19.1.11:8001';
const deviceId = 'kitchen_light';
async function init() {
// Load initial state
const state = await window.apiClient.getDeviceState(deviceId);
updateUI(state);
// Listen for updates
window.apiClient.onDeviceUpdate(deviceId, (event) => {
updateUI(event.state);
});
// Connect to realtime
window.apiClient.connectRealtime((event) => {
console.log('Event:', event);
});
// Handle button clicks
document.getElementById('toggle').onclick = async () => {
const currentState = await window.apiClient.getDeviceState(deviceId);
await window.apiClient.setDeviceState(deviceId, 'light', {
power: !currentState.power
});
};
}
function updateUI(state) {
document.getElementById('status').textContent =
state.power ? 'ON' : 'OFF';
}
init();
</script>
</body>
</html>
```
## Error Handling
Alle API-Methoden werfen Exceptions bei Fehlern:
```javascript
try {
const state = await window.apiClient.getDeviceState('invalid_id');
} catch (error) {
console.error('API error:', error);
showErrorMessage(error.message);
}
```
## Auto-Reconnect
Der SSE-Client versucht automatisch, nach 5 Sekunden wieder zu verbinden, wenn die Verbindung abbricht.
## Verwendete Technologien
- **Fetch API** - Für HTTP-Requests
- **EventSource** - Für Server-Sent Events
- **JSDoc** - Für Type Definitions
- **ES6+** - Modern JavaScript (Class, async/await, etc.)

View File

@@ -0,0 +1,278 @@
/**
* Home Automation API Client
*
* Provides a unified interface to interact with the backend API.
* All functions use the global window.API_BASE configuration.
*/
class HomeAutomationClient {
/**
* Get layout info for a specific device
* @param {string} deviceId - Device ID
* @returns {Promise<object>} Layout info
*/
async getDeviceLayout(deviceId) {
return await this.fetch(this.api(`/devices/${deviceId}/layout`));
}
constructor() {
this.eventSource = null;
this.eventListeners = [];
}
/**
* Helper to construct full API URLs
* Reads window.API_BASE at runtime to support dynamic configuration
* @param {string} path - API path (e.g., '/devices')
* @returns {string} Full URL
*/
api(path) {
const baseUrl = window.API_BASE || '';
return `${baseUrl}${path}`;
}
/**
* Generic fetch wrapper with error handling
* @param {string} url - URL to fetch
* @param {object} options - Fetch options
* @returns {Promise<any>} Response data
*/
async fetch(url, options = {}) {
try {
const response = await fetch(url, {
...options,
headers: {
'Content-Type': 'application/json',
...options.headers
}
});
if (!response.ok) {
throw new Error(`API error: ${response.status} ${response.statusText}`);
}
return await response.json();
} catch (error) {
console.error('API request failed:', error);
throw error;
}
}
/**
* Get layout data (rooms and their devices)
* @returns {Promise<{rooms: Array<{name: string, devices: string[]}>}>}
*/
async getLayout() {
return await this.fetch(this.api('/layout'));
}
/**
* Get all devices with their features
* @returns {Promise<Array<{device_id: string, name: string, type: string, features: object}>>}
*/
async getDevices() {
return await this.fetch(this.api('/devices'));
}
async getDevice(deviceId) {
return await this.fetch(this.api(`/devices/${deviceId}`));
}
/**
* Get current state of a specific device
* @param {string} deviceId - Device ID
* @returns {Promise<object>} Device state
*/
async getDeviceState(deviceId) {
return await this.fetch(this.api(`/devices/${deviceId}/state`));
}
/**
* Get all device states at once
* @returns {Promise<object>} Map of device_id to state
*/
async getAllStates() {
return await this.fetch(this.api('/devices/states'));
}
/**
* Send a command to a device
* @param {string} deviceId - Device ID
* @param {string} type - Device type (light, thermostat, etc.)
* @param {object} payload - Command payload
* @returns {Promise<void>}
*/
async setDeviceState(deviceId, type, payload) {
await fetch(this.api(`/devices/${deviceId}/set`), {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ type, payload })
});
}
/**
* Get room information for a device
* @param {string} deviceId - Device ID
* @returns {Promise<{room: string}>}
*/
async getDeviceRoom(deviceId) {
return await this.fetch(this.api(`/devices/${deviceId}/room`));
}
/**
* Get all available scenes
* @returns {Promise<Array<{scene_id: string, name: string, devices: object}>>}
*/
async getScenes() {
return await this.fetch(this.api('/scenes'));
}
/**
* Activate a scene
* @param {string} sceneId - Scene ID
* @returns {Promise<void>}
*/
async activateScene(sceneId) {
await fetch(this.api(`/scenes/${sceneId}/activate`), {
method: 'POST'
});
}
/**
* Connect to realtime event stream (SSE)
* @param {Function} onEvent - Callback function(event)
* @param {Function} onError - Error callback (optional)
* @returns {EventSource} EventSource instance
*/
connectRealtime(onEvent, onError = null) {
if (this.eventSource) {
this.eventSource.close();
}
this.eventSource = new EventSource(this.api('/realtime'));
this.eventSource.onmessage = (event) => {
try {
const data = JSON.parse(event.data);
// Normalize event format: convert API format to unified format
const normalizedEvent = {
device_id: data.device_id,
type: data.type,
state: data.payload || data.state // Support both formats
};
onEvent(normalizedEvent);
// Notify all registered listeners
this.eventListeners.forEach(listener => {
if (!listener.deviceId || listener.deviceId === normalizedEvent.device_id) {
listener.callback(normalizedEvent);
}
});
} catch (error) {
console.error('Failed to parse SSE event:', error);
}
};
this.eventSource.onerror = (error) => {
console.error('SSE connection error:', error);
if (onError) {
onError(error);
}
// Auto-reconnect after 5 seconds
setTimeout(() => {
if (this.eventSource) {
this.eventSource.close();
this.connectRealtime(onEvent, onError);
}
}, 5000);
};
return this.eventSource;
}
/**
* Register a listener for specific device updates
* @param {string|null} deviceId - Device ID or null for all devices
* @param {Function} callback - Callback function(event)
* @returns {Function} Unsubscribe function
*/
onDeviceUpdate(deviceId, callback) {
const listener = { deviceId, callback };
this.eventListeners.push(listener);
// Return unsubscribe function
return () => {
const index = this.eventListeners.indexOf(listener);
if (index > -1) {
this.eventListeners.splice(index, 1);
}
};
}
/**
* Disconnect from realtime stream
*/
disconnectRealtime() {
if (this.eventSource) {
this.eventSource.close();
this.eventSource = null;
}
this.eventListeners = [];
}
/**
* Helper: Get device by ID from devices array
* @param {Array} devices - Devices array
* @param {string} deviceId - Device ID to find
* @returns {object|null} Device object or null
*/
findDevice(devices, deviceId) {
return devices.find(d => d.device_id === deviceId) || null;
}
/**
* Helper: Get room by name from layout
* @param {object} layout - Layout object
* @param {string} roomName - Room name to find
* @returns {object|null} Room object or null
*/
findRoom(layout, roomName) {
return layout.rooms.find(r => r.name === roomName) || null;
}
/**
* Helper: Get devices for a specific room
* @param {object} layout - Layout object
* @param {Array} devices - Devices array
* @param {string} roomName - Room name
* @returns {Array} Array of device objects
*/
getDevicesForRoom(layout, devices, roomName) {
const room = this.findRoom(layout, roomName);
if (!room) return [];
const deviceMap = {};
devices.forEach(d => deviceMap[d.device_id] = d);
// Extract device IDs from room.devices (they are objects with device_id property)
const deviceIds = room.devices.map(d => d.device_id || d);
return deviceIds
.map(id => deviceMap[id])
.filter(d => d != null);
}
}
// Create global instance
window.apiClient = new HomeAutomationClient();
/**
* Convenience function for backward compatibility
*/
function api(url) {
return window.apiClient.api(url);
}

166
apps/ui/static/types.js Normal file
View File

@@ -0,0 +1,166 @@
/**
* Type definitions for Home Automation API
*
* These are JSDoc type definitions that provide IDE autocomplete
* and type checking in JavaScript files.
*/
/**
* @typedef {Object} Room
* @property {string} name - Room name (e.g., "Küche", "Wohnzimmer")
* @property {Array<{device_id: string, title: string, icon: string, rank: number}>} devices - Array of device objects in this room
*/
/**
* @typedef {Object} Layout
* @property {Room[]} rooms - Array of rooms with their devices
*/
/**
* @typedef {Object} DeviceFeatures
* @property {boolean} [dimmable] - Light: supports brightness control
* @property {boolean} [color_hsb] - Light: supports HSB color control
* @property {boolean} [color_temp] - Light: supports color temperature
* @property {number} [min_temp] - Thermostat: minimum temperature
* @property {number} [max_temp] - Thermostat: maximum temperature
* @property {number} [step] - Thermostat: temperature step size
*/
/**
* @typedef {Object} Device
* @property {string} device_id - Unique device identifier
* @property {string} name - Human-readable device name
* @property {string} type - Device type: light, thermostat, contact, temp_humidity_sensor, relay, outlet, cover
* @property {DeviceFeatures} features - Device-specific features
*/
/**
* @typedef {Object} LightState
* @property {boolean} power - On/off state
* @property {number} [brightness] - Brightness 0-100 (if dimmable)
* @property {Object} [color_hsb] - HSB color (if color_hsb)
* @property {number} color_hsb.hue - Hue 0-360
* @property {number} color_hsb.saturation - Saturation 0-100
* @property {number} color_hsb.brightness - Brightness 0-100
* @property {number} [color_temp] - Color temperature in mireds (if color_temp)
*/
/**
* @typedef {Object} ThermostatState
* @property {number} current_temp - Current temperature in °C
* @property {number} target_temp - Target temperature in °C
* @property {string} mode - Operating mode: heat, cool, auto, off
*/
/**
* @typedef {Object} ContactState
* @property {boolean} open - true if open, false if closed
*/
/**
* @typedef {Object} TempHumidityState
* @property {number} temperature - Temperature in °C
* @property {number} humidity - Relative humidity 0-100%
*/
/**
* @typedef {Object} RelayState
* @property {boolean} power - On/off state
*/
/**
* @typedef {Object} OutletState
* @property {boolean} power - On/off state
*/
/**
* @typedef {Object} CoverState
* @property {number} position - Position 0-100 (0=closed, 100=open)
* @property {string} state - State: open, closed, opening, closing, stopped
*/
/**
* @typedef {LightState|ThermostatState|ContactState|TempHumidityState|RelayState|OutletState|CoverState} DeviceState
*/
/**
* @typedef {Object} RealtimeEvent
* @property {string} device_id - Device that changed
* @property {string} type - Device type
* @property {DeviceState} state - New device state
*/
/**
* @typedef {Object} Scene
* @property {string} scene_id - Unique scene identifier
* @property {string} name - Human-readable scene name
* @property {Object<string, Object>} devices - Map of device_id to desired state
*/
/**
* @typedef {Object} LightPayload
* @property {boolean} [power] - Turn on/off
* @property {number} [brightness] - Set brightness 0-100
* @property {Object} [color_hsb] - Set HSB color
* @property {number} color_hsb.hue - Hue 0-360
* @property {number} color_hsb.saturation - Saturation 0-100
* @property {number} color_hsb.brightness - Brightness 0-100
*/
/**
* @typedef {Object} ThermostatPayload
* @property {number} [target_temp] - Set target temperature
* @property {string} [mode] - Set mode: heat, cool, auto, off
*/
/**
* @typedef {Object} RelayPayload
* @property {boolean} power - Turn on/off
*/
/**
* @typedef {Object} OutletPayload
* @property {boolean} power - Turn on/off
*/
/**
* @typedef {Object} CoverPayload
* @property {number} [position] - Set position 0-100
* @property {string} [action] - Action: open, close, stop
*/
/**
* Example usage:
*
* // Get layout data
* const layout = await window.apiClient.getLayout();
* // layout is typed as Layout
*
* // Get devices
* const devices = await window.apiClient.getDevices();
* // devices is typed as Device[]
*
* // Get device state
* const state = await window.apiClient.getDeviceState('kitchen_light');
* // state is typed as DeviceState
*
* // Set device state
* await window.apiClient.setDeviceState('kitchen_light', 'light', {
* power: true,
* brightness: 80
* });
*
* // Connect to realtime events
* window.apiClient.connectRealtime((event) => {
* console.log('Device update:', event.device_id, event.state);
* });
*
* // Listen to specific device
* const unsubscribe = window.apiClient.onDeviceUpdate('kitchen_light', (event) => {
* console.log('Kitchen light changed:', event.state);
* });
*
* // Later: cleanup
* unsubscribe();
* window.apiClient.disconnectRealtime();
*/

View File

@@ -0,0 +1,828 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Gerät - Home Automation</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
padding: 20px;
}
.container {
max-width: 600px;
margin: 0 auto;
}
.header {
background: rgba(255, 255, 255, 0.95);
border-radius: 12px;
padding: 20px;
margin-bottom: 20px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.back-button {
background: none;
border: none;
color: #667eea;
font-size: 16px;
cursor: pointer;
padding: 8px 0;
margin-bottom: 12px;
display: inline-block;
text-decoration: none;
}
.back-button:hover {
text-decoration: underline;
}
.device-icon {
font-size: 48px;
text-align: center;
margin-bottom: 12px;
}
h1 {
color: #333;
font-size: 24px;
margin-bottom: 8px;
text-align: center;
}
.device-meta {
color: #666;
font-size: 14px;
text-align: center;
margin-bottom: 4px;
}
.card {
background: rgba(255, 255, 255, 0.95);
border-radius: 12px;
padding: 20px;
margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.card-title {
font-size: 16px;
font-weight: 600;
color: #333;
margin-bottom: 16px;
}
.control-group {
margin-bottom: 20px;
}
.control-group:last-child {
margin-bottom: 0;
}
.control-label {
font-size: 14px;
color: #666;
margin-bottom: 8px;
display: block;
}
.toggle-button {
width: 100%;
padding: 16px;
border: none;
border-radius: 8px;
font-size: 18px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.toggle-button.on {
background: #34c759;
color: white;
}
.toggle-button.off {
background: #e0e0e0;
color: #666;
}
.toggle-button:active {
transform: scale(0.98);
}
.slider-container {
margin-bottom: 12px;
}
.slider {
width: 100%;
height: 40px;
-webkit-appearance: none;
appearance: none;
background: #e0e0e0;
outline: none;
border-radius: 20px;
padding: 0;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 32px;
height: 32px;
background: #667eea;
cursor: pointer;
border-radius: 50%;
border: 3px solid white;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
.slider::-moz-range-thumb {
width: 32px;
height: 32px;
background: #667eea;
cursor: pointer;
border-radius: 50%;
border: 3px solid white;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
.slider-value {
text-align: center;
font-size: 24px;
font-weight: 600;
color: #667eea;
margin-top: 8px;
}
.button-group {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
}
.control-button {
padding: 12px;
border: none;
border-radius: 8px;
background: #667eea;
color: white;
font-size: 16px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.control-button:active {
transform: scale(0.95);
}
.control-button:disabled {
background: #e0e0e0;
color: #999;
cursor: not-allowed;
}
.state-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 16px;
}
.state-item {
text-align: center;
}
.state-value {
font-size: 28px;
font-weight: 600;
color: #667eea;
margin-bottom: 4px;
}
.state-label {
font-size: 14px;
color: #666;
}
.state-badge {
display: inline-block;
padding: 8px 20px;
border-radius: 20px;
font-size: 16px;
font-weight: 600;
text-align: center;
}
.state-badge.open {
background: #ff9500;
color: white;
}
.state-badge.closed {
background: #34c759;
color: white;
}
.loading {
text-align: center;
color: white;
font-size: 18px;
padding: 40px;
}
.error {
background: rgba(255, 59, 48, 0.9);
color: white;
padding: 16px;
border-radius: 8px;
text-align: center;
margin-bottom: 20px;
}
.success {
background: rgba(52, 199, 89, 0.9);
color: white;
padding: 12px;
border-radius: 8px;
text-align: center;
margin-top: 12px;
font-size: 14px;
}
.color-picker {
width: 100%;
height: 60px;
border: none;
border-radius: 8px;
cursor: pointer;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<a href="#" id="back-button" class="back-button">← Zurück</a>
<div class="device-icon" id="device-icon">📱</div>
<h1 id="device-name">Gerät wird geladen...</h1>
<div class="device-meta" id="device-room"></div>
<div class="device-meta" id="device-type"></div>
</div>
<div id="error-container"></div>
<div id="loading" class="loading">Lade Gerät...</div>
<div id="controls-container" style="display: none;"></div>
</div>
<script>
// API configuration from backend
window.API_BASE = '{{ api_base }}';
</script>
<!-- Load API client AFTER API_BASE is set -->
<script src="/static/types.js"></script>
<script src="/static/api-client.js"></script>
<script>
// Get device ID from URL
const pathParts = window.location.pathname.split('/');
const deviceId = pathParts[pathParts.length - 1];
// Device data
let deviceData = null;
let deviceState = {};
let roomName = '';
// Device type icons
const deviceIcons = {
'light': '💡',
'thermostat': '🌡️',
'contact': '🚪',
'temp_humidity_sensor': '🌡️',
'relay': '🔌',
'outlet': '🔌',
'cover': '🪟'
};
async function loadDevice() {
const loading = document.getElementById('loading');
const controlsContainer = document.getElementById('controls-container');
const errorContainer = document.getElementById('error-container');
try {
// Load device info using API client
// NEW: Use new endpoints for device info and layout
deviceData = await window.apiClient.getDevice(deviceId);
console.log("Loaded device data:", deviceData);
deviceState = await window.apiClient.getDeviceState(deviceId);
console.log("Loaded device state:", deviceState);
const layoutInfo = await window.apiClient.getDeviceLayout(deviceId);
console.log("Loaded layout info:", layoutInfo);
roomName = layoutInfo.room;
// Update header
document.getElementById('device-icon').textContent = deviceIcons[deviceData.type] || '📱';
document.getElementById('device-name').textContent = deviceData.name;
document.getElementById('device-room').textContent = roomName || 'Kein Raum';
document.getElementById('device-type').textContent = getTypeLabel(deviceData.type);
// Set back button
document.getElementById('back-button').href = roomName ? `/room/${encodeURIComponent(roomName)}` : '/rooms';
// Render controls
loading.style.display = 'none';
controlsContainer.style.display = 'block';
renderControls(controlsContainer);
// Start SSE
connectRealtime();
} catch (error) {
console.error('Error loading device:', error);
loading.style.display = 'none';
errorContainer.innerHTML = `
<div class="error">
⚠️ Fehler beim Laden: ${error.message}
</div>
`;
}
}
function getTypeLabel(type) {
const labels = {
'light': 'Licht',
'thermostat': 'Thermostat',
'contact': 'Kontaktsensor',
'temp_humidity_sensor': 'Temperatur & Luftfeuchte',
'relay': 'Schalter',
'outlet': 'Steckdose',
'cover': 'Jalousie'
};
return labels[type] || type;
}
function renderControls(container) {
container.innerHTML = '';
switch (deviceData.type) {
case 'light':
renderLightControls(container);
break;
case 'thermostat':
renderThermostatControls(container);
break;
case 'relay':
case 'outlet':
renderOutletControls(container);
break;
case 'contact':
renderContactDisplay(container);
break;
case 'temp_humidity_sensor':
renderTempHumidityDisplay(container);
break;
case 'cover':
renderCoverControls(container);
break;
default:
container.innerHTML = '<div class="card">Keine Steuerung verfügbar</div>';
}
}
function renderLightControls(container) {
const card = document.createElement('div');
card.className = 'card';
card.innerHTML = '<div class="card-title">Steuerung</div>';
// Power toggle
const powerGroup = document.createElement('div');
powerGroup.className = 'control-group';
const powerButton = document.createElement('button');
powerButton.className = 'toggle-button ' + (deviceState.power === 'on' ? 'on' : 'off');
powerButton.textContent = deviceState.power === 'on' ? '💡 An' : '💡 Aus';
powerButton.onclick = () => togglePower();
powerGroup.appendChild(powerButton);
card.appendChild(powerGroup);
// Brightness slider (if supported)
if (deviceData.features?.brightness) {
const brightnessGroup = document.createElement('div');
brightnessGroup.className = 'control-group';
brightnessGroup.innerHTML = `
<label class="control-label">Helligkeit</label>
<div class="slider-container">
<input type="range" class="slider" id="brightness-slider" min="0" max="100" value="${deviceState.brightness || 0}">
<div class="slider-value" id="brightness-value">${deviceState.brightness || 0}%</div>
</div>
`;
card.appendChild(brightnessGroup);
setTimeout(() => {
const slider = document.getElementById('brightness-slider');
const valueDisplay = document.getElementById('brightness-value');
slider.oninput = (e) => {
valueDisplay.textContent = e.target.value + '%';
};
slider.onchange = (e) => {
setBrightness(parseInt(e.target.value));
};
}, 0);
}
// Color picker (if supported)
if (deviceData.features?.color_hsb) {
const colorGroup = document.createElement('div');
colorGroup.className = 'control-group';
colorGroup.innerHTML = `
<label class="control-label">Farbe</label>
<input type="color" class="color-picker" id="color-picker" value="#ffffff">
`;
card.appendChild(colorGroup);
setTimeout(() => {
const picker = document.getElementById('color-picker');
picker.onchange = (e) => {
setColor(e.target.value);
};
}, 0);
}
container.appendChild(card);
}
function renderThermostatControls(container) {
const card = document.createElement('div');
card.className = 'card';
// Current state display
const stateGrid = document.createElement('div');
stateGrid.className = 'state-grid';
stateGrid.innerHTML = `
<div class="state-item">
<div class="state-value" id="current-temp">${deviceState.current?.toFixed(1) || '--'}°C</div>
<div class="state-label">Aktuell</div>
</div>
<div class="state-item">
<div class="state-value" id="target-temp">${deviceState.target?.toFixed(1) || '--'}°C</div>
<div class="state-label">Ziel</div>
</div>
`;
card.appendChild(stateGrid);
// Target temperature slider
const sliderGroup = document.createElement('div');
sliderGroup.className = 'control-group';
sliderGroup.style.marginTop = '20px';
sliderGroup.innerHTML = `
<label class="control-label">Zieltemperatur</label>
<div class="slider-container">
<input type="range" class="slider" id="temp-slider" min="5" max="30" step="0.5" value="${deviceState.target || 21}">
<div class="slider-value" id="temp-value">${deviceState.target?.toFixed(1) || '21.0'}°C</div>
</div>
`;
card.appendChild(sliderGroup);
container.appendChild(card);
setTimeout(() => {
const slider = document.getElementById('temp-slider');
const valueDisplay = document.getElementById('temp-value');
slider.oninput = (e) => {
valueDisplay.textContent = parseFloat(e.target.value).toFixed(1) + '°C';
};
slider.onchange = (e) => {
setTargetTemp(parseFloat(e.target.value));
};
}, 0);
}
function renderOutletControls(container) {
const card = document.createElement('div');
card.className = 'card';
card.innerHTML = '<div class="card-title">Steuerung</div>';
const powerGroup = document.createElement('div');
powerGroup.className = 'control-group';
const powerButton = document.createElement('button');
powerButton.className = 'toggle-button ' + (deviceState.power === 'on' ? 'on' : 'off');
powerButton.textContent = deviceState.power === 'on' ? '🔌 An' : '🔌 Aus';
powerButton.onclick = () => togglePower();
powerGroup.appendChild(powerButton);
card.appendChild(powerGroup);
container.appendChild(card);
}
function renderContactDisplay(container) {
const card = document.createElement('div');
card.className = 'card';
card.innerHTML = '<div class="card-title">Status</div>';
const statusDiv = document.createElement('div');
statusDiv.style.textAlign = 'center';
const isOpen = deviceState.contact === 'open';
statusDiv.innerHTML = `
<div class="state-badge ${isOpen ? 'open' : 'closed'}" id="contact-status">
${isOpen ? 'Offen' : 'Geschlossen'}
</div>
`;
card.appendChild(statusDiv);
container.appendChild(card);
}
function renderTempHumidityDisplay(container) {
const card = document.createElement('div');
card.className = 'card';
card.innerHTML = '<div class="card-title">Messwerte</div>';
const stateGrid = document.createElement('div');
stateGrid.className = 'state-grid';
stateGrid.innerHTML = `
<div class="state-item">
<div class="state-value" id="temperature">${deviceState.temperature?.toFixed(1) || '--'}°C</div>
<div class="state-label">Temperatur</div>
</div>
<div class="state-item">
<div class="state-value" id="humidity">${deviceState.humidity || '--'}%</div>
<div class="state-label">Luftfeuchte</div>
</div>
`;
card.appendChild(stateGrid);
container.appendChild(card);
}
function renderCoverControls(container) {
const card = document.createElement('div');
card.className = 'card';
card.innerHTML = '<div class="card-title">Position</div>';
// Position slider
const sliderGroup = document.createElement('div');
sliderGroup.className = 'control-group';
sliderGroup.innerHTML = `
<div class="slider-container">
<input type="range" class="slider" id="position-slider" min="0" max="100" value="${deviceState.position || 0}">
<div class="slider-value" id="position-value">${deviceState.position || 0}%</div>
</div>
`;
card.appendChild(sliderGroup);
// Control buttons
const buttonGroup = document.createElement('div');
buttonGroup.className = 'button-group';
buttonGroup.style.marginTop = '16px';
buttonGroup.innerHTML = `
<button class="control-button" onclick="setCoverPosition(0)">Auf</button>
<button class="control-button" onclick="stopCover()">Stop</button>
<button class="control-button" onclick="setCoverPosition(100)">Zu</button>
`;
card.appendChild(buttonGroup);
container.appendChild(card);
setTimeout(() => {
const slider = document.getElementById('position-slider');
const valueDisplay = document.getElementById('position-value');
slider.oninput = (e) => {
valueDisplay.textContent = e.target.value + '%';
};
slider.onchange = (e) => {
setCoverPosition(parseInt(e.target.value));
};
}, 0);
}
// Control functions
async function togglePower() {
const newState = deviceState.power === 'on' ? 'off' : 'on';
await sendCommand({
type: deviceData.type,
payload: { power: newState }
});
}
async function setBrightness(value) {
await sendCommand({
type: 'light',
payload: { brightness: value }
});
}
async function setColor(hexColor) {
// Convert hex to HSB
const hsb = hexToHSB(hexColor);
await sendCommand({
type: 'light',
payload: {
hue: Math.round(hsb.h),
sat: Math.round(hsb.s)
}
});
}
async function setTargetTemp(value) {
await sendCommand({
type: 'thermostat',
payload: { target: value }
});
}
async function setCoverPosition(value) {
await sendCommand({
type: 'cover',
payload: { position: value }
});
}
async function stopCover() {
await sendCommand({
type: 'cover',
payload: { action: 'stop' }
});
}
async function sendCommand(payload) {
try {
await window.apiClient.setDeviceState(deviceId, deviceData.type, payload.payload);
showSuccess('Befehl gesendet');
} catch (error) {
console.error('Error sending command:', error);
showError('Fehler beim Senden: ' + error.message);
}
}
function showSuccess(message) {
const container = document.getElementById('controls-container');
const successDiv = document.createElement('div');
successDiv.className = 'success';
successDiv.textContent = '✓ ' + message;
container.appendChild(successDiv);
setTimeout(() => successDiv.remove(), 3000);
}
function showError(message) {
const container = document.getElementById('error-container');
container.innerHTML = `<div class="error">⚠️ ${message}</div>`;
setTimeout(() => container.innerHTML = '', 5000);
}
function hexToHSB(hex) {
const r = parseInt(hex.slice(1, 3), 16) / 255;
const g = parseInt(hex.slice(3, 5), 16) / 255;
const b = parseInt(hex.slice(5, 7), 16) / 255;
const max = Math.max(r, g, b);
const min = Math.min(r, g, b);
const diff = max - min;
let h = 0;
if (diff !== 0) {
if (max === r) h = ((g - b) / diff) % 6;
else if (max === g) h = (b - r) / diff + 2;
else h = (r - g) / diff + 4;
}
h = Math.round(h * 60);
if (h < 0) h += 360;
const s = max === 0 ? 0 : (diff / max) * 100;
return { h, s, b: max * 100 };
}
function connectRealtime() {
try {
// Use API client's realtime connection
window.apiClient.connectRealtime((event) => {
if (event.device_id === deviceId && event.state) {
deviceState = { ...deviceState, ...event.state };
updateUI();
}
}, (error) => {
console.error('SSE connection error:', error);
});
} catch (error) {
console.error('Failed to connect to realtime events:', error);
}
}
function updateUI() {
// Update based on device type
switch (deviceData.type) {
case 'light':
updateLightUI();
break;
case 'thermostat':
updateThermostatUI();
break;
case 'relay':
case 'outlet':
updateOutletUI();
break;
case 'contact':
updateContactUI();
break;
case 'temp_humidity_sensor':
updateTempHumidityUI();
break;
case 'cover':
updateCoverUI();
break;
}
}
function updateLightUI() {
const button = document.querySelector('.toggle-button');
if (button) {
button.className = 'toggle-button ' + (deviceState.power === 'on' ? 'on' : 'off');
button.textContent = deviceState.power === 'on' ? '💡 An' : '💡 Aus';
}
const brightnessSlider = document.getElementById('brightness-slider');
const brightnessValue = document.getElementById('brightness-value');
if (brightnessSlider && deviceState.brightness != null) {
brightnessSlider.value = deviceState.brightness;
brightnessValue.textContent = deviceState.brightness + '%';
}
}
function updateThermostatUI() {
const currentTemp = document.getElementById('current-temp');
const targetTemp = document.getElementById('target-temp');
const tempSlider = document.getElementById('temp-slider');
const tempValue = document.getElementById('temp-value');
if (currentTemp && deviceState.current != null) {
currentTemp.textContent = deviceState.current.toFixed(1) + '°C';
}
if (targetTemp && deviceState.target != null) {
targetTemp.textContent = deviceState.target.toFixed(1) + '°C';
}
if (tempSlider && deviceState.target != null) {
tempSlider.value = deviceState.target;
tempValue.textContent = deviceState.target.toFixed(1) + '°C';
}
}
function updateOutletUI() {
const button = document.querySelector('.toggle-button');
if (button) {
button.className = 'toggle-button ' + (deviceState.power === 'on' ? 'on' : 'off');
button.textContent = deviceState.power === 'on' ? '🔌 An' : '🔌 Aus';
}
}
function updateContactUI() {
const status = document.getElementById('contact-status');
if (status && deviceState.contact) {
const isOpen = deviceState.contact === 'open';
status.className = 'state-badge ' + (isOpen ? 'open' : 'closed');
status.textContent = isOpen ? 'Offen' : 'Geschlossen';
}
}
function updateTempHumidityUI() {
const temperature = document.getElementById('temperature');
const humidity = document.getElementById('humidity');
if (temperature && deviceState.temperature != null) {
temperature.textContent = deviceState.temperature.toFixed(1) + '°C';
}
if (humidity && deviceState.humidity != null) {
humidity.textContent = deviceState.humidity + '%';
}
}
function updateCoverUI() {
const slider = document.getElementById('position-slider');
const value = document.getElementById('position-value');
if (slider && deviceState.position != null) {
slider.value = deviceState.position;
value.textContent = deviceState.position + '%';
}
}
// Cleanup on page unload
window.addEventListener('beforeunload', () => {
window.apiClient.disconnectRealtime();
});
// Load device on page load
document.addEventListener('DOMContentLoaded', loadDevice);
</script>
</body>
</html>

465
apps/ui/templates/room.html Normal file
View File

@@ -0,0 +1,465 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ room_name }} - Home Automation</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
padding: 20px;
}
.container {
max-width: 1200px;
margin: 0 auto;
}
h1 {
color: #333;
font-size: 28px;
margin-bottom: 8px;
}
.header {
background: rgba(255, 255, 255, 0.95);
border-radius: 12px;
padding: 20px;
margin-bottom: 20px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.back-button {
background: none;
border: none;
color: #667eea;
font-size: 16px;
cursor: pointer;
padding: 8px 0;
margin-bottom: 12px;
display: inline-block;
text-decoration: none;
}
.back-button:hover {
text-decoration: underline;
}
.room-info {
color: #666;
font-size: 14px;
}
.devices-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 16px;
margin-bottom: 20px;
}
@media (min-width: 600px) {
.devices-grid {
grid-template-columns: repeat(3, 1fr);
}
}
@media (min-width: 900px) {
.devices-grid {
grid-template-columns: repeat(4, 1fr);
}
}
.device-card {
background: rgba(255, 255, 255, 0.95);
border-radius: 12px;
padding: 16px;
text-align: center;
cursor: pointer;
transition: all 0.2s ease;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
min-height: 110px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-decoration: none;
color: inherit;
width: 100%;
}
.device-card:hover {
transform: translateY(-4px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
}
.device-card:active {
transform: translateY(-2px);
}
.device-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 12px;
}
.device-icon {
font-size: 24px;
}
.device-title {
font-size: 14px;
font-weight: 600;
color: #333;
flex: 1;
line-height: 1.3;
}
.device-state {
margin-top: auto;
}
.state-primary {
font-size: 20px;
font-weight: 600;
color: #667eea;
margin-bottom: 4px;
}
.state-secondary {
font-size: 14px;
color: #666;
}
.state-badge {
display: inline-block;
padding: 4px 12px;
border-radius: 12px;
font-size: 13px;
font-weight: 500;
}
.state-badge.on {
background: #34c759;
color: white;
}
.state-badge.off {
background: #e0e0e0;
color: #666;
}
.state-badge.open {
background: #ff9500;
color: white;
}
.state-badge.closed {
background: #34c759;
color: white;
}
.loading {
text-align: center;
color: white;
font-size: 18px;
padding: 40px;
}
.error {
background: rgba(255, 59, 48, 0.9);
color: white;
padding: 16px;
border-radius: 8px;
text-align: center;
margin-bottom: 20px;
}
.no-devices {
background: rgba(255, 255, 255, 0.95);
border-radius: 12px;
padding: 40px;
text-align: center;
color: #666;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<a href="/rooms" class="back-button">← Zurück zu Räumen</a>
<h1 id="room-name">Raum wird geladen...</h1>
<div class="room-info" id="room-info"></div>
</div>
<div id="error-container"></div>
<div id="loading" class="loading">Lade Geräte...</div>
<div id="devices-grid" class="devices-grid" style="display: none;"></div>
<div id="no-devices" class="no-devices" style="display: none;">
Keine Geräte in diesem Raum gefunden.
</div>
</div>
<script>
// API configuration from backend
window.API_BASE = '{{ api_base }}';
</script>
<!-- Load API client AFTER API_BASE is set -->
<script src="/static/types.js"></script>
<script src="/static/api-client.js"></script>
<script>
// Get room name from URL
const pathParts = window.location.pathname.split('/');
const roomName = decodeURIComponent(pathParts[pathParts.length - 1]);
// Device type to icon mapping
const deviceIcons = {
'light': '💡',
'thermostat': '🌡️',
'contact': '🚪',
'temp_humidity_sensor': '🌡️',
'relay': '💡',
'outlet': '💡',
'cover': '🪟'
};
// Device states
const deviceStates = {};
async function loadRoom() {
const loading = document.getElementById('loading');
const grid = document.getElementById('devices-grid');
const noDevices = document.getElementById('no-devices');
const errorContainer = document.getElementById('error-container');
const roomNameEl = document.getElementById('room-name');
const roomInfoEl = document.getElementById('room-info');
try {
// Load layout and devices using API client
// NEW: Use device layout endpoint for each device in this room
const layoutData = await window.apiClient.getLayout();
const devicesData = await window.apiClient.getDevices();
// Example: For each device in room.devices, you could fetch layout info via
// await window.apiClient.fetch(window.apiClient.api(`/devices/${device_id}/layout`));
console.log('Room name from URL:', roomName);
console.log('Available rooms:', layoutData.rooms.map(r => r.name));
console.log('Total devices:', devicesData.length);
// Find the room using API client helper
const room = window.apiClient.findRoom(layoutData, roomName);
if (!room) {
console.error('Room not found:', roomName);
throw new Error(`Raum "${roomName}" nicht gefunden`);
}
console.log('Found room:', room);
console.log('Room devices:', room.devices);
// Update header
roomNameEl.textContent = room.name;
roomInfoEl.textContent = `${room.devices.length} Gerät${room.devices.length !== 1 ? 'e' : ''}`;
// Create device lookup
const deviceMap = {};
devicesData.forEach(device => {
deviceMap[device.device_id] = device;
});
// Extract device IDs from room devices (they are objects now)
const deviceIds = room.devices.map(d => d.device_id);
console.log('Device IDs from room:', deviceIds);
// Filter devices for this room
const roomDevices = deviceIds
.map(deviceId => deviceMap[deviceId])
.filter(device => device != null);
console.log('Filtered room devices:', roomDevices);
loading.style.display = 'none';
if (roomDevices.length === 0) {
noDevices.style.display = 'block';
return;
}
// Lade nur die States für die Geräte im aktuellen Raum
for (const device of roomDevices) {
try {
deviceStates[device.device_id] = await window.apiClient.getDeviceState(device.device_id);
} catch (err) {
deviceStates[device.device_id] = null;
}
}
// Render devices
grid.style.display = 'grid';
roomDevices.forEach(device => {
const card = createDeviceCard(device);
grid.appendChild(card);
});
// Start SSE for live updates
connectRealtime();
} catch (error) {
console.error('Error loading room:', error);
loading.style.display = 'none';
errorContainer.innerHTML = `
<div class="error">
⚠️ Fehler beim Laden: ${error.message}
</div>
`;
}
}
function createDeviceCard(device) {
const card = document.createElement('a');
card.className = 'device-card';
card.href = `/device/${device.device_id}`;
card.dataset.deviceId = device.device_id;
const header = document.createElement('div');
header.className = 'device-header';
const icon = document.createElement('div');
icon.className = 'device-icon';
icon.textContent = deviceIcons[device.type] || '📱';
const title = document.createElement('div');
title.className = 'device-title';
title.textContent = device.name;
header.appendChild(icon);
header.appendChild(title);
const stateDiv = document.createElement('div');
stateDiv.className = 'device-state';
updateDeviceCardState(stateDiv, device);
card.appendChild(header);
card.appendChild(stateDiv);
return card;
}
function updateDeviceCardState(stateDiv, device) {
const state = deviceStates[device.device_id];
if (!state) {
stateDiv.innerHTML = '<div class="state-secondary">Status unbekannt</div>';
return;
}
let html = '';
switch (device.type) {
case 'light':
if (state.power) {
const powerState = state.power === 'on';
html = `<span class="state-badge ${powerState ? 'on' : 'off'}">${powerState ? 'An' : 'Aus'}</span>`;
if (powerState && state.brightness != null) {
html += `<div class="state-secondary">${state.brightness}% Helligkeit</div>`;
}
}
break;
case 'thermostat':
if (state.current != null) {
html = `<div class="state-primary">${state.target.toFixed(1)}°C</div>`;
if (state.target != null) {
html += `<div class="state-secondary">Ist: ${state.current}°C</div>`;
}
}
break;
case 'contact':
if (state.contact != null) {
const isOpen = state.contact === 'open';
html = `<span class="state-badge ${isOpen ? 'open' : 'closed'}">${isOpen ? 'Offen' : 'Geschlossen'}</span>`;
}
break;
case 'temp_humidity_sensor':
if (state.temperature != null) {
html = `<div class="state-primary">${state.temperature.toFixed(1)}°C</div>`;
if (state.humidity != null) {
html += `<div class="state-secondary">${state.humidity}% Luftfeuchte</div>`;
}
}
break;
case 'relay':
case 'outlet':
if (state.power) {
const powerState = state.power === 'on';
html = `<span class="state-badge ${powerState ? 'on' : 'off'}">${powerState ? 'An' : 'Aus'}</span>`;
}
break;
case 'cover':
if (state.position != null) {
html = `<div class="state-primary">${state.position}%</div>`;
html += `<div class="state-secondary">Position</div>`;
}
break;
default:
html = '<div class="state-secondary">Kein Status</div>';
}
stateDiv.innerHTML = html;
}
function connectRealtime() {
try {
// Use API client's connectRealtime method
window.apiClient.connectRealtime((event) => {
// Update device state
if (event.device_id && event.state) {
deviceStates[event.device_id] = event.state;
// Update card if visible
const card = document.querySelector(`[data-device-id="${event.device_id}"]`);
if (card) {
const stateDiv = card.querySelector('.device-state');
window.apiClient.getDevices().then(devices => {
const device = window.apiClient.findDevice(devices, event.device_id);
if (device) {
updateDeviceCardState(stateDiv, device);
}
});
}
}
}, (error) => {
console.error('SSE connection error:', error);
});
} catch (error) {
console.error('Failed to connect to realtime events:', error);
}
}
// Cleanup on page unload
window.addEventListener('beforeunload', () => {
window.apiClient.disconnectRealtime();
});
// Load room on page load
document.addEventListener('DOMContentLoaded', loadRoom);
</script>
</body>
</html>

View File

@@ -0,0 +1,310 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Räume - Home Automation</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
padding: 20px;
}
.container {
max-width: 1200px;
margin: 0 auto;
}
h1 {
color: white;
font-size: 28px;
margin-bottom: 24px;
text-align: center;
}
.rooms-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 16px;
margin-bottom: 20px;
}
@media (min-width: 600px) {
.rooms-grid {
grid-template-columns: repeat(3, 1fr);
}
}
@media (min-width: 900px) {
.rooms-grid {
grid-template-columns: repeat(4, 1fr);
}
}
.room-card {
background: rgba(255, 255, 255, 0.95);
border-radius: 12px;
padding: 16px;
text-align: center;
cursor: pointer;
transition: all 0.2s ease;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
min-height: 110px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-decoration: none;
color: inherit;
}
.room-card:hover {
transform: translateY(-4px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
}
.room-card:active {
transform: translateY(-2px);
}
.room-icon {
font-size: 32px;
margin-bottom: 8px;
}
.room-name {
font-size: 16px;
font-weight: 600;
color: #333;
margin-bottom: 4px;
}
.room-device-count {
font-size: 14px;
color: #666;
}
.room-stats {
font-size: 12px;
color: #999;
margin-top: 4px;
}
.loading {
text-align: center;
color: white;
font-size: 18px;
padding: 40px;
}
.error {
background: rgba(255, 59, 48, 0.9);
color: white;
padding: 16px;
border-radius: 8px;
text-align: center;
margin-bottom: 20px;
}
.back-button {
position: fixed;
top: 20px;
left: 20px;
background: rgba(255, 255, 255, 0.9);
color: #667eea;
border: none;
padding: 10px 20px;
border-radius: 8px;
font-size: 16px;
cursor: pointer;
text-decoration: none;
display: inline-block;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.back-button:hover {
background: white;
}
</style>
</head>
<body>
<a href="/" class="back-button">← Dashboard</a>
<div class="container">
<h1>🏠 Räume</h1>
<div id="error-container"></div>
<div id="loading" class="loading">Lade Räume...</div>
<div id="rooms-grid" class="rooms-grid" style="display: none;"></div>
</div>
<script>
// API configuration from backend
window.API_BASE = '{{ api_base }}';
</script>
<!-- Load API client AFTER API_BASE is set -->
<script src="/static/types.js"></script>
<script src="/static/api-client.js"></script>
<script>
// Room icon mapping
const roomIcons = {
'wohnzimmer': '🛋️',
'küche': '🍳',
'kueche': '🍳',
'schlafzimmer': '🛏️',
'bad': '🚿',
'badezimmer': '🚿',
'bad oben': '🚿',
'bad unten': '🚿',
'flur': '🚪',
'büro': '💼',
'buero': '💼',
'arbeitszimmer': '💼',
'studierzimmer': '📚',
'esszimmer': '🍽️',
'garten': '🌳',
'terrasse': '🌿',
'garage': '🚗',
'keller': '🔧',
'dachboden': '📦',
'kinderzimmer': '🧸',
'patty': '👤',
'wolfgang': '👤',
'default': '🏡'
};
function getRoomIcon(roomName) {
const normalized = roomName.toLowerCase().trim();
return roomIcons[normalized] || roomIcons['default'];
}
async function loadRooms() {
const loading = document.getElementById('loading');
const grid = document.getElementById('rooms-grid');
const errorContainer = document.getElementById('error-container');
try {
// Load layout and devices using API client
// NEW: Use device layout endpoint for each device
// Fallback: load all rooms as before
const layoutData = await window.apiClient.getLayout();
const devicesData = await window.apiClient.getDevices();
// Example: For each device, you could also fetch layout info via
// await window.apiClient.fetch(window.apiClient.api(`/devices/${device_id}/layout`));
// Create device lookup
const deviceMap = {};
devicesData.forEach(device => {
deviceMap[device.device_id] = device;
});
// Render rooms
loading.style.display = 'none';
grid.style.display = 'grid';
layoutData.rooms.forEach(room => {
const card = createRoomCard(room, deviceMap);
grid.appendChild(card);
});
} catch (error) {
console.error('Error loading rooms:', error);
loading.style.display = 'none';
errorContainer.innerHTML = `
<div class="error">
⚠️ Fehler beim Laden der Räume: ${error.message}
</div>
`;
}
}
function createRoomCard(room, deviceMap) {
const card = document.createElement('a');
card.className = 'room-card';
card.href = `/room/${encodeURIComponent(room.name)}`;
const icon = document.createElement('div');
icon.className = 'room-icon';
icon.textContent = getRoomIcon(room.name);
const name = document.createElement('div');
name.className = 'room-name';
name.textContent = room.name;
const deviceCount = document.createElement('div');
deviceCount.className = 'room-device-count';
deviceCount.textContent = `${room.devices.length} Gerät${room.devices.length !== 1 ? 'e' : ''}`;
// Optional: Calculate stats (lights on, windows open, etc.)
const stats = calculateRoomStats(room.devices, deviceMap);
if (stats) {
const statsDiv = document.createElement('div');
statsDiv.className = 'room-stats';
statsDiv.textContent = stats;
card.appendChild(icon);
card.appendChild(name);
card.appendChild(deviceCount);
card.appendChild(statsDiv);
} else {
card.appendChild(icon);
card.appendChild(name);
card.appendChild(deviceCount);
}
return card;
}
function calculateRoomStats(roomDevices, deviceMap) {
// Extract device IDs from room devices (they are objects now)
const deviceIds = roomDevices.map(d => d.device_id || d);
// Count device types
let lights = 0;
let thermostats = 0;
let contacts = 0;
let sensors = 0;
deviceIds.forEach(deviceId => {
const device = deviceMap[deviceId];
if (!device) return;
switch(device.type) {
case 'light':
lights++;
break;
case 'thermostat':
thermostats++;
break;
case 'contact':
contacts++;
break;
case 'temp_humidity_sensor':
sensors++;
break;
}
});
// Build compact stats string
const parts = [];
if (lights > 0) parts.push(`💡${lights}`);
if (thermostats > 0) parts.push(`🌡️${thermostats}`);
if (contacts > 0) parts.push(`🚪${contacts}`);
return parts.length > 0 ? parts.join(' ') : null;
}
// Load rooms on page load
document.addEventListener('DOMContentLoaded', loadRooms);
</script>
</body>
</html>

View File

@@ -11,6 +11,7 @@ redis:
channel: "ui:updates"
devices:
- device_id: lampe_semeniere_wohnzimmer
name: Semeniere
type: relay
cap_version: "relay@1.0.0"
technology: zigbee2mqtt
@@ -25,6 +26,7 @@ devices:
model: "AC10691"
vendor: "OSRAM"
- device_id: stehlampe_esszimmer_spiegel
name: Stehlampe Spiegel
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -35,6 +37,7 @@ devices:
state: "zigbee2mqtt/0x001788010d06ea09"
set: "zigbee2mqtt/0x001788010d06ea09/set"
- device_id: stehlampe_esszimmer_schrank
name: Stehlampe Schrank
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -45,6 +48,7 @@ devices:
state: "zigbee2mqtt/0x001788010d09176c"
set: "zigbee2mqtt/0x001788010d09176c/set"
- device_id: grosse_lampe_wohnzimmer
name: grosse Lampe
type: relay
cap_version: "relay@1.0.0"
technology: zigbee2mqtt
@@ -59,6 +63,7 @@ devices:
model: "AC10691"
vendor: "OSRAM"
- device_id: lampe_naehtischchen_wohnzimmer
name: Nähtischchen
type: relay
cap_version: "relay@1.0.0"
technology: zigbee2mqtt
@@ -72,21 +77,8 @@ devices:
ieee_address: "0x842e14fffee560ee"
model: "HG06337"
vendor: "Lidl"
- device_id: kleine_lampe_rechts_esszimmer
type: relay
cap_version: "relay@1.0.0"
technology: zigbee2mqtt
features:
power: true
topics:
state: "zigbee2mqtt/0xf0d1b80000156645"
set: "zigbee2mqtt/0xf0d1b80000156645/set"
metadata:
friendly_name: "kleine Lampe rechts Esszimmer"
ieee_address: "0xf0d1b80000156645"
model: "AC10691"
vendor: "OSRAM"
- device_id: kleine_lampe_links_esszimmer
name: kleine Lampe
type: relay
cap_version: "relay@1.0.0"
technology: zigbee2mqtt
@@ -101,6 +93,7 @@ devices:
model: "AC10691"
vendor: "OSRAM"
- device_id: leselampe_esszimmer
name: Leselampe
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -116,6 +109,7 @@ devices:
model: "LED1842G3"
vendor: "IKEA"
- device_id: medusalampe_schlafzimmer
name: Medusa-Lampe
type: relay
cap_version: "relay@1.0.0"
technology: zigbee2mqtt
@@ -131,6 +125,7 @@ devices:
vendor: "OSRAM"
- device_id: sportlicht_am_fernseher_studierzimmer
type: light
name: am Fernseher
cap_version: "light@1.2.0"
technology: zigbee2mqtt
features:
@@ -146,6 +141,7 @@ devices:
model: "LED1733G7"
vendor: "IKEA"
- device_id: deckenlampe_schlafzimmer
name: Deckenlampe
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -161,6 +157,7 @@ devices:
model: "8718699688882"
vendor: "Philips"
- device_id: bettlicht_wolfgang
name: Bettlicht Wolfgang
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -176,6 +173,7 @@ devices:
model: "9290020399"
vendor: "Philips"
- device_id: bettlicht_patty
name: Bettlicht Patty
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -191,6 +189,7 @@ devices:
model: "9290020399"
vendor: "Philips"
- device_id: schranklicht_hinten_patty
name: Schranklicht hinten
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -206,6 +205,7 @@ devices:
model: "8718699673147"
vendor: "Philips"
- device_id: schranklicht_vorne_patty
name: Schranklicht vorne
type: relay
cap_version: "relay@1.0.0"
technology: zigbee2mqtt
@@ -220,6 +220,7 @@ devices:
model: "AC10691"
vendor: "OSRAM"
- device_id: leselampe_patty
name: Leselampe
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -235,6 +236,7 @@ devices:
model: "8718699673147"
vendor: "Philips"
- device_id: deckenlampe_esszimmer
name: Deckenlampe
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -249,23 +251,8 @@ devices:
ieee_address: "0x0017880108a03e45"
model: "929002241201"
vendor: "Philips"
- device_id: standlampe_esszimmer
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
features:
power: true
brightness: true
color_temperature: true
topics:
state: "zigbee2mqtt/0xbc33acfffe21f547"
set: "zigbee2mqtt/0xbc33acfffe21f547/set"
metadata:
friendly_name: "Standlampe Esszimmer"
ieee_address: "0xbc33acfffe21f547"
model: "LED1732G11"
vendor: "IKEA"
- device_id: haustuer
name: Haustür-Lampe
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -281,6 +268,7 @@ devices:
model: "LED1842G3"
vendor: "IKEA"
- device_id: deckenlampe_flur_oben
name: Deckenlampe oben
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -297,6 +285,7 @@ devices:
model: "929003099001"
vendor: "Philips"
- device_id: kueche_deckenlampe
name: Deckenlampe
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -312,6 +301,7 @@ devices:
model: "929002469202"
vendor: "Philips"
- device_id: sportlicht_tisch
name: am Tisch
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -327,6 +317,7 @@ devices:
model: "4058075729063"
vendor: "LEDVANCE"
- device_id: sportlicht_regal
name: am Regal
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -342,6 +333,7 @@ devices:
model: "4058075729063"
vendor: "LEDVANCE"
- device_id: licht_flur_oben_am_spiegel
name: Spiegel
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -358,6 +350,7 @@ devices:
model: "LED1732G11"
vendor: "IKEA"
- device_id: experimentlabtest
name: Test Lampe
type: light
cap_version: "light@1.2.0"
technology: zigbee2mqtt
@@ -373,6 +366,7 @@ devices:
model: "4058075208421"
vendor: "LEDVANCE"
- device_id: thermostat_wolfgang
name: Heizung
type: thermostat
cap_version: "thermostat@1.0.0"
technology: zigbee2mqtt
@@ -391,6 +385,7 @@ devices:
model: "GS361A-H04"
vendor: "Siterwell"
- device_id: thermostat_kueche
name: Heizung
type: thermostat
cap_version: "thermostat@1.0.0"
technology: zigbee2mqtt
@@ -409,6 +404,7 @@ devices:
model: "GS361A-H04"
vendor: "Siterwell"
- device_id: thermostat_schlafzimmer
name: Heizung
type: thermostat
cap_version: "thermostat@1.0.0"
technology: max
@@ -427,6 +423,7 @@ devices:
peer_id: "42"
channel: "1"
- device_id: thermostat_esszimmer
name: Heizung
type: thermostat
cap_version: "thermostat@1.0.0"
technology: max
@@ -445,6 +442,7 @@ devices:
peer_id: "45"
channel: "1"
- device_id: thermostat_wohnzimmer
name: Heizung
type: thermostat
cap_version: "thermostat@1.0.0"
technology: max
@@ -463,6 +461,7 @@ devices:
peer_id: "46"
channel: "1"
- device_id: thermostat_patty
name: Heizung
type: thermostat
cap_version: "thermostat@1.0.0"
technology: max
@@ -481,6 +480,7 @@ devices:
peer_id: "39"
channel: "1"
- device_id: thermostat_bad_oben
name: Heizung
type: thermostat
cap_version: "thermostat@1.0.0"
technology: max
@@ -499,6 +499,7 @@ devices:
peer_id: "41"
channel: "1"
- device_id: thermostat_bad_unten
name: Heizung
type: thermostat
cap_version: "thermostat@1.0.0"
technology: max
@@ -517,6 +518,7 @@ devices:
peer_id: "48"
channel: "1"
- device_id: sterne_wohnzimmer
name: Sterne
type: relay
cap_version: "relay@1.0.0"
technology: zigbee2mqtt
@@ -531,8 +533,8 @@ devices:
model: "AC10691"
vendor: "OSRAM"
- device_id: kontakt_schlafzimmer_strasse
name: Fenster
type: contact
name: Kontakt Schlafzimmer Straße
cap_version: contact_sensor@1.0.0
technology: max
topics:
@@ -540,39 +542,39 @@ devices:
features: {}
- device_id: kontakt_esszimmer_strasse_rechts
type: contact
name: Kontakt Esszimmer Straße rechts
name: Fenster rechts
cap_version: contact_sensor@1.0.0
technology: max
topics:
state: homegear/instance1/plain/26/1/STATE
features: {}
- device_id: kontakt_esszimmer_strasse_links
name: Fenster links
type: contact
name: Kontakt Esszimmer Straße links
cap_version: contact_sensor@1.0.0
technology: max
topics:
state: homegear/instance1/plain/27/1/STATE
features: {}
- device_id: kontakt_wohnzimmer_garten_rechts
name: Fenster rechts
type: contact
name: Kontakt Wohnzimmer Garten rechts
cap_version: contact_sensor@1.0.0
technology: max
topics:
state: homegear/instance1/plain/28/1/STATE
features: {}
- device_id: kontakt_wohnzimmer_garten_links
name: Fenster links
type: contact
name: Kontakt Wohnzimmer Garten links
cap_version: contact_sensor@1.0.0
technology: max
topics:
state: homegear/instance1/plain/29/1/STATE
features: {}
- device_id: kontakt_kueche_garten_fenster
name: Fenster Garten
type: contact
name: Kontakt Küche Garten Fenster
cap_version: contact_sensor@1.0.0
technology: zigbee2mqtt
topics:
@@ -580,23 +582,23 @@ devices:
features: {}
- device_id: kontakt_kueche_garten_tuer
type: contact
name: Kontakt Küche Garten Tür
name: Terrassentür
cap_version: contact_sensor@1.0.0
technology: zigbee2mqtt
topics:
state: zigbee2mqtt/0x00158d008b332788
features: {}
- device_id: kontakt_kueche_strasse_rechts
name: Fenster Straße rechts
type: contact
name: Kontakt Küche Straße rechts
cap_version: contact_sensor@1.0.0
technology: zigbee2mqtt
topics:
state: zigbee2mqtt/0x00158d008b151803
features: {}
- device_id: kontakt_kueche_strasse_links
name: Fenster Straße links
type: contact
name: Kontakt Küche Straße links
cap_version: contact_sensor@1.0.0
technology: zigbee2mqtt
topics:
@@ -604,7 +606,7 @@ devices:
features: {}
- device_id: kontakt_patty_garten_rechts
type: contact
name: Kontakt Patty Garten rechts
name: Fenster Garten rechts
cap_version: contact_sensor@1.0.0
technology: max
topics:
@@ -612,7 +614,7 @@ devices:
features: {}
- device_id: kontakt_patty_garten_links
type: contact
name: Kontakt Patty Garten links
name: Fenster Garten links
cap_version: contact_sensor@1.0.0
technology: max
topics:
@@ -620,7 +622,7 @@ devices:
features: {}
- device_id: kontakt_patty_strasse
type: contact
name: Kontakt Patty Straße
name: Fenster Straße
cap_version: contact_sensor@1.0.0
technology: zigbee2mqtt
topics:
@@ -628,7 +630,7 @@ devices:
features: {}
- device_id: kontakt_wolfgang_garten
type: contact
name: Kontakt Wolfgang Garten
name: Fenster
cap_version: contact_sensor@1.0.0
technology: zigbee2mqtt
topics:
@@ -636,7 +638,7 @@ devices:
features: {}
- device_id: kontakt_bad_oben_strasse
type: contact
name: Kontakt Bad Oben Straße
name: Fenster
cap_version: contact_sensor@1.0.0
technology: zigbee2mqtt
topics:
@@ -644,7 +646,7 @@ devices:
features: {}
- device_id: kontakt_bad_unten_strasse
type: contact
name: Kontakt Bad Unten Straße
name: Fenster
cap_version: contact_sensor@1.0.0
technology: max
topics:
@@ -652,7 +654,7 @@ devices:
features: {}
- device_id: sensor_schlafzimmer
type: temp_humidity_sensor
name: Temperatur & Luftfeuchte
name: Thermometer
cap_version: temp_humidity_sensor@1.0.0
technology: zigbee2mqtt
topics:
@@ -660,7 +662,7 @@ devices:
features: {}
- device_id: sensor_wohnzimmer
type: temp_humidity_sensor
name: Temperatur & Luftfeuchte
name: Thermometer
cap_version: temp_humidity_sensor@1.0.0
technology: zigbee2mqtt
topics:
@@ -668,7 +670,7 @@ devices:
features: {}
- device_id: sensor_kueche
type: temp_humidity_sensor
name: Temperatur & Luftfeuchte
name: Thermometer
cap_version: temp_humidity_sensor@1.0.0
technology: zigbee2mqtt
topics:
@@ -676,7 +678,7 @@ devices:
features: {}
- device_id: sensor_arbeitszimmer_patty
type: temp_humidity_sensor
name: Temperatur & Luftfeuchte
name: Thermometer
cap_version: temp_humidity_sensor@1.0.0
technology: zigbee2mqtt
topics:
@@ -684,7 +686,7 @@ devices:
features: {}
- device_id: sensor_arbeitszimmer_wolfgang
type: temp_humidity_sensor
name: Temperatur & Luftfeuchte
name: Thermometer
cap_version: temp_humidity_sensor@1.0.0
technology: zigbee2mqtt
topics:
@@ -692,7 +694,7 @@ devices:
features: {}
- device_id: sensor_bad_oben
type: temp_humidity_sensor
name: Temperatur & Luftfeuchte
name: Thermometer
cap_version: temp_humidity_sensor@1.0.0
technology: zigbee2mqtt
topics:
@@ -700,7 +702,7 @@ devices:
features: {}
- device_id: sensor_bad_unten
type: temp_humidity_sensor
name: Temperatur & Luftfeuchte
name: Thermometer
cap_version: temp_humidity_sensor@1.0.0
technology: zigbee2mqtt
topics:
@@ -708,7 +710,7 @@ devices:
features: {}
- device_id: sensor_flur
type: temp_humidity_sensor
name: Temperatur & Luftfeuchte
name: Thermometer
cap_version: temp_humidity_sensor@1.0.0
technology: zigbee2mqtt
topics:
@@ -716,7 +718,7 @@ devices:
features: {}
- device_id: sensor_waschkueche
type: temp_humidity_sensor
name: Temperatur & Luftfeuchte
name: Thermometer
cap_version: temp_humidity_sensor@1.0.0
technology: zigbee2mqtt
topics:
@@ -724,13 +726,14 @@ devices:
features: {}
- device_id: sensor_sportzimmer
type: temp_humidity_sensor
name: Temperatur & Luftfeuchte
name: Thermometer
cap_version: temp_humidity_sensor@1.0.0
technology: zigbee2mqtt
topics:
state: zigbee2mqtt/0x00158d0009421422
features: {}
- device_id: licht_spuele_kueche
name: Spüle
type: relay
cap_version: "relay@1.0.0"
technology: shelly
@@ -740,6 +743,7 @@ devices:
set: "shellies/LightKitchenSink/relay/0/command"
state: "shellies/LightKitchenSink/relay/0"
- device_id: licht_schrank_esszimmer
name: Schrank
type: relay
cap_version: "relay@1.0.0"
technology: shelly
@@ -750,6 +754,7 @@ devices:
state: "shellies/schrankesszimmer/relay/0"
- device_id: licht_regal_wohnzimmer
type: relay
name: Regal
cap_version: "relay@1.0.0"
technology: shelly
features:
@@ -759,6 +764,7 @@ devices:
state: "shellies/wohnzimmer-regal/relay/0"
- device_id: licht_flur_schrank
type: relay
name: Schrank
cap_version: "relay@1.0.0"
technology: shelly
features:
@@ -767,6 +773,7 @@ devices:
set: "shellies/schrankflur/relay/0/command"
state: "shellies/schrankflur/relay/0"
- device_id: licht_terasse
name: Terrasse
type: relay
cap_version: "relay@1.0.0"
technology: shelly

View File

@@ -39,10 +39,10 @@ rooms:
title: Leselampe Esszimmer
icon: 💡
rank: 60
- device_id: standlampe_esszimmer
title: Standlampe Esszimmer
icon: 💡
rank: 70
# - device_id: standlampe_esszimmer
# title: Standlampe Esszimmer
# icon: 💡
# rank: 70
- device_id: kleine_lampe_links_esszimmer
title: kleine Lampe links Esszimmer
icon: 💡
@@ -55,10 +55,10 @@ rooms:
title: Stehlampe Esszimmer Schrank
icon: 💡
rank: 82
- device_id: kleine_lampe_rechts_esszimmer
title: kleine Lampe rechts Esszimmer
icon: 💡
rank: 90
# - device_id: kleine_lampe_rechts_esszimmer
# title: kleine Lampe rechts Esszimmer
# icon: 💡
# rank: 90
- device_id: licht_schrank_esszimmer
title: Schranklicht Esszimmer
icon: 💡

View File

@@ -0,0 +1,25 @@
abstraction | 2025-11-18 12:04:42,875 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/42/1/SET_TEMPERATURE: 21
abstraction | 2025-11-18 12:04:42,914 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/45/1/SET_TEMPERATURE: 15
abstraction | 2025-11-18 12:04:42,950 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/46/1/SET_TEMPERATURE: 15
abstraction | 2025-11-18 12:04:42,987 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/39/1/SET_TEMPERATURE: 22
abstraction | 2025-11-18 12:04:43,029 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/41/1/SET_TEMPERATURE: 20
abstraction | 2025-11-18 12:04:43,071 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/48/1/SET_TEMPERATURE: 21
abstraction | 2025-11-18 12:04:43,108 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/52/1/STATE: false
abstraction | 2025-11-18 12:04:43,145 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/26/1/STATE: false
abstraction | 2025-11-18 12:04:43,182 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/27/1/STATE: false
abstraction | 2025-11-18 12:04:43,219 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/28/1/STATE: false
abstraction | 2025-11-18 12:04:43,256 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/29/1/STATE: false
abstraction | 2025-11-18 12:04:43,292 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/18/1/STATE: false
abstraction | 2025-11-18 12:04:43,331 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/22/1/STATE: false
abstraction | 2025-11-18 12:04:43,368 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/44/1/STATE: false
abstraction | 2025-11-18 12:04:48,498 - __main__ - DEBUG - MQTT message received on shellies/schrankesszimmer/relay/0: off
abstraction | 2025-11-18 12:04:52,989 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d0003f052b7: {"battery":100,"humidity":55.04,"linkquality":83,"power_outage_count":38416,"pressure":1002.6,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:04:53,024 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d0003f052b7: {"battery":100,"humidity":54.82,"linkquality":83,"power_outage_count":38416,"pressure":1002.6,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:04:53,061 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d0003f052b7: {"battery":100,"humidity":54.82,"linkquality":83,"power_outage_count":38416,"pressure":1002.4,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:05:03,058 - __main__ - DEBUG - MQTT message received on shellies/lichtterasse/relay/0: off
abstraction | 2025-11-18 12:05:08,209 - __main__ - DEBUG - MQTT message received on shellies/wohnzimmer-regal/relay/0: off
abstraction | 2025-11-18 12:05:10,881 - __main__ - DEBUG - MQTT message received on shellies/LightKitchenSink/relay/0: on
abstraction | 2025-11-18 12:05:12,622 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d00083299bb: {"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.9,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:12,656 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d00083299bb: {"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.9,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:12,690 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d00083299bb: {"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.7,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:18,507 - __main__ - DEBUG - MQTT message received on shellies/schrankesszimmer/relay/0: off

View File

@@ -0,0 +1,261 @@
abstraction | 2025-11-18 12:04:40,901 - asyncio - DEBUG - Using selector: EpollSelector
abstraction | 2025-11-18 12:04:40,952 - __main__ - INFO - Loaded configuration from /app/config/devices.yaml
abstraction | 2025-11-18 12:04:40,953 - __main__ - INFO - Loaded 64 device(s): lampe_semeniere_wohnzimmer, stehlampe_esszimmer_spiegel, stehlampe_esszimmer_schrank, grosse_lampe_wohnzimmer, lampe_naehtischchen_wohnzimmer, kleine_lampe_rechts_esszimmer, kleine_lampe_links_esszimmer, leselampe_esszimmer, medusalampe_schlafzimmer, sportlicht_am_fernseher_studierzimmer, deckenlampe_schlafzimmer, bettlicht_wolfgang, bettlicht_patty, schranklicht_hinten_patty, schranklicht_vorne_patty, leselampe_patty, deckenlampe_esszimmer, standlampe_esszimmer, haustuer, deckenlampe_flur_oben, kueche_deckenlampe, sportlicht_tisch, sportlicht_regal, licht_flur_oben_am_spiegel, experimentlabtest, thermostat_wolfgang, thermostat_kueche, thermostat_schlafzimmer, thermostat_esszimmer, thermostat_wohnzimmer, thermostat_patty, thermostat_bad_oben, thermostat_bad_unten, sterne_wohnzimmer, kontakt_schlafzimmer_strasse, kontakt_esszimmer_strasse_rechts, kontakt_esszimmer_strasse_links, kontakt_wohnzimmer_garten_rechts, kontakt_wohnzimmer_garten_links, kontakt_kueche_garten_fenster, kontakt_kueche_garten_tuer, kontakt_kueche_strasse_rechts, kontakt_kueche_strasse_links, kontakt_patty_garten_rechts, kontakt_patty_garten_links, kontakt_patty_strasse, kontakt_wolfgang_garten, kontakt_bad_oben_strasse, kontakt_bad_unten_strasse, sensor_schlafzimmer, sensor_wohnzimmer, sensor_kueche, sensor_arbeitszimmer_patty, sensor_arbeitszimmer_wolfgang, sensor_bad_oben, sensor_bad_unten, sensor_flur, sensor_waschkueche, sensor_sportzimmer, licht_spuele_kueche, licht_schrank_esszimmer, licht_regal_wohnzimmer, licht_flur_schrank, licht_terasse
abstraction | 2025-11-18 12:04:40,953 - __main__ - INFO - Loaded 64 device(s) from configuration
abstraction | 2025-11-18 12:04:41,003 - __main__ - INFO - Connected to Redis: redis://172.23.1.116:6379/8
abstraction | 2025-11-18 12:04:41,003 - __main__ - INFO - Abstraction worker started
abstraction | 2025-11-18 12:04:41,003 - __main__ - INFO - Connecting to MQTT broker: 172.23.1.102:1883
abstraction | 2025-11-18 12:04:41,053 - __main__ - INFO - Connected to MQTT broker as home-automation-abstraction-b39304
abstraction | 2025-11-18 12:04:41,072 - __main__ - INFO - Subscribed to abstract SET: home/relay/lampe_semeniere_wohnzimmer/set
abstraction | 2025-11-18 12:04:41,091 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b8000015480b
abstraction | 2025-11-18 12:04:41,107 - __main__ - INFO - Subscribed to abstract SET: home/light/stehlampe_esszimmer_spiegel/set
abstraction | 2025-11-18 12:04:41,125 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d06ea09
abstraction | 2025-11-18 12:04:41,141 - __main__ - INFO - Subscribed to abstract SET: home/light/stehlampe_esszimmer_schrank/set
abstraction | 2025-11-18 12:04:41,159 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d09176c
abstraction | 2025-11-18 12:04:41,176 - __main__ - INFO - Subscribed to abstract SET: home/relay/grosse_lampe_wohnzimmer/set
abstraction | 2025-11-18 12:04:41,192 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000151aca
abstraction | 2025-11-18 12:04:41,209 - __main__ - INFO - Subscribed to abstract SET: home/relay/lampe_naehtischchen_wohnzimmer/set
abstraction | 2025-11-18 12:04:41,225 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x842e14fffee560ee
abstraction | 2025-11-18 12:04:41,242 - __main__ - INFO - Subscribed to abstract SET: home/relay/kleine_lampe_rechts_esszimmer/set
abstraction | 2025-11-18 12:04:41,259 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000156645
abstraction | 2025-11-18 12:04:41,276 - __main__ - INFO - Subscribed to abstract SET: home/relay/kleine_lampe_links_esszimmer/set
abstraction | 2025-11-18 12:04:41,293 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000153099
abstraction | 2025-11-18 12:04:41,310 - __main__ - INFO - Subscribed to abstract SET: home/light/leselampe_esszimmer/set
abstraction | 2025-11-18 12:04:41,327 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xec1bbdfffe7b84f2
abstraction | 2025-11-18 12:04:41,344 - __main__ - INFO - Subscribed to abstract SET: home/relay/medusalampe_schlafzimmer/set
abstraction | 2025-11-18 12:04:41,361 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000154c7c
abstraction | 2025-11-18 12:04:41,378 - __main__ - INFO - Subscribed to abstract SET: home/light/sportlicht_am_fernseher_studierzimmer/set
abstraction | 2025-11-18 12:04:41,395 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x842e14fffe76a23a
abstraction | 2025-11-18 12:04:41,415 - __main__ - INFO - Subscribed to abstract SET: home/light/deckenlampe_schlafzimmer/set
abstraction | 2025-11-18 12:04:41,432 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880108a406a7
abstraction | 2025-11-18 12:04:41,449 - __main__ - INFO - Subscribed to abstract SET: home/light/bettlicht_wolfgang/set
abstraction | 2025-11-18 12:04:41,466 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00178801081570bf
abstraction | 2025-11-18 12:04:41,484 - __main__ - INFO - Subscribed to abstract SET: home/light/bettlicht_patty/set
abstraction | 2025-11-18 12:04:41,500 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880108158b32
abstraction | 2025-11-18 12:04:41,518 - __main__ - INFO - Subscribed to abstract SET: home/light/schranklicht_hinten_patty/set
abstraction | 2025-11-18 12:04:41,535 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880106e29571
abstraction | 2025-11-18 12:04:41,552 - __main__ - INFO - Subscribed to abstract SET: home/relay/schranklicht_vorne_patty/set
abstraction | 2025-11-18 12:04:41,569 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000154cf5
abstraction | 2025-11-18 12:04:41,586 - __main__ - INFO - Subscribed to abstract SET: home/light/leselampe_patty/set
abstraction | 2025-11-18 12:04:41,603 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010600ec9d
abstraction | 2025-11-18 12:04:41,620 - __main__ - INFO - Subscribed to abstract SET: home/light/deckenlampe_esszimmer/set
abstraction | 2025-11-18 12:04:41,637 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880108a03e45
abstraction | 2025-11-18 12:04:41,655 - __main__ - INFO - Subscribed to abstract SET: home/light/standlampe_esszimmer/set
abstraction | 2025-11-18 12:04:41,674 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xbc33acfffe21f547
abstraction | 2025-11-18 12:04:41,692 - __main__ - INFO - Subscribed to abstract SET: home/light/haustuer/set
abstraction | 2025-11-18 12:04:41,711 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xec1bbdfffea6a3da
abstraction | 2025-11-18 12:04:41,728 - __main__ - INFO - Subscribed to abstract SET: home/light/deckenlampe_flur_oben/set
abstraction | 2025-11-18 12:04:41,746 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d2123a7
abstraction | 2025-11-18 12:04:41,764 - __main__ - INFO - Subscribed to abstract SET: home/light/kueche_deckenlampe/set
abstraction | 2025-11-18 12:04:41,781 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d2c40c4
abstraction | 2025-11-18 12:04:41,798 - __main__ - INFO - Subscribed to abstract SET: home/light/sportlicht_tisch/set
abstraction | 2025-11-18 12:04:41,814 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b8be2409f31b
abstraction | 2025-11-18 12:04:41,831 - __main__ - INFO - Subscribed to abstract SET: home/light/sportlicht_regal/set
abstraction | 2025-11-18 12:04:41,848 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b8be2409f569
abstraction | 2025-11-18 12:04:41,865 - __main__ - INFO - Subscribed to abstract SET: home/light/licht_flur_oben_am_spiegel/set
abstraction | 2025-11-18 12:04:41,883 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x842e14fffefe4ba4
abstraction | 2025-11-18 12:04:41,899 - __main__ - INFO - Subscribed to abstract SET: home/light/experimentlabtest/set
abstraction | 2025-11-18 12:04:41,918 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000195038
abstraction | 2025-11-18 12:04:41,936 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_wolfgang/set
abstraction | 2025-11-18 12:04:41,955 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x540f57fffe7e3cfe
abstraction | 2025-11-18 12:04:41,974 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_kueche/set
abstraction | 2025-11-18 12:04:41,991 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x94deb8fffe2e5c06
abstraction | 2025-11-18 12:04:42,008 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_schlafzimmer/set
abstraction | 2025-11-18 12:04:42,025 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/42/1/SET_TEMPERATURE
abstraction | 2025-11-18 12:04:42,042 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_esszimmer/set
abstraction | 2025-11-18 12:04:42,059 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/45/1/SET_TEMPERATURE
abstraction | 2025-11-18 12:04:42,080 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_wohnzimmer/set
abstraction | 2025-11-18 12:04:42,097 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/46/1/SET_TEMPERATURE
abstraction | 2025-11-18 12:04:42,114 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_patty/set
abstraction | 2025-11-18 12:04:42,131 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/39/1/SET_TEMPERATURE
abstraction | 2025-11-18 12:04:42,150 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_bad_oben/set
abstraction | 2025-11-18 12:04:42,171 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/41/1/SET_TEMPERATURE
abstraction | 2025-11-18 12:04:42,189 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_bad_unten/set
abstraction | 2025-11-18 12:04:42,207 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/48/1/SET_TEMPERATURE
abstraction | 2025-11-18 12:04:42,224 - __main__ - INFO - Subscribed to abstract SET: home/relay/sterne_wohnzimmer/set
abstraction | 2025-11-18 12:04:42,240 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000155fc2
abstraction | 2025-11-18 12:04:42,240 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_schlafzimmer_strasse
abstraction | 2025-11-18 12:04:42,258 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/52/1/STATE
abstraction | 2025-11-18 12:04:42,258 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_esszimmer_strasse_rechts
abstraction | 2025-11-18 12:04:42,275 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/26/1/STATE
abstraction | 2025-11-18 12:04:42,275 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_esszimmer_strasse_links
abstraction | 2025-11-18 12:04:42,293 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/27/1/STATE
abstraction | 2025-11-18 12:04:42,293 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_wohnzimmer_garten_rechts
abstraction | 2025-11-18 12:04:42,313 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/28/1/STATE
abstraction | 2025-11-18 12:04:42,313 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_wohnzimmer_garten_links
abstraction | 2025-11-18 12:04:42,331 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/29/1/STATE
abstraction | 2025-11-18 12:04:42,331 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_garten_fenster
abstraction | 2025-11-18 12:04:42,351 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b332785
abstraction | 2025-11-18 12:04:42,351 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_garten_tuer
abstraction | 2025-11-18 12:04:42,371 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b332788
abstraction | 2025-11-18 12:04:42,371 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_strasse_rechts
abstraction | 2025-11-18 12:04:42,390 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b151803
abstraction | 2025-11-18 12:04:42,390 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_strasse_links
abstraction | 2025-11-18 12:04:42,408 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b331d0b
abstraction | 2025-11-18 12:04:42,408 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_patty_garten_rechts
abstraction | 2025-11-18 12:04:42,424 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/18/1/STATE
abstraction | 2025-11-18 12:04:42,424 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_patty_garten_links
abstraction | 2025-11-18 12:04:42,441 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/22/1/STATE
abstraction | 2025-11-18 12:04:42,441 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_patty_strasse
abstraction | 2025-11-18 12:04:42,462 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000af457cf
abstraction | 2025-11-18 12:04:42,462 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_wolfgang_garten
abstraction | 2025-11-18 12:04:42,479 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b3328da
abstraction | 2025-11-18 12:04:42,480 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_bad_oben_strasse
abstraction | 2025-11-18 12:04:42,496 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b333aec
abstraction | 2025-11-18 12:04:42,496 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_bad_unten_strasse
abstraction | 2025-11-18 12:04:42,513 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/44/1/STATE
abstraction | 2025-11-18 12:04:42,513 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_schlafzimmer
abstraction | 2025-11-18 12:04:42,532 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00043292dc
abstraction | 2025-11-18 12:04:42,532 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_wohnzimmer
abstraction | 2025-11-18 12:04:42,552 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d0008975707
abstraction | 2025-11-18 12:04:42,552 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_kueche
abstraction | 2025-11-18 12:04:42,571 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00083299bb
abstraction | 2025-11-18 12:04:42,571 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_arbeitszimmer_patty
abstraction | 2025-11-18 12:04:42,589 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d0003f052b7
abstraction | 2025-11-18 12:04:42,589 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_arbeitszimmer_wolfgang
abstraction | 2025-11-18 12:04:42,608 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000543fb99
abstraction | 2025-11-18 12:04:42,608 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_bad_oben
abstraction | 2025-11-18 12:04:42,625 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00093e8987
abstraction | 2025-11-18 12:04:42,625 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_bad_unten
abstraction | 2025-11-18 12:04:42,645 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00093e662a
abstraction | 2025-11-18 12:04:42,645 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_flur
abstraction | 2025-11-18 12:04:42,664 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000836ccc6
abstraction | 2025-11-18 12:04:42,664 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_waschkueche
abstraction | 2025-11-18 12:04:42,682 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000449f3bc
abstraction | 2025-11-18 12:04:42,682 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_sportzimmer
abstraction | 2025-11-18 12:04:42,699 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d0009421422
abstraction | 2025-11-18 12:04:42,716 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_spuele_kueche/set
abstraction | 2025-11-18 12:04:42,734 - __main__ - INFO - Subscribed to vendor STATE: shellies/LightKitchenSink/relay/0
abstraction | 2025-11-18 12:04:42,751 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_schrank_esszimmer/set
abstraction | 2025-11-18 12:04:42,770 - __main__ - INFO - Subscribed to vendor STATE: shellies/schrankesszimmer/relay/0
abstraction | 2025-11-18 12:04:42,790 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_regal_wohnzimmer/set
abstraction | 2025-11-18 12:04:42,807 - __main__ - INFO - Subscribed to vendor STATE: shellies/wohnzimmer-regal/relay/0
abstraction | 2025-11-18 12:04:42,823 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_flur_schrank/set
abstraction | 2025-11-18 12:04:42,841 - __main__ - INFO - Subscribed to vendor STATE: shellies/schrankflur/relay/0
abstraction | 2025-11-18 12:04:42,858 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_terasse/set
abstraction | 2025-11-18 12:04:42,875 - __main__ - INFO - Subscribed to vendor STATE: shellies/lichtterasse/relay/0
abstraction | 2025-11-18 12:04:42,875 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/42/1/SET_TEMPERATURE: 21
abstraction | 2025-11-18 12:04:42,875 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=21
abstraction | 2025-11-18 12:04:42,876 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 21.0, 'mode': 'heat'}
abstraction | 2025-11-18 12:04:42,876 - __main__ - INFO - ← abstract STATE thermostat_schlafzimmer: home/thermostat/thermostat_schlafzimmer/state → {"target": 21.0, "mode": "heat"}
abstraction | 2025-11-18 12:04:42,897 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_schlafzimmer", "payload": {"target": 21.0, "mode": "heat"}, "ts": "2025-11-18T12:04:42.897310+00:00"}
abstraction | 2025-11-18 12:04:42,914 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/45/1/SET_TEMPERATURE: 15
abstraction | 2025-11-18 12:04:42,914 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=15
abstraction | 2025-11-18 12:04:42,914 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 15.0, 'mode': 'heat'}
abstraction | 2025-11-18 12:04:42,914 - __main__ - INFO - ← abstract STATE thermostat_esszimmer: home/thermostat/thermostat_esszimmer/state → {"target": 15.0, "mode": "heat"}
abstraction | 2025-11-18 12:04:42,934 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_esszimmer", "payload": {"target": 15.0, "mode": "heat"}, "ts": "2025-11-18T12:04:42.934255+00:00"}
abstraction | 2025-11-18 12:04:42,950 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/46/1/SET_TEMPERATURE: 15
abstraction | 2025-11-18 12:04:42,950 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=15
abstraction | 2025-11-18 12:04:42,950 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 15.0, 'mode': 'heat'}
abstraction | 2025-11-18 12:04:42,951 - __main__ - INFO - ← abstract STATE thermostat_wohnzimmer: home/thermostat/thermostat_wohnzimmer/state → {"target": 15.0, "mode": "heat"}
abstraction | 2025-11-18 12:04:42,970 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_wohnzimmer", "payload": {"target": 15.0, "mode": "heat"}, "ts": "2025-11-18T12:04:42.970936+00:00"}
abstraction | 2025-11-18 12:04:42,987 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/39/1/SET_TEMPERATURE: 22
abstraction | 2025-11-18 12:04:42,988 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=22
abstraction | 2025-11-18 12:04:42,988 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 22.0, 'mode': 'heat'}
abstraction | 2025-11-18 12:04:42,988 - __main__ - INFO - ← abstract STATE thermostat_patty: home/thermostat/thermostat_patty/state → {"target": 22.0, "mode": "heat"}
abstraction | 2025-11-18 12:04:43,009 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_patty", "payload": {"target": 22.0, "mode": "heat"}, "ts": "2025-11-18T12:04:43.009673+00:00"}
abstraction | 2025-11-18 12:04:43,029 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/41/1/SET_TEMPERATURE: 20
abstraction | 2025-11-18 12:04:43,029 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=20
abstraction | 2025-11-18 12:04:43,029 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 20.0, 'mode': 'heat'}
abstraction | 2025-11-18 12:04:43,029 - __main__ - INFO - ← abstract STATE thermostat_bad_oben: home/thermostat/thermostat_bad_oben/state → {"target": 20.0, "mode": "heat"}
abstraction | 2025-11-18 12:04:43,053 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_bad_oben", "payload": {"target": 20.0, "mode": "heat"}, "ts": "2025-11-18T12:04:43.053895+00:00"}
abstraction | 2025-11-18 12:04:43,071 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/48/1/SET_TEMPERATURE: 21
abstraction | 2025-11-18 12:04:43,071 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=21
abstraction | 2025-11-18 12:04:43,071 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 21.0, 'mode': 'heat'}
abstraction | 2025-11-18 12:04:43,072 - __main__ - INFO - ← abstract STATE thermostat_bad_unten: home/thermostat/thermostat_bad_unten/state → {"target": 21.0, "mode": "heat"}
abstraction | 2025-11-18 12:04:43,092 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_bad_unten", "payload": {"target": 21.0, "mode": "heat"}, "ts": "2025-11-18T12:04:43.092210+00:00"}
abstraction | 2025-11-18 12:04:43,108 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/52/1/STATE: false
abstraction | 2025-11-18 12:04:43,108 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,108 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,109 - __main__ - INFO - ← abstract STATE kontakt_schlafzimmer_strasse: home/contact/kontakt_schlafzimmer_strasse/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,128 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_schlafzimmer_strasse", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.128506+00:00"}
abstraction | 2025-11-18 12:04:43,145 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/26/1/STATE: false
abstraction | 2025-11-18 12:04:43,145 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,145 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,146 - __main__ - INFO - ← abstract STATE kontakt_esszimmer_strasse_rechts: home/contact/kontakt_esszimmer_strasse_rechts/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,165 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_esszimmer_strasse_rechts", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.165958+00:00"}
abstraction | 2025-11-18 12:04:43,182 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/27/1/STATE: false
abstraction | 2025-11-18 12:04:43,182 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,183 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,183 - __main__ - INFO - ← abstract STATE kontakt_esszimmer_strasse_links: home/contact/kontakt_esszimmer_strasse_links/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,202 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_esszimmer_strasse_links", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.202580+00:00"}
abstraction | 2025-11-18 12:04:43,219 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/28/1/STATE: false
abstraction | 2025-11-18 12:04:43,219 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,219 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,220 - __main__ - INFO - ← abstract STATE kontakt_wohnzimmer_garten_rechts: home/contact/kontakt_wohnzimmer_garten_rechts/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,239 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_wohnzimmer_garten_rechts", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.239653+00:00"}
abstraction | 2025-11-18 12:04:43,256 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/29/1/STATE: false
abstraction | 2025-11-18 12:04:43,256 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,256 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,257 - __main__ - INFO - ← abstract STATE kontakt_wohnzimmer_garten_links: home/contact/kontakt_wohnzimmer_garten_links/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,275 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_wohnzimmer_garten_links", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.275832+00:00"}
abstraction | 2025-11-18 12:04:43,292 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/18/1/STATE: false
abstraction | 2025-11-18 12:04:43,292 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,292 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,293 - __main__ - INFO - ← abstract STATE kontakt_patty_garten_rechts: home/contact/kontakt_patty_garten_rechts/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,314 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_patty_garten_rechts", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.314579+00:00"}
abstraction | 2025-11-18 12:04:43,331 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/22/1/STATE: false
abstraction | 2025-11-18 12:04:43,331 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,331 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,332 - __main__ - INFO - ← abstract STATE kontakt_patty_garten_links: home/contact/kontakt_patty_garten_links/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,351 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_patty_garten_links", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.351704+00:00"}
abstraction | 2025-11-18 12:04:43,368 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/44/1/STATE: false
abstraction | 2025-11-18 12:04:43,368 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,368 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,369 - __main__ - INFO - ← abstract STATE kontakt_bad_unten_strasse: home/contact/kontakt_bad_unten_strasse/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,388 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_bad_unten_strasse", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.388390+00:00"}
abstraction | 2025-11-18 12:04:48,498 - __main__ - DEBUG - MQTT message received on shellies/schrankesszimmer/relay/0: off
abstraction | 2025-11-18 12:04:48,498 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 12:04:48,498 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 12:04:48,498 - __main__ - INFO - ← abstract STATE licht_schrank_esszimmer: home/relay/licht_schrank_esszimmer/state → {"power": "off"}
abstraction | 2025-11-18 12:04:48,518 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_schrank_esszimmer", "payload": {"power": "off"}, "ts": "2025-11-18T12:04:48.518525+00:00"}
abstraction | 2025-11-18 12:04:52,989 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d0003f052b7: {"battery":100,"humidity":55.04,"linkquality":83,"power_outage_count":38416,"pressure":1002.6,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:04:52,989 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={"battery":100,"humidity":55.04,"linkquality":83,"power_outage_count":38416,"pressure":1002.6,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:04:52,989 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 55.04, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1002.6, 'temperature': 22.13, 'voltage': 3015}
abstraction | 2025-11-18 12:04:52,989 - __main__ - INFO - ← abstract STATE sensor_arbeitszimmer_patty: home/temp_humidity/sensor_arbeitszimmer_patty/state → {"battery": 100, "humidity": 55.04, "linkquality": 83, "power_outage_count": 38416, "pressure": 1002.6, "temperature": 22.13, "voltage": 3015}
abstraction | 2025-11-18 12:04:53,009 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_arbeitszimmer_patty", "payload": {"battery": 100, "humidity": 55.04, "linkquality": 83, "power_outage_count": 38416, "pressure": 1002.6, "temperature": 22.13, "voltage": 3015}, "ts": "2025-11-18T12:04:53.009776+00:00"}
abstraction | 2025-11-18 12:04:53,024 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d0003f052b7: {"battery":100,"humidity":54.82,"linkquality":83,"power_outage_count":38416,"pressure":1002.6,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:04:53,025 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={"battery":100,"humidity":54.82,"linkquality":83,"power_outage_count":38416,"pressure":1002.6,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:04:53,025 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.82, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1002.6, 'temperature': 22.13, 'voltage': 3015}
abstraction | 2025-11-18 12:04:53,025 - __main__ - INFO - ← abstract STATE sensor_arbeitszimmer_patty: home/temp_humidity/sensor_arbeitszimmer_patty/state → {"battery": 100, "humidity": 54.82, "linkquality": 83, "power_outage_count": 38416, "pressure": 1002.6, "temperature": 22.13, "voltage": 3015}
abstraction | 2025-11-18 12:04:53,044 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_arbeitszimmer_patty", "payload": {"battery": 100, "humidity": 54.82, "linkquality": 83, "power_outage_count": 38416, "pressure": 1002.6, "temperature": 22.13, "voltage": 3015}, "ts": "2025-11-18T12:04:53.044379+00:00"}
abstraction | 2025-11-18 12:04:53,061 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d0003f052b7: {"battery":100,"humidity":54.82,"linkquality":83,"power_outage_count":38416,"pressure":1002.4,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:04:53,061 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={"battery":100,"humidity":54.82,"linkquality":83,"power_outage_count":38416,"pressure":1002.4,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:04:53,061 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.82, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1002.4, 'temperature': 22.13, 'voltage': 3015}
abstraction | 2025-11-18 12:04:53,061 - __main__ - INFO - ← abstract STATE sensor_arbeitszimmer_patty: home/temp_humidity/sensor_arbeitszimmer_patty/state → {"battery": 100, "humidity": 54.82, "linkquality": 83, "power_outage_count": 38416, "pressure": 1002.4, "temperature": 22.13, "voltage": 3015}
abstraction | 2025-11-18 12:04:53,084 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_arbeitszimmer_patty", "payload": {"battery": 100, "humidity": 54.82, "linkquality": 83, "power_outage_count": 38416, "pressure": 1002.4, "temperature": 22.13, "voltage": 3015}, "ts": "2025-11-18T12:04:53.083988+00:00"}
abstraction | 2025-11-18 12:05:03,058 - __main__ - DEBUG - MQTT message received on shellies/lichtterasse/relay/0: off
abstraction | 2025-11-18 12:05:03,058 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 12:05:03,058 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 12:05:03,058 - __main__ - INFO - ← abstract STATE licht_terasse: home/relay/licht_terasse/state → {"power": "off"}
abstraction | 2025-11-18 12:05:03,075 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_terasse", "payload": {"power": "off"}, "ts": "2025-11-18T12:05:03.075262+00:00"}
abstraction | 2025-11-18 12:05:08,209 - __main__ - DEBUG - MQTT message received on shellies/wohnzimmer-regal/relay/0: off
abstraction | 2025-11-18 12:05:08,210 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 12:05:08,210 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 12:05:08,210 - __main__ - INFO - ← abstract STATE licht_regal_wohnzimmer: home/relay/licht_regal_wohnzimmer/state → {"power": "off"}
abstraction | 2025-11-18 12:05:08,228 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_regal_wohnzimmer", "payload": {"power": "off"}, "ts": "2025-11-18T12:05:08.228758+00:00"}
abstraction | 2025-11-18 12:05:10,881 - __main__ - DEBUG - MQTT message received on shellies/LightKitchenSink/relay/0: on
abstraction | 2025-11-18 12:05:10,881 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=on
abstraction | 2025-11-18 12:05:10,881 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'on'}
abstraction | 2025-11-18 12:05:10,881 - __main__ - INFO - ← abstract STATE licht_spuele_kueche: home/relay/licht_spuele_kueche/state → {"power": "on"}
abstraction | 2025-11-18 12:05:10,899 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_spuele_kueche", "payload": {"power": "on"}, "ts": "2025-11-18T12:05:10.899207+00:00"}
abstraction | 2025-11-18 12:05:12,622 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d00083299bb: {"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.9,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:12,622 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.9,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:12,622 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 63, 'humidity': 47.69, 'linkquality': 87, 'power_outage_count': 4906, 'pressure': 1009.9, 'temperature': 19.74, 'voltage': 2945}
abstraction | 2025-11-18 12:05:12,622 - __main__ - INFO - ← abstract STATE sensor_kueche: home/temp_humidity/sensor_kueche/state → {"battery": 63, "humidity": 47.69, "linkquality": 87, "power_outage_count": 4906, "pressure": 1009.9, "temperature": 19.74, "voltage": 2945}
abstraction | 2025-11-18 12:05:12,640 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_kueche", "payload": {"battery": 63, "humidity": 47.69, "linkquality": 87, "power_outage_count": 4906, "pressure": 1009.9, "temperature": 19.74, "voltage": 2945}, "ts": "2025-11-18T12:05:12.640129+00:00"}
abstraction | 2025-11-18 12:05:12,656 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d00083299bb: {"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.9,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:12,656 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.9,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:12,656 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 63, 'humidity': 47.69, 'linkquality': 87, 'power_outage_count': 4906, 'pressure': 1009.9, 'temperature': 19.74, 'voltage': 2945}
abstraction | 2025-11-18 12:05:12,657 - __main__ - INFO - ← abstract STATE sensor_kueche: home/temp_humidity/sensor_kueche/state → {"battery": 63, "humidity": 47.69, "linkquality": 87, "power_outage_count": 4906, "pressure": 1009.9, "temperature": 19.74, "voltage": 2945}
abstraction | 2025-11-18 12:05:12,674 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_kueche", "payload": {"battery": 63, "humidity": 47.69, "linkquality": 87, "power_outage_count": 4906, "pressure": 1009.9, "temperature": 19.74, "voltage": 2945}, "ts": "2025-11-18T12:05:12.674372+00:00"}
abstraction | 2025-11-18 12:05:12,690 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d00083299bb: {"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.7,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:12,690 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.7,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:12,690 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 63, 'humidity': 47.69, 'linkquality': 87, 'power_outage_count': 4906, 'pressure': 1009.7, 'temperature': 19.74, 'voltage': 2945}
abstraction | 2025-11-18 12:05:12,690 - __main__ - INFO - ← abstract STATE sensor_kueche: home/temp_humidity/sensor_kueche/state → {"battery": 63, "humidity": 47.69, "linkquality": 87, "power_outage_count": 4906, "pressure": 1009.7, "temperature": 19.74, "voltage": 2945}
abstraction | 2025-11-18 12:05:12,708 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_kueche", "payload": {"battery": 63, "humidity": 47.69, "linkquality": 87, "power_outage_count": 4906, "pressure": 1009.7, "temperature": 19.74, "voltage": 2945}, "ts": "2025-11-18T12:05:12.708715+00:00"}
abstraction | 2025-11-18 12:05:18,507 - __main__ - DEBUG - MQTT message received on shellies/schrankesszimmer/relay/0: off
abstraction | 2025-11-18 12:05:18,508 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 12:05:18,508 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 12:05:18,508 - __main__ - INFO - ← abstract STATE licht_schrank_esszimmer: home/relay/licht_schrank_esszimmer/state → {"power": "off"}
abstraction | 2025-11-18 12:05:18,526 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_schrank_esszimmer", "payload": {"power": "off"}, "ts": "2025-11-18T12:05:18.525971+00:00"}

View File

@@ -0,0 +1,311 @@
rules | 2025-11-18 12:04:40,835 - asyncio - DEBUG - Using selector: EpollSelector
rules | 2025-11-18 12:04:40,835 - __main__ - INFO - ============================================================
rules | 2025-11-18 12:04:40,835 - __main__ - INFO - Rules Engine Starting
rules | 2025-11-18 12:04:40,835 - __main__ - INFO - ============================================================
rules | 2025-11-18 12:04:40,835 - __main__ - INFO - Config: /app/config/rules.yaml
rules | 2025-11-18 12:04:40,835 - __main__ - INFO - MQTT: 172.23.1.102:1883
rules | 2025-11-18 12:04:40,835 - __main__ - INFO - Redis: redis://172.23.1.116:6379/8
rules | 2025-11-18 12:04:40,836 - __main__ - INFO - ============================================================
rules | 2025-11-18 12:04:40,836 - __main__ - INFO - Loading rules configuration from /app/config/rules.yaml
rules | 2025-11-18 12:04:40,841 - __main__ - INFO - Loaded 6 rule(s) from configuration
rules | 2025-11-18 12:04:40,841 - __main__ - INFO - - window_setback_esszimmer (type: window_setback@1.0) [DISABLED]
rules | 2025-11-18 12:04:40,842 - __main__ - INFO - - window_setback_kueche (type: window_setback@1.0) [DISABLED]
rules | 2025-11-18 12:04:40,842 - __main__ - INFO - - window_setback_patty (type: window_setback@1.0) [DISABLED]
rules | 2025-11-18 12:04:40,842 - __main__ - INFO - - window_setback_schlafzimmer (type: window_setback@1.0) [DISABLED]
rules | 2025-11-18 12:04:40,842 - __main__ - INFO - - window_setback_wohnzimmer (type: window_setback@1.0) [DISABLED]
rules | 2025-11-18 12:04:40,846 - __main__ - INFO - - window_setback_wolfgang (type: window_setback@1.0)
rules | 2025-11-18 12:04:40,846 - __main__ - INFO - Successfully loaded 1 rule implementation(s) (5 disabled)
rules | 2025-11-18 12:04:40,846 - __main__ - INFO - Rule window_setback_wolfgang validated: 1 contacts, 1 thermostats
rules | 2025-11-18 12:04:40,846 - __main__ - DEBUG - Rule window_setback_wolfgang subscribes to 2 topic(s)
rules | 2025-11-18 12:04:40,847 - __main__ - INFO - Total MQTT subscriptions needed: 2
rules | 2025-11-18 12:04:40,847 - __main__ - INFO - Starting event processing loop
abstraction | 2025-11-18 12:04:40,901 - asyncio - DEBUG - Using selector: EpollSelector
abstraction | 2025-11-18 12:04:40,952 - __main__ - INFO - Loaded configuration from /app/config/devices.yaml
abstraction | 2025-11-18 12:04:40,953 - __main__ - INFO - Loaded 64 device(s): lampe_semeniere_wohnzimmer, stehlampe_esszimmer_spiegel, stehlampe_esszimmer_schrank, grosse_lampe_wohnzimmer, lampe_naehtischchen_wohnzimmer, kleine_lampe_rechts_esszimmer, kleine_lampe_links_esszimmer, leselampe_esszimmer, medusalampe_schlafzimmer, sportlicht_am_fernseher_studierzimmer, deckenlampe_schlafzimmer, bettlicht_wolfgang, bettlicht_patty, schranklicht_hinten_patty, schranklicht_vorne_patty, leselampe_patty, deckenlampe_esszimmer, standlampe_esszimmer, haustuer, deckenlampe_flur_oben, kueche_deckenlampe, sportlicht_tisch, sportlicht_regal, licht_flur_oben_am_spiegel, experimentlabtest, thermostat_wolfgang, thermostat_kueche, thermostat_schlafzimmer, thermostat_esszimmer, thermostat_wohnzimmer, thermostat_patty, thermostat_bad_oben, thermostat_bad_unten, sterne_wohnzimmer, kontakt_schlafzimmer_strasse, kontakt_esszimmer_strasse_rechts, kontakt_esszimmer_strasse_links, kontakt_wohnzimmer_garten_rechts, kontakt_wohnzimmer_garten_links, kontakt_kueche_garten_fenster, kontakt_kueche_garten_tuer, kontakt_kueche_strasse_rechts, kontakt_kueche_strasse_links, kontakt_patty_garten_rechts, kontakt_patty_garten_links, kontakt_patty_strasse, kontakt_wolfgang_garten, kontakt_bad_oben_strasse, kontakt_bad_unten_strasse, sensor_schlafzimmer, sensor_wohnzimmer, sensor_kueche, sensor_arbeitszimmer_patty, sensor_arbeitszimmer_wolfgang, sensor_bad_oben, sensor_bad_unten, sensor_flur, sensor_waschkueche, sensor_sportzimmer, licht_spuele_kueche, licht_schrank_esszimmer, licht_regal_wohnzimmer, licht_flur_schrank, licht_terasse
abstraction | 2025-11-18 12:04:40,953 - __main__ - INFO - Loaded 64 device(s) from configuration
rules | 2025-11-18 12:04:40,999 - __main__ - INFO - Connecting to MQTT broker 172.23.1.102:1883 (client_id=rule_engine-0d8cce)
abstraction | 2025-11-18 12:04:41,003 - __main__ - INFO - Connected to Redis: redis://172.23.1.116:6379/8
abstraction | 2025-11-18 12:04:41,003 - __main__ - INFO - Abstraction worker started
abstraction | 2025-11-18 12:04:41,003 - __main__ - INFO - Connecting to MQTT broker: 172.23.1.102:1883
rules | 2025-11-18 12:04:41,051 - __main__ - INFO - Connected to MQTT broker 172.23.1.102:1883
abstraction | 2025-11-18 12:04:41,053 - __main__ - INFO - Connected to MQTT broker as home-automation-abstraction-b39304
abstraction | 2025-11-18 12:04:41,072 - __main__ - INFO - Subscribed to abstract SET: home/relay/lampe_semeniere_wohnzimmer/set
rules | 2025-11-18 12:04:41,084 - __main__ - INFO - Subscribed to 2 topic(s): home/thermostat/thermostat_wolfgang/state, home/contact/kontakt_wolfgang_garten/state
rules | 2025-11-18 12:04:41,085 - __main__ - DEBUG - Received event: {'topic': 'home/thermostat/thermostat_wolfgang/state', 'type': 'state', 'cap': 'thermostat', 'device_id': 'thermostat_wolfgang', 'payload': {'target': 23.0, 'current': 23.5, 'mode': 'heat'}, 'ts': '2025-11-18T12:04:41.085220'}
abstraction | 2025-11-18 12:04:41,091 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b8000015480b
rules | 2025-11-18 12:04:41,085 - __main__ - DEBUG - Filtering for cap=thermostat, device_id=thermostat_wolfgang
rules | 2025-11-18 12:04:41,085 - __main__ - DEBUG - Rule window_setback_wolfgang: checking thermostats ['thermostat_wolfgang']
rules | 2025-11-18 12:04:41,086 - __main__ - INFO - Event thermostat/thermostat_wolfgang: 1 matching rule(s)
abstraction | 2025-11-18 12:04:41,107 - __main__ - INFO - Subscribed to abstract SET: home/light/stehlampe_esszimmer_spiegel/set
abstraction | 2025-11-18 12:04:41,125 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d06ea09
abstraction | 2025-11-18 12:04:41,141 - __main__ - INFO - Subscribed to abstract SET: home/light/stehlampe_esszimmer_schrank/set
abstraction | 2025-11-18 12:04:41,159 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d09176c
abstraction | 2025-11-18 12:04:41,176 - __main__ - INFO - Subscribed to abstract SET: home/relay/grosse_lampe_wohnzimmer/set
abstraction | 2025-11-18 12:04:41,192 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000151aca
rules | 2025-11-18 12:04:41,197 - __main__ - DEBUG - Rule window_setback_wolfgang: Updated current target for thermostat_wolfgang: 23.0°C
rules | 2025-11-18 12:04:41,197 - __main__ - DEBUG - Received event: {'topic': 'home/contact/kontakt_wolfgang_garten/state', 'type': 'state', 'cap': 'contact', 'device_id': 'kontakt_wolfgang_garten', 'payload': {'contact': 'closed', 'battery': 100, 'linkquality': 32, 'device_temperature': 28, 'voltage': 3025}, 'ts': '2025-11-18T12:04:41.197402'}
rules | 2025-11-18 12:04:41,198 - __main__ - DEBUG - Filtering for cap=contact, device_id=kontakt_wolfgang_garten
rules | 2025-11-18 12:04:41,198 - __main__ - DEBUG - Rule window_setback_wolfgang: checking contacts ['kontakt_wolfgang_garten']
rules | 2025-11-18 12:04:41,199 - __main__ - INFO - Event contact/kontakt_wolfgang_garten: 1 matching rule(s)
abstraction | 2025-11-18 12:04:41,209 - __main__ - INFO - Subscribed to abstract SET: home/relay/lampe_naehtischchen_wohnzimmer/set
abstraction | 2025-11-18 12:04:41,225 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x842e14fffee560ee
rules | 2025-11-18 12:04:41,233 - __main__ - INFO - Rule window_setback_wolfgang: Window closed, restoring 1 thermostats to previous temperatures
abstraction | 2025-11-18 12:04:41,242 - __main__ - INFO - Subscribed to abstract SET: home/relay/kleine_lampe_rechts_esszimmer/set
rules | 2025-11-18 12:04:41,250 - __main__ - WARNING - No previous target found for thermostat_wolfgang, cannot restore
abstraction | 2025-11-18 12:04:41,259 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000156645
abstraction | 2025-11-18 12:04:41,276 - __main__ - INFO - Subscribed to abstract SET: home/relay/kleine_lampe_links_esszimmer/set
abstraction | 2025-11-18 12:04:41,293 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000153099
abstraction | 2025-11-18 12:04:41,310 - __main__ - INFO - Subscribed to abstract SET: home/light/leselampe_esszimmer/set
abstraction | 2025-11-18 12:04:41,327 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xec1bbdfffe7b84f2
abstraction | 2025-11-18 12:04:41,344 - __main__ - INFO - Subscribed to abstract SET: home/relay/medusalampe_schlafzimmer/set
abstraction | 2025-11-18 12:04:41,361 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000154c7c
abstraction | 2025-11-18 12:04:41,378 - __main__ - INFO - Subscribed to abstract SET: home/light/sportlicht_am_fernseher_studierzimmer/set
abstraction | 2025-11-18 12:04:41,395 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x842e14fffe76a23a
abstraction | 2025-11-18 12:04:41,415 - __main__ - INFO - Subscribed to abstract SET: home/light/deckenlampe_schlafzimmer/set
abstraction | 2025-11-18 12:04:41,432 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880108a406a7
abstraction | 2025-11-18 12:04:41,449 - __main__ - INFO - Subscribed to abstract SET: home/light/bettlicht_wolfgang/set
api | INFO: Started server process [1]
api | INFO: Waiting for application startup.
abstraction | 2025-11-18 12:04:41,466 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00178801081570bf
abstraction | 2025-11-18 12:04:41,484 - __main__ - INFO - Subscribed to abstract SET: home/light/bettlicht_patty/set
api | INFO: Application startup complete.
abstraction | 2025-11-18 12:04:41,500 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880108158b32
api | INFO: Uvicorn running on http://0.0.0.0:8001 (Press CTRL+C to quit)
abstraction | 2025-11-18 12:04:41,518 - __main__ - INFO - Subscribed to abstract SET: home/light/schranklicht_hinten_patty/set
abstraction | 2025-11-18 12:04:41,535 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880106e29571
abstraction | 2025-11-18 12:04:41,552 - __main__ - INFO - Subscribed to abstract SET: home/relay/schranklicht_vorne_patty/set
abstraction | 2025-11-18 12:04:41,569 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000154cf5
abstraction | 2025-11-18 12:04:41,586 - __main__ - INFO - Subscribed to abstract SET: home/light/leselampe_patty/set
abstraction | 2025-11-18 12:04:41,603 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010600ec9d
abstraction | 2025-11-18 12:04:41,620 - __main__ - INFO - Subscribed to abstract SET: home/light/deckenlampe_esszimmer/set
abstraction | 2025-11-18 12:04:41,637 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880108a03e45
abstraction | 2025-11-18 12:04:41,655 - __main__ - INFO - Subscribed to abstract SET: home/light/standlampe_esszimmer/set
ui | UI using API_BASE: http://172.19.1.11:8001
ui | UI using BASE_PATH: /
ui | INFO: Started server process [1]
ui | INFO: Waiting for application startup.
ui | INFO: Application startup complete.
abstraction | 2025-11-18 12:04:41,674 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xbc33acfffe21f547
ui | INFO: Uvicorn running on http://0.0.0.0:8002 (Press CTRL+C to quit)
abstraction | 2025-11-18 12:04:41,692 - __main__ - INFO - Subscribed to abstract SET: home/light/haustuer/set
abstraction | 2025-11-18 12:04:41,711 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xec1bbdfffea6a3da
abstraction | 2025-11-18 12:04:41,728 - __main__ - INFO - Subscribed to abstract SET: home/light/deckenlampe_flur_oben/set
abstraction | 2025-11-18 12:04:41,746 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d2123a7
abstraction | 2025-11-18 12:04:41,764 - __main__ - INFO - Subscribed to abstract SET: home/light/kueche_deckenlampe/set
abstraction | 2025-11-18 12:04:41,781 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d2c40c4
abstraction | 2025-11-18 12:04:41,798 - __main__ - INFO - Subscribed to abstract SET: home/light/sportlicht_tisch/set
abstraction | 2025-11-18 12:04:41,814 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b8be2409f31b
abstraction | 2025-11-18 12:04:41,831 - __main__ - INFO - Subscribed to abstract SET: home/light/sportlicht_regal/set
abstraction | 2025-11-18 12:04:41,848 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b8be2409f569
abstraction | 2025-11-18 12:04:41,865 - __main__ - INFO - Subscribed to abstract SET: home/light/licht_flur_oben_am_spiegel/set
abstraction | 2025-11-18 12:04:41,883 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x842e14fffefe4ba4
abstraction | 2025-11-18 12:04:41,899 - __main__ - INFO - Subscribed to abstract SET: home/light/experimentlabtest/set
abstraction | 2025-11-18 12:04:41,918 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000195038
abstraction | 2025-11-18 12:04:41,936 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_wolfgang/set
abstraction | 2025-11-18 12:04:41,955 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x540f57fffe7e3cfe
abstraction | 2025-11-18 12:04:41,974 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_kueche/set
abstraction | 2025-11-18 12:04:41,991 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x94deb8fffe2e5c06
abstraction | 2025-11-18 12:04:42,008 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_schlafzimmer/set
abstraction | 2025-11-18 12:04:42,025 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/42/1/SET_TEMPERATURE
abstraction | 2025-11-18 12:04:42,042 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_esszimmer/set
abstraction | 2025-11-18 12:04:42,059 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/45/1/SET_TEMPERATURE
abstraction | 2025-11-18 12:04:42,080 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_wohnzimmer/set
abstraction | 2025-11-18 12:04:42,097 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/46/1/SET_TEMPERATURE
abstraction | 2025-11-18 12:04:42,114 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_patty/set
abstraction | 2025-11-18 12:04:42,131 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/39/1/SET_TEMPERATURE
abstraction | 2025-11-18 12:04:42,150 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_bad_oben/set
abstraction | 2025-11-18 12:04:42,171 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/41/1/SET_TEMPERATURE
abstraction | 2025-11-18 12:04:42,189 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_bad_unten/set
abstraction | 2025-11-18 12:04:42,207 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/48/1/SET_TEMPERATURE
abstraction | 2025-11-18 12:04:42,224 - __main__ - INFO - Subscribed to abstract SET: home/relay/sterne_wohnzimmer/set
abstraction | 2025-11-18 12:04:42,240 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000155fc2
abstraction | 2025-11-18 12:04:42,240 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_schlafzimmer_strasse
abstraction | 2025-11-18 12:04:42,258 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/52/1/STATE
abstraction | 2025-11-18 12:04:42,258 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_esszimmer_strasse_rechts
abstraction | 2025-11-18 12:04:42,275 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/26/1/STATE
abstraction | 2025-11-18 12:04:42,275 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_esszimmer_strasse_links
abstraction | 2025-11-18 12:04:42,293 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/27/1/STATE
abstraction | 2025-11-18 12:04:42,293 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_wohnzimmer_garten_rechts
abstraction | 2025-11-18 12:04:42,313 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/28/1/STATE
abstraction | 2025-11-18 12:04:42,313 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_wohnzimmer_garten_links
abstraction | 2025-11-18 12:04:42,331 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/29/1/STATE
abstraction | 2025-11-18 12:04:42,331 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_garten_fenster
abstraction | 2025-11-18 12:04:42,351 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b332785
abstraction | 2025-11-18 12:04:42,351 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_garten_tuer
abstraction | 2025-11-18 12:04:42,371 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b332788
abstraction | 2025-11-18 12:04:42,371 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_strasse_rechts
abstraction | 2025-11-18 12:04:42,390 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b151803
abstraction | 2025-11-18 12:04:42,390 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_strasse_links
abstraction | 2025-11-18 12:04:42,408 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b331d0b
abstraction | 2025-11-18 12:04:42,408 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_patty_garten_rechts
abstraction | 2025-11-18 12:04:42,424 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/18/1/STATE
abstraction | 2025-11-18 12:04:42,424 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_patty_garten_links
abstraction | 2025-11-18 12:04:42,441 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/22/1/STATE
abstraction | 2025-11-18 12:04:42,441 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_patty_strasse
abstraction | 2025-11-18 12:04:42,462 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000af457cf
abstraction | 2025-11-18 12:04:42,462 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_wolfgang_garten
abstraction | 2025-11-18 12:04:42,479 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b3328da
abstraction | 2025-11-18 12:04:42,480 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_bad_oben_strasse
abstraction | 2025-11-18 12:04:42,496 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b333aec
abstraction | 2025-11-18 12:04:42,496 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_bad_unten_strasse
abstraction | 2025-11-18 12:04:42,513 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/44/1/STATE
abstraction | 2025-11-18 12:04:42,513 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_schlafzimmer
abstraction | 2025-11-18 12:04:42,532 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00043292dc
abstraction | 2025-11-18 12:04:42,532 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_wohnzimmer
abstraction | 2025-11-18 12:04:42,552 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d0008975707
abstraction | 2025-11-18 12:04:42,552 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_kueche
abstraction | 2025-11-18 12:04:42,571 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00083299bb
abstraction | 2025-11-18 12:04:42,571 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_arbeitszimmer_patty
abstraction | 2025-11-18 12:04:42,589 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d0003f052b7
abstraction | 2025-11-18 12:04:42,589 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_arbeitszimmer_wolfgang
abstraction | 2025-11-18 12:04:42,608 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000543fb99
abstraction | 2025-11-18 12:04:42,608 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_bad_oben
abstraction | 2025-11-18 12:04:42,625 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00093e8987
abstraction | 2025-11-18 12:04:42,625 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_bad_unten
abstraction | 2025-11-18 12:04:42,645 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00093e662a
abstraction | 2025-11-18 12:04:42,645 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_flur
abstraction | 2025-11-18 12:04:42,664 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000836ccc6
abstraction | 2025-11-18 12:04:42,664 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_waschkueche
abstraction | 2025-11-18 12:04:42,682 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000449f3bc
abstraction | 2025-11-18 12:04:42,682 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_sportzimmer
abstraction | 2025-11-18 12:04:42,699 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d0009421422
abstraction | 2025-11-18 12:04:42,716 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_spuele_kueche/set
abstraction | 2025-11-18 12:04:42,734 - __main__ - INFO - Subscribed to vendor STATE: shellies/LightKitchenSink/relay/0
abstraction | 2025-11-18 12:04:42,751 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_schrank_esszimmer/set
abstraction | 2025-11-18 12:04:42,770 - __main__ - INFO - Subscribed to vendor STATE: shellies/schrankesszimmer/relay/0
abstraction | 2025-11-18 12:04:42,790 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_regal_wohnzimmer/set
abstraction | 2025-11-18 12:04:42,807 - __main__ - INFO - Subscribed to vendor STATE: shellies/wohnzimmer-regal/relay/0
abstraction | 2025-11-18 12:04:42,823 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_flur_schrank/set
abstraction | 2025-11-18 12:04:42,841 - __main__ - INFO - Subscribed to vendor STATE: shellies/schrankflur/relay/0
abstraction | 2025-11-18 12:04:42,858 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_terasse/set
abstraction | 2025-11-18 12:04:42,875 - __main__ - INFO - Subscribed to vendor STATE: shellies/lichtterasse/relay/0
abstraction | 2025-11-18 12:04:42,875 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/42/1/SET_TEMPERATURE: 21
abstraction | 2025-11-18 12:04:42,875 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=21
abstraction | 2025-11-18 12:04:42,876 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 21.0, 'mode': 'heat'}
abstraction | 2025-11-18 12:04:42,876 - __main__ - INFO - ← abstract STATE thermostat_schlafzimmer: home/thermostat/thermostat_schlafzimmer/state → {"target": 21.0, "mode": "heat"}
abstraction | 2025-11-18 12:04:42,897 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_schlafzimmer", "payload": {"target": 21.0, "mode": "heat"}, "ts": "2025-11-18T12:04:42.897310+00:00"}
abstraction | 2025-11-18 12:04:42,914 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/45/1/SET_TEMPERATURE: 15
abstraction | 2025-11-18 12:04:42,914 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=15
abstraction | 2025-11-18 12:04:42,914 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 15.0, 'mode': 'heat'}
abstraction | 2025-11-18 12:04:42,914 - __main__ - INFO - ← abstract STATE thermostat_esszimmer: home/thermostat/thermostat_esszimmer/state → {"target": 15.0, "mode": "heat"}
abstraction | 2025-11-18 12:04:42,934 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_esszimmer", "payload": {"target": 15.0, "mode": "heat"}, "ts": "2025-11-18T12:04:42.934255+00:00"}
abstraction | 2025-11-18 12:04:42,950 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/46/1/SET_TEMPERATURE: 15
abstraction | 2025-11-18 12:04:42,950 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=15
abstraction | 2025-11-18 12:04:42,950 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 15.0, 'mode': 'heat'}
abstraction | 2025-11-18 12:04:42,951 - __main__ - INFO - ← abstract STATE thermostat_wohnzimmer: home/thermostat/thermostat_wohnzimmer/state → {"target": 15.0, "mode": "heat"}
abstraction | 2025-11-18 12:04:42,970 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_wohnzimmer", "payload": {"target": 15.0, "mode": "heat"}, "ts": "2025-11-18T12:04:42.970936+00:00"}
abstraction | 2025-11-18 12:04:42,987 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/39/1/SET_TEMPERATURE: 22
abstraction | 2025-11-18 12:04:42,988 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=22
abstraction | 2025-11-18 12:04:42,988 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 22.0, 'mode': 'heat'}
abstraction | 2025-11-18 12:04:42,988 - __main__ - INFO - ← abstract STATE thermostat_patty: home/thermostat/thermostat_patty/state → {"target": 22.0, "mode": "heat"}
abstraction | 2025-11-18 12:04:43,009 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_patty", "payload": {"target": 22.0, "mode": "heat"}, "ts": "2025-11-18T12:04:43.009673+00:00"}
abstraction | 2025-11-18 12:04:43,029 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/41/1/SET_TEMPERATURE: 20
abstraction | 2025-11-18 12:04:43,029 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=20
abstraction | 2025-11-18 12:04:43,029 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 20.0, 'mode': 'heat'}
abstraction | 2025-11-18 12:04:43,029 - __main__ - INFO - ← abstract STATE thermostat_bad_oben: home/thermostat/thermostat_bad_oben/state → {"target": 20.0, "mode": "heat"}
abstraction | 2025-11-18 12:04:43,053 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_bad_oben", "payload": {"target": 20.0, "mode": "heat"}, "ts": "2025-11-18T12:04:43.053895+00:00"}
abstraction | 2025-11-18 12:04:43,071 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/48/1/SET_TEMPERATURE: 21
abstraction | 2025-11-18 12:04:43,071 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=21
abstraction | 2025-11-18 12:04:43,071 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 21.0, 'mode': 'heat'}
abstraction | 2025-11-18 12:04:43,072 - __main__ - INFO - ← abstract STATE thermostat_bad_unten: home/thermostat/thermostat_bad_unten/state → {"target": 21.0, "mode": "heat"}
abstraction | 2025-11-18 12:04:43,092 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_bad_unten", "payload": {"target": 21.0, "mode": "heat"}, "ts": "2025-11-18T12:04:43.092210+00:00"}
abstraction | 2025-11-18 12:04:43,108 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/52/1/STATE: false
abstraction | 2025-11-18 12:04:43,108 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,108 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,109 - __main__ - INFO - ← abstract STATE kontakt_schlafzimmer_strasse: home/contact/kontakt_schlafzimmer_strasse/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,128 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_schlafzimmer_strasse", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.128506+00:00"}
abstraction | 2025-11-18 12:04:43,145 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/26/1/STATE: false
abstraction | 2025-11-18 12:04:43,145 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,145 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,146 - __main__ - INFO - ← abstract STATE kontakt_esszimmer_strasse_rechts: home/contact/kontakt_esszimmer_strasse_rechts/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,165 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_esszimmer_strasse_rechts", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.165958+00:00"}
abstraction | 2025-11-18 12:04:43,182 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/27/1/STATE: false
abstraction | 2025-11-18 12:04:43,182 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,183 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,183 - __main__ - INFO - ← abstract STATE kontakt_esszimmer_strasse_links: home/contact/kontakt_esszimmer_strasse_links/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,202 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_esszimmer_strasse_links", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.202580+00:00"}
abstraction | 2025-11-18 12:04:43,219 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/28/1/STATE: false
abstraction | 2025-11-18 12:04:43,219 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,219 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,220 - __main__ - INFO - ← abstract STATE kontakt_wohnzimmer_garten_rechts: home/contact/kontakt_wohnzimmer_garten_rechts/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,239 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_wohnzimmer_garten_rechts", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.239653+00:00"}
abstraction | 2025-11-18 12:04:43,256 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/29/1/STATE: false
abstraction | 2025-11-18 12:04:43,256 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,256 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,257 - __main__ - INFO - ← abstract STATE kontakt_wohnzimmer_garten_links: home/contact/kontakt_wohnzimmer_garten_links/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,275 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_wohnzimmer_garten_links", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.275832+00:00"}
abstraction | 2025-11-18 12:04:43,292 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/18/1/STATE: false
abstraction | 2025-11-18 12:04:43,292 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,292 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,293 - __main__ - INFO - ← abstract STATE kontakt_patty_garten_rechts: home/contact/kontakt_patty_garten_rechts/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,314 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_patty_garten_rechts", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.314579+00:00"}
abstraction | 2025-11-18 12:04:43,331 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/22/1/STATE: false
abstraction | 2025-11-18 12:04:43,331 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,331 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,332 - __main__ - INFO - ← abstract STATE kontakt_patty_garten_links: home/contact/kontakt_patty_garten_links/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,351 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_patty_garten_links", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.351704+00:00"}
abstraction | 2025-11-18 12:04:43,368 - __main__ - DEBUG - MQTT message received on homegear/instance1/plain/44/1/STATE: false
abstraction | 2025-11-18 12:04:43,368 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 12:04:43,368 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 12:04:43,369 - __main__ - INFO - ← abstract STATE kontakt_bad_unten_strasse: home/contact/kontakt_bad_unten_strasse/state → {"contact": "closed"}
abstraction | 2025-11-18 12:04:43,388 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_bad_unten_strasse", "payload": {"contact": "closed"}, "ts": "2025-11-18T12:04:43.388390+00:00"}
api | INFO: 172.16.3.98:60163 - "GET /realtime HTTP/1.1" 200 OK
ui | INFO: 127.0.0.1:35036 - "GET /health HTTP/1.1" 200 OK
api | INFO: 172.16.3.98:60172 - "GET /realtime HTTP/1.1" 200 OK
abstraction | 2025-11-18 12:04:48,498 - __main__ - DEBUG - MQTT message received on shellies/schrankesszimmer/relay/0: off
abstraction | 2025-11-18 12:04:48,498 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 12:04:48,498 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 12:04:48,498 - __main__ - INFO - ← abstract STATE licht_schrank_esszimmer: home/relay/licht_schrank_esszimmer/state → {"power": "off"}
abstraction | 2025-11-18 12:04:48,518 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_schrank_esszimmer", "payload": {"power": "off"}, "ts": "2025-11-18T12:04:48.518525+00:00"}
api | INFO: 172.16.3.98:60187 - "GET /realtime HTTP/1.1" 200 OK
abstraction | 2025-11-18 12:04:52,989 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d0003f052b7: {"battery":100,"humidity":55.04,"linkquality":83,"power_outage_count":38416,"pressure":1002.6,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:04:52,989 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={"battery":100,"humidity":55.04,"linkquality":83,"power_outage_count":38416,"pressure":1002.6,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:04:52,989 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 55.04, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1002.6, 'temperature': 22.13, 'voltage': 3015}
abstraction | 2025-11-18 12:04:52,989 - __main__ - INFO - ← abstract STATE sensor_arbeitszimmer_patty: home/temp_humidity/sensor_arbeitszimmer_patty/state → {"battery": 100, "humidity": 55.04, "linkquality": 83, "power_outage_count": 38416, "pressure": 1002.6, "temperature": 22.13, "voltage": 3015}
abstraction | 2025-11-18 12:04:53,009 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_arbeitszimmer_patty", "payload": {"battery": 100, "humidity": 55.04, "linkquality": 83, "power_outage_count": 38416, "pressure": 1002.6, "temperature": 22.13, "voltage": 3015}, "ts": "2025-11-18T12:04:53.009776+00:00"}
abstraction | 2025-11-18 12:04:53,024 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d0003f052b7: {"battery":100,"humidity":54.82,"linkquality":83,"power_outage_count":38416,"pressure":1002.6,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:04:53,025 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={"battery":100,"humidity":54.82,"linkquality":83,"power_outage_count":38416,"pressure":1002.6,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:04:53,025 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.82, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1002.6, 'temperature': 22.13, 'voltage': 3015}
abstraction | 2025-11-18 12:04:53,025 - __main__ - INFO - ← abstract STATE sensor_arbeitszimmer_patty: home/temp_humidity/sensor_arbeitszimmer_patty/state → {"battery": 100, "humidity": 54.82, "linkquality": 83, "power_outage_count": 38416, "pressure": 1002.6, "temperature": 22.13, "voltage": 3015}
abstraction | 2025-11-18 12:04:53,044 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_arbeitszimmer_patty", "payload": {"battery": 100, "humidity": 54.82, "linkquality": 83, "power_outage_count": 38416, "pressure": 1002.6, "temperature": 22.13, "voltage": 3015}, "ts": "2025-11-18T12:04:53.044379+00:00"}
abstraction | 2025-11-18 12:04:53,061 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d0003f052b7: {"battery":100,"humidity":54.82,"linkquality":83,"power_outage_count":38416,"pressure":1002.4,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:04:53,061 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={"battery":100,"humidity":54.82,"linkquality":83,"power_outage_count":38416,"pressure":1002.4,"temperature":22.13,"voltage":3015}
abstraction | 2025-11-18 12:04:53,061 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.82, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1002.4, 'temperature': 22.13, 'voltage': 3015}
abstraction | 2025-11-18 12:04:53,061 - __main__ - INFO - ← abstract STATE sensor_arbeitszimmer_patty: home/temp_humidity/sensor_arbeitszimmer_patty/state → {"battery": 100, "humidity": 54.82, "linkquality": 83, "power_outage_count": 38416, "pressure": 1002.4, "temperature": 22.13, "voltage": 3015}
abstraction | 2025-11-18 12:04:53,084 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_arbeitszimmer_patty", "payload": {"battery": 100, "humidity": 54.82, "linkquality": 83, "power_outage_count": 38416, "pressure": 1002.4, "temperature": 22.13, "voltage": 3015}, "ts": "2025-11-18T12:04:53.083988+00:00"}
abstraction | 2025-11-18 12:05:03,058 - __main__ - DEBUG - MQTT message received on shellies/lichtterasse/relay/0: off
abstraction | 2025-11-18 12:05:03,058 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 12:05:03,058 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 12:05:03,058 - __main__ - INFO - ← abstract STATE licht_terasse: home/relay/licht_terasse/state → {"power": "off"}
abstraction | 2025-11-18 12:05:03,075 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_terasse", "payload": {"power": "off"}, "ts": "2025-11-18T12:05:03.075262+00:00"}
abstraction | 2025-11-18 12:05:08,209 - __main__ - DEBUG - MQTT message received on shellies/wohnzimmer-regal/relay/0: off
abstraction | 2025-11-18 12:05:08,210 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 12:05:08,210 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 12:05:08,210 - __main__ - INFO - ← abstract STATE licht_regal_wohnzimmer: home/relay/licht_regal_wohnzimmer/state → {"power": "off"}
abstraction | 2025-11-18 12:05:08,228 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_regal_wohnzimmer", "payload": {"power": "off"}, "ts": "2025-11-18T12:05:08.228758+00:00"}
abstraction | 2025-11-18 12:05:10,881 - __main__ - DEBUG - MQTT message received on shellies/LightKitchenSink/relay/0: on
abstraction | 2025-11-18 12:05:10,881 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=on
abstraction | 2025-11-18 12:05:10,881 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'on'}
abstraction | 2025-11-18 12:05:10,881 - __main__ - INFO - ← abstract STATE licht_spuele_kueche: home/relay/licht_spuele_kueche/state → {"power": "on"}
abstraction | 2025-11-18 12:05:10,899 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_spuele_kueche", "payload": {"power": "on"}, "ts": "2025-11-18T12:05:10.899207+00:00"}
abstraction | 2025-11-18 12:05:12,622 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d00083299bb: {"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.9,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:12,622 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.9,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:12,622 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 63, 'humidity': 47.69, 'linkquality': 87, 'power_outage_count': 4906, 'pressure': 1009.9, 'temperature': 19.74, 'voltage': 2945}
abstraction | 2025-11-18 12:05:12,622 - __main__ - INFO - ← abstract STATE sensor_kueche: home/temp_humidity/sensor_kueche/state → {"battery": 63, "humidity": 47.69, "linkquality": 87, "power_outage_count": 4906, "pressure": 1009.9, "temperature": 19.74, "voltage": 2945}
abstraction | 2025-11-18 12:05:12,640 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_kueche", "payload": {"battery": 63, "humidity": 47.69, "linkquality": 87, "power_outage_count": 4906, "pressure": 1009.9, "temperature": 19.74, "voltage": 2945}, "ts": "2025-11-18T12:05:12.640129+00:00"}
abstraction | 2025-11-18 12:05:12,656 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d00083299bb: {"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.9,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:12,656 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.9,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:12,656 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 63, 'humidity': 47.69, 'linkquality': 87, 'power_outage_count': 4906, 'pressure': 1009.9, 'temperature': 19.74, 'voltage': 2945}
abstraction | 2025-11-18 12:05:12,657 - __main__ - INFO - ← abstract STATE sensor_kueche: home/temp_humidity/sensor_kueche/state → {"battery": 63, "humidity": 47.69, "linkquality": 87, "power_outage_count": 4906, "pressure": 1009.9, "temperature": 19.74, "voltage": 2945}
abstraction | 2025-11-18 12:05:12,674 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_kueche", "payload": {"battery": 63, "humidity": 47.69, "linkquality": 87, "power_outage_count": 4906, "pressure": 1009.9, "temperature": 19.74, "voltage": 2945}, "ts": "2025-11-18T12:05:12.674372+00:00"}
abstraction | 2025-11-18 12:05:12,690 - __main__ - DEBUG - MQTT message received on zigbee2mqtt/0x00158d00083299bb: {"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.7,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:12,690 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={"battery":63,"humidity":47.69,"linkquality":87,"power_outage_count":4906,"pressure":1009.7,"temperature":19.74,"voltage":2945}
abstraction | 2025-11-18 12:05:12,690 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 63, 'humidity': 47.69, 'linkquality': 87, 'power_outage_count': 4906, 'pressure': 1009.7, 'temperature': 19.74, 'voltage': 2945}
abstraction | 2025-11-18 12:05:12,690 - __main__ - INFO - ← abstract STATE sensor_kueche: home/temp_humidity/sensor_kueche/state → {"battery": 63, "humidity": 47.69, "linkquality": 87, "power_outage_count": 4906, "pressure": 1009.7, "temperature": 19.74, "voltage": 2945}
abstraction | 2025-11-18 12:05:12,708 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_kueche", "payload": {"battery": 63, "humidity": 47.69, "linkquality": 87, "power_outage_count": 4906, "pressure": 1009.7, "temperature": 19.74, "voltage": 2945}, "ts": "2025-11-18T12:05:12.708715+00:00"}
ui | INFO: 127.0.0.1:35638 - "GET /health HTTP/1.1" 200 OK
abstraction | 2025-11-18 12:05:18,507 - __main__ - DEBUG - MQTT message received on shellies/schrankesszimmer/relay/0: off
abstraction | 2025-11-18 12:05:18,508 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 12:05:18,508 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 12:05:18,508 - __main__ - INFO - ← abstract STATE licht_schrank_esszimmer: home/relay/licht_schrank_esszimmer/state → {"power": "off"}
abstraction | 2025-11-18 12:05:18,526 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_schrank_esszimmer", "payload": {"power": "off"}, "ts": "2025-11-18T12:05:18.525971+00:00"}

View File

@@ -0,0 +1,268 @@
abstraction | 2025-11-18 10:23:59,179 - asyncio - DEBUG - Using selector: EpollSelector
abstraction | 2025-11-18 10:23:59,240 - __main__ - INFO - Loaded configuration from /app/config/devices.yaml
abstraction | 2025-11-18 10:23:59,240 - __main__ - INFO - Loaded 64 device(s): lampe_semeniere_wohnzimmer, stehlampe_esszimmer_spiegel, stehlampe_esszimmer_schrank, grosse_lampe_wohnzimmer, lampe_naehtischchen_wohnzimmer, kleine_lampe_rechts_esszimmer, kleine_lampe_links_esszimmer, leselampe_esszimmer, medusalampe_schlafzimmer, sportlicht_am_fernseher_studierzimmer, deckenlampe_schlafzimmer, bettlicht_wolfgang, bettlicht_patty, schranklicht_hinten_patty, schranklicht_vorne_patty, leselampe_patty, deckenlampe_esszimmer, standlampe_esszimmer, haustuer, deckenlampe_flur_oben, kueche_deckenlampe, sportlicht_tisch, sportlicht_regal, licht_flur_oben_am_spiegel, experimentlabtest, thermostat_wolfgang, thermostat_kueche, thermostat_schlafzimmer, thermostat_esszimmer, thermostat_wohnzimmer, thermostat_patty, thermostat_bad_oben, thermostat_bad_unten, sterne_wohnzimmer, kontakt_schlafzimmer_strasse, kontakt_esszimmer_strasse_rechts, kontakt_esszimmer_strasse_links, kontakt_wohnzimmer_garten_rechts, kontakt_wohnzimmer_garten_links, kontakt_kueche_garten_fenster, kontakt_kueche_garten_tuer, kontakt_kueche_strasse_rechts, kontakt_kueche_strasse_links, kontakt_patty_garten_rechts, kontakt_patty_garten_links, kontakt_patty_strasse, kontakt_wolfgang_garten, kontakt_bad_oben_strasse, kontakt_bad_unten_strasse, sensor_schlafzimmer, sensor_wohnzimmer, sensor_kueche, sensor_arbeitszimmer_patty, sensor_arbeitszimmer_wolfgang, sensor_bad_oben, sensor_bad_unten, sensor_flur, sensor_waschkueche, sensor_sportzimmer, licht_spuele_kueche, licht_schrank_esszimmer, licht_regal_wohnzimmer, licht_flur_schrank, licht_terasse
abstraction | 2025-11-18 10:23:59,241 - __main__ - INFO - Loaded 64 device(s) from configuration
abstraction | 2025-11-18 10:23:59,292 - __main__ - INFO - Connected to Redis: redis://172.23.1.116:6379/8
abstraction | 2025-11-18 10:23:59,292 - __main__ - INFO - Abstraction worker started
abstraction | 2025-11-18 10:23:59,293 - __main__ - INFO - Connecting to MQTT broker: 172.23.1.102:1883
abstraction | 2025-11-18 10:23:59,341 - __main__ - INFO - Connected to MQTT broker as home-automation-abstraction-2cfdfa
abstraction | 2025-11-18 10:23:59,359 - __main__ - INFO - Subscribed to abstract SET: home/relay/lampe_semeniere_wohnzimmer/set
abstraction | 2025-11-18 10:23:59,377 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b8000015480b
abstraction | 2025-11-18 10:23:59,394 - __main__ - INFO - Subscribed to abstract SET: home/light/stehlampe_esszimmer_spiegel/set
abstraction | 2025-11-18 10:23:59,411 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d06ea09
abstraction | 2025-11-18 10:23:59,428 - __main__ - INFO - Subscribed to abstract SET: home/light/stehlampe_esszimmer_schrank/set
abstraction | 2025-11-18 10:23:59,444 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d09176c
abstraction | 2025-11-18 10:23:59,460 - __main__ - INFO - Subscribed to abstract SET: home/relay/grosse_lampe_wohnzimmer/set
abstraction | 2025-11-18 10:23:59,477 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000151aca
abstraction | 2025-11-18 10:23:59,493 - __main__ - INFO - Subscribed to abstract SET: home/relay/lampe_naehtischchen_wohnzimmer/set
abstraction | 2025-11-18 10:23:59,510 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x842e14fffee560ee
abstraction | 2025-11-18 10:23:59,526 - __main__ - INFO - Subscribed to abstract SET: home/relay/kleine_lampe_rechts_esszimmer/set
abstraction | 2025-11-18 10:23:59,543 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000156645
abstraction | 2025-11-18 10:23:59,560 - __main__ - INFO - Subscribed to abstract SET: home/relay/kleine_lampe_links_esszimmer/set
abstraction | 2025-11-18 10:23:59,578 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000153099
abstraction | 2025-11-18 10:23:59,595 - __main__ - INFO - Subscribed to abstract SET: home/light/leselampe_esszimmer/set
abstraction | 2025-11-18 10:23:59,612 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xec1bbdfffe7b84f2
abstraction | 2025-11-18 10:23:59,630 - __main__ - INFO - Subscribed to abstract SET: home/relay/medusalampe_schlafzimmer/set
abstraction | 2025-11-18 10:23:59,647 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000154c7c
abstraction | 2025-11-18 10:23:59,665 - __main__ - INFO - Subscribed to abstract SET: home/light/sportlicht_am_fernseher_studierzimmer/set
abstraction | 2025-11-18 10:23:59,682 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x842e14fffe76a23a
abstraction | 2025-11-18 10:23:59,700 - __main__ - INFO - Subscribed to abstract SET: home/light/deckenlampe_schlafzimmer/set
abstraction | 2025-11-18 10:23:59,717 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880108a406a7
abstraction | 2025-11-18 10:23:59,735 - __main__ - INFO - Subscribed to abstract SET: home/light/bettlicht_wolfgang/set
abstraction | 2025-11-18 10:23:59,753 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00178801081570bf
abstraction | 2025-11-18 10:23:59,770 - __main__ - INFO - Subscribed to abstract SET: home/light/bettlicht_patty/set
abstraction | 2025-11-18 10:23:59,788 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880108158b32
abstraction | 2025-11-18 10:23:59,807 - __main__ - INFO - Subscribed to abstract SET: home/light/schranklicht_hinten_patty/set
abstraction | 2025-11-18 10:23:59,825 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880106e29571
abstraction | 2025-11-18 10:23:59,844 - __main__ - INFO - Subscribed to abstract SET: home/relay/schranklicht_vorne_patty/set
abstraction | 2025-11-18 10:23:59,862 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000154cf5
abstraction | 2025-11-18 10:23:59,881 - __main__ - INFO - Subscribed to abstract SET: home/light/leselampe_patty/set
abstraction | 2025-11-18 10:23:59,901 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010600ec9d
abstraction | 2025-11-18 10:23:59,920 - __main__ - INFO - Subscribed to abstract SET: home/light/deckenlampe_esszimmer/set
abstraction | 2025-11-18 10:23:59,940 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880108a03e45
abstraction | 2025-11-18 10:23:59,959 - __main__ - INFO - Subscribed to abstract SET: home/light/standlampe_esszimmer/set
abstraction | 2025-11-18 10:23:59,979 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xbc33acfffe21f547
abstraction | 2025-11-18 10:23:59,999 - __main__ - INFO - Subscribed to abstract SET: home/light/haustuer/set
abstraction | 2025-11-18 10:24:00,016 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xec1bbdfffea6a3da
abstraction | 2025-11-18 10:24:00,034 - __main__ - INFO - Subscribed to abstract SET: home/light/deckenlampe_flur_oben/set
abstraction | 2025-11-18 10:24:00,053 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d2123a7
abstraction | 2025-11-18 10:24:00,072 - __main__ - INFO - Subscribed to abstract SET: home/light/kueche_deckenlampe/set
abstraction | 2025-11-18 10:24:00,090 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d2c40c4
abstraction | 2025-11-18 10:24:00,108 - __main__ - INFO - Subscribed to abstract SET: home/light/sportlicht_tisch/set
abstraction | 2025-11-18 10:24:00,127 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b8be2409f31b
abstraction | 2025-11-18 10:24:00,145 - __main__ - INFO - Subscribed to abstract SET: home/light/sportlicht_regal/set
abstraction | 2025-11-18 10:24:00,163 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b8be2409f569
abstraction | 2025-11-18 10:24:00,183 - __main__ - INFO - Subscribed to abstract SET: home/light/licht_flur_oben_am_spiegel/set
abstraction | 2025-11-18 10:24:00,201 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x842e14fffefe4ba4
abstraction | 2025-11-18 10:24:00,218 - __main__ - INFO - Subscribed to abstract SET: home/light/experimentlabtest/set
abstraction | 2025-11-18 10:24:00,237 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000195038
abstraction | 2025-11-18 10:24:00,255 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_wolfgang/set
abstraction | 2025-11-18 10:24:00,271 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x540f57fffe7e3cfe
abstraction | 2025-11-18 10:24:00,292 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_kueche/set
abstraction | 2025-11-18 10:24:00,313 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x94deb8fffe2e5c06
abstraction | 2025-11-18 10:24:00,334 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_schlafzimmer/set
abstraction | 2025-11-18 10:24:00,356 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/42/1/SET_TEMPERATURE
abstraction | 2025-11-18 10:24:00,377 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_esszimmer/set
abstraction | 2025-11-18 10:24:00,398 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/45/1/SET_TEMPERATURE
abstraction | 2025-11-18 10:24:00,420 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_wohnzimmer/set
abstraction | 2025-11-18 10:24:00,440 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/46/1/SET_TEMPERATURE
abstraction | 2025-11-18 10:24:00,457 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_patty/set
abstraction | 2025-11-18 10:24:00,475 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/39/1/SET_TEMPERATURE
abstraction | 2025-11-18 10:24:00,493 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_bad_oben/set
abstraction | 2025-11-18 10:24:00,509 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/41/1/SET_TEMPERATURE
abstraction | 2025-11-18 10:24:00,530 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_bad_unten/set
abstraction | 2025-11-18 10:24:00,551 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/48/1/SET_TEMPERATURE
abstraction | 2025-11-18 10:24:00,572 - __main__ - INFO - Subscribed to abstract SET: home/relay/sterne_wohnzimmer/set
abstraction | 2025-11-18 10:24:00,593 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000155fc2
abstraction | 2025-11-18 10:24:00,593 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_schlafzimmer_strasse
abstraction | 2025-11-18 10:24:00,614 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/52/1/STATE
abstraction | 2025-11-18 10:24:00,614 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_esszimmer_strasse_rechts
abstraction | 2025-11-18 10:24:00,630 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/26/1/STATE
abstraction | 2025-11-18 10:24:00,630 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_esszimmer_strasse_links
abstraction | 2025-11-18 10:24:00,647 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/27/1/STATE
abstraction | 2025-11-18 10:24:00,647 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_wohnzimmer_garten_rechts
abstraction | 2025-11-18 10:24:00,668 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/28/1/STATE
abstraction | 2025-11-18 10:24:00,668 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_wohnzimmer_garten_links
abstraction | 2025-11-18 10:24:00,691 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/29/1/STATE
abstraction | 2025-11-18 10:24:00,691 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_garten_fenster
abstraction | 2025-11-18 10:24:00,708 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b332785
abstraction | 2025-11-18 10:24:00,708 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_garten_tuer
abstraction | 2025-11-18 10:24:00,728 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b332788
abstraction | 2025-11-18 10:24:00,728 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_strasse_rechts
abstraction | 2025-11-18 10:24:00,747 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b151803
abstraction | 2025-11-18 10:24:00,747 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_strasse_links
abstraction | 2025-11-18 10:24:00,767 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b331d0b
abstraction | 2025-11-18 10:24:00,767 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_patty_garten_rechts
abstraction | 2025-11-18 10:24:00,784 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/18/1/STATE
abstraction | 2025-11-18 10:24:00,784 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_patty_garten_links
abstraction | 2025-11-18 10:24:00,802 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/22/1/STATE
abstraction | 2025-11-18 10:24:00,802 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_patty_strasse
abstraction | 2025-11-18 10:24:00,821 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000af457cf
abstraction | 2025-11-18 10:24:00,821 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_wolfgang_garten
abstraction | 2025-11-18 10:24:00,838 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b3328da
abstraction | 2025-11-18 10:24:00,838 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_bad_oben_strasse
abstraction | 2025-11-18 10:24:00,855 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b333aec
abstraction | 2025-11-18 10:24:00,855 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_bad_unten_strasse
abstraction | 2025-11-18 10:24:00,872 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/44/1/STATE
abstraction | 2025-11-18 10:24:00,872 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_schlafzimmer
abstraction | 2025-11-18 10:24:00,891 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00043292dc
abstraction | 2025-11-18 10:24:00,891 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_wohnzimmer
abstraction | 2025-11-18 10:24:00,907 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d0008975707
abstraction | 2025-11-18 10:24:00,907 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_kueche
abstraction | 2025-11-18 10:24:00,925 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00083299bb
abstraction | 2025-11-18 10:24:00,925 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_arbeitszimmer_patty
abstraction | 2025-11-18 10:24:00,947 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d0003f052b7
abstraction | 2025-11-18 10:24:00,947 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_arbeitszimmer_wolfgang
abstraction | 2025-11-18 10:24:00,969 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000543fb99
abstraction | 2025-11-18 10:24:00,969 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_bad_oben
abstraction | 2025-11-18 10:24:00,986 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00093e8987
abstraction | 2025-11-18 10:24:00,986 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_bad_unten
abstraction | 2025-11-18 10:24:01,004 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00093e662a
abstraction | 2025-11-18 10:24:01,004 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_flur
abstraction | 2025-11-18 10:24:01,022 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000836ccc6
abstraction | 2025-11-18 10:24:01,022 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_waschkueche
abstraction | 2025-11-18 10:24:01,038 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000449f3bc
abstraction | 2025-11-18 10:24:01,038 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_sportzimmer
abstraction | 2025-11-18 10:24:01,058 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d0009421422
abstraction | 2025-11-18 10:24:01,074 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_spuele_kueche/set
abstraction | 2025-11-18 10:24:01,090 - __main__ - INFO - Subscribed to vendor STATE: shellies/LightKitchenSink/relay/0
abstraction | 2025-11-18 10:24:01,107 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_schrank_esszimmer/set
abstraction | 2025-11-18 10:24:01,122 - __main__ - INFO - Subscribed to vendor STATE: shellies/schrankesszimmer/relay/0
abstraction | 2025-11-18 10:24:01,139 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_regal_wohnzimmer/set
abstraction | 2025-11-18 10:24:01,155 - __main__ - INFO - Subscribed to vendor STATE: shellies/wohnzimmer-regal/relay/0
abstraction | 2025-11-18 10:24:01,172 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_flur_schrank/set
abstraction | 2025-11-18 10:24:01,189 - __main__ - INFO - Subscribed to vendor STATE: shellies/schrankflur/relay/0
abstraction | 2025-11-18 10:24:01,205 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_terasse/set
abstraction | 2025-11-18 10:24:01,222 - __main__ - INFO - Subscribed to vendor STATE: shellies/lichtterasse/relay/0
abstraction | 2025-11-18 10:24:01,222 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=21
abstraction | 2025-11-18 10:24:01,222 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 21.0, 'mode': 'heat'}
abstraction | 2025-11-18 10:24:01,222 - __main__ - INFO - ← abstract STATE thermostat_schlafzimmer: home/thermostat/thermostat_schlafzimmer/state → {"target": 21.0, "mode": "heat"}
abstraction | 2025-11-18 10:24:01,243 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_schlafzimmer", "payload": {"target": 21.0, "mode": "heat"}, "ts": "2025-11-18T10:24:01.243641+00:00"}
abstraction | 2025-11-18 10:24:01,260 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=15
abstraction | 2025-11-18 10:24:01,260 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 15.0, 'mode': 'heat'}
abstraction | 2025-11-18 10:24:01,260 - __main__ - INFO - ← abstract STATE thermostat_esszimmer: home/thermostat/thermostat_esszimmer/state → {"target": 15.0, "mode": "heat"}
abstraction | 2025-11-18 10:24:01,280 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_esszimmer", "payload": {"target": 15.0, "mode": "heat"}, "ts": "2025-11-18T10:24:01.280285+00:00"}
abstraction | 2025-11-18 10:24:01,296 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=15
abstraction | 2025-11-18 10:24:01,296 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 15.0, 'mode': 'heat'}
abstraction | 2025-11-18 10:24:01,296 - __main__ - INFO - ← abstract STATE thermostat_wohnzimmer: home/thermostat/thermostat_wohnzimmer/state → {"target": 15.0, "mode": "heat"}
abstraction | 2025-11-18 10:24:01,317 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_wohnzimmer", "payload": {"target": 15.0, "mode": "heat"}, "ts": "2025-11-18T10:24:01.317708+00:00"}
abstraction | 2025-11-18 10:24:01,334 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=22
abstraction | 2025-11-18 10:24:01,334 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 22.0, 'mode': 'heat'}
abstraction | 2025-11-18 10:24:01,334 - __main__ - INFO - ← abstract STATE thermostat_patty: home/thermostat/thermostat_patty/state → {"target": 22.0, "mode": "heat"}
abstraction | 2025-11-18 10:24:01,357 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_patty", "payload": {"target": 22.0, "mode": "heat"}, "ts": "2025-11-18T10:24:01.357082+00:00"}
abstraction | 2025-11-18 10:24:01,373 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=20
abstraction | 2025-11-18 10:24:01,373 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 20.0, 'mode': 'heat'}
abstraction | 2025-11-18 10:24:01,373 - __main__ - INFO - ← abstract STATE thermostat_bad_oben: home/thermostat/thermostat_bad_oben/state → {"target": 20.0, "mode": "heat"}
abstraction | 2025-11-18 10:24:01,395 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_bad_oben", "payload": {"target": 20.0, "mode": "heat"}, "ts": "2025-11-18T10:24:01.395470+00:00"}
abstraction | 2025-11-18 10:24:01,411 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=5
abstraction | 2025-11-18 10:24:01,411 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 5.0, 'mode': 'heat'}
abstraction | 2025-11-18 10:24:01,411 - __main__ - INFO - ← abstract STATE thermostat_bad_unten: home/thermostat/thermostat_bad_unten/state → {"target": 5.0, "mode": "heat"}
abstraction | 2025-11-18 10:24:01,431 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_bad_unten", "payload": {"target": 5.0, "mode": "heat"}, "ts": "2025-11-18T10:24:01.431068+00:00"}
abstraction | 2025-11-18 10:24:01,448 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 10:24:01,448 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 10:24:01,449 - __main__ - INFO - ← abstract STATE kontakt_schlafzimmer_strasse: home/contact/kontakt_schlafzimmer_strasse/state → {"contact": "closed"}
abstraction | 2025-11-18 10:24:01,472 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_schlafzimmer_strasse", "payload": {"contact": "closed"}, "ts": "2025-11-18T10:24:01.472456+00:00"}
abstraction | 2025-11-18 10:24:01,491 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 10:24:01,491 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 10:24:01,491 - __main__ - INFO - ← abstract STATE kontakt_esszimmer_strasse_rechts: home/contact/kontakt_esszimmer_strasse_rechts/state → {"contact": "closed"}
abstraction | 2025-11-18 10:24:01,733 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_esszimmer_strasse_rechts", "payload": {"contact": "closed"}, "ts": "2025-11-18T10:24:01.733873+00:00"}
abstraction | 2025-11-18 10:24:01,750 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 10:24:01,750 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 10:24:01,750 - __main__ - INFO - ← abstract STATE kontakt_esszimmer_strasse_links: home/contact/kontakt_esszimmer_strasse_links/state → {"contact": "closed"}
abstraction | 2025-11-18 10:24:01,771 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_esszimmer_strasse_links", "payload": {"contact": "closed"}, "ts": "2025-11-18T10:24:01.771380+00:00"}
abstraction | 2025-11-18 10:24:01,788 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 10:24:01,788 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 10:24:01,788 - __main__ - INFO - ← abstract STATE kontakt_wohnzimmer_garten_rechts: home/contact/kontakt_wohnzimmer_garten_rechts/state → {"contact": "closed"}
abstraction | 2025-11-18 10:24:01,808 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_wohnzimmer_garten_rechts", "payload": {"contact": "closed"}, "ts": "2025-11-18T10:24:01.808516+00:00"}
abstraction | 2025-11-18 10:24:01,825 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 10:24:01,825 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 10:24:01,825 - __main__ - INFO - ← abstract STATE kontakt_wohnzimmer_garten_links: home/contact/kontakt_wohnzimmer_garten_links/state → {"contact": "closed"}
abstraction | 2025-11-18 10:24:01,844 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_wohnzimmer_garten_links", "payload": {"contact": "closed"}, "ts": "2025-11-18T10:24:01.844046+00:00"}
abstraction | 2025-11-18 10:24:01,860 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 10:24:01,861 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 10:24:01,861 - __main__ - INFO - ← abstract STATE kontakt_patty_garten_rechts: home/contact/kontakt_patty_garten_rechts/state → {"contact": "closed"}
abstraction | 2025-11-18 10:24:01,881 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_patty_garten_rechts", "payload": {"contact": "closed"}, "ts": "2025-11-18T10:24:01.881922+00:00"}
abstraction | 2025-11-18 10:24:01,898 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 10:24:01,898 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 10:24:01,898 - __main__ - INFO - ← abstract STATE kontakt_patty_garten_links: home/contact/kontakt_patty_garten_links/state → {"contact": "closed"}
abstraction | 2025-11-18 10:24:01,922 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_patty_garten_links", "payload": {"contact": "closed"}, "ts": "2025-11-18T10:24:01.922254+00:00"}
abstraction | 2025-11-18 10:24:01,940 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=true
abstraction | 2025-11-18 10:24:01,940 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'open'}
abstraction | 2025-11-18 10:24:01,940 - __main__ - INFO - ← abstract STATE kontakt_bad_unten_strasse: home/contact/kontakt_bad_unten_strasse/state → {"contact": "open"}
abstraction | 2025-11-18 10:24:01,959 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_bad_unten_strasse", "payload": {"contact": "open"}, "ts": "2025-11-18T10:24:01.959678+00:00"}
abstraction | 2025-11-18 10:24:02,354 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:24:02,354 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:24:02,354 - __main__ - INFO - ← abstract STATE licht_terasse: home/relay/licht_terasse/state → {"power": "off"}
abstraction | 2025-11-18 10:24:02,373 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_terasse", "payload": {"power": "off"}, "ts": "2025-11-18T10:24:02.373461+00:00"}
abstraction | 2025-11-18 10:24:07,440 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:24:07,440 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:24:07,441 - __main__ - INFO - ← abstract STATE licht_regal_wohnzimmer: home/relay/licht_regal_wohnzimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:24:07,459 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_regal_wohnzimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:24:07.459082+00:00"}
abstraction | 2025-11-18 10:24:08,817 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.37, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1004.2, 'temperature': 22.16, 'voltage': 3015}
abstraction | 2025-11-18 10:24:08,817 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.37, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1004.2, 'temperature': 22.16, 'voltage': 3015}
abstraction | 2025-11-18 10:24:08,817 - __main__ - INFO - ← abstract STATE sensor_arbeitszimmer_patty: home/temp_humidity/sensor_arbeitszimmer_patty/state → {"battery": 100, "humidity": 54.37, "linkquality": 83, "power_outage_count": 38416, "pressure": 1004.2, "temperature": 22.16, "voltage": 3015}
abstraction | 2025-11-18 10:24:08,835 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_arbeitszimmer_patty", "payload": {"battery": 100, "humidity": 54.37, "linkquality": 83, "power_outage_count": 38416, "pressure": 1004.2, "temperature": 22.16, "voltage": 3015}, "ts": "2025-11-18T10:24:08.835488+00:00"}
abstraction | 2025-11-18 10:24:08,852 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.22, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1004.2, 'temperature': 22.16, 'voltage': 3015}
abstraction | 2025-11-18 10:24:08,852 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.22, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1004.2, 'temperature': 22.16, 'voltage': 3015}
abstraction | 2025-11-18 10:24:08,852 - __main__ - INFO - ← abstract STATE sensor_arbeitszimmer_patty: home/temp_humidity/sensor_arbeitszimmer_patty/state → {"battery": 100, "humidity": 54.22, "linkquality": 83, "power_outage_count": 38416, "pressure": 1004.2, "temperature": 22.16, "voltage": 3015}
abstraction | 2025-11-18 10:24:08,870 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_arbeitszimmer_patty", "payload": {"battery": 100, "humidity": 54.22, "linkquality": 83, "power_outage_count": 38416, "pressure": 1004.2, "temperature": 22.16, "voltage": 3015}, "ts": "2025-11-18T10:24:08.870674+00:00"}
abstraction | 2025-11-18 10:24:08,887 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.22, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1003.9, 'temperature': 22.16, 'voltage': 3015}
abstraction | 2025-11-18 10:24:08,887 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.22, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1003.9, 'temperature': 22.16, 'voltage': 3015}
abstraction | 2025-11-18 10:24:08,887 - __main__ - INFO - ← abstract STATE sensor_arbeitszimmer_patty: home/temp_humidity/sensor_arbeitszimmer_patty/state → {"battery": 100, "humidity": 54.22, "linkquality": 83, "power_outage_count": 38416, "pressure": 1003.9, "temperature": 22.16, "voltage": 3015}
abstraction | 2025-11-18 10:24:08,907 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_arbeitszimmer_patty", "payload": {"battery": 100, "humidity": 54.22, "linkquality": 83, "power_outage_count": 38416, "pressure": 1003.9, "temperature": 22.16, "voltage": 3015}, "ts": "2025-11-18T10:24:08.907729+00:00"}
abstraction | 2025-11-18 10:24:10,178 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=on
abstraction | 2025-11-18 10:24:10,178 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'on'}
abstraction | 2025-11-18 10:24:10,178 - __main__ - INFO - ← abstract STATE licht_spuele_kueche: home/relay/licht_spuele_kueche/state → {"power": "on"}
abstraction | 2025-11-18 10:24:10,196 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_spuele_kueche", "payload": {"power": "on"}, "ts": "2025-11-18T10:24:10.196762+00:00"}
abstraction | 2025-11-18 10:24:17,815 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:24:17,815 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:24:17,815 - __main__ - INFO - ← abstract STATE licht_schrank_esszimmer: home/relay/licht_schrank_esszimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:24:17,834 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_schrank_esszimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:24:17.834042+00:00"}
abstraction | 2025-11-18 10:24:32,370 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:24:32,370 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:24:32,370 - __main__ - INFO - ← abstract STATE licht_terasse: home/relay/licht_terasse/state → {"power": "off"}
abstraction | 2025-11-18 10:24:32,405 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_terasse", "payload": {"power": "off"}, "ts": "2025-11-18T10:24:32.405754+00:00"}
abstraction | 2025-11-18 10:24:37,447 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:24:37,447 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:24:37,447 - __main__ - INFO - ← abstract STATE licht_regal_wohnzimmer: home/relay/licht_regal_wohnzimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:24:37,465 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_regal_wohnzimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:24:37.465220+00:00"}
abstraction | 2025-11-18 10:24:40,188 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=on
abstraction | 2025-11-18 10:24:40,189 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'on'}
abstraction | 2025-11-18 10:24:40,189 - __main__ - INFO - ← abstract STATE licht_spuele_kueche: home/relay/licht_spuele_kueche/state → {"power": "on"}
abstraction | 2025-11-18 10:24:40,207 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_spuele_kueche", "payload": {"power": "on"}, "ts": "2025-11-18T10:24:40.207222+00:00"}
abstraction | 2025-11-18 10:24:47,833 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:24:47,833 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:24:47,833 - __main__ - INFO - ← abstract STATE licht_schrank_esszimmer: home/relay/licht_schrank_esszimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:24:47,868 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_schrank_esszimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:24:47.868787+00:00"}
abstraction | 2025-11-18 10:25:02,363 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:25:02,363 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:25:02,363 - __main__ - INFO - ← abstract STATE licht_terasse: home/relay/licht_terasse/state → {"power": "off"}
abstraction | 2025-11-18 10:25:02,381 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_terasse", "payload": {"power": "off"}, "ts": "2025-11-18T10:25:02.381792+00:00"}
abstraction | 2025-11-18 10:25:07,447 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:25:07,448 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:25:07,448 - __main__ - INFO - ← abstract STATE licht_regal_wohnzimmer: home/relay/licht_regal_wohnzimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:25:07,465 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_regal_wohnzimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:25:07.465566+00:00"}
abstraction | 2025-11-18 10:25:10,185 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=on
abstraction | 2025-11-18 10:25:10,185 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'on'}
abstraction | 2025-11-18 10:25:10,185 - __main__ - INFO - ← abstract STATE licht_spuele_kueche: home/relay/licht_spuele_kueche/state → {"power": "on"}
abstraction | 2025-11-18 10:25:10,202 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_spuele_kueche", "payload": {"power": "on"}, "ts": "2025-11-18T10:25:10.202372+00:00"}
abstraction | 2025-11-18 10:25:17,820 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:25:17,820 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:25:17,820 - __main__ - INFO - ← abstract STATE licht_schrank_esszimmer: home/relay/licht_schrank_esszimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:25:17,838 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_schrank_esszimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:25:17.838140+00:00"}
abstraction | 2025-11-18 10:25:32,361 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:25:32,361 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:25:32,361 - __main__ - INFO - ← abstract STATE licht_terasse: home/relay/licht_terasse/state → {"power": "off"}
abstraction | 2025-11-18 10:25:32,379 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_terasse", "payload": {"power": "off"}, "ts": "2025-11-18T10:25:32.379286+00:00"}
abstraction | 2025-11-18 10:25:37,455 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:25:37,455 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:25:37,455 - __main__ - INFO - ← abstract STATE licht_regal_wohnzimmer: home/relay/licht_regal_wohnzimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:25:37,473 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_regal_wohnzimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:25:37.473171+00:00"}
abstraction | 2025-11-18 10:25:40,193 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=on
abstraction | 2025-11-18 10:25:40,194 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'on'}
abstraction | 2025-11-18 10:25:40,194 - __main__ - INFO - ← abstract STATE licht_spuele_kueche: home/relay/licht_spuele_kueche/state → {"power": "on"}
abstraction | 2025-11-18 10:25:40,211 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_spuele_kueche", "payload": {"power": "on"}, "ts": "2025-11-18T10:25:40.211493+00:00"}
abstraction | 2025-11-18 10:25:47,821 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:25:47,821 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:25:47,821 - __main__ - INFO - ← abstract STATE licht_schrank_esszimmer: home/relay/licht_schrank_esszimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:25:47,838 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_schrank_esszimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:25:47.838508+00:00"}

332
debug/2025-11-18-debug.log Normal file
View File

@@ -0,0 +1,332 @@
✔ home-automation-abstraction Built 0.0s
✔ home-automation-api Built 0.0s
✔ home-automation-rules Built 0.0s
✔ home-automation-ui Built 0.0s
Attaching to abstraction, api, rules, ui
abstraction | 2025-11-18 10:23:59,179 - asyncio - DEBUG - Using selector: EpollSelector
rules | 2025-11-18 10:23:59,207 - asyncio - DEBUG - Using selector: EpollSelector
rules | 2025-11-18 10:23:59,208 - __main__ - INFO - ============================================================
rules | 2025-11-18 10:23:59,208 - __main__ - INFO - Rules Engine Starting
rules | 2025-11-18 10:23:59,209 - __main__ - INFO - ============================================================
rules | 2025-11-18 10:23:59,209 - __main__ - INFO - Config: /app/config/rules.yaml
rules | 2025-11-18 10:23:59,210 - __main__ - INFO - MQTT: 172.23.1.102:1883
rules | 2025-11-18 10:23:59,210 - __main__ - INFO - Redis: redis://172.23.1.116:6379/8
rules | 2025-11-18 10:23:59,210 - __main__ - INFO - ============================================================
rules | 2025-11-18 10:23:59,211 - __main__ - INFO - Loading rules configuration from /app/config/rules.yaml
rules | 2025-11-18 10:23:59,217 - __main__ - INFO - Loaded 6 rule(s) from configuration
rules | 2025-11-18 10:23:59,218 - __main__ - INFO - - window_setback_esszimmer (type: window_setback@1.0) [DISABLED]
rules | 2025-11-18 10:23:59,218 - __main__ - INFO - - window_setback_kueche (type: window_setback@1.0) [DISABLED]
rules | 2025-11-18 10:23:59,219 - __main__ - INFO - - window_setback_patty (type: window_setback@1.0) [DISABLED]
rules | 2025-11-18 10:23:59,219 - __main__ - INFO - - window_setback_schlafzimmer (type: window_setback@1.0) [DISABLED]
rules | 2025-11-18 10:23:59,220 - __main__ - INFO - - window_setback_wohnzimmer (type: window_setback@1.0) [DISABLED]
rules | 2025-11-18 10:23:59,225 - __main__ - INFO - - window_setback_wolfgang (type: window_setback@1.0)
rules | 2025-11-18 10:23:59,225 - __main__ - INFO - Successfully loaded 1 rule implementation(s) (5 disabled)
rules | 2025-11-18 10:23:59,226 - __main__ - INFO - Rule window_setback_wolfgang validated: 1 contacts, 1 thermostats
rules | 2025-11-18 10:23:59,226 - __main__ - DEBUG - Rule window_setback_wolfgang subscribes to 2 topic(s)
rules | 2025-11-18 10:23:59,227 - __main__ - INFO - Total MQTT subscriptions needed: 2
rules | 2025-11-18 10:23:59,227 - __main__ - INFO - Starting event processing loop
abstraction | 2025-11-18 10:23:59,240 - __main__ - INFO - Loaded configuration from /app/config/devices.yaml
abstraction | 2025-11-18 10:23:59,240 - __main__ - INFO - Loaded 64 device(s): lampe_semeniere_wohnzimmer, stehlampe_esszimmer_spiegel, stehlampe_esszimmer_schrank, grosse_lampe_wohnzimmer, lampe_naehtischchen_wohnzimmer, kleine_lampe_rechts_esszimmer, kleine_lampe_links_esszimmer, leselampe_esszimmer, medusalampe_schlafzimmer, sportlicht_am_fernseher_studierzimmer, deckenlampe_schlafzimmer, bettlicht_wolfgang, bettlicht_patty, schranklicht_hinten_patty, schranklicht_vorne_patty, leselampe_patty, deckenlampe_esszimmer, standlampe_esszimmer, haustuer, deckenlampe_flur_oben, kueche_deckenlampe, sportlicht_tisch, sportlicht_regal, licht_flur_oben_am_spiegel, experimentlabtest, thermostat_wolfgang, thermostat_kueche, thermostat_schlafzimmer, thermostat_esszimmer, thermostat_wohnzimmer, thermostat_patty, thermostat_bad_oben, thermostat_bad_unten, sterne_wohnzimmer, kontakt_schlafzimmer_strasse, kontakt_esszimmer_strasse_rechts, kontakt_esszimmer_strasse_links, kontakt_wohnzimmer_garten_rechts, kontakt_wohnzimmer_garten_links, kontakt_kueche_garten_fenster, kontakt_kueche_garten_tuer, kontakt_kueche_strasse_rechts, kontakt_kueche_strasse_links, kontakt_patty_garten_rechts, kontakt_patty_garten_links, kontakt_patty_strasse, kontakt_wolfgang_garten, kontakt_bad_oben_strasse, kontakt_bad_unten_strasse, sensor_schlafzimmer, sensor_wohnzimmer, sensor_kueche, sensor_arbeitszimmer_patty, sensor_arbeitszimmer_wolfgang, sensor_bad_oben, sensor_bad_unten, sensor_flur, sensor_waschkueche, sensor_sportzimmer, licht_spuele_kueche, licht_schrank_esszimmer, licht_regal_wohnzimmer, licht_flur_schrank, licht_terasse
abstraction | 2025-11-18 10:23:59,241 - __main__ - INFO - Loaded 64 device(s) from configuration
abstraction | 2025-11-18 10:23:59,292 - __main__ - INFO - Connected to Redis: redis://172.23.1.116:6379/8
abstraction | 2025-11-18 10:23:59,292 - __main__ - INFO - Abstraction worker started
abstraction | 2025-11-18 10:23:59,293 - __main__ - INFO - Connecting to MQTT broker: 172.23.1.102:1883
abstraction | 2025-11-18 10:23:59,341 - __main__ - INFO - Connected to MQTT broker as home-automation-abstraction-2cfdfa
abstraction | 2025-11-18 10:23:59,359 - __main__ - INFO - Subscribed to abstract SET: home/relay/lampe_semeniere_wohnzimmer/set
abstraction | 2025-11-18 10:23:59,377 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b8000015480b
rules | 2025-11-18 10:23:59,378 - __main__ - INFO - Connecting to MQTT broker 172.23.1.102:1883 (client_id=rule_engine-782522)
abstraction | 2025-11-18 10:23:59,394 - __main__ - INFO - Subscribed to abstract SET: home/light/stehlampe_esszimmer_spiegel/set
abstraction | 2025-11-18 10:23:59,411 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d06ea09
abstraction | 2025-11-18 10:23:59,428 - __main__ - INFO - Subscribed to abstract SET: home/light/stehlampe_esszimmer_schrank/set
rules | 2025-11-18 10:23:59,431 - __main__ - INFO - Connected to MQTT broker 172.23.1.102:1883
abstraction | 2025-11-18 10:23:59,444 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d09176c
abstraction | 2025-11-18 10:23:59,460 - __main__ - INFO - Subscribed to abstract SET: home/relay/grosse_lampe_wohnzimmer/set
rules | 2025-11-18 10:23:59,466 - __main__ - INFO - Subscribed to 2 topic(s): home/thermostat/thermostat_wolfgang/state, home/contact/kontakt_wolfgang_garten/state
rules | 2025-11-18 10:23:59,467 - __main__ - DEBUG - Received event: {'topic': 'home/thermostat/thermostat_wolfgang/state', 'type': 'state', 'cap': 'thermostat', 'device_id': 'thermostat_wolfgang', 'payload': {'target': 23.0, 'current': 22.5, 'mode': 'heat'}, 'ts': '2025-11-18T10:23:59.467177'}
rules | 2025-11-18 10:23:59,467 - __main__ - DEBUG - Filtering for cap=thermostat, device_id=thermostat_wolfgang
rules | 2025-11-18 10:23:59,468 - __main__ - DEBUG - Rule window_setback_wolfgang: checking thermostats ['thermostat_wolfgang']
rules | 2025-11-18 10:23:59,468 - __main__ - INFO - Event thermostat/thermostat_wolfgang: 1 matching rule(s)
abstraction | 2025-11-18 10:23:59,477 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000151aca
abstraction | 2025-11-18 10:23:59,493 - __main__ - INFO - Subscribed to abstract SET: home/relay/lampe_naehtischchen_wohnzimmer/set
abstraction | 2025-11-18 10:23:59,510 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x842e14fffee560ee
abstraction | 2025-11-18 10:23:59,526 - __main__ - INFO - Subscribed to abstract SET: home/relay/kleine_lampe_rechts_esszimmer/set
abstraction | 2025-11-18 10:23:59,543 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000156645
abstraction | 2025-11-18 10:23:59,560 - __main__ - INFO - Subscribed to abstract SET: home/relay/kleine_lampe_links_esszimmer/set
rules | 2025-11-18 10:23:59,572 - __main__ - DEBUG - Rule window_setback_wolfgang: Updated current target for thermostat_wolfgang: 23.0°C
rules | 2025-11-18 10:23:59,573 - __main__ - DEBUG - Received event: {'topic': 'home/contact/kontakt_wolfgang_garten/state', 'type': 'state', 'cap': 'contact', 'device_id': 'kontakt_wolfgang_garten', 'payload': {'contact': 'closed', 'battery': 100, 'linkquality': 32, 'device_temperature': 26, 'voltage': 3025}, 'ts': '2025-11-18T10:23:59.573073'}
rules | 2025-11-18 10:23:59,573 - __main__ - DEBUG - Filtering for cap=contact, device_id=kontakt_wolfgang_garten
rules | 2025-11-18 10:23:59,573 - __main__ - DEBUG - Rule window_setback_wolfgang: checking contacts ['kontakt_wolfgang_garten']
rules | 2025-11-18 10:23:59,574 - __main__ - INFO - Event contact/kontakt_wolfgang_garten: 1 matching rule(s)
abstraction | 2025-11-18 10:23:59,578 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000153099
abstraction | 2025-11-18 10:23:59,595 - __main__ - INFO - Subscribed to abstract SET: home/light/leselampe_esszimmer/set
rules | 2025-11-18 10:23:59,610 - __main__ - INFO - Rule window_setback_wolfgang: Window closed, restoring 1 thermostats to previous temperatures
abstraction | 2025-11-18 10:23:59,612 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xec1bbdfffe7b84f2
rules | 2025-11-18 10:23:59,627 - __main__ - WARNING - No previous target found for thermostat_wolfgang, cannot restore
abstraction | 2025-11-18 10:23:59,630 - __main__ - INFO - Subscribed to abstract SET: home/relay/medusalampe_schlafzimmer/set
abstraction | 2025-11-18 10:23:59,647 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000154c7c
abstraction | 2025-11-18 10:23:59,665 - __main__ - INFO - Subscribed to abstract SET: home/light/sportlicht_am_fernseher_studierzimmer/set
abstraction | 2025-11-18 10:23:59,682 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x842e14fffe76a23a
abstraction | 2025-11-18 10:23:59,700 - __main__ - INFO - Subscribed to abstract SET: home/light/deckenlampe_schlafzimmer/set
abstraction | 2025-11-18 10:23:59,717 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880108a406a7
api | INFO: Started server process [1]
api | INFO: Waiting for application startup.
abstraction | 2025-11-18 10:23:59,735 - __main__ - INFO - Subscribed to abstract SET: home/light/bettlicht_wolfgang/set
api | INFO: Application startup complete.
abstraction | 2025-11-18 10:23:59,753 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00178801081570bf
api | INFO: Uvicorn running on http://0.0.0.0:8001 (Press CTRL+C to quit)
abstraction | 2025-11-18 10:23:59,770 - __main__ - INFO - Subscribed to abstract SET: home/light/bettlicht_patty/set
abstraction | 2025-11-18 10:23:59,788 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880108158b32
abstraction | 2025-11-18 10:23:59,807 - __main__ - INFO - Subscribed to abstract SET: home/light/schranklicht_hinten_patty/set
abstraction | 2025-11-18 10:23:59,825 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880106e29571
abstraction | 2025-11-18 10:23:59,844 - __main__ - INFO - Subscribed to abstract SET: home/relay/schranklicht_vorne_patty/set
abstraction | 2025-11-18 10:23:59,862 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000154cf5
abstraction | 2025-11-18 10:23:59,881 - __main__ - INFO - Subscribed to abstract SET: home/light/leselampe_patty/set
abstraction | 2025-11-18 10:23:59,901 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010600ec9d
abstraction | 2025-11-18 10:23:59,920 - __main__ - INFO - Subscribed to abstract SET: home/light/deckenlampe_esszimmer/set
abstraction | 2025-11-18 10:23:59,940 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x0017880108a03e45
abstraction | 2025-11-18 10:23:59,959 - __main__ - INFO - Subscribed to abstract SET: home/light/standlampe_esszimmer/set
abstraction | 2025-11-18 10:23:59,979 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xbc33acfffe21f547
ui | UI using API_BASE: http://172.19.1.11:8001
ui | UI using BASE_PATH: /
ui | INFO: Started server process [1]
ui | INFO: Waiting for application startup.
ui | INFO: Application startup complete.
abstraction | 2025-11-18 10:23:59,999 - __main__ - INFO - Subscribed to abstract SET: home/light/haustuer/set
ui | INFO: Uvicorn running on http://0.0.0.0:8002 (Press CTRL+C to quit)
abstraction | 2025-11-18 10:24:00,016 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xec1bbdfffea6a3da
abstraction | 2025-11-18 10:24:00,034 - __main__ - INFO - Subscribed to abstract SET: home/light/deckenlampe_flur_oben/set
abstraction | 2025-11-18 10:24:00,053 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d2123a7
abstraction | 2025-11-18 10:24:00,072 - __main__ - INFO - Subscribed to abstract SET: home/light/kueche_deckenlampe/set
abstraction | 2025-11-18 10:24:00,090 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x001788010d2c40c4
abstraction | 2025-11-18 10:24:00,108 - __main__ - INFO - Subscribed to abstract SET: home/light/sportlicht_tisch/set
abstraction | 2025-11-18 10:24:00,127 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b8be2409f31b
abstraction | 2025-11-18 10:24:00,145 - __main__ - INFO - Subscribed to abstract SET: home/light/sportlicht_regal/set
abstraction | 2025-11-18 10:24:00,163 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b8be2409f569
abstraction | 2025-11-18 10:24:00,183 - __main__ - INFO - Subscribed to abstract SET: home/light/licht_flur_oben_am_spiegel/set
abstraction | 2025-11-18 10:24:00,201 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x842e14fffefe4ba4
abstraction | 2025-11-18 10:24:00,218 - __main__ - INFO - Subscribed to abstract SET: home/light/experimentlabtest/set
abstraction | 2025-11-18 10:24:00,237 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000195038
abstraction | 2025-11-18 10:24:00,255 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_wolfgang/set
abstraction | 2025-11-18 10:24:00,271 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x540f57fffe7e3cfe
abstraction | 2025-11-18 10:24:00,292 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_kueche/set
abstraction | 2025-11-18 10:24:00,313 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x94deb8fffe2e5c06
abstraction | 2025-11-18 10:24:00,334 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_schlafzimmer/set
abstraction | 2025-11-18 10:24:00,356 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/42/1/SET_TEMPERATURE
abstraction | 2025-11-18 10:24:00,377 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_esszimmer/set
abstraction | 2025-11-18 10:24:00,398 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/45/1/SET_TEMPERATURE
abstraction | 2025-11-18 10:24:00,420 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_wohnzimmer/set
abstraction | 2025-11-18 10:24:00,440 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/46/1/SET_TEMPERATURE
abstraction | 2025-11-18 10:24:00,457 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_patty/set
abstraction | 2025-11-18 10:24:00,475 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/39/1/SET_TEMPERATURE
abstraction | 2025-11-18 10:24:00,493 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_bad_oben/set
abstraction | 2025-11-18 10:24:00,509 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/41/1/SET_TEMPERATURE
abstraction | 2025-11-18 10:24:00,530 - __main__ - INFO - Subscribed to abstract SET: home/thermostat/thermostat_bad_unten/set
abstraction | 2025-11-18 10:24:00,551 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/48/1/SET_TEMPERATURE
abstraction | 2025-11-18 10:24:00,572 - __main__ - INFO - Subscribed to abstract SET: home/relay/sterne_wohnzimmer/set
abstraction | 2025-11-18 10:24:00,593 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0xf0d1b80000155fc2
abstraction | 2025-11-18 10:24:00,593 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_schlafzimmer_strasse
abstraction | 2025-11-18 10:24:00,614 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/52/1/STATE
abstraction | 2025-11-18 10:24:00,614 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_esszimmer_strasse_rechts
abstraction | 2025-11-18 10:24:00,630 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/26/1/STATE
abstraction | 2025-11-18 10:24:00,630 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_esszimmer_strasse_links
abstraction | 2025-11-18 10:24:00,647 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/27/1/STATE
abstraction | 2025-11-18 10:24:00,647 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_wohnzimmer_garten_rechts
abstraction | 2025-11-18 10:24:00,668 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/28/1/STATE
abstraction | 2025-11-18 10:24:00,668 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_wohnzimmer_garten_links
abstraction | 2025-11-18 10:24:00,691 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/29/1/STATE
abstraction | 2025-11-18 10:24:00,691 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_garten_fenster
abstraction | 2025-11-18 10:24:00,708 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b332785
abstraction | 2025-11-18 10:24:00,708 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_garten_tuer
abstraction | 2025-11-18 10:24:00,728 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b332788
abstraction | 2025-11-18 10:24:00,728 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_strasse_rechts
abstraction | 2025-11-18 10:24:00,747 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b151803
abstraction | 2025-11-18 10:24:00,747 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_kueche_strasse_links
abstraction | 2025-11-18 10:24:00,767 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b331d0b
abstraction | 2025-11-18 10:24:00,767 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_patty_garten_rechts
abstraction | 2025-11-18 10:24:00,784 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/18/1/STATE
abstraction | 2025-11-18 10:24:00,784 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_patty_garten_links
abstraction | 2025-11-18 10:24:00,802 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/22/1/STATE
abstraction | 2025-11-18 10:24:00,802 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_patty_strasse
abstraction | 2025-11-18 10:24:00,821 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000af457cf
abstraction | 2025-11-18 10:24:00,821 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_wolfgang_garten
abstraction | 2025-11-18 10:24:00,838 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b3328da
abstraction | 2025-11-18 10:24:00,838 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_bad_oben_strasse
abstraction | 2025-11-18 10:24:00,855 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d008b333aec
abstraction | 2025-11-18 10:24:00,855 - __main__ - INFO - Skipping SET subscription for read-only device: kontakt_bad_unten_strasse
api | INFO: 172.16.3.98:51428 - "GET /realtime HTTP/1.1" 200 OK
abstraction | 2025-11-18 10:24:00,872 - __main__ - INFO - Subscribed to vendor STATE: homegear/instance1/plain/44/1/STATE
abstraction | 2025-11-18 10:24:00,872 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_schlafzimmer
abstraction | 2025-11-18 10:24:00,891 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00043292dc
abstraction | 2025-11-18 10:24:00,891 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_wohnzimmer
api | INFO: 172.16.3.98:51429 - "GET /realtime HTTP/1.1" 200 OK
abstraction | 2025-11-18 10:24:00,907 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d0008975707
abstraction | 2025-11-18 10:24:00,907 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_kueche
abstraction | 2025-11-18 10:24:00,925 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00083299bb
abstraction | 2025-11-18 10:24:00,925 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_arbeitszimmer_patty
abstraction | 2025-11-18 10:24:00,947 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d0003f052b7
abstraction | 2025-11-18 10:24:00,947 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_arbeitszimmer_wolfgang
abstraction | 2025-11-18 10:24:00,969 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000543fb99
abstraction | 2025-11-18 10:24:00,969 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_bad_oben
abstraction | 2025-11-18 10:24:00,986 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00093e8987
abstraction | 2025-11-18 10:24:00,986 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_bad_unten
abstraction | 2025-11-18 10:24:01,004 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d00093e662a
abstraction | 2025-11-18 10:24:01,004 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_flur
abstraction | 2025-11-18 10:24:01,022 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000836ccc6
abstraction | 2025-11-18 10:24:01,022 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_waschkueche
abstraction | 2025-11-18 10:24:01,038 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d000449f3bc
abstraction | 2025-11-18 10:24:01,038 - __main__ - INFO - Skipping SET subscription for read-only device: sensor_sportzimmer
abstraction | 2025-11-18 10:24:01,058 - __main__ - INFO - Subscribed to vendor STATE: zigbee2mqtt/0x00158d0009421422
abstraction | 2025-11-18 10:24:01,074 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_spuele_kueche/set
abstraction | 2025-11-18 10:24:01,090 - __main__ - INFO - Subscribed to vendor STATE: shellies/LightKitchenSink/relay/0
abstraction | 2025-11-18 10:24:01,107 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_schrank_esszimmer/set
abstraction | 2025-11-18 10:24:01,122 - __main__ - INFO - Subscribed to vendor STATE: shellies/schrankesszimmer/relay/0
abstraction | 2025-11-18 10:24:01,139 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_regal_wohnzimmer/set
abstraction | 2025-11-18 10:24:01,155 - __main__ - INFO - Subscribed to vendor STATE: shellies/wohnzimmer-regal/relay/0
abstraction | 2025-11-18 10:24:01,172 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_flur_schrank/set
abstraction | 2025-11-18 10:24:01,189 - __main__ - INFO - Subscribed to vendor STATE: shellies/schrankflur/relay/0
abstraction | 2025-11-18 10:24:01,205 - __main__ - INFO - Subscribed to abstract SET: home/relay/licht_terasse/set
abstraction | 2025-11-18 10:24:01,222 - __main__ - INFO - Subscribed to vendor STATE: shellies/lichtterasse/relay/0
abstraction | 2025-11-18 10:24:01,222 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=21
abstraction | 2025-11-18 10:24:01,222 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 21.0, 'mode': 'heat'}
abstraction | 2025-11-18 10:24:01,222 - __main__ - INFO - ← abstract STATE thermostat_schlafzimmer: home/thermostat/thermostat_schlafzimmer/state → {"target": 21.0, "mode": "heat"}
abstraction | 2025-11-18 10:24:01,243 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_schlafzimmer", "payload": {"target": 21.0, "mode": "heat"}, "ts": "2025-11-18T10:24:01.243641+00:00"}
abstraction | 2025-11-18 10:24:01,260 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=15
abstraction | 2025-11-18 10:24:01,260 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 15.0, 'mode': 'heat'}
abstraction | 2025-11-18 10:24:01,260 - __main__ - INFO - ← abstract STATE thermostat_esszimmer: home/thermostat/thermostat_esszimmer/state → {"target": 15.0, "mode": "heat"}
abstraction | 2025-11-18 10:24:01,280 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_esszimmer", "payload": {"target": 15.0, "mode": "heat"}, "ts": "2025-11-18T10:24:01.280285+00:00"}
abstraction | 2025-11-18 10:24:01,296 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=15
abstraction | 2025-11-18 10:24:01,296 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 15.0, 'mode': 'heat'}
abstraction | 2025-11-18 10:24:01,296 - __main__ - INFO - ← abstract STATE thermostat_wohnzimmer: home/thermostat/thermostat_wohnzimmer/state → {"target": 15.0, "mode": "heat"}
abstraction | 2025-11-18 10:24:01,317 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_wohnzimmer", "payload": {"target": 15.0, "mode": "heat"}, "ts": "2025-11-18T10:24:01.317708+00:00"}
abstraction | 2025-11-18 10:24:01,334 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=22
abstraction | 2025-11-18 10:24:01,334 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 22.0, 'mode': 'heat'}
abstraction | 2025-11-18 10:24:01,334 - __main__ - INFO - ← abstract STATE thermostat_patty: home/thermostat/thermostat_patty/state → {"target": 22.0, "mode": "heat"}
abstraction | 2025-11-18 10:24:01,357 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_patty", "payload": {"target": 22.0, "mode": "heat"}, "ts": "2025-11-18T10:24:01.357082+00:00"}
abstraction | 2025-11-18 10:24:01,373 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=20
abstraction | 2025-11-18 10:24:01,373 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 20.0, 'mode': 'heat'}
abstraction | 2025-11-18 10:24:01,373 - __main__ - INFO - ← abstract STATE thermostat_bad_oben: home/thermostat/thermostat_bad_oben/state → {"target": 20.0, "mode": "heat"}
abstraction | 2025-11-18 10:24:01,395 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_bad_oben", "payload": {"target": 20.0, "mode": "heat"}, "ts": "2025-11-18T10:24:01.395470+00:00"}
abstraction | 2025-11-18 10:24:01,411 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=thermostat, tech=max, payload=5
abstraction | 2025-11-18 10:24:01,411 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=thermostat, tech=max, payload={'target': 5.0, 'mode': 'heat'}
abstraction | 2025-11-18 10:24:01,411 - __main__ - INFO - ← abstract STATE thermostat_bad_unten: home/thermostat/thermostat_bad_unten/state → {"target": 5.0, "mode": "heat"}
abstraction | 2025-11-18 10:24:01,431 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "thermostat_bad_unten", "payload": {"target": 5.0, "mode": "heat"}, "ts": "2025-11-18T10:24:01.431068+00:00"}
abstraction | 2025-11-18 10:24:01,448 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 10:24:01,448 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 10:24:01,449 - __main__ - INFO - ← abstract STATE kontakt_schlafzimmer_strasse: home/contact/kontakt_schlafzimmer_strasse/state → {"contact": "closed"}
abstraction | 2025-11-18 10:24:01,472 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_schlafzimmer_strasse", "payload": {"contact": "closed"}, "ts": "2025-11-18T10:24:01.472456+00:00"}
abstraction | 2025-11-18 10:24:01,491 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 10:24:01,491 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 10:24:01,491 - __main__ - INFO - ← abstract STATE kontakt_esszimmer_strasse_rechts: home/contact/kontakt_esszimmer_strasse_rechts/state → {"contact": "closed"}
abstraction | 2025-11-18 10:24:01,733 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_esszimmer_strasse_rechts", "payload": {"contact": "closed"}, "ts": "2025-11-18T10:24:01.733873+00:00"}
abstraction | 2025-11-18 10:24:01,750 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 10:24:01,750 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 10:24:01,750 - __main__ - INFO - ← abstract STATE kontakt_esszimmer_strasse_links: home/contact/kontakt_esszimmer_strasse_links/state → {"contact": "closed"}
abstraction | 2025-11-18 10:24:01,771 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_esszimmer_strasse_links", "payload": {"contact": "closed"}, "ts": "2025-11-18T10:24:01.771380+00:00"}
abstraction | 2025-11-18 10:24:01,788 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 10:24:01,788 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 10:24:01,788 - __main__ - INFO - ← abstract STATE kontakt_wohnzimmer_garten_rechts: home/contact/kontakt_wohnzimmer_garten_rechts/state → {"contact": "closed"}
abstraction | 2025-11-18 10:24:01,808 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_wohnzimmer_garten_rechts", "payload": {"contact": "closed"}, "ts": "2025-11-18T10:24:01.808516+00:00"}
abstraction | 2025-11-18 10:24:01,825 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 10:24:01,825 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 10:24:01,825 - __main__ - INFO - ← abstract STATE kontakt_wohnzimmer_garten_links: home/contact/kontakt_wohnzimmer_garten_links/state → {"contact": "closed"}
abstraction | 2025-11-18 10:24:01,844 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_wohnzimmer_garten_links", "payload": {"contact": "closed"}, "ts": "2025-11-18T10:24:01.844046+00:00"}
abstraction | 2025-11-18 10:24:01,860 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 10:24:01,861 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 10:24:01,861 - __main__ - INFO - ← abstract STATE kontakt_patty_garten_rechts: home/contact/kontakt_patty_garten_rechts/state → {"contact": "closed"}
abstraction | 2025-11-18 10:24:01,881 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_patty_garten_rechts", "payload": {"contact": "closed"}, "ts": "2025-11-18T10:24:01.881922+00:00"}
abstraction | 2025-11-18 10:24:01,898 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=false
abstraction | 2025-11-18 10:24:01,898 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'closed'}
abstraction | 2025-11-18 10:24:01,898 - __main__ - INFO - ← abstract STATE kontakt_patty_garten_links: home/contact/kontakt_patty_garten_links/state → {"contact": "closed"}
abstraction | 2025-11-18 10:24:01,922 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_patty_garten_links", "payload": {"contact": "closed"}, "ts": "2025-11-18T10:24:01.922254+00:00"}
abstraction | 2025-11-18 10:24:01,940 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=contact, tech=max, payload=true
abstraction | 2025-11-18 10:24:01,940 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=contact, tech=max, payload={'contact': 'open'}
abstraction | 2025-11-18 10:24:01,940 - __main__ - INFO - ← abstract STATE kontakt_bad_unten_strasse: home/contact/kontakt_bad_unten_strasse/state → {"contact": "open"}
abstraction | 2025-11-18 10:24:01,959 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "kontakt_bad_unten_strasse", "payload": {"contact": "open"}, "ts": "2025-11-18T10:24:01.959678+00:00"}
abstraction | 2025-11-18 10:24:02,354 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:24:02,354 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:24:02,354 - __main__ - INFO - ← abstract STATE licht_terasse: home/relay/licht_terasse/state → {"power": "off"}
abstraction | 2025-11-18 10:24:02,373 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_terasse", "payload": {"power": "off"}, "ts": "2025-11-18T10:24:02.373461+00:00"}
ui | INFO: 127.0.0.1:49192 - "GET /health HTTP/1.1" 200 OK
api | INFO: 172.16.3.98:51450 - "GET /realtime HTTP/1.1" 200 OK
abstraction | 2025-11-18 10:24:07,440 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:24:07,440 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:24:07,441 - __main__ - INFO - ← abstract STATE licht_regal_wohnzimmer: home/relay/licht_regal_wohnzimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:24:07,459 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_regal_wohnzimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:24:07.459082+00:00"}
abstraction | 2025-11-18 10:24:08,817 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.37, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1004.2, 'temperature': 22.16, 'voltage': 3015}
abstraction | 2025-11-18 10:24:08,817 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.37, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1004.2, 'temperature': 22.16, 'voltage': 3015}
abstraction | 2025-11-18 10:24:08,817 - __main__ - INFO - ← abstract STATE sensor_arbeitszimmer_patty: home/temp_humidity/sensor_arbeitszimmer_patty/state → {"battery": 100, "humidity": 54.37, "linkquality": 83, "power_outage_count": 38416, "pressure": 1004.2, "temperature": 22.16, "voltage": 3015}
abstraction | 2025-11-18 10:24:08,835 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_arbeitszimmer_patty", "payload": {"battery": 100, "humidity": 54.37, "linkquality": 83, "power_outage_count": 38416, "pressure": 1004.2, "temperature": 22.16, "voltage": 3015}, "ts": "2025-11-18T10:24:08.835488+00:00"}
abstraction | 2025-11-18 10:24:08,852 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.22, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1004.2, 'temperature': 22.16, 'voltage': 3015}
abstraction | 2025-11-18 10:24:08,852 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.22, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1004.2, 'temperature': 22.16, 'voltage': 3015}
abstraction | 2025-11-18 10:24:08,852 - __main__ - INFO - ← abstract STATE sensor_arbeitszimmer_patty: home/temp_humidity/sensor_arbeitszimmer_patty/state → {"battery": 100, "humidity": 54.22, "linkquality": 83, "power_outage_count": 38416, "pressure": 1004.2, "temperature": 22.16, "voltage": 3015}
abstraction | 2025-11-18 10:24:08,870 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_arbeitszimmer_patty", "payload": {"battery": 100, "humidity": 54.22, "linkquality": 83, "power_outage_count": 38416, "pressure": 1004.2, "temperature": 22.16, "voltage": 3015}, "ts": "2025-11-18T10:24:08.870674+00:00"}
abstraction | 2025-11-18 10:24:08,887 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.22, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1003.9, 'temperature': 22.16, 'voltage': 3015}
abstraction | 2025-11-18 10:24:08,887 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=temp_humidity_sensor, tech=zigbee2mqtt, payload={'battery': 100, 'humidity': 54.22, 'linkquality': 83, 'power_outage_count': 38416, 'pressure': 1003.9, 'temperature': 22.16, 'voltage': 3015}
abstraction | 2025-11-18 10:24:08,887 - __main__ - INFO - ← abstract STATE sensor_arbeitszimmer_patty: home/temp_humidity/sensor_arbeitszimmer_patty/state → {"battery": 100, "humidity": 54.22, "linkquality": 83, "power_outage_count": 38416, "pressure": 1003.9, "temperature": 22.16, "voltage": 3015}
abstraction | 2025-11-18 10:24:08,907 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "sensor_arbeitszimmer_patty", "payload": {"battery": 100, "humidity": 54.22, "linkquality": 83, "power_outage_count": 38416, "pressure": 1003.9, "temperature": 22.16, "voltage": 3015}, "ts": "2025-11-18T10:24:08.907729+00:00"}
abstraction | 2025-11-18 10:24:10,178 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=on
abstraction | 2025-11-18 10:24:10,178 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'on'}
abstraction | 2025-11-18 10:24:10,178 - __main__ - INFO - ← abstract STATE licht_spuele_kueche: home/relay/licht_spuele_kueche/state → {"power": "on"}
abstraction | 2025-11-18 10:24:10,196 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_spuele_kueche", "payload": {"power": "on"}, "ts": "2025-11-18T10:24:10.196762+00:00"}
abstraction | 2025-11-18 10:24:17,815 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:24:17,815 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:24:17,815 - __main__ - INFO - ← abstract STATE licht_schrank_esszimmer: home/relay/licht_schrank_esszimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:24:17,834 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_schrank_esszimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:24:17.834042+00:00"}
abstraction | 2025-11-18 10:24:32,370 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:24:32,370 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:24:32,370 - __main__ - INFO - ← abstract STATE licht_terasse: home/relay/licht_terasse/state → {"power": "off"}
abstraction | 2025-11-18 10:24:32,405 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_terasse", "payload": {"power": "off"}, "ts": "2025-11-18T10:24:32.405754+00:00"}
ui | INFO: 127.0.0.1:39276 - "GET /health HTTP/1.1" 200 OK
abstraction | 2025-11-18 10:24:37,447 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:24:37,447 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:24:37,447 - __main__ - INFO - ← abstract STATE licht_regal_wohnzimmer: home/relay/licht_regal_wohnzimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:24:37,465 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_regal_wohnzimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:24:37.465220+00:00"}
abstraction | 2025-11-18 10:24:40,188 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=on
abstraction | 2025-11-18 10:24:40,189 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'on'}
abstraction | 2025-11-18 10:24:40,189 - __main__ - INFO - ← abstract STATE licht_spuele_kueche: home/relay/licht_spuele_kueche/state → {"power": "on"}
abstraction | 2025-11-18 10:24:40,207 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_spuele_kueche", "payload": {"power": "on"}, "ts": "2025-11-18T10:24:40.207222+00:00"}
abstraction | 2025-11-18 10:24:47,833 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:24:47,833 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:24:47,833 - __main__ - INFO - ← abstract STATE licht_schrank_esszimmer: home/relay/licht_schrank_esszimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:24:47,868 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_schrank_esszimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:24:47.868787+00:00"}
abstraction | 2025-11-18 10:25:02,363 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:25:02,363 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:25:02,363 - __main__ - INFO - ← abstract STATE licht_terasse: home/relay/licht_terasse/state → {"power": "off"}
abstraction | 2025-11-18 10:25:02,381 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_terasse", "payload": {"power": "off"}, "ts": "2025-11-18T10:25:02.381792+00:00"}
ui | INFO: 127.0.0.1:37108 - "GET /health HTTP/1.1" 200 OK
abstraction | 2025-11-18 10:25:07,447 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:25:07,448 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:25:07,448 - __main__ - INFO - ← abstract STATE licht_regal_wohnzimmer: home/relay/licht_regal_wohnzimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:25:07,465 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_regal_wohnzimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:25:07.465566+00:00"}
abstraction | 2025-11-18 10:25:10,185 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=on
abstraction | 2025-11-18 10:25:10,185 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'on'}
abstraction | 2025-11-18 10:25:10,185 - __main__ - INFO - ← abstract STATE licht_spuele_kueche: home/relay/licht_spuele_kueche/state → {"power": "on"}
abstraction | 2025-11-18 10:25:10,202 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_spuele_kueche", "payload": {"power": "on"}, "ts": "2025-11-18T10:25:10.202372+00:00"}
abstraction | 2025-11-18 10:25:17,820 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:25:17,820 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:25:17,820 - __main__ - INFO - ← abstract STATE licht_schrank_esszimmer: home/relay/licht_schrank_esszimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:25:17,838 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_schrank_esszimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:25:17.838140+00:00"}
api | INFO: 172.16.3.98:51763 - "GET /docs HTTP/1.1" 200 OK
api | /usr/local/lib/python3.14/site-packages/fastapi/openapi/utils.py:207: UserWarning: Duplicate Operation ID get_device_layout_devices__device_id__layout_get for function get_device_layout at /app/apps/api/main.py
api | warnings.warn(message, stacklevel=1)
api | /usr/local/lib/python3.14/site-packages/fastapi/openapi/utils.py:207: UserWarning: Duplicate Operation ID get_device_state_devices__device_id__state_get for function get_device_state at /app/apps/api/main.py
api | warnings.warn(message, stacklevel=1)
api | INFO: 172.16.3.98:51763 - "GET /openapi.json HTTP/1.1" 200 OK
api | INFO: 172.16.3.98:51763 - "GET /devices/states HTTP/1.1" 200 OK
abstraction | 2025-11-18 10:25:32,361 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:25:32,361 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:25:32,361 - __main__ - INFO - ← abstract STATE licht_terasse: home/relay/licht_terasse/state → {"power": "off"}
abstraction | 2025-11-18 10:25:32,379 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_terasse", "payload": {"power": "off"}, "ts": "2025-11-18T10:25:32.379286+00:00"}
ui | INFO: 127.0.0.1:41510 - "GET /health HTTP/1.1" 200 OK
abstraction | 2025-11-18 10:25:37,455 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:25:37,455 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:25:37,455 - __main__ - INFO - ← abstract STATE licht_regal_wohnzimmer: home/relay/licht_regal_wohnzimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:25:37,473 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_regal_wohnzimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:25:37.473171+00:00"}
abstraction | 2025-11-18 10:25:40,193 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=on
abstraction | 2025-11-18 10:25:40,194 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'on'}
abstraction | 2025-11-18 10:25:40,194 - __main__ - INFO - ← abstract STATE licht_spuele_kueche: home/relay/licht_spuele_kueche/state → {"power": "on"}
abstraction | 2025-11-18 10:25:40,211 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_spuele_kueche", "payload": {"power": "on"}, "ts": "2025-11-18T10:25:40.211493+00:00"}
abstraction | 2025-11-18 10:25:47,821 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract IN: type=relay, tech=shelly, payload=off
abstraction | 2025-11-18 10:25:47,821 - apps.abstraction.transformation - DEBUG - transform_vendor_to_abstract OUT: type=relay, tech=shelly, payload={'power': 'off'}
abstraction | 2025-11-18 10:25:47,821 - __main__ - INFO - ← abstract STATE licht_schrank_esszimmer: home/relay/licht_schrank_esszimmer/state → {"power": "off"}
abstraction | 2025-11-18 10:25:47,838 - __main__ - INFO - ← Redis PUBLISH ui:updates → {"type": "state", "device_id": "licht_schrank_esszimmer", "payload": {"power": "off"}, "ts": "2025-11-18T10:25:47.838508+00:00"}

View File

@@ -1,5 +1,3 @@
version: "3.9"
x-environment: &default-env
MQTT_BROKER: "172.23.1.102"
MQTT_PORT: 1883