Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor logic for setting light state. #2553

Merged
merged 32 commits into from
Apr 5, 2020
Merged

Refactor logic for setting light state. #2553

merged 32 commits into from
Apr 5, 2020

Conversation

ebaauw
Copy link
Collaborator

@ebaauw ebaauw commented Mar 8, 2020

See #2475.

I've tested this on a Hue bulb and on a GLEDOPTO controller. The latter doesn't turn on on Move to Level (with On/Off), but it does set the level (even while the light is off). The subsequent On then turns the light on at level 2, causing almost the same behaviour as Hue lights. I would appreciate people testing this on other lights, notably IKEA.

For discussion on the functionality, please see #2475.

ebaauw added 13 commits March 8, 2020 12:24
- Don't replace `TaskSetLevel` tasks.  New `state.on` / `state.bri` logic (see #2475) sends _Move to Level with On/Off_ for level 2 and transition time 0, followed by _On_, followed by _Move to Level_ for given brightness and transitiontime.
- Fix misleading debug message when replacing task.
Fix `addTaskSetColorLoop()`, see #2475.
- Set `lightNode` attributes for colorloop only here;
- Set colormode to `xy` (instead of `hs`).
Light sets colormode to `hs` when starting the colorloop.
Refactor `setLightState()`, see #2475.
Refactor `setLightState()`, see #2475.
Implement _Off with Effect_ command.
- Send _Off with Effect_ to turn off Hue lights;
- Clear active colorloop when light is turned off.  Hue lights do so automatically, but others (e.g. GLEDOPTO) don't.
Error message when trying to modify colour attribute while colorloop is active.
@manup
Copy link
Member

manup commented Mar 10, 2020

Thanks for the PR, I like it, looks cleaner and easier to understand than the former version. I'll test it in my setup with various IKEA lights. Since it's quite a large diff I'll give it some days for testing and not merge it yet in 2.05.76, but if everything works well in 2.05.77 in about a week.

@ebaauw
Copy link
Collaborator Author

ebaauw commented Mar 10, 2020

@manup, That’s cool, just hope I can keep the PR current with all the other changes happening. Looking forward to your feedback. If this works out, I would want to do something similar for group action and for sensor config and (for CLIP sensors) state.

There's a number of related issues, I'd really like your input on.

  1. I see a huge opportunity in simplifying the code even further by expanding LightNode to provide getter/setter methods for all ResourceItem values and issue the Event (only) from there. Not only will this ensure no event will be forgotten, it also eliminates a load of code duplication. A single line could replace: checking for a valid value, getting the item, checking that it’s not null, setting the value, checking whether it’s changed, issuing the event, updating the etag, setting the save database flag. Maybe it will even allow for de_web_plugin.cpp to be displayed in full on GitHub...

  2. The Hue bridge only ever returns http status 200 on api calls, and returns api errors solely in the response body. It will report other http status codes for non-api resources. This makes for simpler client logic (no need to check the response body on other status codes), and allows for mixed success/error responses. E.g. when sending {"on": true, "bri": "nonsense"} the Hue bridge still switches the light on. I think the bridge actually sends the ZigBee command when it reports a device is off error. Need some more sniffing.

  3. The sending Move to Level (with On/Off), On, Move to Level works, but sometimes I see a slight tinkle in the light. I think we'd want to send either Move to Level (with On/Off) or On, but not both. That would mean whitelisting the lights that actually turn on on Move to Level with (On/Off), just like whitelisting the Hue lights for Off with Effect. Without light capabilities, this becomes unmanageable. Again, LightNode seems the logical place to implement these.

  4. As mentioned in the issue, I'd like to use different attributes for Window covering device and Warning device resources. We might want to implement this change, before adding support in Phoscon. One of the reasons to want this change is to support changing the state of these devices through groups.

Add message that `colormode` is not modifyable instead of not available.
Fix update ZCL value debug message
Samsum SmartThings multipupose sensors, see #1848:
- Don't configure event reporting for orientation attributes (as these are already sent in the _IAS Zone State Notification_ command);
- Set periodic reporting of these to every 5 minutes, in line with temperature and open/close reporting for the same sensor.
Samsumg SmartThings multipurpose sensor, see #1848:
- Add `config.duration`.
Samsumg SmartThings multipurpose sensor, see #1848:
- Add `config.duration`.
- Refactor logic  to update `state.vibration`.
Fix setting `state.on` for Aqara B1, see #1654.
Improve handling of scene states (PUT `/groups/#/scenes/#/lights/#/state`), see #2507:
- Handle `ct` in scene light state;
- Set colormode for scene light state.
Improve handling of scene states (PUT `/groups/#/scenes/#/lights/#/state`), see #2507:
- Bug fix: malformed packet on setting scene light state;
- iCasa filament light stores `ct` in _Enhanced Hue_;
- Add `lastannounced` and `lastseen` attributes, see 2590;
- Store `state.lastupdated` in msec resolution, see #1687.
Add `lastannounced` and `lastseen` attributes, see 2590.
- Implement `lastseen` attribute (in msec resolution), see 2590;
- Bug fix: `state.ontime` not honoured for sirens (warning devices);
- Include light `state` in light added event, see  #2625.
- Show `state.lastupdated` in msec resolution, see #1687;
- Implement `lastsceen`.
@ebaauw
Copy link
Collaborator Author

ebaauw commented Apr 3, 2020

@manup, how are the tests proceeding?

I haven't yet addressed any of the points 1-4 above. Would really appreciate your input.
I do have a load of other enhancements and bug fixes:

Set `rx()` for ZGPSwitch `/sensors`, so `lastseen` is updated.
- Handle restore of `state.lastupdated` with both second and  milliseccond resolution.
@manup
Copy link
Member

manup commented Apr 5, 2020

Wow that are heaps of improvements, thanks a lot!

I think the PR is ready for merging if you're ok with that?
So far I've tested it with:

  • IKEA CWS E27 color bulb
  • IKEA GU10 color temperature (1. Gen)
  • IKEA E14 color temperature
  • OSRAM GU10 color temperature
  • OSRAM plug
  • OSRAM E27 RGB color
  • FLS-PP lp RGBW ballast

Works like a charm here, I've tested the on/off, brightness, color and color temperature capabilities.

  1. I see a huge opportunity in simplifying the code even further by expanding LightNode to provide getter/setter methods for all ResourceItem values and issue the Event (only) from there. Not only will this ensure no event will be forgotten, it also eliminates a load of code duplication. A single line could replace: checking for a valid value, getting the item, checking that it’s not null, setting the value, checking whether it’s changed, issuing the event, updating the etag, setting the save database flag. Maybe it will even allow for de_web_plugin.cpp to be displayed in full on GitHub...

Indeed that, I agree it will simplify the code by putting the repeating details of the ResourceItems behind a higher level wrapper. It might not be possible for all places but the wast majority can be simplified.

Since this is a huge refactor it might be good to coordinate this with other pull requests, perhaps a short code freeze until it's done. So that other PRs can build on top of it. Or as alternative it could be done incrementally?

  1. The Hue bridge only ever returns http status 200 on api calls, and returns api errors solely in the response body. It will report other http status codes for non-api resources. This makes for simpler client logic (no need to check the response body on other status codes), and allows for mixed success/error responses. E.g. when sending {"on": true, "bri": "nonsense"} the Hue bridge still switches the light on. I think the bridge actually sends the ZigBee command when it reports a device is off error. Need some more sniffing.

I'm open to this but it need to be checked with the various API-Clients out there to not break them by switching over to 200 Responses. In case of the Phoscon App it would already work but I'm not sure about others.

  1. The sending Move to Level (with On/Off), On, Move to Level works, but sometimes I see a slight tinkle in the light. I think we'd want to send either Move to Level (with On/Off) or On, but not both. That would mean whitelisting the lights that actually turn on on Move to Level with (On/Off), just like whitelisting the Hue lights for Off with Effect. Without light capabilities, this becomes unmanageable. Again, LightNode seems the logical place to implement these.

Agree, I also think when building the capabilities JSON file(s) (?) they can be used by both the v1 and v2 API. This might actually a good first step to figure out how the new lights API should be modeled.

  1. As mentioned in the issue, I'd like to use different attributes for Window covering device and Warning device resources. We might want to implement this change, before adding support in Phoscon. One of the reasons to want this change is to support changing the state of these devices
    through groups.

Separating the attributes makes sense, currently @YKO-de is building the window covering support in the Phoscon App which internally already works on the current API. Since the API layer is very thin it should be easy to adjust it. I'm not sure about the other API clients like Home Assisten and similar. So the change should be coordinated with the maintainers to not cause any surprises :)

@ebaauw
Copy link
Collaborator Author

ebaauw commented Apr 5, 2020

I think the PR is ready for merging if you're ok with that?

Yes, please. I fear it's getting way too big.

Ad 1. I tried to implement setter/getter methods on RestNodeBase and it's subclasses (to issue events for lastseen from rx()), but wasn't able to issue enqueueEvent() from there. I think RestNodeBase needs a DeRestPluginPrivate parent property. Does that seem the right approach to you?

Ad 2. This would actually simplify Homebridge Hue and other clients that also support the Hue bridge. I wouldn't know all clients, however.

Ad 3. Or at least what capabilities we need to record.

Ad 4. We could start by adding the new attributes next to the existing ones, who would be deprecated. Next, implement the new attributes on /groups action, so the non-light devices can be controlled from groups through the API. Eventually, we could remove the deprecated existing attributes.

@manup manup merged commit 2e86a73 into dresden-elektronik:master Apr 5, 2020
@tubalainen
Copy link

tubalainen commented May 23, 2020

Dear @ebaauw and @manup .. transitiontime stopped working with .76.
Is this a bug or a "breaking change" and Home Assistant (and others) are to adapt/change accordingly?

For reference, please see 2791

@ebaauw
Copy link
Collaborator Author

ebaauw commented May 23, 2020

@tubalainen, I still see normal transition times when PUTting the light state through the API. With default transition time, as well as when specifying transitiontime explicitly. What API calls are you sending?

@tubalainen
Copy link

tubalainen commented May 23, 2020

Thanks for asking @ebaauw .

On/Off works like expected - but with "transition" declared in my automation it does not compute fully with .76 - it just turns off with the default transitiontime (1-2 seconds ish).

I use this automation in Home Assistant (dim from 100% down to 0 (off) in 30 seconds):

- id: 'kontoret_master_off'
  alias: Kontoret master fjärr off
  initial_state: 'on'
  trigger:
  - event_data:
      id: remote_master_kontor
      event: 2002
    platform: event
    event_type: deconz_event
  condition: []
  action:
#  - data:
#      entity_id: switch.circadian_lighting_lampor_kontoret_fargtemp_circadian
#    service: switch.turn_off
#  - delay: 00:00:02
  - data:
      entity_id:
        - light.lampa_taket_kontoret
        - light.lampa_ikea_rgb
        - light.ledstrip_skrivbordet
        - light.lampa_kontoret_bakom_monitorn
        - light.takpanel_kontor
        - light.lampa_kistan
        - light.led_panel_jormlien
      transition: 30
    service: light.turn_off

The following outcome in the debug log from Home Assistant with version .76 (when the button is being pushed) - the lights turns off (with a default transition of 1-2 sec ish?):

2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"24","r":"sensors","state":{"buttonevent":2002,"lastupdated":"2020-05-23T13:50:40.110"},"t":"event","uniqueid":"00:0d:6f:ff:fe:b1:e0:65-01-1000"}
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.gateway] Sending "put" "{'on': False, 'bri': 0, 'transitiontime': 300}" to "172.17.0.2 /lights/21/state"
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.gateway] HTTP request response: [{'success': {'/lights/21/state/bri': 0}},
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.gateway] Sending "put" "{'on': False, 'bri': 0, 'transitiontime': 300}" to "172.17.0.2 /lights/14/state"
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"21","r":"lights","state":{"alert":null,"bri":0,"colormode":"ct","ct":440,"on":false,"reachable":true},"t":"event","uniqueid":"00:0d:6f:ff:fe:55:7e:77-01"}
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.gateway] HTTP request response: [{'success': {'/lights/14/state/bri': 0}},
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"14","r":"lights","state":{"alert":null,"bri":0,"colormode":"ct","ct":370,"on":false,"reachable":true},"t":"event","uniqueid":"90:fd:9f:ff:fe:89:75:a9-01"}
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.gateway] Sending "put" "{'on': False, 'bri': 0, 'transitiontime': 300}" to "172.17.0.2 /lights/5/state"
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.gateway] HTTP request response: [{'success': {'/lights/5/state/bri': 0}},
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"5","r":"lights","state":{"alert":null,"bri":0,"colormode":"ct","ct":366,"on":true,"reachable":true},"t":"event","uniqueid":"00:17:88:01:02:04:b8:08-0b"}
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.gateway] Sending "put" "{'on': False, 'bri': 0, 'transitiontime': 300}" to "172.17.0.2 /lights/20/state"
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.gateway] HTTP request response: [{'success': {'/lights/20/state/bri': 0}},
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"20","r":"lights","state":{"alert":null,"bri":0,"colormode":"xy","hue":0,"on":false,"reachable":true,"sat":0,"xy":[0.41,0.342]},"t":"event","uniqueid":"00:0d:6f:ff:fe:1f:1c:15-01"}
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.gateway] Sending "put" "{'on': False, 'bri': 0, 'transitiontime': 300}" to "172.17.0.2 /lights/18/state"
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.gateway] HTTP request response: [{'success': {'/lights/18/state/bri': 0}},
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"18","r":"lights","state":{"alert":null,"bri":0,"colormode":"ct","ct":454,"on":false,"reachable":true},"t":"event","uniqueid":"90:fd:9f:ff:fe:1f:c0:16-01"}
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.gateway] Sending "put" "{'on': False, 'bri': 0, 'transitiontime': 300}" to "172.17.0.2 /lights/16/state"
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.gateway] HTTP request response: [{'success': {'/lights/16/state/bri': 0}},
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"16","r":"lights","state":{"alert":null,"bri":0,"colormode":"ct","ct":370,"on":false,"reachable":true},"t":"event","uniqueid":"00:0b:57:ff:fe:dd:3d:4c-01"}
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"14","r":"lights","state":{"alert":null,"bri":251,"colormode":"ct","ct":370,"on":false,"reachable":true},"t":"event","uniqueid":"90:fd:9f:ff:fe:89:75:a9-01"}
2020-05-23 15:50:40 DEBUG (MainThread) [pydeconz.websocket] {"config":{"alert":"none","battery":87,"delay":60,"duration":60,"group":"41217","on":true,"reachable":true},"e":"changed","id":"30","r":"sensors","t":"event","uniqueid":"90:fd:9f:ff:fe:8c:81:53-01-0006"}

And here is the exact same log from Home Assistant using .75 - the lights dim/transitions to off state 30 seconds later:

2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"24","r":"sensors","state":{"buttonevent":2002,"lastupdated":"2020-05-23T13:56:36"},"t":"event","uniqueid":"00:0d:6f:ff:fe:b1:e0:65-01-1000"}
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.gateway] Sending "put" "{'on': False, 'bri': 0, 'transitiontime': 300}" to "172.17.0.2 /lights/16/state"
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.gateway] HTTP request response: [{'success': {'/lights/16/state/on': False}},
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.gateway] Sending "put" "{'on': False, 'bri': 0, 'transitiontime': 300}" to "172.17.0.2 /lights/20/state"
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"16","r":"lights","state":{"alert":null,"bri":0,"colormode":"ct","ct":370,"on":false,"reachable":true},"t":"event","uniqueid":"00:0b:57:ff:fe:dd:3d:4c-01"}
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.gateway] HTTP request response: [{'success': {'/lights/20/state/on': False}},
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"20","r":"lights","state":{"alert":null,"bri":0,"colormode":"xy","hue":0,"on":false,"reachable":true,"sat":0,"xy":[0.41,0.342]},"t":"event","uniqueid":"00:0d:6f:ff:fe:1f:1c:15-01"}
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.gateway] Sending "put" "{'on': False, 'bri': 0, 'transitiontime': 300}" to "172.17.0.2 /lights/5/state"
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.gateway] HTTP request response: [{'success': {'/lights/5/state/on': False}},
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"5","r":"lights","state":{"alert":null,"bri":0,"colormode":"ct","ct":366,"on":false,"reachable":true},"t":"event","uniqueid":"00:17:88:01:02:04:b8:08-0b"}
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.gateway] Sending "put" "{'on': False, 'bri': 0, 'transitiontime': 300}" to "172.17.0.2 /lights/14/state"
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.gateway] HTTP request response: [{'success': {'/lights/14/state/on': False}},
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"14","r":"lights","state":{"alert":null,"bri":0,"colormode":"ct","ct":370,"on":false,"reachable":true},"t":"event","uniqueid":"90:fd:9f:ff:fe:89:75:a9-01"}
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.gateway] Sending "put" "{'on': False, 'bri': 0, 'transitiontime': 300}" to "172.17.0.2 /lights/18/state"
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.gateway] HTTP request response: [{'success': {'/lights/18/state/on': False}},
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"18","r":"lights","state":{"alert":null,"bri":0,"colormode":"ct","ct":454,"on":false,"reachable":true},"t":"event","uniqueid":"90:fd:9f:ff:fe:1f:c0:16-01"}
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.gateway] Sending "put" "{'on': False, 'bri': 0, 'transitiontime': 300}" to "172.17.0.2 /lights/21/state"
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.gateway] HTTP request response: [{'success': {'/lights/21/state/on': False}},
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"21","r":"lights","state":{"alert":null,"bri":0,"colormode":"ct","ct":440,"on":false,"reachable":true},"t":"event","uniqueid":"00:0d:6f:ff:fe:55:7e:77-01"}
2020-05-23 15:56:36 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"20","r":"lights","state":{"alert":null,"bri":254,"colormode":"xy","hue":0,"on":false,"reachable":true,"sat":0,"xy":[0.41,0.342]},"t":"event","uniqueid":"00:0d:6f:ff:fe:1f:1c:15-01"}
2020-05-23 15:56:38 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"21","r":"lights","state":{"alert":null,"bri":0,"colormode":"ct","ct":440,"on":true,"reachable":true},"t":"event","uniqueid":"00:0d:6f:ff:fe:55:7e:77-01"}
2020-05-23 15:56:38 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"21","r":"lights","state":{"alert":null,"bri":254,"colormode":"ct","ct":440,"on":true,"reachable":true},"t":"event","uniqueid":"00:0d:6f:ff:fe:55:7e:77-01"}
2020-05-23 15:56:39 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"56002","r":"groups","state":{"all_on":false,"any_on":false},"t":"event"}
2020-05-23 15:56:40 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"18","r":"lights","state":{"alert":null,"bri":0,"colormode":"ct","ct":454,"on":true,"reachable":true},"t":"event","uniqueid":"90:fd:9f:ff:fe:1f:c0:16-01"}
2020-05-23 15:56:40 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"18","r":"lights","state":{"alert":null,"bri":254,"colormode":"ct","ct":454,"on":true,"reachable":true},"t":"event","uniqueid":"90:fd:9f:ff:fe:1f:c0:16-01"}
2020-05-23 15:56:48 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"5","r":"lights","state":{"alert":null,"bri":0,"colormode":"ct","ct":366,"on":true,"reachable":true},"t":"event","uniqueid":"00:17:88:01:02:04:b8:08-0b"}
2020-05-23 15:56:48 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"5","r":"lights","state":{"alert":null,"bri":155,"colormode":"ct","ct":366,"on":true,"reachable":true},"t":"event","uniqueid":"00:17:88:01:02:04:b8:08-0b"}
2020-05-23 15:57:02 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"5","r":"lights","state":{"alert":null,"bri":39,"colormode":"ct","ct":366,"on":true,"reachable":true},"t":"event","uniqueid":"00:17:88:01:02:04:b8:08-0b"}
2020-05-23 15:57:06 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"16","r":"lights","state":{"alert":null,"bri":1,"colormode":"ct","ct":370,"on":false,"reachable":true},"t":"event","uniqueid":"00:0b:57:ff:fe:dd:3d:4c-01"}
2020-05-23 15:57:07 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"14","r":"lights","state":{"alert":null,"bri":1,"colormode":"ct","ct":370,"on":false,"reachable":true},"t":"event","uniqueid":"90:fd:9f:ff:fe:89:75:a9-01"}
2020-05-23 15:57:07 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"21","r":"lights","state":{"alert":null,"bri":254,"colormode":"ct","ct":440,"on":false,"reachable":true},"t":"event","uniqueid":"00:0d:6f:ff:fe:55:7e:77-01"}
2020-05-23 15:57:07 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"21","r":"lights","state":{"alert":null,"bri":1,"colormode":"ct","ct":440,"on":false,"reachable":true},"t":"event","uniqueid":"00:0d:6f:ff:fe:55:7e:77-01"}
2020-05-23 15:57:07 DEBUG (MainThread) [pydeconz.websocket] {"e":"changed","id":"20","r":"lights","state":{"alert":null,"bri":1,"colormode":"xy","hue":0,"on":false,"reachable":true,"sat":0,"xy":[0.41,0.342]},"t":"event","uniqueid":"00:0d:6f:ff:fe:1f:1c:15-01"}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants