Compare commits
17 Commits
0.5.5
...
0.6.3-conf
| Author | SHA1 | Date | |
|---|---|---|---|
|
54fdcc12e1
|
|||
|
9f725c4c70
|
|||
|
f1dbd9344d
|
|||
|
5a67d7b330
|
|||
|
cc342245f8
|
|||
|
50253d536d
|
|||
|
e0aa50c9d2
|
|||
|
dc20d9f4b2
|
|||
|
ffb35928b4
|
|||
|
ac84ff7103
|
|||
|
c185494da3
|
|||
|
ec4a37a268
|
|||
|
d4b1d27b81
|
|||
|
ad07bc79e2
|
|||
|
ab41e79cb2
|
|||
|
fe92d336b1
|
|||
|
0ca59896ad
|
@@ -351,6 +351,36 @@ def _transform_relay_shelly_to_abstract(payload: str) -> dict[str, Any]:
|
|||||||
"""
|
"""
|
||||||
return {"power": payload.strip()}
|
return {"power": payload.strip()}
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# HANDLER FUNCTIONS: relay - tasmota technology
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
def _transform_relay_tasmota_to_vendor(payload: dict[str, Any]) -> str:
|
||||||
|
"""Transform abstract relay payload to Tasmota format.
|
||||||
|
|
||||||
|
Tasmota expects plain text 'on' or 'off' (not JSON).
|
||||||
|
- power: 'on'/'off' -> 'on'/'off' (plain string)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
- Abstract: {'power': 'on'}
|
||||||
|
- Tasmota: 'on'
|
||||||
|
"""
|
||||||
|
power = payload.get("power", "off")
|
||||||
|
return power
|
||||||
|
|
||||||
|
|
||||||
|
def _transform_relay_tasmota_to_abstract(payload: str) -> dict[str, Any]:
|
||||||
|
"""Transform Tasmota relay payload to abstract format.
|
||||||
|
|
||||||
|
Tasmota sends plain text 'on' or 'off' (not JSON).
|
||||||
|
- 'on'/'off' -> power: 'on'/'off'
|
||||||
|
|
||||||
|
Example:
|
||||||
|
- Tasmota: 'ON'
|
||||||
|
- Abstract: {'power': 'on'}
|
||||||
|
"""
|
||||||
|
return {"power": payload.strip().lower()}
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# HANDLER FUNCTIONS: relay - hottis_pv_modbus technology
|
# HANDLER FUNCTIONS: relay - hottis_pv_modbus technology
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
@@ -581,6 +611,8 @@ TRANSFORM_HANDLERS: dict[tuple[str, str, str], TransformHandler] = {
|
|||||||
("relay", "shelly", "to_abstract"): _transform_relay_shelly_to_abstract,
|
("relay", "shelly", "to_abstract"): _transform_relay_shelly_to_abstract,
|
||||||
("relay", "hottis_pv_modbus", "to_vendor"): _transform_relay_hottis_pv_modbus_to_vendor,
|
("relay", "hottis_pv_modbus", "to_vendor"): _transform_relay_hottis_pv_modbus_to_vendor,
|
||||||
("relay", "hottis_pv_modbus", "to_abstract"): _transform_relay_hottis_pv_modbus_to_abstract,
|
("relay", "hottis_pv_modbus", "to_abstract"): _transform_relay_hottis_pv_modbus_to_abstract,
|
||||||
|
("relay", "tasmota", "to_vendor"): _transform_relay_tasmota_to_vendor,
|
||||||
|
("relay", "tasmota", "to_abstract"): _transform_relay_tasmota_to_abstract,
|
||||||
|
|
||||||
# Three-Phase Powermeter transformations
|
# Three-Phase Powermeter transformations
|
||||||
("three_phase_powermeter", "hottis_pv_modbus", "to_vendor"): _transform_three_phase_powermeter_hottis_pv_modbus_to_vendor,
|
("three_phase_powermeter", "hottis_pv_modbus", "to_vendor"): _transform_three_phase_powermeter_hottis_pv_modbus_to_vendor,
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class ContactAccessory(Accessory):
|
|||||||
|
|
||||||
category = CATEGORY_SENSOR
|
category = CATEGORY_SENSOR
|
||||||
|
|
||||||
def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs):
|
def __init__(self, driver, device, api_client, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
Initialize the contact sensor accessory.
|
Initialize the contact sensor accessory.
|
||||||
|
|
||||||
@@ -22,9 +22,8 @@ class ContactAccessory(Accessory):
|
|||||||
driver: HAP driver instance
|
driver: HAP driver instance
|
||||||
device: Device object from DeviceRegistry
|
device: Device object from DeviceRegistry
|
||||||
api_client: ApiClient for sending commands
|
api_client: ApiClient for sending commands
|
||||||
display_name: Optional display name (defaults to device.friendly_name)
|
|
||||||
"""
|
"""
|
||||||
name = display_name or device.friendly_name or device.name
|
name = device.name
|
||||||
super().__init__(driver, name, *args, **kwargs)
|
super().__init__(driver, name, *args, **kwargs)
|
||||||
self.device = device
|
self.device = device
|
||||||
self.api_client = api_client
|
self.api_client = api_client
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ class OnOffLightAccessory(Accessory):
|
|||||||
|
|
||||||
category = CATEGORY_LIGHTBULB
|
category = CATEGORY_LIGHTBULB
|
||||||
|
|
||||||
def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs):
|
def __init__(self, driver, device, api_client, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
Initialize the light accessory.
|
Initialize the light accessory.
|
||||||
|
|
||||||
@@ -24,9 +24,8 @@ class OnOffLightAccessory(Accessory):
|
|||||||
driver: HAP driver instance
|
driver: HAP driver instance
|
||||||
device: Device object from DeviceRegistry
|
device: Device object from DeviceRegistry
|
||||||
api_client: ApiClient for sending commands
|
api_client: ApiClient for sending commands
|
||||||
display_name: Optional display name (defaults to device.friendly_name)
|
|
||||||
"""
|
"""
|
||||||
name = display_name or device.friendly_name or device.name
|
name = device.name
|
||||||
super().__init__(driver, name, *args, **kwargs)
|
super().__init__(driver, name, *args, **kwargs)
|
||||||
self.device = device
|
self.device = device
|
||||||
self.api_client = api_client
|
self.api_client = api_client
|
||||||
@@ -57,9 +56,9 @@ class OnOffLightAccessory(Accessory):
|
|||||||
class DimmableLightAccessory(OnOffLightAccessory):
|
class DimmableLightAccessory(OnOffLightAccessory):
|
||||||
"""Dimmable Light with brightness control."""
|
"""Dimmable Light with brightness control."""
|
||||||
|
|
||||||
def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs):
|
def __init__(self, driver, device, api_client, *args, **kwargs):
|
||||||
# Don't call super().__init__() yet - we need to set up service first
|
# Don't call super().__init__() yet - we need to set up service first
|
||||||
name = display_name or device.friendly_name or device.name
|
name = device.name
|
||||||
Accessory.__init__(self, driver, name, *args, **kwargs)
|
Accessory.__init__(self, driver, name, *args, **kwargs)
|
||||||
self.device = device
|
self.device = device
|
||||||
self.api_client = api_client
|
self.api_client = api_client
|
||||||
@@ -106,9 +105,9 @@ class DimmableLightAccessory(OnOffLightAccessory):
|
|||||||
class ColorLightAccessory(DimmableLightAccessory):
|
class ColorLightAccessory(DimmableLightAccessory):
|
||||||
"""RGB Light with full color control."""
|
"""RGB Light with full color control."""
|
||||||
|
|
||||||
def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs):
|
def __init__(self, driver, device, api_client, *args, **kwargs):
|
||||||
# Don't call super().__init__() - build everything from scratch
|
# Don't call super().__init__() - build everything from scratch
|
||||||
name = display_name or device.friendly_name or device.name
|
name = device.name
|
||||||
Accessory.__init__(self, driver, name, *args, **kwargs)
|
Accessory.__init__(self, driver, name, *args, **kwargs)
|
||||||
self.device = device
|
self.device = device
|
||||||
self.api_client = api_client
|
self.api_client = api_client
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class OutletAccessory(Accessory):
|
|||||||
|
|
||||||
category = CATEGORY_OUTLET
|
category = CATEGORY_OUTLET
|
||||||
|
|
||||||
def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs):
|
def __init__(self, driver, device, api_client, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
Initialize the outlet accessory.
|
Initialize the outlet accessory.
|
||||||
|
|
||||||
@@ -23,9 +23,8 @@ class OutletAccessory(Accessory):
|
|||||||
driver: HAP driver instance
|
driver: HAP driver instance
|
||||||
device: Device object from DeviceRegistry
|
device: Device object from DeviceRegistry
|
||||||
api_client: ApiClient for sending commands
|
api_client: ApiClient for sending commands
|
||||||
display_name: Optional display name (defaults to device.friendly_name)
|
|
||||||
"""
|
"""
|
||||||
name = display_name or device.friendly_name or device.name
|
name = device.name
|
||||||
super().__init__(driver, name, *args, **kwargs)
|
super().__init__(driver, name, *args, **kwargs)
|
||||||
self.device = device
|
self.device = device
|
||||||
self.api_client = api_client
|
self.api_client = api_client
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class TempHumidityAccessory(Accessory):
|
|||||||
|
|
||||||
category = CATEGORY_SENSOR
|
category = CATEGORY_SENSOR
|
||||||
|
|
||||||
def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs):
|
def __init__(self, driver, device, api_client, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
Initialize the temp/humidity sensor accessory.
|
Initialize the temp/humidity sensor accessory.
|
||||||
|
|
||||||
@@ -23,9 +23,8 @@ class TempHumidityAccessory(Accessory):
|
|||||||
driver: HAP driver instance
|
driver: HAP driver instance
|
||||||
device: Device object from DeviceRegistry
|
device: Device object from DeviceRegistry
|
||||||
api_client: ApiClient for sending commands
|
api_client: ApiClient for sending commands
|
||||||
display_name: Optional display name (defaults to device.friendly_name)
|
|
||||||
"""
|
"""
|
||||||
name = display_name or device.friendly_name or device.name
|
name = device.name
|
||||||
super().__init__(driver, name, *args, **kwargs)
|
super().__init__(driver, name, *args, **kwargs)
|
||||||
self.device = device
|
self.device = device
|
||||||
self.api_client = api_client
|
self.api_client = api_client
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ class ThermostatAccessory(Accessory):
|
|||||||
|
|
||||||
category = CATEGORY_THERMOSTAT
|
category = CATEGORY_THERMOSTAT
|
||||||
|
|
||||||
def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs):
|
def __init__(self, driver, device, api_client, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
Initialize the thermostat accessory.
|
Initialize the thermostat accessory.
|
||||||
|
|
||||||
@@ -25,9 +25,8 @@ class ThermostatAccessory(Accessory):
|
|||||||
driver: HAP driver instance
|
driver: HAP driver instance
|
||||||
device: Device object from DeviceRegistry
|
device: Device object from DeviceRegistry
|
||||||
api_client: ApiClient for sending commands
|
api_client: ApiClient for sending commands
|
||||||
display_name: Optional display name (defaults to device.friendly_name)
|
|
||||||
"""
|
"""
|
||||||
name = display_name or device.friendly_name or device.name
|
name = device.name
|
||||||
super().__init__(driver, name, *args, **kwargs)
|
super().__init__(driver, name, *args, **kwargs)
|
||||||
self.device = device
|
self.device = device
|
||||||
self.api_client = api_client
|
self.api_client = api_client
|
||||||
|
|||||||
@@ -50,26 +50,7 @@ class ApiClient:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Failed to get devices: {e}")
|
logger.error(f"Failed to get devices: {e}")
|
||||||
raise
|
raise
|
||||||
|
|
||||||
def get_layout(self) -> Dict:
|
|
||||||
"""
|
|
||||||
Get layout information (rooms and device assignments).
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Layout dictionary with room structure
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
response = httpx.get(
|
|
||||||
f'{self.base_url}/layout',
|
|
||||||
headers=self.headers,
|
|
||||||
timeout=self.timeout
|
|
||||||
)
|
|
||||||
response.raise_for_status()
|
|
||||||
return response.json()
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Failed to get layout: {e}")
|
|
||||||
raise
|
|
||||||
|
|
||||||
def get_device_state(self, device_id: str) -> Dict:
|
def get_device_state(self, device_id: str) -> Dict:
|
||||||
"""
|
"""
|
||||||
Get current state of a specific device.
|
Get current state of a specific device.
|
||||||
|
|||||||
@@ -18,8 +18,6 @@ class Device:
|
|||||||
device_id: str
|
device_id: str
|
||||||
type: str # "light", "thermostat", "relay", "contact", "temp_humidity", "cover"
|
type: str # "light", "thermostat", "relay", "contact", "temp_humidity", "cover"
|
||||||
name: str # Short name from /devices
|
name: str # Short name from /devices
|
||||||
friendly_name: str # Display title from /layout (fallback to name)
|
|
||||||
room: Optional[str] # Room name from layout
|
|
||||||
features: Dict[str, bool] # Feature flags (e.g., {"power": true, "brightness": true})
|
features: Dict[str, bool] # Feature flags (e.g., {"power": true, "brightness": true})
|
||||||
read_only: bool # True for sensors that don't accept commands
|
read_only: bool # True for sensors that don't accept commands
|
||||||
|
|
||||||
@@ -50,24 +48,7 @@ class DeviceRegistry:
|
|||||||
"""
|
"""
|
||||||
# Get devices and layout
|
# Get devices and layout
|
||||||
devices_data = api_client.get_devices()
|
devices_data = api_client.get_devices()
|
||||||
layout_data = api_client.get_layout()
|
|
||||||
|
|
||||||
# Build lookup: device_id -> (room_name, title)
|
|
||||||
layout_map = {}
|
|
||||||
if isinstance(layout_data, dict) and 'rooms' in layout_data:
|
|
||||||
rooms_list = layout_data['rooms']
|
|
||||||
if isinstance(rooms_list, list):
|
|
||||||
for room in rooms_list:
|
|
||||||
if isinstance(room, dict):
|
|
||||||
room_name = room.get('name', 'Unknown')
|
|
||||||
devices_in_room = room.get('devices', [])
|
|
||||||
for device_info in devices_in_room:
|
|
||||||
if isinstance(device_info, dict):
|
|
||||||
device_id = device_info.get('device_id')
|
|
||||||
title = device_info.get('title', '')
|
|
||||||
if device_id:
|
|
||||||
layout_map[device_id] = (room_name, title)
|
|
||||||
|
|
||||||
# Create Device objects
|
# Create Device objects
|
||||||
devices = []
|
devices = []
|
||||||
for dev_data in devices_data:
|
for dev_data in devices_data:
|
||||||
@@ -76,9 +57,6 @@ class DeviceRegistry:
|
|||||||
logger.warning(f"Device without device_id: {dev_data}")
|
logger.warning(f"Device without device_id: {dev_data}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Get layout info
|
|
||||||
room_name, title = layout_map.get(device_id, (None, ''))
|
|
||||||
|
|
||||||
# Determine if read-only (sensors don't accept set commands)
|
# Determine if read-only (sensors don't accept set commands)
|
||||||
device_type = dev_data.get('type', '')
|
device_type = dev_data.get('type', '')
|
||||||
read_only = device_type in ['contact', 'temp_humidity', 'motion', 'smoke']
|
read_only = device_type in ['contact', 'temp_humidity', 'motion', 'smoke']
|
||||||
@@ -86,9 +64,7 @@ class DeviceRegistry:
|
|||||||
device = Device(
|
device = Device(
|
||||||
device_id=device_id,
|
device_id=device_id,
|
||||||
type=device_type,
|
type=device_type,
|
||||||
name=dev_data.get('name', device_id),
|
name=device_id,
|
||||||
friendly_name=title or dev_data.get('name', device_id),
|
|
||||||
room=room_name,
|
|
||||||
features=dev_data.get('features', {}),
|
features=dev_data.get('features', {}),
|
||||||
read_only=read_only
|
read_only=read_only
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -71,14 +71,9 @@ def build_bridge(driver: AccessoryDriver, api_client: ApiClient) -> Bridge:
|
|||||||
try:
|
try:
|
||||||
accessory = create_accessory_for_device(device, api_client, driver)
|
accessory = create_accessory_for_device(device, api_client, driver)
|
||||||
if accessory:
|
if accessory:
|
||||||
# Set room information in the accessory (HomeKit will use this for suggestions)
|
|
||||||
if device.room:
|
|
||||||
# Store room info for potential future use
|
|
||||||
accessory._room_name = device.room
|
|
||||||
|
|
||||||
bridge.add_accessory(accessory)
|
bridge.add_accessory(accessory)
|
||||||
accessory_map[device.device_id] = accessory
|
accessory_map[device.device_id] = accessory
|
||||||
logger.info(f"Added accessory: {device.friendly_name} ({device.type}) in room: {device.room or 'Unknown'}")
|
logger.info(f"Added accessory: {device.name} ({device.type}, {accessory.__class__.__name__})")
|
||||||
else:
|
else:
|
||||||
logger.warning(f"No accessory mapping for device: {device.name} ({device.type})")
|
logger.warning(f"No accessory mapping for device: {device.name} ({device.type})")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -90,23 +85,6 @@ def build_bridge(driver: AccessoryDriver, api_client: ApiClient) -> Bridge:
|
|||||||
logger.info(f"Bridge built with {len(accessory_map)} accessories")
|
logger.info(f"Bridge built with {len(accessory_map)} accessories")
|
||||||
return bridge
|
return bridge
|
||||||
|
|
||||||
|
|
||||||
def get_accessory_name(device) -> str:
|
|
||||||
"""
|
|
||||||
Build accessory name including room information.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
device: Device object from DeviceRegistry
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Name string like "Device Name (Room)" or just "Device Name" if no room
|
|
||||||
"""
|
|
||||||
base_name = device.friendly_name or device.name
|
|
||||||
if device.room:
|
|
||||||
return f"{base_name} ({device.room})"
|
|
||||||
return base_name
|
|
||||||
|
|
||||||
|
|
||||||
def create_accessory_for_device(device, api_client: ApiClient, driver: AccessoryDriver):
|
def create_accessory_for_device(device, api_client: ApiClient, driver: AccessoryDriver):
|
||||||
"""
|
"""
|
||||||
Create appropriate HomeKit accessory based on device type and features.
|
Create appropriate HomeKit accessory based on device type and features.
|
||||||
@@ -115,32 +93,30 @@ def create_accessory_for_device(device, api_client: ApiClient, driver: Accessory
|
|||||||
"""
|
"""
|
||||||
device_type = device.type
|
device_type = device.type
|
||||||
features = device.features
|
features = device.features
|
||||||
display_name = get_accessory_name(device)
|
|
||||||
|
|
||||||
# Light accessories
|
# Light accessories
|
||||||
if device_type == "light":
|
if device_type == "light":
|
||||||
if features.get("color_hsb"):
|
if features.get("color_hsb"):
|
||||||
return ColorLightAccessory(driver, device, api_client, display_name=display_name)
|
return ColorLightAccessory(driver, device, api_client)
|
||||||
elif features.get("brightness"):
|
elif features.get("brightness"):
|
||||||
return DimmableLightAccessory(driver, device, api_client, display_name=display_name)
|
return DimmableLightAccessory(driver, device, api_client)
|
||||||
else:
|
else:
|
||||||
return OnOffLightAccessory(driver, device, api_client, display_name=display_name)
|
return OnOffLightAccessory(driver, device, api_client)
|
||||||
|
|
||||||
# Thermostat
|
# Thermostat
|
||||||
elif device_type == "thermostat":
|
elif device_type == "thermostat":
|
||||||
return ThermostatAccessory(driver, device, api_client, display_name=display_name)
|
return ThermostatAccessory(driver, device, api_client)
|
||||||
|
|
||||||
# Contact sensor
|
# Contact sensor
|
||||||
elif device_type == "contact":
|
elif device_type == "contact":
|
||||||
return ContactAccessory(driver, device, api_client, display_name=display_name)
|
return ContactAccessory(driver, device, api_client)
|
||||||
|
|
||||||
# Temperature/Humidity sensor
|
# Temperature/Humidity sensor
|
||||||
elif device_type == "temp_humidity_sensor":
|
elif device_type == "temp_humidity_sensor":
|
||||||
return TempHumidityAccessory(driver, device, api_client, display_name=display_name)
|
return TempHumidityAccessory(driver, device, api_client)
|
||||||
|
|
||||||
# Relay/Outlet
|
# Relay/Outlet
|
||||||
elif device_type == "relay":
|
elif device_type == "relay":
|
||||||
return OutletAccessory(driver, device, api_client, display_name=display_name)
|
return OutletAccessory(driver, device, api_client)
|
||||||
|
|
||||||
# Cover/Blinds (optional)
|
# Cover/Blinds (optional)
|
||||||
elif device_type == "cover":
|
elif device_type == "cover":
|
||||||
|
|||||||
@@ -241,22 +241,6 @@ devices:
|
|||||||
ieee_address: "0x0017880108a03e45"
|
ieee_address: "0x0017880108a03e45"
|
||||||
model: "929002241201"
|
model: "929002241201"
|
||||||
vendor: "Philips"
|
vendor: "Philips"
|
||||||
- device_id: haustuer
|
|
||||||
name: Haustür-Lampe
|
|
||||||
type: light
|
|
||||||
cap_version: "light@1.2.0"
|
|
||||||
technology: zigbee2mqtt
|
|
||||||
features:
|
|
||||||
power: true
|
|
||||||
brightness: true
|
|
||||||
topics:
|
|
||||||
state: "zigbee2mqtt/0xec1bbdfffea6a3da"
|
|
||||||
set: "zigbee2mqtt/0xec1bbdfffea6a3da/set"
|
|
||||||
metadata:
|
|
||||||
friendly_name: "Haustür"
|
|
||||||
ieee_address: "0xec1bbdfffea6a3da"
|
|
||||||
model: "LED1842G3"
|
|
||||||
vendor: "IKEA"
|
|
||||||
- device_id: deckenlampe_flur_oben
|
- device_id: deckenlampe_flur_oben
|
||||||
name: Deckenlampe oben
|
name: Deckenlampe oben
|
||||||
type: light
|
type: light
|
||||||
@@ -783,6 +767,88 @@ devices:
|
|||||||
topics:
|
topics:
|
||||||
set: "shellies/lichtterasse/relay/0/command"
|
set: "shellies/lichtterasse/relay/0/command"
|
||||||
state: "shellies/lichtterasse/relay/0"
|
state: "shellies/lichtterasse/relay/0"
|
||||||
|
- device_id: kugellampe_patty
|
||||||
|
name: Kugellampe Patty
|
||||||
|
type: light
|
||||||
|
cap_version: "light@1.2.0"
|
||||||
|
technology: zigbee2mqtt
|
||||||
|
features:
|
||||||
|
power: true
|
||||||
|
brightness: true
|
||||||
|
topics:
|
||||||
|
state: "zigbee2mqtt/0xbc33acfffe21f547"
|
||||||
|
set: "zigbee2mqtt/0xbc33acfffe21f547/set"
|
||||||
|
- device_id: kueche_fensterbank_licht
|
||||||
|
name: Fensterbank Küche
|
||||||
|
type: light
|
||||||
|
cap_version: "light@1.2.0"
|
||||||
|
technology: zigbee2mqtt
|
||||||
|
features:
|
||||||
|
power: true
|
||||||
|
brightness: true
|
||||||
|
topics:
|
||||||
|
state: "zigbee2mqtt/0xf0d1b8000017515d"
|
||||||
|
set: "zigbee2mqtt/0xf0d1b8000017515d/set"
|
||||||
|
- device_id: licht_kommode_schlafzimmer
|
||||||
|
name: Kommode Schlafzimmer
|
||||||
|
type: relay
|
||||||
|
cap_version: "relay@1.0.0"
|
||||||
|
technology: tasmota
|
||||||
|
features:
|
||||||
|
power: true
|
||||||
|
topics:
|
||||||
|
set: "cmnd/tasmota/04/POWER"
|
||||||
|
state: "stat/tasmota/04/POWER"
|
||||||
|
- device_id: licht_fensterbank_esszimmer
|
||||||
|
name: Fensterbank Esszimmer
|
||||||
|
type: relay
|
||||||
|
cap_version: "relay@1.0.0"
|
||||||
|
technology: tasmota
|
||||||
|
features:
|
||||||
|
power: true
|
||||||
|
topics:
|
||||||
|
set: "cmnd/tasmota/02/POWER"
|
||||||
|
state: "stat/tasmota/02/POWER"
|
||||||
|
- device_id: licht_schreibtisch_patty
|
||||||
|
name: Schreibtisch Patty
|
||||||
|
type: relay
|
||||||
|
cap_version: "relay@1.0.0"
|
||||||
|
technology: tasmota
|
||||||
|
features:
|
||||||
|
power: true
|
||||||
|
topics:
|
||||||
|
set: "cmnd/tasmota/03/POWER"
|
||||||
|
state: "stat/tasmota/03/POWER"
|
||||||
|
- device_id: kugeln_regal_flur
|
||||||
|
name: Kugeln Regal Flur
|
||||||
|
type: relay
|
||||||
|
cap_version: "relay@1.0.0"
|
||||||
|
technology: tasmota
|
||||||
|
features:
|
||||||
|
power: true
|
||||||
|
topics:
|
||||||
|
set: "cmnd/tasmota/01/POWER"
|
||||||
|
state: "stat/tasmota/01/POWER"
|
||||||
|
- device_id: schrank_flur_haustür
|
||||||
|
name: Schrank Flur Haustür
|
||||||
|
type: relay
|
||||||
|
cap_version: "relay@1.0.0"
|
||||||
|
technology: tasmota
|
||||||
|
features:
|
||||||
|
power: true
|
||||||
|
topics:
|
||||||
|
set: "cmnd/tasmota/05/POWER"
|
||||||
|
state: "stat/tasmota/05/POWER"
|
||||||
|
- device_id: gartenlicht_vorne
|
||||||
|
name: Gartenlicht vorne
|
||||||
|
type: relay
|
||||||
|
cap_version: "relay@1.0.0"
|
||||||
|
technology: tasmota
|
||||||
|
features:
|
||||||
|
power: true
|
||||||
|
topics:
|
||||||
|
set: "cmnd/tasmota/06/POWER"
|
||||||
|
state: "stat/tasmota/06/POWER"
|
||||||
|
|
||||||
- device_id: power_relay_caroutlet
|
- device_id: power_relay_caroutlet
|
||||||
name: Car Outlet
|
name: Car Outlet
|
||||||
@@ -799,8 +865,30 @@ devices:
|
|||||||
name: Car Outlet
|
name: Car Outlet
|
||||||
type: three_phase_powermeter
|
type: three_phase_powermeter
|
||||||
cap_version: "three_phase_powermeter@1.0.0"
|
cap_version: "three_phase_powermeter@1.0.0"
|
||||||
technology: hottis_modbus
|
technology: hottis_pv_modbus
|
||||||
topics:
|
topics:
|
||||||
state: "caroutlet/powermeter"
|
state: "IoT/Car/Values"
|
||||||
|
|
||||||
|
- device_id: schranklicht_flur_vor_kueche
|
||||||
|
name: Schranklicht Flur vor Küche
|
||||||
|
type: light
|
||||||
|
cap_version: "relay@1.0.0"
|
||||||
|
technology: zigbee2mqtt
|
||||||
|
features:
|
||||||
|
power: true
|
||||||
|
topics:
|
||||||
|
state: "zigbee2mqtt/0xf0d1b80000155a1f"
|
||||||
|
set: "zigbee2mqtt/0xf0d1b80000155a1f/set"
|
||||||
|
- device_id: deckenlampe_wohnzimmer
|
||||||
|
name: Deckenlampe Wohnzimmer
|
||||||
|
type: light
|
||||||
|
cap_version: "relay@1.0.0"
|
||||||
|
technology: zigbee2mqtt
|
||||||
|
features:
|
||||||
|
power: true
|
||||||
|
brightness: true
|
||||||
|
topics:
|
||||||
|
state: "zigbee2mqtt/0x842e14fffea72027"
|
||||||
|
set: "zigbee2mqtt/0x842e14fffea72027/set"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,10 @@ rooms:
|
|||||||
title: Medusa-Lampe Schlafzimmer
|
title: Medusa-Lampe Schlafzimmer
|
||||||
icon: 💡
|
icon: 💡
|
||||||
rank: 40
|
rank: 40
|
||||||
|
- device_id: licht_kommode_schlafzimmer
|
||||||
|
title: Kommode Schlafzimmer
|
||||||
|
icon: 💡
|
||||||
|
rank: 42
|
||||||
- device_id: thermostat_schlafzimmer
|
- device_id: thermostat_schlafzimmer
|
||||||
title: Thermostat Schlafzimmer
|
title: Thermostat Schlafzimmer
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
@@ -39,10 +43,10 @@ rooms:
|
|||||||
title: Leselampe Esszimmer
|
title: Leselampe Esszimmer
|
||||||
icon: 💡
|
icon: 💡
|
||||||
rank: 60
|
rank: 60
|
||||||
# - device_id: standlampe_esszimmer
|
- device_id: licht_fensterbank_esszimmer
|
||||||
# title: Standlampe Esszimmer
|
title: Fensterbank 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: 💡
|
||||||
@@ -97,6 +101,10 @@ rooms:
|
|||||||
title: Regallicht Wohnzimmer
|
title: Regallicht Wohnzimmer
|
||||||
icon: 💡
|
icon: 💡
|
||||||
rank: 132
|
rank: 132
|
||||||
|
- device_id: deckenlampe_wohnzimmer
|
||||||
|
title: Deckenlampe Wohnzimmer
|
||||||
|
icon: 💡
|
||||||
|
rank: 133
|
||||||
- device_id: thermostat_wohnzimmer
|
- device_id: thermostat_wohnzimmer
|
||||||
title: Thermostat Wohnzimmer
|
title: Thermostat Wohnzimmer
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
@@ -127,6 +135,10 @@ rooms:
|
|||||||
title: Küche Putzlicht
|
title: Küche Putzlicht
|
||||||
icon: 💡
|
icon: 💡
|
||||||
rank: 143
|
rank: 143
|
||||||
|
- device_id: kueche_fensterbank_licht
|
||||||
|
title: Küche Fensterbank
|
||||||
|
icon: 💡
|
||||||
|
rank: 144
|
||||||
- device_id: thermostat_kueche
|
- device_id: thermostat_kueche
|
||||||
title: Kueche
|
title: Kueche
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
@@ -165,6 +177,14 @@ rooms:
|
|||||||
title: Schranklicht vorne Patty
|
title: Schranklicht vorne Patty
|
||||||
icon: 💡
|
icon: 💡
|
||||||
rank: 180
|
rank: 180
|
||||||
|
- device_id: kugellampe_patty
|
||||||
|
title: Kugellampe Patty
|
||||||
|
icon: 💡
|
||||||
|
rank: 181
|
||||||
|
- device_id: licht_schreibtisch_patty
|
||||||
|
title: Licht Schreibtisch Patty
|
||||||
|
icon: 💡
|
||||||
|
rank: 182
|
||||||
- device_id: thermostat_patty
|
- device_id: thermostat_patty
|
||||||
title: Thermostat Patty
|
title: Thermostat Patty
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
@@ -209,18 +229,22 @@ rooms:
|
|||||||
title: Deckenlampe Flur oben
|
title: Deckenlampe Flur oben
|
||||||
icon: 💡
|
icon: 💡
|
||||||
rank: 210
|
rank: 210
|
||||||
- device_id: haustuer
|
- device_id: kugeln_regal_flur
|
||||||
title: Haustür
|
title: Kugeln Regal
|
||||||
icon: 💡
|
|
||||||
rank: 220
|
|
||||||
- device_id: licht_flur_schrank
|
|
||||||
title: Schranklicht Flur
|
|
||||||
icon: 💡
|
icon: 💡
|
||||||
rank: 222
|
rank: 222
|
||||||
- device_id: licht_flur_oben_am_spiegel
|
- device_id: licht_flur_oben_am_spiegel
|
||||||
title: Licht Flur oben am Spiegel
|
title: Licht oben am Spiegel
|
||||||
icon: 💡
|
icon: 💡
|
||||||
rank: 230
|
rank: 230
|
||||||
|
- device_id: schrank_flur_haustür
|
||||||
|
title: Schranklicht an der Haustür
|
||||||
|
icon: 💡
|
||||||
|
rank: 231
|
||||||
|
- device_id: schranklicht_flur_vor_kueche
|
||||||
|
title: Schranklicht vor Küche
|
||||||
|
icon: 💡
|
||||||
|
rank: 232
|
||||||
- device_id: sensor_flur
|
- device_id: sensor_flur
|
||||||
title: Temperatur & Luftfeuchte
|
title: Temperatur & Luftfeuchte
|
||||||
icon: 🌡️
|
icon: 🌡️
|
||||||
@@ -283,6 +307,10 @@ rooms:
|
|||||||
title: Licht Terasse
|
title: Licht Terasse
|
||||||
icon: 💡
|
icon: 💡
|
||||||
rank: 290
|
rank: 290
|
||||||
|
- device_id: gartenlicht_vorne
|
||||||
|
title: Gartenlicht vorne
|
||||||
|
icon: 💡
|
||||||
|
rank: 291
|
||||||
- name: Garage
|
- name: Garage
|
||||||
devices:
|
devices:
|
||||||
- device_id: power_relay_caroutlet
|
- device_id: power_relay_caroutlet
|
||||||
|
|||||||
Reference in New Issue
Block a user