Migrating Zwave & ZigBee stuff to MQTT - guidance needed.
-
@akbooer said in Migrating Zwave & ZigBee stuff to MQTT - guidance needed.:
The bridge self-installs if openLuup sees one of those devices (over MQTT) and creates a corresponding virtual device.
I can see the complexity of doing this for zigbee2mqtt as there are so many devices, many of which are composites. So for example these motion detectors:
which are tiny and also have high claimed battery life, have all sorts of properties in their payload - however it's fundamentally a motion sensor:
{ "battery": 100, "detection_interval": 30, "device_temperature": 22, "illuminance": 64, "linkquality": 255, "motion_sensitivity": "medium", "occupancy": false, "power_outage_count": 0, "trigger_indicator": false, "voltage": 3215 }
Home Assistant has similar problems, where there are so many properties to perhaps make use of and/or handle.
I'm thinking that with zigbee2mqtt and also ZWAVE JS UI you could possibly do OK with just handling a few types of devices. I would suggest just:
- Relays
- Dimmable and colored lights
- Blinds?
Other stuff could probably be handled with code and the Virtual HTTP Devices plug-in.
Out of interest; the zigbee2mqtt "Bridge" churns out stuff like this for each zigbee device:
[ { "definition": null, "endpoints": { "1": { "bindings": [], "clusters": { "input": [ "genBasic", "genIdentify", "genOnOff", "genTime", "genOta", "26", "lightingColorCtrl" ], "output": [ "genBasic", "genIdentify", "genGroups", "genScenes", "genOnOff", "genLevelCtrl", "genPollCtrl", "lightingColorCtrl", "msIlluminanceMeasurement", "msTemperatureMeasurement", "msRelativeHumidity", "msOccupancySensing", "ssIasZone", "haMeterIdentification", "haApplianceStatistics", "haElectricalMeasurement", "seMetering", "touchlink", "manuSpecificUbisysDimmerSetup", "manuSpecificSamsungAccelerometer" ] }, "configured_reportings": [], "scenes": [] }, "242": { "bindings": [], "clusters": { "input": [], "output": [ "greenPower" ] }, "configured_reportings": [], "scenes": [] } }, "friendly_name": "Coordinator", "ieee_address": "0xredacted", "interview_completed": true, "interviewing": false, "network_address": 0, "supported": false, "type": "Coordinator" }, { "date_code": "Dec 7 2021", "definition": { "description": "Aqara P1 human body movement and illuminance sensor", "exposes": [ { "access": 1, "description": "Indicates whether the device detected occupancy", "name": "occupancy", "property": "occupancy", "type": "binary", "value_off": false, "value_on": true }, { "access": 1, "description": "Measured illuminance in lux", "name": "illuminance_lux", "property": "illuminance", "type": "numeric", "unit": "lx" }, { "access": 1, "description": "Measured illuminance in lux", "name": "illuminance", "property": "illuminance", "type": "numeric", "unit": "lx" }, { "access": 7, "description": ". Press pairing button right before changing this otherwise it will fail.", "name": "motion_sensitivity", "property": "motion_sensitivity", "type": "enum", "values": [ "low", "medium", "high" ] }, { "access": 7, "description": "Time interval for detecting actions. Press pairing button right before changing this otherwise it will fail.", "name": "detection_interval", "property": "detection_interval", "type": "numeric", "unit": "s", "value_max": 65535, "value_min": 2 }, { "access": 7, "description": "When this option is enabled then blue LED will blink once when motion is detected. Press pairing button right before changing this otherwise it will fail.", "name": "trigger_indicator", "property": "trigger_indicator", "type": "binary", "value_off": false, "value_on": true }, { "access": 1, "description": "Temperature of the device", "name": "device_temperature", "property": "device_temperature", "type": "numeric", "unit": "°C" }, { "access": 1, "description": "Remaining battery in %", "name": "battery", "property": "battery", "type": "numeric", "unit": "%", "value_max": 100, "value_min": 0 }, { "access": 1, "description": "Voltage of the battery in millivolts", "name": "voltage", "property": "voltage", "type": "numeric", "unit": "mV" }, { "access": 1, "description": "Link quality (signal strength)", "name": "linkquality", "property": "linkquality", "type": "numeric", "unit": "lqi", "value_max": 255, "value_min": 0 } ], "model": "RTCGQ14LM", "options": [ { "access": 2, "description": "Time in seconds after which occupancy is cleared after detecting it (default is \"detection_interval\" + 2 seconds). The value must be equal to or greater than \"detection_interval\", and it can also be a fraction.", "name": "occupancy_timeout", "property": "occupancy_timeout", "type": "numeric", "unit": "s", "value_min": 0, "value_step": 0.1 }, { "access": 2, "description": "Sends a message the last time occupancy (occupancy: true) was detected. When setting this for example to [10, 60] a `{\"no_occupancy_since\": 10}` will be send after 10 seconds and a `{\"no_occupancy_since\": 60}` after 60 seconds.", "item_type": "number", "name": "no_occupancy_since", "property": "no_occupancy_since", "type": "list" }, { "access": 2, "description": "Calibrates the illuminance value (percentual offset), takes into effect on next report of device.", "name": "illuminance_calibration", "property": "illuminance_calibration", "type": "numeric" }, { "access": 2, "description": "Calibrates the device_temperature value (absolute offset), takes into effect on next report of device.", "name": "device_temperature_calibration", "property": "device_temperature_calibration", "type": "numeric" } ], "supports_ota": true, "vendor": "Xiaomi" }, "endpoints": { "1": { "bindings": [], "clusters": { "input": [ "genBasic", "genPowerCfg", "genIdentify", "aqaraOpple" ], "output": [ "genIdentify", "genOta", "aqaraOpple" ] }, "configured_reportings": [], "scenes": [] } }, "friendly_name": "hello/testing", "ieee_address": "0x01234567890abcde", "interview_completed": true, "interviewing": false, "manufacturer": "LUMI", "model_id": "lumi.motion.ac02", "network_address": 32549, "power_source": "Battery", "software_build_id": "0.0.0_0005", "supported": true, "type": "EndDevice" } ]
However getting back to the migration issue; I could probably make use of the Virtual HTTP Devices plug-in but as previously mentioned, I may need up to 80 devices to be created.
How do you "Create" a device programmatically? Looks like the MIOS documentation Wiki is being abandoned; otherwise I would scour through that for the answer. Assume you need to post D_zyz.xml and I_xyz.xml file names, etc to somewhere?
@a-lurker said in Migrating Zwave & ZigBee stuff to MQTT - guidance needed.:
I'm thinking that with zigbee2mqtt and also ZWAVE JS UI you could possibly do OK with just handling a few types of devices. I would suggest just:
Relays
Dimmable and colored lights
Blinds?Other stuff could probably be handled with code and the Virtual HTTP Devices plug-in.
Yes, that's the sort of thing I had in mind. Both Shelly and Tasmota bridges are similarly constrained.
What topics do zigbee2mqtt and ZWAVE JS UI use?
Shelly currently subsribes to "shellies/#", and Tasmota to "tele/#", and " tasmota/tele/#".
-
@a-lurker said in Migrating Zwave & ZigBee stuff to MQTT - guidance needed.:
I'm thinking that with zigbee2mqtt and also ZWAVE JS UI you could possibly do OK with just handling a few types of devices. I would suggest just:
Relays
Dimmable and colored lights
Blinds?Other stuff could probably be handled with code and the Virtual HTTP Devices plug-in.
Yes, that's the sort of thing I had in mind. Both Shelly and Tasmota bridges are similarly constrained.
What topics do zigbee2mqtt and ZWAVE JS UI use?
Shelly currently subsribes to "shellies/#", and Tasmota to "tele/#", and " tasmota/tele/#".
I'm still delving into this, so my current knowledge is a little on the short side and the following is a little generalized. However:
It seems that battery operated devices have nothing that can be controlled and their status cannot be read on demand ie no set or get possible (as indicated by an "access" sub property - see below). Presumably because they are asleep most of the time. So a battery powered Aqara motion detector publishes this only when it's triggered by motion:
"zigbee2mqtt/0x01234567890abcde" and supplying a flat json payload containing all the properties - see previous post above.
"zigbee2mqtt" begins all the topics. It can be set to something else but not sure why you would; unless you had multiple instances of zigbee2mqtt running.
0x01234567890abcde is the "ieee_address" of the device and it can be associated with a "friendly_name" of your own choice, such as "bedroom1/left_corner/motion"
So you could have topics such as:
"zigbee2mqttInstance2/bedroom1/left_corner/motion" instead of "zigbee2mqtt/0x01234567890abcde"
The bridge defines all the devices and the devices' topics:
"zigbee2mqtt/bridge/devices" with a payload, which is an array of json objects - one for each device. ieee_address and friendly_name are top level properties of each device in the array. See previous post above.
The "zigbee2mqtt/bridge/devices" topic is published when you first connect to the zigbee2mqtt server. ie you can't do a GET on it - not sure why that is. It's republished if a device joins or leaves. You can force a republish by doing: "zigbee2mqtt/bridge/request/restart" but that's a bit radical, as it does a full server restart.
Each property in the device's status report is also further described by the bridge. So a status property such as temperature has sub properties eg "access", which indicates if the property can be set or get. ie battery operated devices can't be set or get. That is to say each device has an array of property description objects.
So to set up: you would load up the array of devices from "zigbee2mqtt/bridge/devices". Then wizz through them looking for ones of interest under "definition.exposes[array]". Trying to identify what the device type is, appears to be a bit tricky. Looks like you have check the device for the presence of various property combinations or omissions.
Aqara motion detector: has "occupancy". Also has device_temperature & illuminance, which in this case is not much use, as you only get the values when motion triggers the unit.
Hue light bulb: has "light"
Hue light switch: has "action"
Gets tricky with say composite devices. But it would be good to allow some of them eg:
Ikuü Dual outlet: has "switch" with "state_left" & "state_right" but no "brightness"
Tuya five gang light switch: has: "switch" with "state_l1" to "state_l5" (but no "moving_*" properties see below).
Lots of the devices also have temperature sensors and some have energy consumption sensors.
But then you have this that helps confound identification of a device:
Dual curtain/blind controller: It has "moving_left" & "moving_right" but it also has "state_left" & "state_right" like the Ikuü Dual outlet above!
Controlling things - eg a light bulb. There are two ways:
- send a block of json as the payload
- or pure text as the payload, with words such as ON or OFF or TOGGLE
From the following link that talks about these two SET & GET:
In case you don't want to use JSON, publishing to zigbee2mqtt/[FRIENDLY_NAME]/set/state with payload ON is the same as publishing to zigbee2mqtt/[FRIENDLY_NAME]/set payload {"state": "ON"}"
Hope this is of some help.
-
I'm still delving into this, so my current knowledge is a little on the short side and the following is a little generalized. However:
It seems that battery operated devices have nothing that can be controlled and their status cannot be read on demand ie no set or get possible (as indicated by an "access" sub property - see below). Presumably because they are asleep most of the time. So a battery powered Aqara motion detector publishes this only when it's triggered by motion:
"zigbee2mqtt/0x01234567890abcde" and supplying a flat json payload containing all the properties - see previous post above.
"zigbee2mqtt" begins all the topics. It can be set to something else but not sure why you would; unless you had multiple instances of zigbee2mqtt running.
0x01234567890abcde is the "ieee_address" of the device and it can be associated with a "friendly_name" of your own choice, such as "bedroom1/left_corner/motion"
So you could have topics such as:
"zigbee2mqttInstance2/bedroom1/left_corner/motion" instead of "zigbee2mqtt/0x01234567890abcde"
The bridge defines all the devices and the devices' topics:
"zigbee2mqtt/bridge/devices" with a payload, which is an array of json objects - one for each device. ieee_address and friendly_name are top level properties of each device in the array. See previous post above.
The "zigbee2mqtt/bridge/devices" topic is published when you first connect to the zigbee2mqtt server. ie you can't do a GET on it - not sure why that is. It's republished if a device joins or leaves. You can force a republish by doing: "zigbee2mqtt/bridge/request/restart" but that's a bit radical, as it does a full server restart.
Each property in the device's status report is also further described by the bridge. So a status property such as temperature has sub properties eg "access", which indicates if the property can be set or get. ie battery operated devices can't be set or get. That is to say each device has an array of property description objects.
So to set up: you would load up the array of devices from "zigbee2mqtt/bridge/devices". Then wizz through them looking for ones of interest under "definition.exposes[array]". Trying to identify what the device type is, appears to be a bit tricky. Looks like you have check the device for the presence of various property combinations or omissions.
Aqara motion detector: has "occupancy". Also has device_temperature & illuminance, which in this case is not much use, as you only get the values when motion triggers the unit.
Hue light bulb: has "light"
Hue light switch: has "action"
Gets tricky with say composite devices. But it would be good to allow some of them eg:
Ikuü Dual outlet: has "switch" with "state_left" & "state_right" but no "brightness"
Tuya five gang light switch: has: "switch" with "state_l1" to "state_l5" (but no "moving_*" properties see below).
Lots of the devices also have temperature sensors and some have energy consumption sensors.
But then you have this that helps confound identification of a device:
Dual curtain/blind controller: It has "moving_left" & "moving_right" but it also has "state_left" & "state_right" like the Ikuü Dual outlet above!
Controlling things - eg a light bulb. There are two ways:
- send a block of json as the payload
- or pure text as the payload, with words such as ON or OFF or TOGGLE
From the following link that talks about these two SET & GET:
In case you don't want to use JSON, publishing to zigbee2mqtt/[FRIENDLY_NAME]/set/state with payload ON is the same as publishing to zigbee2mqtt/[FRIENDLY_NAME]/set payload {"state": "ON"}"
Hope this is of some help.
-
Log of switch operation:
luup.call_action:: 209.urn:upnp-org:serviceId:SwitchPower1.SetTarget luup_log:209: VirtualDevices[3.0-beta7@209](actionPower@94):actionPower(209,"1") luup_log:209: VirtualDevices[3.0-beta7@209](actionPowerInternal@47):actionPowerInternal(209,true,true) luup_log:209: VirtualDevices[3.0-beta7@209](setVar@104):setVar("urn:upnp-org:serviceId:SwitchPower1","Target","1",209) old value "0" luup.variable_set:: 209.urn:upnp-org:serviceId:SwitchPower1.Target was: 0 now: 1 #hooks:0 luup_log:209: VirtualDevices[3.0-beta7@209](sendDeviceCommand@308):sendDeviceCommand("SetPowerURL","on",209)
These are all empty:
MQTT_BrightnessValue
MQTT_PowerStatusOff
MQTT_PowerStatusOnThese are all set to: "http://"
SetPowerOffURL
SetPowerURL
SetToggleURL
SetUpdateMetersURL -
Log of switch operation:
luup.call_action:: 209.urn:upnp-org:serviceId:SwitchPower1.SetTarget luup_log:209: VirtualDevices[3.0-beta7@209](actionPower@94):actionPower(209,"1") luup_log:209: VirtualDevices[3.0-beta7@209](actionPowerInternal@47):actionPowerInternal(209,true,true) luup_log:209: VirtualDevices[3.0-beta7@209](setVar@104):setVar("urn:upnp-org:serviceId:SwitchPower1","Target","1",209) old value "0" luup.variable_set:: 209.urn:upnp-org:serviceId:SwitchPower1.Target was: 0 now: 1 #hooks:0 luup_log:209: VirtualDevices[3.0-beta7@209](sendDeviceCommand@308):sendDeviceCommand("SetPowerURL","on",209)
These are all empty:
MQTT_BrightnessValue
MQTT_PowerStatusOff
MQTT_PowerStatusOnThese are all set to: "http://"
SetPowerOffURL
SetPowerURL
SetToggleURL
SetUpdateMetersURLZigbee supported devices page shows three column headings:
- Vendor
- Exposes
- Search
The "Exposes" pull down list is very useful as you can filter devices by what properties they expose. Useful for working on how to identify the device type. The filter allows multiple properties to be selected - allowing devices to be narrowed down further.
-
Zigbee supported devices page shows three column headings:
- Vendor
- Exposes
- Search
The "Exposes" pull down list is very useful as you can filter devices by what properties they expose. Useful for working on how to identify the device type. The filter allows multiple properties to be selected - allowing devices to be narrowed down further.
Should be able to run this code to get some idea how the type of the zigbee devices could potentially be identified:
local zigbee2mqtt_bridge_devices = [[ [{ "definition": null, "endpoints": { "1": { "bindings": [], "clusters": { "input": ["genBasic", "genIdentify", "genOnOff", "genTime", "genOta", "26", "lightingColorCtrl"], "output": ["genBasic", "genIdentify", "genGroups", "genScenes", "genOnOff", "genLevelCtrl", "genPollCtrl", "lightingColorCtrl", "msIlluminanceMeasurement", "msTemperatureMeasurement", "msRelativeHumidity", "msOccupancySensing", "ssIasZone", "haMeterIdentification", "haApplianceStatistics", "haElectricalMeasurement", "seMetering", "touchlink", "manuSpecificUbisysDimmerSetup", "manuSpecificSamsungAccelerometer"] }, "configured_reportings": [], "scenes": [] }, "242": { "bindings": [], "clusters": { "input": [], "output": ["greenPower"] }, "configured_reportings": [], "scenes": [] } }, "friendly_name": "Coordinator", "ieee_address": "0xredacted", "interview_completed": true, "interviewing": false, "network_address": 0, "supported": false, "type": "Coordinator" }, { "date_code": "Dec7 2021", "definition": { "description": "Aqara P1 human body movement and illuminance sensor", "exposes": [{ "access": 1, "description": "Indicates whether the device detected occupancy", "name": "occupancy", "property": "occupancy", "type": "binary", "value_off": false, "value_on": true }, { "access": 1, "description": "Measured illuminance in lux", "name": "illuminance_lux", "property": "illuminance", "type": "numeric", "unit": "lx" }, { "access": 1, "description": "Measured illuminance in lux", "name": "illuminance", "property": "illuminance", "type": "numeric", "unit": "lx" }, { "access": 7, "description": ". Press pairing button right before changing this otherwise it will fail.", "name": "motion_sensitivity", "property": "motion_sensitivity", "type": "enum", "values": ["low", "medium", "high"] }, { "access": 7, "description": "Time interval for detecting actions. Press pairing button right before changing this otherwise it will fail.", "name": "detection_interval", "property": "detection_interval", "type": "numeric", "unit": "s", "value_max": 65535, "value_min": 2 }, { "access": 7, "description": "When this option is enabled then blue LED will blink once when motion is detected. Press pairing button right before changing this otherwise it will fail.", "name": "trigger_indicator", "property": "trigger_indicator", "type": "binary", "value_off": false, "value_on": true }, { "access": 1, "description": "Temperature of the device", "name": "device_temperature", "property": "device_temperature", "type": "numeric", "unit": "°C" }, { "access": 1, "description": "Remaining battery in %", "name": "battery", "property": "battery", "type": "numeric", "unit": "%", "value_max": 100, "value_min": 0 }, { "access": 1, "description": "Voltage of the battery in millivolts", "name": "voltage", "property": "voltage", "type": "numeric", "unit": "mV" }, { "access": 1, "description": "Link quality (signal strength)", "name": "linkquality", "property": "linkquality", "type": "numeric", "unit": "lqi", "value_max": 255, "value_min": 0 }], "model": "RTCGQ14LM", "options": [{ "access": 2, "description": "Time in seconds after which occupancy is cleared after detecting it (default is \"detection_interval\" + 2 seconds). The value must be equal to or greater than \"detection_interval\", and it can also be a fraction.", "name": "occupancy_timeout", "property": "occupancy_timeout", "type": "numeric", "unit": "s", "value_min": 0, "value_step": 0.1 }, { "access": 2, "description": "Sends a message the last time occupancy (occupancy: true) was detected. When setting this for example to [10, 60] a `{\"no_occupancy_since\": 10}` will be send after 10 seconds and a `{\"no_occupancy_since\": 60}` after 60 seconds.", "item_type": "number", "name": "no_occupancy_since", "property": "no_occupancy_since", "type": "list" }, { "access": 2, "description": "Calibrates the illuminance value (percentual offset), takes into effect on next report of device.", "name": "illuminance_calibration", "property": "illuminance_calibration", "type": "numeric" }, { "access": 2, "description": "Calibrates the device_temperature value (absolute offset), takes into effect on next report of device.", "name": "device_temperature_calibration", "property": "device_temperature_calibration", "type": "numeric" }], "supports_ota": true, "vendor": "Xiaomi" }, "endpoints": { "1": { "bindings": [], "clusters": { "input": ["genBasic", "genPowerCfg", "genIdentify", "aqaraOpple"], "output": ["genIdentify", "genOta", "aqaraOpple"] }, "configured_reportings": [], "scenes": [] } }, "friendly_name": "hello/testing", "ieee_address": "0x01234567890abcde", "interview_completed": true, "interviewing": false, "manufacturer": "LUMI", "model_id": "lumi.motion.ac02", "network_address": 32549, "power_source": "Battery", "software_build_id": "0.0.0_0005", "supported": true, "type": "EndDevice" }] ]] local json = require ('dkjson') local ZBdevices = json.decode(zigbee2mqtt_bridge_devices) print('Number of devices = '..#ZBdevices..'\n') for idx=1, #ZBdevices do print ('friendly_name is '..ZBdevices[idx].friendly_name) print ('ieee_address is '..ZBdevices[idx].ieee_address..'\n') -- if not the coordinator if ZBdevices[idx].definition then print('Properties follow:') local foundMotion = false for idx2=1, #ZBdevices[idx].definition.exposes do devProperty = ZBdevices[idx].definition.exposes[idx2].property print (devProperty) if devProperty == 'occupancy' then foundMotion = true end end if foundMotion then print("\nDevice is a motion sensor") end end end return true
-
Log of switch operation:
luup.call_action:: 209.urn:upnp-org:serviceId:SwitchPower1.SetTarget luup_log:209: VirtualDevices[3.0-beta7@209](actionPower@94):actionPower(209,"1") luup_log:209: VirtualDevices[3.0-beta7@209](actionPowerInternal@47):actionPowerInternal(209,true,true) luup_log:209: VirtualDevices[3.0-beta7@209](setVar@104):setVar("urn:upnp-org:serviceId:SwitchPower1","Target","1",209) old value "0" luup.variable_set:: 209.urn:upnp-org:serviceId:SwitchPower1.Target was: 0 now: 1 #hooks:0 luup_log:209: VirtualDevices[3.0-beta7@209](sendDeviceCommand@308):sendDeviceCommand("SetPowerURL","on",209)
These are all empty:
MQTT_BrightnessValue
MQTT_PowerStatusOff
MQTT_PowerStatusOnThese are all set to: "http://"
SetPowerOffURL
SetPowerURL
SetToggleURL
SetUpdateMetersURL -
@a-lurker said in Migrating Zwave & ZigBee stuff to MQTT - guidance needed.:
These are all set to: "http://"
SetPowerOffURL
SetPowerURL
SetToggleURL
SetUpdateMetersURLSet them to skip and try again.
OK it works with them all set to skip although the documentation says blank, skip or http:// is OK
. Might be useful to initialize them to skip.
-
I'm still delving into this, so my current knowledge is a little on the short side and the following is a little generalized. However:
It seems that battery operated devices have nothing that can be controlled and their status cannot be read on demand ie no set or get possible (as indicated by an "access" sub property - see below). Presumably because they are asleep most of the time. So a battery powered Aqara motion detector publishes this only when it's triggered by motion:
"zigbee2mqtt/0x01234567890abcde" and supplying a flat json payload containing all the properties - see previous post above.
"zigbee2mqtt" begins all the topics. It can be set to something else but not sure why you would; unless you had multiple instances of zigbee2mqtt running.
0x01234567890abcde is the "ieee_address" of the device and it can be associated with a "friendly_name" of your own choice, such as "bedroom1/left_corner/motion"
So you could have topics such as:
"zigbee2mqttInstance2/bedroom1/left_corner/motion" instead of "zigbee2mqtt/0x01234567890abcde"
The bridge defines all the devices and the devices' topics:
"zigbee2mqtt/bridge/devices" with a payload, which is an array of json objects - one for each device. ieee_address and friendly_name are top level properties of each device in the array. See previous post above.
The "zigbee2mqtt/bridge/devices" topic is published when you first connect to the zigbee2mqtt server. ie you can't do a GET on it - not sure why that is. It's republished if a device joins or leaves. You can force a republish by doing: "zigbee2mqtt/bridge/request/restart" but that's a bit radical, as it does a full server restart.
Each property in the device's status report is also further described by the bridge. So a status property such as temperature has sub properties eg "access", which indicates if the property can be set or get. ie battery operated devices can't be set or get. That is to say each device has an array of property description objects.
So to set up: you would load up the array of devices from "zigbee2mqtt/bridge/devices". Then wizz through them looking for ones of interest under "definition.exposes[array]". Trying to identify what the device type is, appears to be a bit tricky. Looks like you have check the device for the presence of various property combinations or omissions.
Aqara motion detector: has "occupancy". Also has device_temperature & illuminance, which in this case is not much use, as you only get the values when motion triggers the unit.
Hue light bulb: has "light"
Hue light switch: has "action"
Gets tricky with say composite devices. But it would be good to allow some of them eg:
Ikuü Dual outlet: has "switch" with "state_left" & "state_right" but no "brightness"
Tuya five gang light switch: has: "switch" with "state_l1" to "state_l5" (but no "moving_*" properties see below).
Lots of the devices also have temperature sensors and some have energy consumption sensors.
But then you have this that helps confound identification of a device:
Dual curtain/blind controller: It has "moving_left" & "moving_right" but it also has "state_left" & "state_right" like the Ikuü Dual outlet above!
Controlling things - eg a light bulb. There are two ways:
- send a block of json as the payload
- or pure text as the payload, with words such as ON or OFF or TOGGLE
From the following link that talks about these two SET & GET:
In case you don't want to use JSON, publishing to zigbee2mqtt/[FRIENDLY_NAME]/set/state with payload ON is the same as publishing to zigbee2mqtt/[FRIENDLY_NAME]/set payload {"state": "ON"}"
Hope this is of some help.
-
@a-lurker said in Migrating Zwave & ZigBee stuff to MQTT - guidance needed.:
Hope this is of some help.
Certainly is! I'll pull something together and post it in the testing branch. Might need a bit of to and fro to get going properly.
There is a new version (v22.11.27) in the testing branch.
If you connect to the openLuup MQTT server, then it should detect the "bridge/devices" message and create some generic devices with some partial info about them in some variables. Just a basic test to show that the fundamentals work.
When the message is first detected, openLuup will create a Zigbee2MQTT bridge, a room called Zigbee and the child devices in that room. Here's what I get with the sample code you provided above (excellent starting info, by the way!) ...
-
OK it works with them all set to skip although the documentation says blank, skip or http:// is OK
. Might be useful to initialize them to skip.
@a-lurker said in Migrating Zwave & ZigBee stuff to MQTT - guidance needed.:
OK it works with them all set to skip although the documentation says blank, skip or http:// is OK
. Might be useful to initialize them to skip.
Yep, time to update docs and the lib. Thanks for letting me know.
-
All works as advertised!! Excellent work. I still don't see the last image of the variables - still see the table pointers; as per your early image. Probably the latest code hadn't been committed to GitHub, judging by your commit times & post times.
I installed the openLuup testing branch and restarted. All worked as normal. Then I restarted the zigbee2mqtt server forcing it to output the "bridge/devices" message and everything got going in openLuup - great.
This is going to provide a lot possibilities. Currently 2507 possibilities! Downside is I may have to go and buy a few more devices.
Here's the start up log with a few edits and minus the date time. Might be useful to have say "none" or "****" for UserName & Password in the log. The "My Lua ver 0.50 debug:" is some of my test code:
Thank you very much for your efforts.
openLuup.io.server:: MQTT:1883 connection from XXX.XX.XX.XX tcp{client}: 0x47e20b0 openLuup.mqtt:: CONNECT tcp{client}: 0x47e20b0 openLuup.mqtt:: ClientId: mqttjs_19f169d2 openLuup.mqtt:: WillTopic: zigbee2mqtt/bridge/state openLuup.mqtt:: WillMessage: {"state":"offline"} openLuup.mqtt:: UserName: **** openLuup.mqtt:: Password: **** openLuup.mqtt:: PUBLISH tcp{client}: 0x47e20b0 luup.zigbee2mqtt:0: Topic ignored : zigbee2mqtt/bridge/state openLuup.mqtt:: SUBSCRIBE tcp{client}: 0x47e20b0 openLuup.mqtt:: Packet Id: 0x2972 openLuup.mqtt:: Topic: zigbee2mqtt/# openLuup.mqtt:: mqttjs_19f169d2 SUBSCRIBE to zigbee2mqtt/# tcp{client}: 0x47e20b0 openLuup.mqtt:: PUBLISH tcp{client}: 0x47e20b0 luup.zigbee2mqtt:0: Topic ignored : zigbee2mqtt/bridge/info openLuup.mqtt:: PUBLISH tcp{client}: 0x47e20b0 luup.zigbee2mqtt:0: New Zigbee detected: 0x84b4dbfffecc0c6f openLuup.luup:: creating room [36] Zigbee luup.create_device:: [20001] D_GenericZigbeeDevice.xml / / D_GenericZigbeeDevice.json (GenericZigbeeDevice) luup.zigbee2mqtt:0: New Zigbee detected: 0x01234567890abcde luup.create_device:: [20002] D_GenericZigbeeDevice.xml / / D_GenericZigbeeDevice.json (GenericZigbeeDevice) openLuup.mqtt:: PUBLISH tcp{client}: 0x47e20b0 luup.zigbee2mqtt:0: Topic ignored : zigbee2mqtt/bridge/groups openLuup.mqtt:: PUBLISH tcp{client}: 0x47e20b0 luup.zigbee2mqtt:0: Topic ignored : zigbee2mqtt/bridge/extensions openLuup.mqtt:: PUBLISH tcp{client}: 0x47e20b0 luup.zigbee2mqtt:0: Topic ignored : zigbee2mqtt/bridge/logging openLuup.mqtt:: PUBLISH tcp{client}: 0x47e20b0 luup.zigbee2mqtt:0: Topic ignored : zigbee2mqtt/bridge/logging openLuup.mqtt:: PUBLISH tcp{client}: 0x47e20b0 luup_log:0: My Lua ver 0.50 debug: topic = zigbee2mqtt/0x01234567890abcde luup_log:0: My Lua ver 0.50 debug: device_temperature = 18 luup_log:0: My Lua ver 0.50 debug: illuminance = 316 luup_log:0: My Lua ver 0.50 debug: occupancy = false
-
Great! Yes, haven’t committed the latest.
So that’s enough to get you going, then?
What else is needed? Obviously device type Identification and variable updates…
Device detection would be good. Hoping to see but asking a lot:
- Occupancy sensor as per the device already shown in zigbee2mqtt/bridge payload.
- RGB & white adjustable light bulb in this link. It's pretty typical. RGB would be optional. ie some bulbs being white only tunable.
- Something like this Chinese dual outlet.. This would produce two virtual switches.
- Hue switch/buttons. and similarly something like this single button. or this one.
The above should allow a Hue hub replacement in most cases? Noting the Hue switch is pretty tricky to replicate. Seems like it's effectively a scene controller.
The Occupancy sensor also has illuminance and temperature but certainly at this stage; just need the device's primary function.
I note in the documents some of the properties are in round brackets eg:
light (state, brightness, color_temp, color_xy), effect, power_on_behavior, linkquality
I don't know but I suspect that those properties in round braces are sub properties of the property of 'light" and that would be reflected in the MQTT device definition json as such. I need to add in a few more devices to my zigbee network to be definitive.
I had a look at the ZWave JS UI . Probably not overly different form Zigbee.
-
I'm still delving into this, so my current knowledge is a little on the short side and the following is a little generalized. However:
It seems that battery operated devices have nothing that can be controlled and their status cannot be read on demand ie no set or get possible (as indicated by an "access" sub property - see below). Presumably because they are asleep most of the time. So a battery powered Aqara motion detector publishes this only when it's triggered by motion:
"zigbee2mqtt/0x01234567890abcde" and supplying a flat json payload containing all the properties - see previous post above.
"zigbee2mqtt" begins all the topics. It can be set to something else but not sure why you would; unless you had multiple instances of zigbee2mqtt running.
0x01234567890abcde is the "ieee_address" of the device and it can be associated with a "friendly_name" of your own choice, such as "bedroom1/left_corner/motion"
So you could have topics such as:
"zigbee2mqttInstance2/bedroom1/left_corner/motion" instead of "zigbee2mqtt/0x01234567890abcde"
The bridge defines all the devices and the devices' topics:
"zigbee2mqtt/bridge/devices" with a payload, which is an array of json objects - one for each device. ieee_address and friendly_name are top level properties of each device in the array. See previous post above.
The "zigbee2mqtt/bridge/devices" topic is published when you first connect to the zigbee2mqtt server. ie you can't do a GET on it - not sure why that is. It's republished if a device joins or leaves. You can force a republish by doing: "zigbee2mqtt/bridge/request/restart" but that's a bit radical, as it does a full server restart.
Each property in the device's status report is also further described by the bridge. So a status property such as temperature has sub properties eg "access", which indicates if the property can be set or get. ie battery operated devices can't be set or get. That is to say each device has an array of property description objects.
So to set up: you would load up the array of devices from "zigbee2mqtt/bridge/devices". Then wizz through them looking for ones of interest under "definition.exposes[array]". Trying to identify what the device type is, appears to be a bit tricky. Looks like you have check the device for the presence of various property combinations or omissions.
Aqara motion detector: has "occupancy". Also has device_temperature & illuminance, which in this case is not much use, as you only get the values when motion triggers the unit.
Hue light bulb: has "light"
Hue light switch: has "action"
Gets tricky with say composite devices. But it would be good to allow some of them eg:
Ikuü Dual outlet: has "switch" with "state_left" & "state_right" but no "brightness"
Tuya five gang light switch: has: "switch" with "state_l1" to "state_l5" (but no "moving_*" properties see below).
Lots of the devices also have temperature sensors and some have energy consumption sensors.
But then you have this that helps confound identification of a device:
Dual curtain/blind controller: It has "moving_left" & "moving_right" but it also has "state_left" & "state_right" like the Ikuü Dual outlet above!
Controlling things - eg a light bulb. There are two ways:
- send a block of json as the payload
- or pure text as the payload, with words such as ON or OFF or TOGGLE
From the following link that talks about these two SET & GET:
In case you don't want to use JSON, publishing to zigbee2mqtt/[FRIENDLY_NAME]/set/state with payload ON is the same as publishing to zigbee2mqtt/[FRIENDLY_NAME]/set payload {"state": "ON"}"
Hope this is of some help.
@a-lurker said in Migrating Zwave & ZigBee stuff to MQTT - guidance needed.:
0x01234567890abcde is the "ieee_address" of the device and it can be associated with a "friendly_name" of your own choice, such as "bedroom1/left_corner/motion"
This would seem to be a somewhat ambiguous convention, since MQTT topics are also subdivided with the '/' symbol. Especially since these can then be suffixed...
- zigbee2mqtt/FRIENDLY_NAME/availability
- zigbee2mqtt/FRIENDLY_NAME/set
- zigbee2mqtt/FRIENDLY_NAME/get
...and so on.
I suppose we have to go with it.
-
New testing version v22.11.28 with the updated variable listing and also (perhaps) device identification for:
- lights (displayed as switch)
- switches (displayed as scene controller)
- occupancy (displayed as motion sensor)
- generic
The identified devices should have some of their standard serviceIds and variables.
Can I get a more complete bridge/devices JSON to try?
-
New testing version v22.11.28 with the updated variable listing and also (perhaps) device identification for:
- lights (displayed as switch)
- switches (displayed as scene controller)
- occupancy (displayed as motion sensor)
- generic
The identified devices should have some of their standard serviceIds and variables.
Can I get a more complete bridge/devices JSON to try?
@akbooer
This is all coming along nicely - thanks.I've set up a Hue color/tuneable white light bulb as it's probably the most complicated of the lights. This is what it replies with when you do a "zigbee2mqtt/0xaa55aa55aa55aa55/set" with payload {"state": "TOGGLE"}
{ "color_mode": "xy", "linkquality": 255, "state": "ON" }
Not sure if the "color_mode" is actually changeable. ie whether it's always XY color (CIE 1931 color space) or whether it can be RGB style. I note the Ikea bulbs just seem to be XY space.
If I change a color in the zigbee2MQTT web page it sends (not sure about all the back slashes):
'zigbee2mqtt/0xaa55aa55aa55aa55', payload '{\"color\":{\"x\":0.4339,\"y\":0.5008},\"color_mode\":\"xy\",\"linkquality\":255,\"state\":\"ON\"}'"}
this is the reply from the bulb.
{ "color": { "x": 0.6942, "y": 0.2963 }, "color_mode": "xy", "linkquality": 255, "state": "ON" }
Here's "zigbee2mqtt/bridge/devices" for the light bulb only. You see there is a further lower level "features" below "exposes" ie "description,exposes,features". I've just cut & pasted the light bulb json description part below. It's just concatenated with the coordinator and the occupancy sensor, that you have already been using. I hope this is not getting unduly complex.
The coordinator and the occupancy sensor are listed here in the json and this is the light bulb: ... ,{ "date_code": "20210331", "definition": { "description": "Hue white and color ambiance E26/E27/E14", "exposes": [ { "features": [ { "access": 7, "description": "On/off state of this light", "name": "state", "property": "state", "type": "binary", "value_off": "OFF", "value_on": "ON", "value_toggle": "TOGGLE" }, { "access": 7, "description": "Brightness of this light", "name": "brightness", "property": "brightness", "type": "numeric", "value_max": 254, "value_min": 0 }, { "access": 7, "description": "Color temperature of this light", "name": "color_temp", "presets": [ { "description": "Coolest temperature supported", "name": "coolest", "value": 153 }, { "description": "Cool temperature (250 mireds / 4000 Kelvin)", "name": "cool", "value": 250 }, { "description": "Neutral temperature (370 mireds / 2700 Kelvin)", "name": "neutral", "value": 370 }, { "description": "Warm temperature (454 mireds / 2200 Kelvin)", "name": "warm", "value": 454 }, { "description": "Warmest temperature supported", "name": "warmest", "value": 500 } ], "property": "color_temp", "type": "numeric", "unit": "mired", "value_max": 500, "value_min": 153 }, { "access": 7, "description": "Color temperature after cold power on of this light", "name": "color_temp_startup", "presets": [ { "description": "Coolest temperature supported", "name": "coolest", "value": 153 }, { "description": "Cool temperature (250 mireds / 4000 Kelvin)", "name": "cool", "value": 250 }, { "description": "Neutral temperature (370 mireds / 2700 Kelvin)", "name": "neutral", "value": 370 }, { "description": "Warm temperature (454 mireds / 2200 Kelvin)", "name": "warm", "value": 454 }, { "description": "Warmest temperature supported", "name": "warmest", "value": 500 }, { "description": "Restore previous color_temp on cold power on", "name": "previous", "value": 65535 } ], "property": "color_temp_startup", "type": "numeric", "unit": "mired", "value_max": 500, "value_min": 153 }, { "description": "Color of this light in the CIE 1931 color space (x/y)", "features": [ { "access": 7, "name": "x", "property": "x", "type": "numeric" }, { "access": 7, "name": "y", "property": "y", "type": "numeric" } ], "name": "color_xy", "property": "color", "type": "composite" }, { "description": "Color of this light expressed as hue/saturation", "features": [ { "access": 7, "name": "hue", "property": "hue", "type": "numeric" }, { "access": 7, "name": "saturation", "property": "saturation", "type": "numeric" } ], "name": "color_hs", "property": "color", "type": "composite" } ], "type": "light" }, { "access": 2, "description": "Triggers an effect on the light (e.g. make light blink for a few seconds)", "name": "effect", "property": "effect", "type": "enum", "values": [ "blink", "breathe", "okay", "channel_change", "finish_effect", "stop_effect" ] }, { "access": 1, "description": "Link quality (signal strength)", "name": "linkquality", "property": "linkquality", "type": "numeric", "unit": "lqi", "value_max": 255, "value_min": 0 } ], "model": "9290012573A", "options": [ { "access": 2, "description": "Controls the transition time (in seconds) of on/off, brightness, color temperature (if applicable) and color (if applicable) changes. Defaults to `0` (no transition).", "name": "transition", "property": "transition", "type": "numeric", "value_min": 0 }, { "access": 2, "description": "When enabled colors will be synced, e.g. if the light supports both color x/y and color temperature a conversion from color x/y to color temperature will be done when setting the x/y color (default true).", "name": "color_sync", "property": "color_sync", "type": "binary", "value_off": false, "value_on": true } ], "supports_ota": true, "vendor": "Philips" }, "endpoints": { "11": { "bindings": [], "clusters": { "input": [ "genBasic", "genIdentify", "genGroups", "genScenes", "genOnOff", "genLevelCtrl", "touchlink", "manuSpecificPhilips2", "lightingColorCtrl", "manuSpecificUbisysDimmerSetup" ], "output": [ "genOta" ] }, "configured_reportings": [], "scenes": [] }, "242": { "bindings": [], "clusters": { "input": [ "greenPower" ], "output": [ "greenPower" ] }, "configured_reportings": [], "scenes": [] } }, "friendly_name": "0xaa55aa55aa55aa55", "ieee_address": "0xaa55aa55aa55aa55", "interview_completed": true, "interviewing": false, "manufacturer": "Signify Netherlands B.V.", "model_id": "LCT010", "network_address": 34172, "power_source": "Mains (single phase)", "software_build_id": "1.88.1", "supported": true, "type": "Router" }
zigbee2mqtt has individual device set up/review pages. You can see here that all the colors can be set up for example. The tooltip shows underlying stuff. In this case for color_hs.
-
New testing version v22.11.29 should identify (some) lights, and it's plausible that the on/off control will work (the dimmer doesn't, and the internal state doesn't yet get updated.) Would be interested in the log when trying this.
Making great progress. The light is recognized and can be turned on & off. Also if I change the color with the zigbee2mqtt web page and then turn the light off and on in AltUI the color is retained.
Here is one observed issue: I have in my own code with a subscription to the occupancy sensor and using that to set a switch in VirtualHTTP. Has been working and has now stopped working. You see the code here - line 415.. Looks like something in openLuup has stopped that functioning? See error in log below:
luup_log:209: VirtualDevices[3.0-beta7@209](initializeMqtt@421):initializeMqtt(209,{ PowerStatusOff={ Value="0", Service="urn:upnp-org:serviceId:SwitchPower1", Variable="Status" }, BrightnessValue={ Variable="LoadLevelStatus", Service="urn:upnp-org:serviceId:Dimming1" }, PowerStatusOn={ Value="1", Service="urn:upnp-org:serviceId:SwitchPower1", Variable="Status" } }) - openLuup: true luup_log:209: VirtualDevices[3.0-beta7@209](subscribeToMqtt@414):subscribeToMqtt(209,nil,{ deviceID=209, opts={ Value="0", Service="urn:upnp-org:serviceId:SwitchPower1", Variable="Status" } }) openLuup.context_switch:: ERROR: [dev #209] ./L_VirtualLibrary.lua:415: attempt to concatenate field 'topic' (a nil value) openLuup.scheduler:: job aborted : ./L_VirtualLibrary.lua:415: attempt to concatenate field 'topic' (a nil value) openLuup.scheduler:: [211] Zigbee2MQTT device startup luup.set_failure:: status = 0 luup.variable_set:: 211.urn:micasaverde-com:serviceId:HaDevice1.CommFailure was: 0 now: 0 #hooks:0 luup.variable_set:: 211.urn:micasaverde-com:serviceId:HaDevice1.CommFailureTime was: 0 now: 0 #hooks:0 openLuup.scheduler:: [211] Zigbee2MQTT device startup completed: status=true, msg=OK, name=Zigbee2MQTTBridge
Start up of openLuup and then connecting to zigbee2mqtt server follows:
openLuup.mqtt:: CONNECT tcp{client}: 0x2d4a968 openLuup.mqtt:: ClientId: mqttjs_2080d9ee openLuup.mqtt:: WillTopic: zigbee2mqtt/bridge/state openLuup.mqtt:: WillMessage: {"state":"offline"} openLuup.mqtt:: UserName: **** openLuup.mqtt:: Password: **** openLuup.mqtt:: CONNECT tcp{client}: 0x25141a0 openLuup.mqtt:: ClientId: mqtt-explorer-27e89756 openLuup.mqtt:: WillTopic: openLuup.mqtt:: WillMessage: openLuup.mqtt:: UserName: **** openLuup.mqtt:: Password: **** openLuup.mqtt:: SUBSCRIBE tcp{client}: 0x25141a0 openLuup.mqtt:: Packet Id: 0xa5b3 openLuup.mqtt:: Topic: # openLuup.mqtt:: mqtt-explorer-27e89756 SUBSCRIBE to # tcp{client}: 0x25141a0 openLuup.mqtt:: SUBSCRIBE tcp{client}: 0x25141a0 openLuup.mqtt:: Packet Id: 0xa5b4 openLuup.mqtt:: Topic: $SYS/# openLuup.mqtt:: mqtt-explorer-27e89756 SUBSCRIBE to $SYS/# tcp{client}: 0x25141a0 openLuup.mqtt:: SUBSCRIBE tcp{client}: 0x2d4a968 openLuup.mqtt:: Packet Id: 0x6437 openLuup.mqtt:: Topic: zigbee2mqtt/# openLuup.mqtt:: mqttjs_2080d9ee SUBSCRIBE to zigbee2mqtt/# tcp{client}: 0x2d4a968 openLuup.mqtt:: PUBLISH tcp{client}: 0x2d4a968 luup.zigbee2mqtt:0: Topic ignored : bridge/logging openLuup.mqtt:: PUBLISH tcp{client}: 0x2d4a968 luup.zigbee2mqtt:0: Topic ignored : bridge/logging openLuup.mqtt:: PUBLISH tcp{client}: 0x2d4a968 luup.zigbee2mqtt:0: Topic ignored : bridge/state openLuup.server:: request completed (871430 bytes, 55 chunks, 630 ms) tcp{client}: 0x29113e0 openLuup.server:: GET /data_request?id=user_data&output_format=json&DataVersion=768995292&_=1669768933474 HTTP/1.1 tcp{client}: 0x29113e0 openLuup.server:: request completed (1679360 bytes, 105 chunks, 1182 ms) tcp{client}: 0x29113e0
Restart of zigbee2mqtt server to force devices to be announced by the zigbee2mqtt server. You see the zigbee devices being detected and set up by openLuup.
openLuup.mqtt:: CONNECT tcp{client}: 0x2ac56b0 openLuup.mqtt:: ClientId: mqttjs_689eab85 openLuup.mqtt:: WillTopic: zigbee2mqtt/bridge/state openLuup.mqtt:: WillMessage: {"state":"offline"} openLuup.mqtt:: UserName: **** openLuup.mqtt:: Password: **** openLuup.mqtt:: PUBLISH tcp{client}: 0x2ac56b0 luup.zigbee2mqtt:0: Topic ignored : bridge/state openLuup.mqtt:: SUBSCRIBE tcp{client}: 0x2ac56b0 openLuup.mqtt:: Packet Id: 0x8099 openLuup.mqtt:: Topic: zigbee2mqtt/# openLuup.mqtt:: mqttjs_689eab85 SUBSCRIBE to zigbee2mqtt/# tcp{client}: 0x2ac56b0 openLuup.mqtt:: PUBLISH tcp{client}: 0x2ac56b0 luup.zigbee2mqtt:0: Topic ignored : bridge/info openLuup.mqtt:: PUBLISH tcp{client}: 0x2ac56b0 luup.zigbee2mqtt:0: New Zigbee detected: 0xRedacted1 luup.create_device:: [20001] D_GenericZigbeeDevice.xml / / D_GenericZigbeeDevice.json (GenericZigbeeDevice) luup.zigbee2mqtt:0: New Zigbee detected: 0xRedacted2 luup.create_device:: [20002] D_MotionSensor1.xml / / D_MotionSensor1.json (urn:schemas-micasaverde-com:device:MotionSensor:1) luup.zigbee2mqtt:0: New Zigbee detected: 0xRedacted3 luup.create_device:: [20003] D_DimmableLight1.xml / / D_DimmableLight1.json (urn:schemas-upnp-org:device:DimmableLight:1) openLuup.server:: request completed (16218 bytes, 2 chunks, 4645 ms) tcp{client}: 0x2456b18 openLuup.mqtt:: PUBLISH tcp{client}: 0x2ac56b0 luup.zigbee2mqtt:0: Topic ignored : bridge/groups openLuup.mqtt:: PUBLISH tcp{client}: 0x2ac56b0 luup.zigbee2mqtt:0: Topic ignored : bridge/extensions openLuup.mqtt:: PUBLISH tcp{client}: 0x2ac56b0 luup.zigbee2mqtt:0: Topic ignored : bridge/logging openLuup.mqtt:: PUBLISH tcp{client}: 0x2ac56b0 luup.zigbee2mqtt:0: Topic ignored : bridge/logging openLuup.mqtt:: PUBLISH tcp{client}: 0x2ac56b0
Here is the light being turned on & off noting that it actually does go on & off but I'm unclear about all the "Topic ignored". eg "0x_redacted_light_bulb/set/state"
openLuup.server:: GET /data_request?id=action&output_format=json&DeviceNum=20003&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1 HTTP/1.1 tcp{client}: 0x28ba940 luup.call_action:: 20003.urn:upnp-org:serviceId:SwitchPower1.SetTarget luup.call_action:: action will be handled by parent: 211 luup.zigbee2mqtt:0: Topic ignored : 0x_redacted_light_bulb/set/state openLuup.server:: request completed (35 bytes, 1 chunks, 16 ms) tcp{client}: 0x28ba940 luup.watch_callback:: 12.urn:a-lurker-com:serviceId:Paradox_IP150_wps1.Zone_018 called [3]variableWatchCallback() function: 0x156a978 openLuup.mqtt:: PUBLISH tcp{client}: 0x2b88a08 luup.zigbee2mqtt:0: Topic ignored : bridge/logging openLuup.mqtt:: PUBLISH tcp{client}: 0x2b88a08 luup.zigbee2mqtt:0: Topic ignored : 0x_redacted_light_bulb luup.variable_set:: 10021.urn:micasaverde-com:serviceId:ZWaveNetwork1.LastPollSuccess was: 1669791951 now: 1669792831 #hooks:0 openLuup.server:: GET /data_request?id=lu_status2&output_format=json&DataVersion=769116357&Timeout=60&MinimumDelay=1500&_=1669769862259 HTTP/1.1 tcp{client}: 0x1f620a0 openLuup.server:: request completed (7375 bytes, 1 chunks, 120 ms) tcp{client}: 0x1f620a0 openLuup.server:: GET /data_request?id=lu_status2&output_format=json&DataVersion=769116361&Timeout=60&MinimumDelay=1500&_=1669769862260 HTTP/1.1 tcp{client}: 0x1f620a0 openLuup.server:: GET /data_request?id=action&output_format=json&DeviceNum=20003&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1 HTTP/1.1 tcp{client}: 0x28ba940 luup.call_action:: 20003.urn:upnp-org:serviceId:SwitchPower1.SetTarget luup.call_action:: action will be handled by parent: 211 luup.zigbee2mqtt:0: Topic ignored : 0x_redacted_light_bulb/set/state openLuup.server:: request completed (35 bytes, 1 chunks, 4 ms) tcp{client}: 0x28ba940 openLuup.mqtt:: PUBLISH tcp{client}: 0x2b88a08 luup.zigbee2mqtt:0: Topic ignored : bridge/logging openLuup.mqtt:: PUBLISH tcp{client}: 0x2b88a08 luup.zigbee2mqtt:0: Topic ignored : 0x_redacted_light_bulb openLuup.server:: request completed (6642 bytes, 1 chunks, 3272 ms) tcp{client}: 0x1f620a0 openLuup.server:: GET /data_request?id=lu_status2&output_format=json&DataVersion=769116362&Timeout=60&MinimumDelay=1500&_=1669769862261 HTTP/1.1 tcp{client}: 0x1f620a0 openLuup.server:: GET /data_request?id=action&output_format=json&DeviceNum=20003&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0 HTTP/1.1 tcp{client}: 0x28ba940 luup.call_action:: 20003.urn:upnp-org:serviceId:SwitchPower1.SetTarget luup.call_action:: action will be handled by parent: 211 luup.zigbee2mqtt:0: Topic ignored : 0x_redacted_light_bulb/set/state openLuup.server:: request completed (35 bytes, 1 chunks, 4 ms) tcp{client}: 0x28ba940 openLuup.mqtt:: PUBLISH tcp{client}: 0x2b88a08 luup.zigbee2mqtt:0: Topic ignored : bridge/logging openLuup.mqtt:: PUBLISH tcp{client}: 0x2b88a08 luup.zigbee2mqtt:0: Topic ignored : 0x_redacted_light_bulb openLuup.server:: request completed (6870 bytes, 1 chunks, 4973 ms) tcp{client}: 0x1f620a0
Here is the light being turned on & off being reported by zigbee2mqtt in the linux terminal.
Zigbee2MQTT:info 2022-11-30 18:20:30: MQTT publish: topic 'zigbee2mqtt/0x_redacted_light_bulb', payload '{"brightness":42,"color":{"x":0.5267,"y":0.4133},"color_mode":"color_temp","color_temp":500,"linkquality":224,"state":"ON"}' Zigbee2MQTT:info 2022-11-30 18:20:35: MQTT publish: topic 'zigbee2mqtt/0x_redacted_light_bulb', payload '{"brightness":42,"color":{"x":0.5267,"y":0.4133},"color_mode":"color_temp","color_temp":500,"linkquality":232,"state":"ON"}' Zigbee2MQTT:info 2022-11-30 18:20:40: MQTT publish: topic 'zigbee2mqtt/0x_redacted_light_bulb', payload '{"brightness":42,"color":{"x":0.5267,"y":0.4133},"color_mode":"color_temp","color_temp":500,"linkquality":224,"state":"OFF"}' Zigbee2MQTT:info 2022-11-30 18:26:51: MQTT publish: topic 'zigbee2mqtt/0x_redacted_occupancy_sensor', payload '{"battery":100,"detection_interval":30,"device_temperature":19,"illuminance":77,"linkquality":132,"motion_sensitivity":"medium","occupancy":false,"power_outage_count":0,"trigger_indicator":false,"voltage":3189}'