Compare commits
64 Commits
3a2702e9aa
...
826d73990b
| Author | SHA1 | Date | |
|---|---|---|---|
|
826d73990b
|
|||
|
86587402b6
|
|||
|
110b903dc8
|
|||
|
a8f6ad800d
|
|||
|
52a50e1cd4
|
|||
|
9d7e26677f
|
|||
|
ebd459bfc1
|
|||
|
e49c5affe9
|
|||
|
5595cf4f37
|
|||
|
f61417a631
|
|||
|
6d62732d1d
|
|||
|
73814df01e
|
|||
|
4b7ac9b82b
|
|||
|
850d810cb3
|
|||
|
5bdfbacc3c
|
|||
|
3d9043b8fa
|
|||
|
1890a83939
|
|||
|
23edd42fca
|
|||
|
5fbaab3c11
|
|||
|
2eefbcd44b
|
|||
|
d09caa9d92
|
|||
|
127b5857c3
|
|||
|
c2dcb733d8
|
|||
|
168b2c4b12
|
|||
|
66872703c1
|
|||
|
d4b44fa73e
|
|||
|
87a86524d4
|
|||
|
91fdfde280
|
|||
|
d138d7bf0a
|
|||
|
8b08ded0c6
|
|||
|
6a0601742a
|
|||
|
99580f8ff9
|
|||
|
381f8521d4
|
|||
|
a382d58601
|
|||
|
0ca5ffaca0
|
|||
|
ec193a92f8
|
|||
|
c473ea341e
|
|||
|
0b6b9a01fb
|
|||
|
734ee18e85
|
|||
|
d9d17d37e5
|
|||
|
29e2fd441b
|
|||
|
f902f40386
|
|||
|
6483cf0740
|
|||
|
2863f5f5a6
|
|||
|
3e02decc02
|
|||
|
3e9e388ddd
|
|||
|
1f6fe134d5
|
|||
|
05884bb99a
|
|||
|
5d08ec970a
|
|||
|
732c333966
|
|||
|
c685e65be5
|
|||
|
2eb9d323de
|
|||
|
d9d2033dd7
|
|||
|
04c8cc8577
|
|||
|
e140227f7a
|
|||
|
cc25a22025
|
|||
|
af6ab012dd
|
|||
|
a2c2ef7ddd
|
|||
|
ecf31c7f8b
|
|||
|
74d4fea695
|
|||
|
c38fdab0ad
|
|||
|
094cef0bd7
|
|||
|
1027b905b5
|
|||
|
204a70a438
|
@@ -199,7 +199,7 @@ async def handle_vendor_state(
|
|||||||
device_id: str,
|
device_id: str,
|
||||||
device_type: str,
|
device_type: str,
|
||||||
device_technology: str,
|
device_technology: str,
|
||||||
payload: dict[str, Any],
|
payload: str,
|
||||||
redis_channel: str = "ui:updates"
|
redis_channel: str = "ui:updates"
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Handle vendor STATE message and publish to abstract topic + Redis.
|
"""Handle vendor STATE message and publish to abstract topic + Redis.
|
||||||
@@ -210,7 +210,7 @@ async def handle_vendor_state(
|
|||||||
device_id: Device identifier
|
device_id: Device identifier
|
||||||
device_type: Device type (e.g., 'light', 'thermostat')
|
device_type: Device type (e.g., 'light', 'thermostat')
|
||||||
device_technology: Technology identifier (e.g., 'zigbee2mqtt')
|
device_technology: Technology identifier (e.g., 'zigbee2mqtt')
|
||||||
payload: State payload (vendor-specific format)
|
payload: string Message payload
|
||||||
redis_channel: Redis channel for UI updates
|
redis_channel: Redis channel for UI updates
|
||||||
"""
|
"""
|
||||||
# Transform vendor-specific payload to abstract format
|
# Transform vendor-specific payload to abstract format
|
||||||
@@ -323,81 +323,33 @@ async def mqtt_worker(config: dict[str, Any], redis_client: aioredis.Redis) -> N
|
|||||||
|
|
||||||
# Process messages
|
# Process messages
|
||||||
async for message in client.messages:
|
async for message in client.messages:
|
||||||
last_activity = asyncio.get_event_loop().time()
|
try:
|
||||||
topic = str(message.topic)
|
last_activity = asyncio.get_event_loop().time()
|
||||||
payload_str = message.payload.decode()
|
topic = str(message.topic)
|
||||||
|
payload_str = message.payload.decode()
|
||||||
# Determine if message is from a MAX! device (requires plain text handling)
|
retain = getattr(message, 'retain', None)
|
||||||
is_max_device = False
|
logger.debug(f"MQTT message received on ({retain=}) {topic}: {payload_str}")
|
||||||
max_device_id = None
|
|
||||||
max_device_type = None
|
# Check if this is an abstract SET message
|
||||||
|
if topic.startswith("home/") and topic.endswith("/set"):
|
||||||
# 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)
|
payload = json.loads(payload_str)
|
||||||
except json.JSONDecodeError:
|
|
||||||
logger.warning(f"Invalid JSON on {topic}: {payload_str}")
|
# Extract device_type and device_id from topic
|
||||||
continue
|
parts = topic.split("/")
|
||||||
|
if len(parts) == 4: # home/<type>/<id>/set
|
||||||
# Check if this is an abstract SET message
|
device_type = parts[1]
|
||||||
if topic.startswith("home/") and topic.endswith("/set"):
|
device_id = parts[2]
|
||||||
# Extract device_type and device_id from topic
|
|
||||||
parts = topic.split("/")
|
if device_id in devices:
|
||||||
if len(parts) == 4: # home/<type>/<id>/set
|
device = devices[device_id]
|
||||||
device_type = parts[1]
|
vendor_topic = device["topics"]["set"]
|
||||||
device_id = parts[2]
|
device_technology = device.get("technology", "unknown")
|
||||||
|
await handle_abstract_set(
|
||||||
if device_id in devices:
|
client, device_id, device_type, device_technology, vendor_topic, payload
|
||||||
device = devices[device_id]
|
)
|
||||||
vendor_topic = device["topics"]["set"]
|
|
||||||
device_technology = device.get("technology", "unknown")
|
# Check if this is a vendor STATE message
|
||||||
await handle_abstract_set(
|
|
||||||
client, device_id, device_type, device_technology, vendor_topic, payload
|
|
||||||
)
|
|
||||||
|
|
||||||
# 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:
|
else:
|
||||||
# Find device by vendor state topic for other technologies
|
# Find device by vendor state topic for other technologies
|
||||||
for device_id, device in devices.items():
|
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")
|
device_technology = device.get("technology", "unknown")
|
||||||
await handle_vendor_state(
|
await handle_vendor_state(
|
||||||
client, redis_client, device_id, device["type"],
|
client, redis_client, device_id, device["type"],
|
||||||
device_technology, payload, redis_channel
|
device_technology, payload_str, redis_channel
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
logger.error(f"Failed to decode JSON payload on topic {topic}: {payload_str}")
|
||||||
|
|
||||||
except asyncio.CancelledError:
|
except asyncio.CancelledError:
|
||||||
logger.info("MQTT worker cancelled")
|
logger.info("MQTT worker cancelled")
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ This module implements a registry-pattern for vendor-specific transformations:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
import json
|
||||||
from typing import Any, Callable
|
from typing import Any, Callable
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@@ -24,11 +25,14 @@ def _transform_light_simulator_to_vendor(payload: dict[str, Any]) -> dict[str, A
|
|||||||
return payload
|
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.
|
"""Transform simulator light payload to abstract format.
|
||||||
|
|
||||||
Simulator uses same format as abstract protocol (no transformation needed).
|
Simulator uses same format as abstract protocol (no transformation needed).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
payload = json.loads(payload)
|
||||||
|
|
||||||
return payload
|
return payload
|
||||||
|
|
||||||
|
|
||||||
@@ -40,11 +44,14 @@ def _transform_thermostat_simulator_to_vendor(payload: dict[str, Any]) -> dict[s
|
|||||||
return payload
|
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.
|
"""Transform simulator thermostat payload to abstract format.
|
||||||
|
|
||||||
Simulator uses same format as abstract protocol (no transformation needed).
|
Simulator uses same format as abstract protocol (no transformation needed).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
payload = json.loads(payload)
|
||||||
|
|
||||||
return payload
|
return payload
|
||||||
|
|
||||||
|
|
||||||
@@ -80,7 +87,7 @@ def _transform_light_zigbee2mqtt_to_vendor(payload: dict[str, Any]) -> dict[str,
|
|||||||
return vendor_payload
|
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.
|
"""Transform zigbee2mqtt light payload to abstract format.
|
||||||
|
|
||||||
Transformations:
|
Transformations:
|
||||||
@@ -91,7 +98,7 @@ def _transform_light_zigbee2mqtt_to_abstract(payload: dict[str, Any]) -> dict[st
|
|||||||
- zigbee2mqtt: {'state': 'ON', 'brightness': 254}
|
- zigbee2mqtt: {'state': 'ON', 'brightness': 254}
|
||||||
- Abstract: {'power': 'on', 'brightness': 100}
|
- Abstract: {'power': 'on', 'brightness': 100}
|
||||||
"""
|
"""
|
||||||
abstract_payload = payload.copy()
|
abstract_payload = json.loads(payload)
|
||||||
|
|
||||||
# Transform state -> power with lowercase values
|
# Transform state -> power with lowercase values
|
||||||
if "state" in abstract_payload:
|
if "state" in abstract_payload:
|
||||||
@@ -128,7 +135,7 @@ def _transform_thermostat_zigbee2mqtt_to_vendor(payload: dict[str, Any]) -> dict
|
|||||||
return vendor_payload
|
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.
|
"""Transform zigbee2mqtt thermostat payload to abstract format.
|
||||||
|
|
||||||
Transformations:
|
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'}
|
- zigbee2mqtt: {'current_heating_setpoint': 15, 'local_temperature': 23, 'system_mode': 'heat'}
|
||||||
- Abstract: {'target': 15.0, 'current': 23.0, 'mode': 'heat'}
|
- Abstract: {'target': 15.0, 'current': 23.0, 'mode': 'heat'}
|
||||||
"""
|
"""
|
||||||
|
payload = json.loads(payload)
|
||||||
abstract_payload = {}
|
abstract_payload = {}
|
||||||
|
|
||||||
# Extract target temperature
|
# Extract target temperature
|
||||||
@@ -173,7 +181,7 @@ def _transform_contact_sensor_zigbee2mqtt_to_vendor(payload: dict[str, Any]) ->
|
|||||||
return payload
|
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.
|
"""Transform zigbee2mqtt contact sensor payload to abstract format.
|
||||||
|
|
||||||
Transformations:
|
Transformations:
|
||||||
@@ -188,6 +196,7 @@ def _transform_contact_sensor_zigbee2mqtt_to_abstract(payload: dict[str, Any]) -
|
|||||||
- zigbee2mqtt: {"contact": false, "battery": 100, "linkquality": 87}
|
- zigbee2mqtt: {"contact": false, "battery": 100, "linkquality": 87}
|
||||||
- Abstract: {"contact": "open", "battery": 100, "linkquality": 87}
|
- Abstract: {"contact": "open", "battery": 100, "linkquality": 87}
|
||||||
"""
|
"""
|
||||||
|
payload = json.loads(payload)
|
||||||
abstract_payload = {}
|
abstract_payload = {}
|
||||||
|
|
||||||
# Transform contact state (inverted logic!)
|
# Transform contact state (inverted logic!)
|
||||||
@@ -226,7 +235,7 @@ def _transform_contact_sensor_max_to_vendor(payload: dict[str, Any]) -> dict[str
|
|||||||
return payload
|
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.
|
"""Transform MAX! (Homegear) contact sensor payload to abstract format.
|
||||||
|
|
||||||
MAX! sends "true"/"false" (string or bool) on STATE topic.
|
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"}
|
- Abstract: {"contact": "open"}
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
# Handle string, bool, or dict input
|
contact_value = payload.strip().lower() == "true"
|
||||||
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
|
# MAX! semantics: True = OPEN, False = CLOSED
|
||||||
return {
|
return {
|
||||||
@@ -278,11 +275,12 @@ def _transform_temp_humidity_sensor_zigbee2mqtt_to_vendor(payload: dict[str, Any
|
|||||||
return payload
|
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.
|
"""Transform zigbee2mqtt temp/humidity sensor payload to abstract format.
|
||||||
|
|
||||||
Passthrough - zigbee2mqtt provides temperature, humidity, battery, linkquality directly.
|
Passthrough - zigbee2mqtt provides temperature, humidity, battery, linkquality directly.
|
||||||
"""
|
"""
|
||||||
|
payload = json.loads(payload)
|
||||||
return 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
|
# 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.
|
"""Transform abstract temp/humidity sensor payload to MAX! format.
|
||||||
|
|
||||||
Temp/humidity sensors are read-only, so this should not be called for SET commands.
|
Temp/humidity sensors are read-only, so this should not be called for SET commands.
|
||||||
Returns payload as-is for compatibility.
|
Returns payload as-is for compatibility.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
payload = json.loads(payload)
|
||||||
|
|
||||||
return 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.
|
"""Transform MAX! temp/humidity sensor payload to abstract format.
|
||||||
|
|
||||||
Passthrough - MAX! provides temperature, humidity, battery directly.
|
Passthrough - MAX! provides temperature, humidity, battery directly.
|
||||||
"""
|
"""
|
||||||
|
payload = json.loads(payload)
|
||||||
return payload
|
return payload
|
||||||
|
|
||||||
|
|
||||||
@@ -326,12 +328,13 @@ def _transform_relay_zigbee2mqtt_to_vendor(payload: dict[str, Any]) -> dict[str,
|
|||||||
return vendor_payload
|
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.
|
"""Transform zigbee2mqtt relay payload to abstract format.
|
||||||
|
|
||||||
Relay only has power on/off, same transformation as light.
|
Relay only has power on/off, same transformation as light.
|
||||||
- state: 'ON'/'OFF' -> power: 'on'/'off'
|
- state: 'ON'/'OFF' -> power: 'on'/'off'
|
||||||
"""
|
"""
|
||||||
|
payload = json.loads(payload)
|
||||||
abstract_payload = payload.copy()
|
abstract_payload = payload.copy()
|
||||||
|
|
||||||
if "state" in abstract_payload:
|
if "state" in abstract_payload:
|
||||||
@@ -369,12 +372,7 @@ def _transform_relay_shelly_to_abstract(payload: str) -> dict[str, Any]:
|
|||||||
- Shelly: 'on'
|
- Shelly: 'on'
|
||||||
- Abstract: {'power': 'on'}
|
- Abstract: {'power': 'on'}
|
||||||
"""
|
"""
|
||||||
# Shelly payload is a plain string, not a dict
|
return {"power": payload.strip()}
|
||||||
if isinstance(payload, str):
|
|
||||||
return {"power": payload.strip()}
|
|
||||||
|
|
||||||
# Fallback if it's already a dict (shouldn't happen)
|
|
||||||
return payload
|
|
||||||
|
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
@@ -412,7 +410,7 @@ def _transform_thermostat_max_to_vendor(payload: dict[str, Any]) -> str:
|
|||||||
return "21"
|
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.
|
"""Transform MAX! (Homegear) thermostat payload to abstract format.
|
||||||
|
|
||||||
MAX! sends only the integer temperature value (no JSON).
|
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
|
Note: MAX! doesn't send current temperature via SET_TEMPERATURE topic
|
||||||
"""
|
"""
|
||||||
try:
|
|
||||||
# Handle both string and numeric input
|
# Handle both string and numeric input
|
||||||
if isinstance(payload, str):
|
target_temp = float(payload.strip())
|
||||||
target_temp = float(payload.strip())
|
|
||||||
elif isinstance(payload, (int, float)):
|
return {
|
||||||
target_temp = float(payload)
|
"target": target_temp,
|
||||||
else:
|
"mode": "heat" # MAX! is always in heating mode
|
||||||
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(
|
def transform_vendor_to_abstract(
|
||||||
device_type: str,
|
device_type: str,
|
||||||
device_technology: str,
|
device_technology: str,
|
||||||
vendor_payload: dict[str, Any]
|
vendor_payload: str
|
||||||
) -> dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
"""Transform vendor-specific payload to abstract format.
|
"""Transform vendor-specific payload to abstract format.
|
||||||
|
|
||||||
|
|||||||
225
apps/api/main.py
225
apps/api/main.py
@@ -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 asyncio
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
@@ -179,9 +37,12 @@ from apps.api.resolvers import (
|
|||||||
clear_room_cache,
|
clear_room_cache,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
logging.basicConfig(
|
||||||
|
level=logging.DEBUG,
|
||||||
|
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
||||||
|
)
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# STATE CACHES
|
# STATE CACHES
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
@@ -212,6 +73,48 @@ app.add_middleware(
|
|||||||
allow_headers=["*"],
|
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")
|
@app.on_event("startup")
|
||||||
async def startup_event():
|
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)
|
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")
|
@app.get("/devices")
|
||||||
async def get_devices() -> list[DeviceInfo]:
|
async def get_devices() -> list[DeviceInfo]:
|
||||||
"""Get list of available devices.
|
"""Get list of available devices.
|
||||||
@@ -469,6 +398,7 @@ async def get_devices() -> list[DeviceInfo]:
|
|||||||
Returns:
|
Returns:
|
||||||
list: List of device information including features
|
list: List of device information including features
|
||||||
"""
|
"""
|
||||||
|
logger.debug("Fetching list of devices")
|
||||||
devices = load_devices()
|
devices = load_devices()
|
||||||
return [
|
return [
|
||||||
DeviceInfo(
|
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")
|
@app.get("/layout")
|
||||||
async def get_layout() -> dict[str, Any]:
|
async def get_layout() -> dict[str, Any]:
|
||||||
|
|||||||
@@ -77,6 +77,58 @@ async def index(request: Request) -> HTMLResponse:
|
|||||||
return await dashboard(request)
|
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)
|
@app.get("/dashboard", response_class=HTMLResponse)
|
||||||
async def dashboard(request: Request) -> HTMLResponse:
|
async def dashboard(request: Request) -> HTMLResponse:
|
||||||
"""Render the dashboard with rooms and devices.
|
"""Render the dashboard with rooms and devices.
|
||||||
|
|||||||
188
apps/ui/redesign_ui.txt
Normal file
188
apps/ui/redesign_ui.txt
Normal 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)
|
||||||
|
- 3–4 Spalten auf größeren Screens
|
||||||
|
- Kachelgröße kompakt (ca. 140px x 110px)
|
||||||
|
- Icon ~32px
|
||||||
|
- Text ~14–16px
|
||||||
|
- 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
301
apps/ui/static/README.md
Normal 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.)
|
||||||
278
apps/ui/static/api-client.js
Normal file
278
apps/ui/static/api-client.js
Normal 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
166
apps/ui/static/types.js
Normal 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();
|
||||||
|
*/
|
||||||
828
apps/ui/templates/device.html
Normal file
828
apps/ui/templates/device.html
Normal 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
465
apps/ui/templates/room.html
Normal 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>
|
||||||
310
apps/ui/templates/rooms.html
Normal file
310
apps/ui/templates/rooms.html
Normal 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>
|
||||||
@@ -11,6 +11,7 @@ redis:
|
|||||||
channel: "ui:updates"
|
channel: "ui:updates"
|
||||||
devices:
|
devices:
|
||||||
- device_id: lampe_semeniere_wohnzimmer
|
- device_id: lampe_semeniere_wohnzimmer
|
||||||
|
name: Semeniere
|
||||||
type: relay
|
type: relay
|
||||||
cap_version: "relay@1.0.0"
|
cap_version: "relay@1.0.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -25,6 +26,7 @@ devices:
|
|||||||
model: "AC10691"
|
model: "AC10691"
|
||||||
vendor: "OSRAM"
|
vendor: "OSRAM"
|
||||||
- device_id: stehlampe_esszimmer_spiegel
|
- device_id: stehlampe_esszimmer_spiegel
|
||||||
|
name: Stehlampe Spiegel
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -35,6 +37,7 @@ devices:
|
|||||||
state: "zigbee2mqtt/0x001788010d06ea09"
|
state: "zigbee2mqtt/0x001788010d06ea09"
|
||||||
set: "zigbee2mqtt/0x001788010d06ea09/set"
|
set: "zigbee2mqtt/0x001788010d06ea09/set"
|
||||||
- device_id: stehlampe_esszimmer_schrank
|
- device_id: stehlampe_esszimmer_schrank
|
||||||
|
name: Stehlampe Schrank
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -45,6 +48,7 @@ devices:
|
|||||||
state: "zigbee2mqtt/0x001788010d09176c"
|
state: "zigbee2mqtt/0x001788010d09176c"
|
||||||
set: "zigbee2mqtt/0x001788010d09176c/set"
|
set: "zigbee2mqtt/0x001788010d09176c/set"
|
||||||
- device_id: grosse_lampe_wohnzimmer
|
- device_id: grosse_lampe_wohnzimmer
|
||||||
|
name: grosse Lampe
|
||||||
type: relay
|
type: relay
|
||||||
cap_version: "relay@1.0.0"
|
cap_version: "relay@1.0.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -59,6 +63,7 @@ devices:
|
|||||||
model: "AC10691"
|
model: "AC10691"
|
||||||
vendor: "OSRAM"
|
vendor: "OSRAM"
|
||||||
- device_id: lampe_naehtischchen_wohnzimmer
|
- device_id: lampe_naehtischchen_wohnzimmer
|
||||||
|
name: Nähtischchen
|
||||||
type: relay
|
type: relay
|
||||||
cap_version: "relay@1.0.0"
|
cap_version: "relay@1.0.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -72,21 +77,8 @@ devices:
|
|||||||
ieee_address: "0x842e14fffee560ee"
|
ieee_address: "0x842e14fffee560ee"
|
||||||
model: "HG06337"
|
model: "HG06337"
|
||||||
vendor: "Lidl"
|
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
|
- device_id: kleine_lampe_links_esszimmer
|
||||||
|
name: kleine Lampe
|
||||||
type: relay
|
type: relay
|
||||||
cap_version: "relay@1.0.0"
|
cap_version: "relay@1.0.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -101,6 +93,7 @@ devices:
|
|||||||
model: "AC10691"
|
model: "AC10691"
|
||||||
vendor: "OSRAM"
|
vendor: "OSRAM"
|
||||||
- device_id: leselampe_esszimmer
|
- device_id: leselampe_esszimmer
|
||||||
|
name: Leselampe
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -116,6 +109,7 @@ devices:
|
|||||||
model: "LED1842G3"
|
model: "LED1842G3"
|
||||||
vendor: "IKEA"
|
vendor: "IKEA"
|
||||||
- device_id: medusalampe_schlafzimmer
|
- device_id: medusalampe_schlafzimmer
|
||||||
|
name: Medusa-Lampe
|
||||||
type: relay
|
type: relay
|
||||||
cap_version: "relay@1.0.0"
|
cap_version: "relay@1.0.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -131,6 +125,7 @@ devices:
|
|||||||
vendor: "OSRAM"
|
vendor: "OSRAM"
|
||||||
- device_id: sportlicht_am_fernseher_studierzimmer
|
- device_id: sportlicht_am_fernseher_studierzimmer
|
||||||
type: light
|
type: light
|
||||||
|
name: am Fernseher
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
features:
|
features:
|
||||||
@@ -146,6 +141,7 @@ devices:
|
|||||||
model: "LED1733G7"
|
model: "LED1733G7"
|
||||||
vendor: "IKEA"
|
vendor: "IKEA"
|
||||||
- device_id: deckenlampe_schlafzimmer
|
- device_id: deckenlampe_schlafzimmer
|
||||||
|
name: Deckenlampe
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -161,6 +157,7 @@ devices:
|
|||||||
model: "8718699688882"
|
model: "8718699688882"
|
||||||
vendor: "Philips"
|
vendor: "Philips"
|
||||||
- device_id: bettlicht_wolfgang
|
- device_id: bettlicht_wolfgang
|
||||||
|
name: Bettlicht Wolfgang
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -176,6 +173,7 @@ devices:
|
|||||||
model: "9290020399"
|
model: "9290020399"
|
||||||
vendor: "Philips"
|
vendor: "Philips"
|
||||||
- device_id: bettlicht_patty
|
- device_id: bettlicht_patty
|
||||||
|
name: Bettlicht Patty
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -191,6 +189,7 @@ devices:
|
|||||||
model: "9290020399"
|
model: "9290020399"
|
||||||
vendor: "Philips"
|
vendor: "Philips"
|
||||||
- device_id: schranklicht_hinten_patty
|
- device_id: schranklicht_hinten_patty
|
||||||
|
name: Schranklicht hinten
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -206,6 +205,7 @@ devices:
|
|||||||
model: "8718699673147"
|
model: "8718699673147"
|
||||||
vendor: "Philips"
|
vendor: "Philips"
|
||||||
- device_id: schranklicht_vorne_patty
|
- device_id: schranklicht_vorne_patty
|
||||||
|
name: Schranklicht vorne
|
||||||
type: relay
|
type: relay
|
||||||
cap_version: "relay@1.0.0"
|
cap_version: "relay@1.0.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -220,6 +220,7 @@ devices:
|
|||||||
model: "AC10691"
|
model: "AC10691"
|
||||||
vendor: "OSRAM"
|
vendor: "OSRAM"
|
||||||
- device_id: leselampe_patty
|
- device_id: leselampe_patty
|
||||||
|
name: Leselampe
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -235,6 +236,7 @@ devices:
|
|||||||
model: "8718699673147"
|
model: "8718699673147"
|
||||||
vendor: "Philips"
|
vendor: "Philips"
|
||||||
- device_id: deckenlampe_esszimmer
|
- device_id: deckenlampe_esszimmer
|
||||||
|
name: Deckenlampe
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -249,23 +251,8 @@ devices:
|
|||||||
ieee_address: "0x0017880108a03e45"
|
ieee_address: "0x0017880108a03e45"
|
||||||
model: "929002241201"
|
model: "929002241201"
|
||||||
vendor: "Philips"
|
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
|
- device_id: haustuer
|
||||||
|
name: Haustür-Lampe
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -281,6 +268,7 @@ devices:
|
|||||||
model: "LED1842G3"
|
model: "LED1842G3"
|
||||||
vendor: "IKEA"
|
vendor: "IKEA"
|
||||||
- device_id: deckenlampe_flur_oben
|
- device_id: deckenlampe_flur_oben
|
||||||
|
name: Deckenlampe oben
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -297,6 +285,7 @@ devices:
|
|||||||
model: "929003099001"
|
model: "929003099001"
|
||||||
vendor: "Philips"
|
vendor: "Philips"
|
||||||
- device_id: kueche_deckenlampe
|
- device_id: kueche_deckenlampe
|
||||||
|
name: Deckenlampe
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -312,6 +301,7 @@ devices:
|
|||||||
model: "929002469202"
|
model: "929002469202"
|
||||||
vendor: "Philips"
|
vendor: "Philips"
|
||||||
- device_id: sportlicht_tisch
|
- device_id: sportlicht_tisch
|
||||||
|
name: am Tisch
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -327,6 +317,7 @@ devices:
|
|||||||
model: "4058075729063"
|
model: "4058075729063"
|
||||||
vendor: "LEDVANCE"
|
vendor: "LEDVANCE"
|
||||||
- device_id: sportlicht_regal
|
- device_id: sportlicht_regal
|
||||||
|
name: am Regal
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -342,6 +333,7 @@ devices:
|
|||||||
model: "4058075729063"
|
model: "4058075729063"
|
||||||
vendor: "LEDVANCE"
|
vendor: "LEDVANCE"
|
||||||
- device_id: licht_flur_oben_am_spiegel
|
- device_id: licht_flur_oben_am_spiegel
|
||||||
|
name: Spiegel
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -358,6 +350,7 @@ devices:
|
|||||||
model: "LED1732G11"
|
model: "LED1732G11"
|
||||||
vendor: "IKEA"
|
vendor: "IKEA"
|
||||||
- device_id: experimentlabtest
|
- device_id: experimentlabtest
|
||||||
|
name: Test Lampe
|
||||||
type: light
|
type: light
|
||||||
cap_version: "light@1.2.0"
|
cap_version: "light@1.2.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -373,6 +366,7 @@ devices:
|
|||||||
model: "4058075208421"
|
model: "4058075208421"
|
||||||
vendor: "LEDVANCE"
|
vendor: "LEDVANCE"
|
||||||
- device_id: thermostat_wolfgang
|
- device_id: thermostat_wolfgang
|
||||||
|
name: Heizung
|
||||||
type: thermostat
|
type: thermostat
|
||||||
cap_version: "thermostat@1.0.0"
|
cap_version: "thermostat@1.0.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -391,6 +385,7 @@ devices:
|
|||||||
model: "GS361A-H04"
|
model: "GS361A-H04"
|
||||||
vendor: "Siterwell"
|
vendor: "Siterwell"
|
||||||
- device_id: thermostat_kueche
|
- device_id: thermostat_kueche
|
||||||
|
name: Heizung
|
||||||
type: thermostat
|
type: thermostat
|
||||||
cap_version: "thermostat@1.0.0"
|
cap_version: "thermostat@1.0.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -409,6 +404,7 @@ devices:
|
|||||||
model: "GS361A-H04"
|
model: "GS361A-H04"
|
||||||
vendor: "Siterwell"
|
vendor: "Siterwell"
|
||||||
- device_id: thermostat_schlafzimmer
|
- device_id: thermostat_schlafzimmer
|
||||||
|
name: Heizung
|
||||||
type: thermostat
|
type: thermostat
|
||||||
cap_version: "thermostat@1.0.0"
|
cap_version: "thermostat@1.0.0"
|
||||||
technology: max
|
technology: max
|
||||||
@@ -427,6 +423,7 @@ devices:
|
|||||||
peer_id: "42"
|
peer_id: "42"
|
||||||
channel: "1"
|
channel: "1"
|
||||||
- device_id: thermostat_esszimmer
|
- device_id: thermostat_esszimmer
|
||||||
|
name: Heizung
|
||||||
type: thermostat
|
type: thermostat
|
||||||
cap_version: "thermostat@1.0.0"
|
cap_version: "thermostat@1.0.0"
|
||||||
technology: max
|
technology: max
|
||||||
@@ -445,6 +442,7 @@ devices:
|
|||||||
peer_id: "45"
|
peer_id: "45"
|
||||||
channel: "1"
|
channel: "1"
|
||||||
- device_id: thermostat_wohnzimmer
|
- device_id: thermostat_wohnzimmer
|
||||||
|
name: Heizung
|
||||||
type: thermostat
|
type: thermostat
|
||||||
cap_version: "thermostat@1.0.0"
|
cap_version: "thermostat@1.0.0"
|
||||||
technology: max
|
technology: max
|
||||||
@@ -463,6 +461,7 @@ devices:
|
|||||||
peer_id: "46"
|
peer_id: "46"
|
||||||
channel: "1"
|
channel: "1"
|
||||||
- device_id: thermostat_patty
|
- device_id: thermostat_patty
|
||||||
|
name: Heizung
|
||||||
type: thermostat
|
type: thermostat
|
||||||
cap_version: "thermostat@1.0.0"
|
cap_version: "thermostat@1.0.0"
|
||||||
technology: max
|
technology: max
|
||||||
@@ -481,6 +480,7 @@ devices:
|
|||||||
peer_id: "39"
|
peer_id: "39"
|
||||||
channel: "1"
|
channel: "1"
|
||||||
- device_id: thermostat_bad_oben
|
- device_id: thermostat_bad_oben
|
||||||
|
name: Heizung
|
||||||
type: thermostat
|
type: thermostat
|
||||||
cap_version: "thermostat@1.0.0"
|
cap_version: "thermostat@1.0.0"
|
||||||
technology: max
|
technology: max
|
||||||
@@ -499,6 +499,7 @@ devices:
|
|||||||
peer_id: "41"
|
peer_id: "41"
|
||||||
channel: "1"
|
channel: "1"
|
||||||
- device_id: thermostat_bad_unten
|
- device_id: thermostat_bad_unten
|
||||||
|
name: Heizung
|
||||||
type: thermostat
|
type: thermostat
|
||||||
cap_version: "thermostat@1.0.0"
|
cap_version: "thermostat@1.0.0"
|
||||||
technology: max
|
technology: max
|
||||||
@@ -517,6 +518,7 @@ devices:
|
|||||||
peer_id: "48"
|
peer_id: "48"
|
||||||
channel: "1"
|
channel: "1"
|
||||||
- device_id: sterne_wohnzimmer
|
- device_id: sterne_wohnzimmer
|
||||||
|
name: Sterne
|
||||||
type: relay
|
type: relay
|
||||||
cap_version: "relay@1.0.0"
|
cap_version: "relay@1.0.0"
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
@@ -531,8 +533,8 @@ devices:
|
|||||||
model: "AC10691"
|
model: "AC10691"
|
||||||
vendor: "OSRAM"
|
vendor: "OSRAM"
|
||||||
- device_id: kontakt_schlafzimmer_strasse
|
- device_id: kontakt_schlafzimmer_strasse
|
||||||
|
name: Fenster
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Schlafzimmer Straße
|
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: max
|
technology: max
|
||||||
topics:
|
topics:
|
||||||
@@ -540,39 +542,39 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: kontakt_esszimmer_strasse_rechts
|
- device_id: kontakt_esszimmer_strasse_rechts
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Esszimmer Straße rechts
|
name: Fenster rechts
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: max
|
technology: max
|
||||||
topics:
|
topics:
|
||||||
state: homegear/instance1/plain/26/1/STATE
|
state: homegear/instance1/plain/26/1/STATE
|
||||||
features: {}
|
features: {}
|
||||||
- device_id: kontakt_esszimmer_strasse_links
|
- device_id: kontakt_esszimmer_strasse_links
|
||||||
|
name: Fenster links
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Esszimmer Straße links
|
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: max
|
technology: max
|
||||||
topics:
|
topics:
|
||||||
state: homegear/instance1/plain/27/1/STATE
|
state: homegear/instance1/plain/27/1/STATE
|
||||||
features: {}
|
features: {}
|
||||||
- device_id: kontakt_wohnzimmer_garten_rechts
|
- device_id: kontakt_wohnzimmer_garten_rechts
|
||||||
|
name: Fenster rechts
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Wohnzimmer Garten rechts
|
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: max
|
technology: max
|
||||||
topics:
|
topics:
|
||||||
state: homegear/instance1/plain/28/1/STATE
|
state: homegear/instance1/plain/28/1/STATE
|
||||||
features: {}
|
features: {}
|
||||||
- device_id: kontakt_wohnzimmer_garten_links
|
- device_id: kontakt_wohnzimmer_garten_links
|
||||||
|
name: Fenster links
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Wohnzimmer Garten links
|
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: max
|
technology: max
|
||||||
topics:
|
topics:
|
||||||
state: homegear/instance1/plain/29/1/STATE
|
state: homegear/instance1/plain/29/1/STATE
|
||||||
features: {}
|
features: {}
|
||||||
- device_id: kontakt_kueche_garten_fenster
|
- device_id: kontakt_kueche_garten_fenster
|
||||||
|
name: Fenster Garten
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Küche Garten Fenster
|
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
@@ -580,23 +582,23 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: kontakt_kueche_garten_tuer
|
- device_id: kontakt_kueche_garten_tuer
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Küche Garten Tür
|
name: Terrassentür
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
state: zigbee2mqtt/0x00158d008b332788
|
state: zigbee2mqtt/0x00158d008b332788
|
||||||
features: {}
|
features: {}
|
||||||
- device_id: kontakt_kueche_strasse_rechts
|
- device_id: kontakt_kueche_strasse_rechts
|
||||||
|
name: Fenster Straße rechts
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Küche Straße rechts
|
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
state: zigbee2mqtt/0x00158d008b151803
|
state: zigbee2mqtt/0x00158d008b151803
|
||||||
features: {}
|
features: {}
|
||||||
- device_id: kontakt_kueche_strasse_links
|
- device_id: kontakt_kueche_strasse_links
|
||||||
|
name: Fenster Straße links
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Küche Straße links
|
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
@@ -604,7 +606,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: kontakt_patty_garten_rechts
|
- device_id: kontakt_patty_garten_rechts
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Patty Garten rechts
|
name: Fenster Garten rechts
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: max
|
technology: max
|
||||||
topics:
|
topics:
|
||||||
@@ -612,7 +614,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: kontakt_patty_garten_links
|
- device_id: kontakt_patty_garten_links
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Patty Garten links
|
name: Fenster Garten links
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: max
|
technology: max
|
||||||
topics:
|
topics:
|
||||||
@@ -620,7 +622,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: kontakt_patty_strasse
|
- device_id: kontakt_patty_strasse
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Patty Straße
|
name: Fenster Straße
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
@@ -628,7 +630,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: kontakt_wolfgang_garten
|
- device_id: kontakt_wolfgang_garten
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Wolfgang Garten
|
name: Fenster
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
@@ -636,7 +638,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: kontakt_bad_oben_strasse
|
- device_id: kontakt_bad_oben_strasse
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Bad Oben Straße
|
name: Fenster
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
@@ -644,7 +646,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: kontakt_bad_unten_strasse
|
- device_id: kontakt_bad_unten_strasse
|
||||||
type: contact
|
type: contact
|
||||||
name: Kontakt Bad Unten Straße
|
name: Fenster
|
||||||
cap_version: contact_sensor@1.0.0
|
cap_version: contact_sensor@1.0.0
|
||||||
technology: max
|
technology: max
|
||||||
topics:
|
topics:
|
||||||
@@ -652,7 +654,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: sensor_schlafzimmer
|
- device_id: sensor_schlafzimmer
|
||||||
type: temp_humidity_sensor
|
type: temp_humidity_sensor
|
||||||
name: Temperatur & Luftfeuchte
|
name: Thermometer
|
||||||
cap_version: temp_humidity_sensor@1.0.0
|
cap_version: temp_humidity_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
@@ -660,7 +662,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: sensor_wohnzimmer
|
- device_id: sensor_wohnzimmer
|
||||||
type: temp_humidity_sensor
|
type: temp_humidity_sensor
|
||||||
name: Temperatur & Luftfeuchte
|
name: Thermometer
|
||||||
cap_version: temp_humidity_sensor@1.0.0
|
cap_version: temp_humidity_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
@@ -668,7 +670,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: sensor_kueche
|
- device_id: sensor_kueche
|
||||||
type: temp_humidity_sensor
|
type: temp_humidity_sensor
|
||||||
name: Temperatur & Luftfeuchte
|
name: Thermometer
|
||||||
cap_version: temp_humidity_sensor@1.0.0
|
cap_version: temp_humidity_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
@@ -676,7 +678,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: sensor_arbeitszimmer_patty
|
- device_id: sensor_arbeitszimmer_patty
|
||||||
type: temp_humidity_sensor
|
type: temp_humidity_sensor
|
||||||
name: Temperatur & Luftfeuchte
|
name: Thermometer
|
||||||
cap_version: temp_humidity_sensor@1.0.0
|
cap_version: temp_humidity_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
@@ -684,7 +686,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: sensor_arbeitszimmer_wolfgang
|
- device_id: sensor_arbeitszimmer_wolfgang
|
||||||
type: temp_humidity_sensor
|
type: temp_humidity_sensor
|
||||||
name: Temperatur & Luftfeuchte
|
name: Thermometer
|
||||||
cap_version: temp_humidity_sensor@1.0.0
|
cap_version: temp_humidity_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
@@ -692,7 +694,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: sensor_bad_oben
|
- device_id: sensor_bad_oben
|
||||||
type: temp_humidity_sensor
|
type: temp_humidity_sensor
|
||||||
name: Temperatur & Luftfeuchte
|
name: Thermometer
|
||||||
cap_version: temp_humidity_sensor@1.0.0
|
cap_version: temp_humidity_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
@@ -700,7 +702,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: sensor_bad_unten
|
- device_id: sensor_bad_unten
|
||||||
type: temp_humidity_sensor
|
type: temp_humidity_sensor
|
||||||
name: Temperatur & Luftfeuchte
|
name: Thermometer
|
||||||
cap_version: temp_humidity_sensor@1.0.0
|
cap_version: temp_humidity_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
@@ -708,7 +710,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: sensor_flur
|
- device_id: sensor_flur
|
||||||
type: temp_humidity_sensor
|
type: temp_humidity_sensor
|
||||||
name: Temperatur & Luftfeuchte
|
name: Thermometer
|
||||||
cap_version: temp_humidity_sensor@1.0.0
|
cap_version: temp_humidity_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
@@ -716,7 +718,7 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: sensor_waschkueche
|
- device_id: sensor_waschkueche
|
||||||
type: temp_humidity_sensor
|
type: temp_humidity_sensor
|
||||||
name: Temperatur & Luftfeuchte
|
name: Thermometer
|
||||||
cap_version: temp_humidity_sensor@1.0.0
|
cap_version: temp_humidity_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
@@ -724,13 +726,14 @@ devices:
|
|||||||
features: {}
|
features: {}
|
||||||
- device_id: sensor_sportzimmer
|
- device_id: sensor_sportzimmer
|
||||||
type: temp_humidity_sensor
|
type: temp_humidity_sensor
|
||||||
name: Temperatur & Luftfeuchte
|
name: Thermometer
|
||||||
cap_version: temp_humidity_sensor@1.0.0
|
cap_version: temp_humidity_sensor@1.0.0
|
||||||
technology: zigbee2mqtt
|
technology: zigbee2mqtt
|
||||||
topics:
|
topics:
|
||||||
state: zigbee2mqtt/0x00158d0009421422
|
state: zigbee2mqtt/0x00158d0009421422
|
||||||
features: {}
|
features: {}
|
||||||
- device_id: licht_spuele_kueche
|
- device_id: licht_spuele_kueche
|
||||||
|
name: Spüle
|
||||||
type: relay
|
type: relay
|
||||||
cap_version: "relay@1.0.0"
|
cap_version: "relay@1.0.0"
|
||||||
technology: shelly
|
technology: shelly
|
||||||
@@ -740,6 +743,7 @@ devices:
|
|||||||
set: "shellies/LightKitchenSink/relay/0/command"
|
set: "shellies/LightKitchenSink/relay/0/command"
|
||||||
state: "shellies/LightKitchenSink/relay/0"
|
state: "shellies/LightKitchenSink/relay/0"
|
||||||
- device_id: licht_schrank_esszimmer
|
- device_id: licht_schrank_esszimmer
|
||||||
|
name: Schrank
|
||||||
type: relay
|
type: relay
|
||||||
cap_version: "relay@1.0.0"
|
cap_version: "relay@1.0.0"
|
||||||
technology: shelly
|
technology: shelly
|
||||||
@@ -750,6 +754,7 @@ devices:
|
|||||||
state: "shellies/schrankesszimmer/relay/0"
|
state: "shellies/schrankesszimmer/relay/0"
|
||||||
- device_id: licht_regal_wohnzimmer
|
- device_id: licht_regal_wohnzimmer
|
||||||
type: relay
|
type: relay
|
||||||
|
name: Regal
|
||||||
cap_version: "relay@1.0.0"
|
cap_version: "relay@1.0.0"
|
||||||
technology: shelly
|
technology: shelly
|
||||||
features:
|
features:
|
||||||
@@ -759,6 +764,7 @@ devices:
|
|||||||
state: "shellies/wohnzimmer-regal/relay/0"
|
state: "shellies/wohnzimmer-regal/relay/0"
|
||||||
- device_id: licht_flur_schrank
|
- device_id: licht_flur_schrank
|
||||||
type: relay
|
type: relay
|
||||||
|
name: Schrank
|
||||||
cap_version: "relay@1.0.0"
|
cap_version: "relay@1.0.0"
|
||||||
technology: shelly
|
technology: shelly
|
||||||
features:
|
features:
|
||||||
@@ -767,6 +773,7 @@ devices:
|
|||||||
set: "shellies/schrankflur/relay/0/command"
|
set: "shellies/schrankflur/relay/0/command"
|
||||||
state: "shellies/schrankflur/relay/0"
|
state: "shellies/schrankflur/relay/0"
|
||||||
- device_id: licht_terasse
|
- device_id: licht_terasse
|
||||||
|
name: Terrasse
|
||||||
type: relay
|
type: relay
|
||||||
cap_version: "relay@1.0.0"
|
cap_version: "relay@1.0.0"
|
||||||
technology: shelly
|
technology: shelly
|
||||||
|
|||||||
@@ -39,10 +39,10 @@ rooms:
|
|||||||
title: Leselampe Esszimmer
|
title: Leselampe Esszimmer
|
||||||
icon: 💡
|
icon: 💡
|
||||||
rank: 60
|
rank: 60
|
||||||
- device_id: standlampe_esszimmer
|
# - device_id: standlampe_esszimmer
|
||||||
title: Standlampe Esszimmer
|
# title: Standlampe Esszimmer
|
||||||
icon: 💡
|
# icon: 💡
|
||||||
rank: 70
|
# rank: 70
|
||||||
- device_id: kleine_lampe_links_esszimmer
|
- device_id: kleine_lampe_links_esszimmer
|
||||||
title: kleine Lampe links Esszimmer
|
title: kleine Lampe links Esszimmer
|
||||||
icon: 💡
|
icon: 💡
|
||||||
@@ -55,10 +55,10 @@ rooms:
|
|||||||
title: Stehlampe Esszimmer Schrank
|
title: Stehlampe Esszimmer Schrank
|
||||||
icon: 💡
|
icon: 💡
|
||||||
rank: 82
|
rank: 82
|
||||||
- device_id: kleine_lampe_rechts_esszimmer
|
# - device_id: kleine_lampe_rechts_esszimmer
|
||||||
title: kleine Lampe rechts Esszimmer
|
# title: kleine Lampe rechts Esszimmer
|
||||||
icon: 💡
|
# icon: 💡
|
||||||
rank: 90
|
# rank: 90
|
||||||
- device_id: licht_schrank_esszimmer
|
- device_id: licht_schrank_esszimmer
|
||||||
title: Schranklicht Esszimmer
|
title: Schranklicht Esszimmer
|
||||||
icon: 💡
|
icon: 💡
|
||||||
|
|||||||
25
debug/2025-11-18-01-MQTT_message_received_on.log
Normal file
25
debug/2025-11-18-01-MQTT_message_received_on.log
Normal 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
|
||||||
261
debug/2025-11-18-01-abstraction-debug.log
Normal file
261
debug/2025-11-18-01-abstraction-debug.log
Normal 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"}
|
||||||
311
debug/2025-11-18-01-debug.log
Normal file
311
debug/2025-11-18-01-debug.log
Normal 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"}
|
||||||
268
debug/2025-11-18-abstraction-debug.log
Normal file
268
debug/2025-11-18-abstraction-debug.log
Normal 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
332
debug/2025-11-18-debug.log
Normal 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"}
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
version: "3.9"
|
|
||||||
|
|
||||||
x-environment: &default-env
|
x-environment: &default-env
|
||||||
MQTT_BROKER: "172.23.1.102"
|
MQTT_BROKER: "172.23.1.102"
|
||||||
MQTT_PORT: 1883
|
MQTT_PORT: 1883
|
||||||
|
|||||||
Reference in New Issue
Block a user