Dreo wall mounted heater DR-HSH009S

Model: DR-HSH009S
Number of speeds: No speeds, heater modes instead.
Does the fan support oscillating: Yes, the front baffle can oscillate or be in set in 1 of 3 static positions pointing to floor / mid / ceiling.
What preset modes are supported: H1, H2, H3, and Eco mode which can be set to a specific temperature.
Is temperature supported: yes when in Eco Mode.

Think this is now listed as model WH719S on Dreos website. I would love to have this added as well

Here my 2 cents as well:
Model: DR-HSH009S
2024-01-16 10:22:20.426 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-01-16 10:22:20.426 DEBUG (DreoWebSocketStream) [pydreo] Received message for unknown or unsupported device. SN:<PHONE_NUMBER>442639873-7a895322ab243f42:001:0000000000w
2024-01-16 10:22:20.426 DEBUG (DreoWebSocketStream) [pydreo] Message: {'method': 'control-report', 'devicesn': '1643940769442639873-7a895322ab243f42:001:0000000000w', 'messageid': '3769a045-b70a-4093-a8f5-3e37cfdc23dc', 'timestamp':<PHONE_NUMBER>, 'reported': {'oscangle': 90}}
2024-01-16 10:22:34.377 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-01-16 10:22:34.377 DEBUG (DreoWebSocketStream) [pydreo] Received message for unknown or unsupported device. SN:<PHONE_NUMBER>442639873-7a895322ab243f42:001:0000000000w
2024-01-16 10:22:34.377 DEBUG (DreoWebSocketStream) [pydreo] Message: {'method': 'control-report', 'devicesn': '1643940769442639873-7a895322ab243f42:001:0000000000w', 'messageid': '8034c922-4de9-4d34-bbaf-f079063866cf', 'timestamp':<PHONE_NUMBER>, 'reported': {'oscangle': 120}}
2024-01-16 10:22:36.446 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-01-16 10:22:36.447 DEBUG (DreoWebSocketStream) [pydreo] Received message for unknown or unsupported device. SN:<PHONE_NUMBER>442639873-7a895322ab243f42:001:0000000000w
2024-01-16 10:22:36.447 DEBUG (DreoWebSocketStream) [pydreo] Message: {'method': 'control-report', 'devicesn': '1643940769442639873-7a895322ab243f42:001:0000000000w', 'messageid': 'b69dbff6-f301-45fe-b9c7-d40859980b3c', 'timestamp':<PHONE_NUMBER>, 'reported': {'oscangle': 60}}
2024-01-16 10:22:38.615 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-01-16 10:22:38.615 DEBUG (DreoWebSocketStream) [pydreo] Received message for unknown or unsupported device. SN:<PHONE_NUMBER>442639873-7a895322ab243f42:001:0000000000w
2024-01-16 10:22:38.615 DEBUG (DreoWebSocketStream) [pydreo] Message: {'method': 'control-report', 'devicesn': '1643940769442639873-7a895322ab243f42:001:0000000000w', 'messageid': '00715d17-8a26-483f-955c-1fa005fe1c48', 'timestamp':<PHONE_NUMBER>, 'reported': {'oscangle': 90}}
2024-01-16 10:22:40.127 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-01-16 10:22:40.128 DEBUG (DreoWebSocketStream) [pydreo] Received message for unknown or unsupported device. SN:<PHONE_NUMBER>442639873-7a895322ab243f42:001:0000000000w
2024-01-16 10:22:40.128 DEBUG (DreoWebSocketStream) [pydreo] Message: {'method': 'control-report', 'devicesn': '1643940769442639873-7a895322ab243f42:001:0000000000w', 'messageid': '5c81dbe6-6d54-4ae5-bbc5-90928508abcc', 'timestamp':<PHONE_NUMBER>, 'reported': {'oscangle': 120}}
2024-01-16 10:22:41.899 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-01-16 10:22:41.899 DEBUG (DreoWebSocketStream) [pydreo] Received message for unknown or unsupported device. SN:<PHONE_NUMBER>442639873-7a895322ab243f42:001:0000000000w
2024-01-16 10:22:41.899 DEBUG (DreoWebSocketStream) [pydreo] Message: {'method': 'control-report', 'devicesn': '1643940769442639873-7a895322ab243f42:001:0000000000w', 'messageid': 'd296dd9c-8f5a-4959-98d2-8811fee29782', 'timestamp':<PHONE_NUMBER>, 'reported': {'mode': 'hotair', 'htalevel': 1}}
2024-01-16 10:22:43.255 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-01-16 10:22:43.255 DEBUG (DreoWebSocketStream) [pydreo] Received message for unknown or unsupported device. SN:<PHONE_NUMBER>442639873-7a895322ab243f42:001:0000000000w
2024-01-16 10:22:43.255 DEBUG (DreoWebSocketStream) [pydreo] Message: {'method': 'control-report', 'devicesn': '1643940769442639873-7a895322ab243f42:001:0000000000w', 'messageid': 'f55c9134-0026-4a14-9299-139f739e65a9', 'timestamp':<PHONE_NUMBER>, 'reported': {'mode': 'eco'}}

Happy to add any information needed for this unit. To add to initial post by @spacedoodle:
Unit has 5 modes:

3 heat modes (H1, H2, H3)
A Fan Only mode
Eco Mode (supports temperature setting)

Fan position has 4 settings:

Oscillating
Fixed 60°
Fixed 90°
Fixed 120°

Unit also has a shutdown timer that can be set from 1-24 hours.

Would be great if we could add this heater. I'll help any way I can.

This would be great.

@chris4824 @pringleprng @thoughtleader @spacedoodle @natodd @Shwalamazula:
I've created a PR that is waiting for @JeffSteinbok to take a look at it - https://github.com/JeffSteinbok/hass-dreo/pull/71 - it provides initial support for heaters (mine is the Atom One), and all of the above heaters should work with it as near as I can tell. The only thing that isn't (yet) fully supported is the fan oscillation when it's more than just a swing, but that shouldn't be too hard for me to add.
If you want to try it out, feel free to add my repo directly to your system - https://github.com/andy-cooper/hass-dreo
I'd love for this to be integrated into Jeff's work, because I don't think maintaining 2 different versions of this is a great idea, but if that's what it takes 😁

OK, I've added the above heaters to my list of supported heaters @chris4824  @pringleprng @thoughtleader @spacedoodle @natodd @Shwalamazula
If you want to be brave and try this out by adding https://github.com/andy-cooper/hass-dreo to your list of custom HACS repositories (nothing will break, things just won't work properly from HA if I've got problems), that would be great.
Once we've got that functionality working, I can work on adding the oscillation angles to the heater support.

Ive got the wh739s. Thank you for your hqrd work though appreciated!

@pringleprng - just added that model for you. Go ahead and try it out from my repo -  https://github.com/andy-cooper/hass-dreo

thank you so much @andy-cooper .. working great.

@chris4824 - fantastic! That's the DR-HSH009S / WH719S right? I'll see if I can find time shortly to add in the oscillation modes. That's definitely going to be experimental, because I don't actually have one of them. If you're willing to test it out and provide feedback on it, I'd be happy to do that.

That is correct. I'll be glad to test it. I don't use the oscillation so don't rush. Thanks again.

It works great. ECO mode is automode confused me for a moment.  Only thing miasing is oscillation modes. I see you are already working on it. Awesome, work!

@pringleprng excellent! Yeah - eco vs auto confused me too at first, but that's the terminology that the Home Assistant code uses. If I didn't do it that way, the H1/H2/H3 preset modes would have required a completely custom UI as well, so I wanted to fit it into the existing paradigm.
I'm going to try to look at the oscillation modes this week and get that out,  but at the same time I'm trying to get the existing code merged into Jeff's core code base, so I want to wait until that's done before adding more code.

@pringleprng , @chris4824 ,  @thoughtleader @spacedoodle @natodd @Shwalamazula:
I've added support for the oscillation angles to my fork of this project in a new branch because @JeffSteinbok hasn't merged my code changes as yet.
Please feel free to test it out - https://github.com/andy-cooper/hass-dreo/tree/oscangle - note that it is the "oscangle" branch, so you'd need to either manually copy the files into your installation, or add that URL as a custom repository.
I have added the oscillation angles to the "Swing Mode" drop-down, because that is the only location that I can find to make it work with the climate control. That said, it does seem to fit well there. Note that this is very experimental, because I don't have a heater with which I can test it out - it doesn't break my Atom One heater, so at least that is good.
--Andy

@andy-cooper tried your oscangle branch but no extra controls for oscillation shows up. and your latest commit about python 3.10 makes the heaters unavailable.

Thanks @chris4824 - sorry about that :(.
Any chance you could enable debug logs, gather the logs and attach them to this? That way I can take a look at what went wrong and try to fix it?

FYI - this is what it should look like

This is what I have

I'll try to get the logs for you

here is the logs. turning the fan on and off.

2024-03-02 12:49:54.620 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-03-02 12:49:54.620 DEBUG (DreoWebSocketStream) [pydreo] {Matts Heater}: got {{'method': 'report', 'devicesn': '1643940769442639873-4ade862797544707:001:0000000000w', 'messageid': 'ab3a37b2-ddac-4667-9610-5e06d749f810', 'timestamp':<PHONE_NUMBER>543, 'reported': {'temperature': 71}}} message **
2024-03-02 12:49:54.620 DEBUG (DreoWebSocketStream) [pydreo] PyDreoHeater:handle_server_update(Matts Heater): {'method': 'report', 'devicesn': '1643940769442639873-4ade862797544707:001:0000000000w', 'messageid': 'ab3a37b2-ddac-4667-9610-5e06d749f810', 'timestamp':<PHONE_NUMBER>543, 'reported': {'temperature': 71}}
2024-03-02 12:49:54.620 INFO (DreoWebSocketStream) [pydreo] temperature reported: 71
2024-03-02 12:49:54.636 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:54.636 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:54.636 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:54.636 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:54.636 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.055 DEBUG (SyncWorker_55) [dreo] DreoHeaterHA:set_hvac_mode(Tylers Heater) fan_only --> coolair
2024-03-02 12:49:59.055 DEBUG (SyncWorker_55) [pydreo] PyDreoHeater:mode(Tylers Heater) --> coolair
2024-03-02 12:49:59.055 DEBUG (SyncWorker_55) [pydreo] {"devicesn": "1643940769442639873-ee7012adbff327d2:001:0000000000w", "method": "control", "params": {"mode": "coolair"}, "timestamp": "1709401799055"}
2024-03-02 12:49:59.058 DEBUG (SyncWorker_55) [pydreo] PyDreoHeater:poweron.setter - True
2024-03-02 12:49:59.058 DEBUG (SyncWorker_55) [pydreo] {"devicesn": "1643940769442639873-ee7012adbff327d2:001:0000000000w", "method": "control", "params": {"poweron": true}, "timestamp": "1709401799058"}
2024-03-02 12:49:59.112 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-03-02 12:49:59.112 DEBUG (DreoWebSocketStream) [pydreo] {Tylers Heater}: got {{'method': 'control-reply', 'devicesn': '1643940769442639873-ee7012adbff327d2:001:0000000000w', 'timestamp':<PHONE_NUMBER>076, 'reported': {'mode': 'coolair'}}} message **
2024-03-02 12:49:59.112 DEBUG (DreoWebSocketStream) [pydreo] PyDreoHeater:handle_server_update(Tylers Heater): {'method': 'control-reply', 'devicesn': '1643940769442639873-ee7012adbff327d2:001:0000000000w', 'timestamp':<PHONE_NUMBER>076, 'reported': {'mode': 'coolair'}}
2024-03-02 12:49:59.112 INFO (DreoWebSocketStream) [pydreo] mode reported: coolair
2024-03-02 12:49:59.129 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-03-02 12:49:59.129 DEBUG (DreoWebSocketStream) [pydreo] {Tylers Heater}: got {{'method': 'control-reply', 'devicesn': '1643940769442639873-ee7012adbff327d2:001:0000000000w', 'timestamp':<PHONE_NUMBER>079, 'reported': {'poweron': True}}} message **
2024-03-02 12:49:59.129 DEBUG (DreoWebSocketStream) [pydreo] PyDreoHeater:handle_server_update(Tylers Heater): {'method': 'control-reply', 'devicesn': '1643940769442639873-ee7012adbff327d2:001:0000000000w', 'timestamp':<PHONE_NUMBER>079, 'reported': {'poweron': True}}
2024-03-02 12:49:59.129 INFO (DreoWebSocketStream) [pydreo] poweron reported: True
2024-03-02 12:49:59.137 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.137 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.137 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.137 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.137 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.137 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.137 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.137 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.137 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.137 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.904 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-03-02 12:49:59.905 DEBUG (DreoWebSocketStream) [pydreo] {Tylers Heater}: got {{'method': 'control-report', 'devicesn': '1643940769442639873-ee7012adbff327d2:001:0000000000w', 'messageid': '09d21b8e-dd2d-4b8b-824f-6396437d9b2c', 'timestamp':<PHONE_NUMBER>, 'reported': {'mode': 'coolair', 'poweron': True}}} message **
2024-03-02 12:49:59.905 DEBUG (DreoWebSocketStream) [pydreo] PyDreoHeater:handle_server_update(Tylers Heater): {'method': 'control-report', 'devicesn': '1643940769442639873-ee7012adbff327d2:001:0000000000w', 'messageid': '09d21b8e-dd2d-4b8b-824f-6396437d9b2c', 'timestamp':<PHONE_NUMBER>, 'reported': {'mode': 'coolair', 'poweron': True}}
2024-03-02 12:49:59.905 INFO (DreoWebSocketStream) [pydreo] poweron reported: True
2024-03-02 12:49:59.905 INFO (DreoWebSocketStream) [pydreo] mode reported: coolair
2024-03-02 12:49:59.910 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.910 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.910 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.910 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:49:59.910 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:04.759 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-03-02 12:50:04.759 DEBUG (DreoWebSocketStream) [pydreo] {Matts Heater}: got {{'method': 'report', 'devicesn': '1643940769442639873-4ade862797544707:001:0000000000w', 'messageid': 'ca6a931b-a51c-47d4-9df9-aa6cf6adec87', 'timestamp':<PHONE_NUMBER>682, 'reported': {'temperature': 72}}} message **
2024-03-02 12:50:04.759 DEBUG (DreoWebSocketStream) [pydreo] PyDreoHeater:handle_server_update(Matts Heater): {'method': 'report', 'devicesn': '1643940769442639873-4ade862797544707:001:0000000000w', 'messageid': 'ca6a931b-a51c-47d4-9df9-aa6cf6adec87', 'timestamp':<PHONE_NUMBER>682, 'reported': {'temperature': 72}}
2024-03-02 12:50:04.759 INFO (DreoWebSocketStream) [pydreo] temperature reported: 72
2024-03-02 12:50:04.837 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:04.837 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:04.837 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:04.837 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:04.837 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:07.576 DEBUG (SyncWorker_45) [dreo] DreoHeaterHA:set_hvac_mode(Tylers Heater) off --> off
2024-03-02 12:50:07.576 DEBUG (SyncWorker_45) [pydreo] PyDreoHeater:mode(Tylers Heater) --> off
2024-03-02 12:50:07.576 DEBUG (SyncWorker_45) [pydreo] {"devicesn": "1643940769442639873-ee7012adbff327d2:001:0000000000w", "method": "control", "params": {"mode": "off"}, "timestamp": "1709401807576"}
2024-03-02 12:50:07.580 DEBUG (SyncWorker_45) [pydreo] PyDreoHeater:poweron.setter - False
2024-03-02 12:50:07.580 DEBUG (SyncWorker_45) [pydreo] {"devicesn": "1643940769442639873-ee7012adbff327d2:001:0000000000w", "method": "control", "params": {"poweron": false}, "timestamp": "1709401807580"}
2024-03-02 12:50:07.635 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-03-02 12:50:07.636 DEBUG (DreoWebSocketStream) [pydreo] {Tylers Heater}: got {{'method': 'control-reply', 'devicesn': '1643940769442639873-ee7012adbff327d2:001:0000000000w', 'timestamp':<PHONE_NUMBER>599, 'reported': {'mode': 'off'}}} message **
2024-03-02 12:50:07.636 DEBUG (DreoWebSocketStream) [pydreo] PyDreoHeater:handle_server_update(Tylers Heater): {'method': 'control-reply', 'devicesn': '1643940769442639873-ee7012adbff327d2:001:0000000000w', 'timestamp':<PHONE_NUMBER>599, 'reported': {'mode': 'off'}}
2024-03-02 12:50:07.636 INFO (DreoWebSocketStream) [pydreo] mode reported: off
2024-03-02 12:50:07.652 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-03-02 12:50:07.652 DEBUG (DreoWebSocketStream) [pydreo] {Tylers Heater}: got {{'method': 'control-reply', 'devicesn': '1643940769442639873-ee7012adbff327d2:001:0000000000w', 'timestamp':<PHONE_NUMBER>601, 'reported': {'poweron': False}}} message **
2024-03-02 12:50:07.652 DEBUG (DreoWebSocketStream) [pydreo] PyDreoHeater:handle_server_update(Tylers Heater): {'method': 'control-reply', 'devicesn': '1643940769442639873-ee7012adbff327d2:001:0000000000w', 'timestamp':<PHONE_NUMBER>601, 'reported': {'poweron': False}}
2024-03-02 12:50:07.652 INFO (DreoWebSocketStream) [pydreo] poweron reported: False
2024-03-02 12:50:07.688 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:07.688 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:07.688 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:07.688 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:07.688 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:07.689 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:07.689 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:07.689 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:07.689 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:07.689 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:08.303 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-03-02 12:50:08.303 DEBUG (DreoWebSocketStream) [pydreo] {Tylers Heater}: got {{'method': 'control-report', 'devicesn': '1643940769442639873-ee7012adbff327d2:001:0000000000w', 'messageid': '7d903d83-2357-4f35-a85e-fa94901f9f2e', 'timestamp':<PHONE_NUMBER>, 'reported': {'mode': 'coolair', 'poweron': False}}} message **
2024-03-02 12:50:08.303 DEBUG (DreoWebSocketStream) [pydreo] PyDreoHeater:handle_server_update(Tylers Heater): {'method': 'control-report', 'devicesn': '1643940769442639873-ee7012adbff327d2:001:0000000000w', 'messageid': '7d903d83-2357-4f35-a85e-fa94901f9f2e', 'timestamp':<PHONE_NUMBER>, 'reported': {'mode': 'coolair', 'poweron': False}}
2024-03-02 12:50:08.303 INFO (DreoWebSocketStream) [pydreo] poweron reported: False
2024-03-02 12:50:08.304 INFO (DreoWebSocketStream) [pydreo] mode reported: coolair
2024-03-02 12:50:08.386 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:08.386 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:08.386 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:08.386 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:08.386 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:09.735 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-03-02 12:50:09.735 DEBUG (DreoWebSocketStream) [pydreo] {Matts Heater}: got {{'method': 'report', 'devicesn': '1643940769442639873-4ade862797544707:001:0000000000w', 'messageid': '666d6d10-f948-4c32-9541-76906b73ee8c', 'timestamp':<PHONE_NUMBER>662, 'reported': {'temperature': 71}}} message **
2024-03-02 12:50:09.735 DEBUG (DreoWebSocketStream) [pydreo] PyDreoHeater:handle_server_update(Matts Heater): {'method': 'report', 'devicesn': '1643940769442639873-4ade862797544707:001:0000000000w', 'messageid': '666d6d10-f948-4c32-9541-76906b73ee8c', 'timestamp':<PHONE_NUMBER>662, 'reported': {'temperature': 71}}
2024-03-02 12:50:09.735 INFO (DreoWebSocketStream) [pydreo] temperature reported: 71
2024-03-02 12:50:09.737 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:09.737 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:09.737 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:09.737 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-02 12:50:09.737 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on

and here is the diagnostic log

{
"home_assistant": {
"installation_type": "Home Assistant OS",
"version": "2024.3.0b3",
"dev": false,
"hassio": true,
"virtualenv": false,
"python_version": "3.12.2",
"docker": true,
"arch": "x86_64",
"timezone": "America/New_York",
"os_name": "Linux",
"os_version": "6.6.16-haos",
"supervisor": "2024.02.1",
"host_os": "Home Assistant OS 12.0",
"docker_version": "24.0.7",
"chassis": "vm",
"run_as_root": true
},
"custom_components": {
"cielo_home": {
"version": "1.6.8",
"requirements": []
},
"weatherdotcom": {
"version": "1.1.6",
"requirements": []
},
"smartlife": {
"version": "0.1.0",
"requirements": [
"tuya-device-sharing-sdk==0.1.9"
]
},
"ttlock": {
"version": "v0.6.1",
"requirements": [
"pydantic"
]
},
"alarmo": {
"version": "v1.9.14",
"requirements": []
},
"blueiris": {
"version": "1.0.16",
"requirements": []
},
"localtuya": {
"version": "<IP_ADDRESS>",
"requirements": []
},
"alexa_media": {
"version": "4.9.2",
"requirements": [
"alexapy==1.27.10",
"packaging>=20.3",
"wrapt>=1.14.0"
]
},
"browser_mod": {
"version": "2.3.0",
"requirements": []
},
"dreo": {
"version": "0.1.3",
"requirements": [
"websockets"
]
},
"meross_cloud": {
"version": "1.2.13",
"requirements": [
"meross_iot==<IP_ADDRESS>"
]
},
"hacs": {
"version": "1.34.0",
"requirements": [
"aiogithubapi>=22.10.1"
]
}
},
"integration_manifest": {
"domain": "dreo",
"name": "Dreo",
"codeowners": [
"@jeffsteinbok",
"@andy-cooper"
],
"config_flow": true,
"dependencies": [],
"documentation": "https://github.com/andy-cooper/hass-dreo/blob/master/README.md",
"iot_class": "cloud_push",
"issue_tracker": "https://github.com/andy-cooper/hass-dreo/issues",
"loggers": [
"dreo",
"pydreo"
],
"requirements": [
"websockets"
],
"version": "0.1.3",
"is_built_in": false
},
"data": {
"dreo": {
"fan_count": 0,
"heater_count": 2,
"raw_devicelist": {
"code": 0,
"msg": "OK",
"data": {
"currentPage": 1,
"pageSize": 100,
"totalNum": 2,
"totalPage": 1,
"list": [
{
"deviceId": "...",
"sn": "...",
"brand": "Dreo",
"model": "DR-HSH009S",
"productId": "...",
"productName": "Heater",
"deviceName": "Tylers Heater",
"shared": false,
"series": null,
"seriesName": "Wall-mounted Heater",
"color": "w",
"controlsConf": {
"template": "DR-HSH009S",
"lottie": {
"key": "poweron",
"frames": [
{
"value": 0,
"frame": [
0
]
},
{
"value": 1,
"frame": [
3
]
}
]
},
"schedule": {
"duration": [
{
"text": "schedule_control_turnoff_never",
"desc": "schedule_control_turnoff_never_desc",
"time": 0
},
{
"text": "schedule_control_turnoff_30min",
"desc": "schedule_control_turnoff_30min_desc",
"time": 1800
},
{
"text": "schedule_control_turnoff_1h",
"desc": "schedule_control_turnoff_1h_desc",
"time": 3600
},
{
"text": "schedule_control_turnoff_2h",
"desc": "schedule_control_turnoff_2h_desc",
"time": 7200
},
{
"text": "schedule_control_turnoff_4h",
"desc": "schedule_control_turnoff_4h_desc",
"time": 14400
},
{
"text": "schedule_control_turnoff_6h",
"desc": "schedule_control_turnoff_6h_desc",
"time": 21600
},
{
"text": "schedule_control_turnoff_8h",
"desc": "schedule_control_turnoff_8h_desc",
"time": 28800
}
],
"modes": [
{
"icon": "ic_hsh_item_heat",
"title": "device_heater_mode_heat",
"cmd": "mode",
"value": "hotair",
"valueType": 2,
"isSelected": true,
"attention": [
"mode",
"htalevel",
"poweron",
"oscangle"
],
"controls": [
{
"type": 1,
"title": "device_control_mode_manual_level",
"cmd": [
"htalevel"
],
"value": 3,
"valueType": 1,
"startValue": 0,
"validValue": 1,
"periodColor": "#FF9500",
"endValue": 3,
"groupId": 0,
"startColor": "#FFD666",
"endColor": "#FF7214",
"isSelected": false,
"preUnit": "H"
}
]
},
{
"icon": "ic_hsh_item_eco",
"title": "device_heater_mode_eco",
"cmd": "mode",
"value": "eco",
"valueType": 2,
"isSelected": false,
"attention": [
"mode",
"ecolevel",
"poweron",
"oscangle"
],
"controls": [
{
"type": 4,
"valueType": 1,
"title": "device_control_temp",
"startColor": "#FFD666",
"endColor": "#FF7214",
"cmd": [
"ecolevel"
],
"value": 85,
"startValue": 41,
"endValue": 95,
"groupId": 0,
"isSelected": false,
"unit": "\u2109"
}
]
},
{
"icon": "ic_hsh_item_fanonly",
"title": "device_heater_mode_fan_only",
"cmd": "mode",
"value": "coolair",
"valueType": 2,
"isSelected": false,
"attention": [
"mode",
"poweron",
"oscangle"
],
"controls": []
}
]
},
"timer": {
"maxHour": 23
},
"cards": [
{
"type": 2,
"title": "home_temp",
"icon": "",
"image": "",
"url": "",
"show": true
},
{
"type": 8,
"title": "",
"icon": "",
"image": "",
"url": "dreo://nav/device/schedule?deviceSn={sn}",
"show": true,
"key": "",
"minVersion": "2.2.2"
},
{
"type": 6,
"title": "device_settings_title",
"icon": "ic_setting",
"image": "",
"url": "dreo://nav/device/setting?deviceSn=${sn}",
"show": true,
"key": "setting"
}
],
"feature": {
"schedule": {
"enable": true,
"localSupport": true,
"module": [
{
"type": "HeFi",
"version": "0.0.1"
}
]
}
},
"preference": [
{
"id": "270",
"type": "Display List",
"title": "dev_ctrl_heater_display",
"image": "ic_display",
"reverse": false
},
{
"id": "200",
"type": "Panel Sound",
"title": "device_control_panelsound",
"image": "ic_mute",
"reverse": true,
"cmd": "muteon"
},
{
"id": "220",
"type": "Child Lock",
"title": "device_control_childlock",
"image": "ic_child_lock",
"reverse": false,
"cmd": "childlockon"
},
{
"id": "250",
"type": "Open Window Detection",
"title": "dev_ctrl_open_win_dect",
"image": "ic_winopen",
"cmd": "winopenon"
},
{
"id": "280",
"type": "Show Temp",
"title": "ambient_temp_always_on",
"image": "ic_temp_unit_show",
"reverse": false,
"cmd": "dispmode"
},
{
"id": "230",
"type": "Temperature Unit",
"title": "device_control_temp_unit",
"image": "ic_temp_unit"
},
{
"id": "240",
"type": "Temperature Calibration",
"title": "device_control_temp_calibration",
"image": "ic_temp_cal"
}
],
"control": [
{
"swingtype": true,
"hideSafeMode": true
}
],
"category": "Space Heater",
"version": {
"minControlVer": "2.2.2",
"minPairingVer": "2.0.0"
}
},
"mainConf": {
"isSmart": true,
"isWifi": true,
"isBluetooth": true,
"isVoiceControl": true
},
"resourcesConf": {
"imageSmallSrc": "https://resources.dreo-cloud.com/app/202306/20bad19da722a44238bb81ae3a6b87b689.png",
"imageFullSrc": "https://resources.dreo-cloud.com/app/202307/259dd80ef20e50432195beab4dc1939160.zip",
"imageSmallDarkSrc": "",
"imageFullDarkSrc": ""
},
"servicesConf": [
{
"key": "user_manual",
"value": "https://resources.dreo-cloud.com/app/202310/12e3d6cbd972e04025a44e8ff09f096552.pdf"
}
],
"userManuals": [
{
"icon": "https://resources.dreo-cloud.com/app/202309/7c299b4e04b3842c3b7efe11e8b13b88d.png",
"url": "https://resources.dreo-cloud.com/app/202310/12e3d6cbd972e04025a44e8ff09f096552.pdf",
"desc": "Wall-mounted Heater"
},
{
"icon": "https://resources.dreo-cloud.com/app/202309/71392605cead140a282abedfcdd49bbdf.png",
"url": "https://resources.dreo-cloud.com/app/202310/12a5ec101b8fa04ce2a65956acdce8e0ab.pdf",
"desc": "Wall-mounted Heater with ALCI Plug"
},
{
"icon": "https://resources.dreo-cloud.com/app/202309/75e96dbcf73e14cb1ba94172c55968c11.png",
"url": "https://resources.dreo-cloud.com/app/202310/121c4cbb7fff054a72a105a74d1cb703aa.pdf",
"desc": "Wall-mounted Heater with Safety Plug"
}
]
},
{
"deviceId": "...",
"sn": "...",
"brand": "Dreo",
"model": "DR-HSH009S",
"productId": "...",
"productName": "Heater",
"deviceName": "Matts Heater",
"shared": false,
"series": null,
"seriesName": "Wall-mounted Heater",
"color": "w",
"controlsConf": {
"template": "DR-HSH009S",
"lottie": {
"key": "poweron",
"frames": [
{
"value": 0,
"frame": [
0
]
},
{
"value": 1,
"frame": [
3
]
}
]
},
"schedule": {
"duration": [
{
"text": "schedule_control_turnoff_never",
"desc": "schedule_control_turnoff_never_desc",
"time": 0
},
{
"text": "schedule_control_turnoff_30min",
"desc": "schedule_control_turnoff_30min_desc",
"time": 1800
},
{
"text": "schedule_control_turnoff_1h",
"desc": "schedule_control_turnoff_1h_desc",
"time": 3600
},
{
"text": "schedule_control_turnoff_2h",
"desc": "schedule_control_turnoff_2h_desc",
"time": 7200
},
{
"text": "schedule_control_turnoff_4h",
"desc": "schedule_control_turnoff_4h_desc",
"time": 14400
},
{
"text": "schedule_control_turnoff_6h",
"desc": "schedule_control_turnoff_6h_desc",
"time": 21600
},
{
"text": "schedule_control_turnoff_8h",
"desc": "schedule_control_turnoff_8h_desc",
"time": 28800
}
],
"modes": [
{
"icon": "ic_hsh_item_heat",
"title": "device_heater_mode_heat",
"cmd": "mode",
"value": "hotair",
"valueType": 2,
"isSelected": true,
"attention": [
"mode",
"htalevel",
"poweron",
"oscangle"
],
"controls": [
{
"type": 1,
"title": "device_control_mode_manual_level",
"cmd": [
"htalevel"
],
"value": 3,
"valueType": 1,
"startValue": 0,
"validValue": 1,
"periodColor": "#FF9500",
"endValue": 3,
"groupId": 0,
"startColor": "#FFD666",
"endColor": "#FF7214",
"isSelected": false,
"preUnit": "H"
}
]
},
{
"icon": "ic_hsh_item_eco",
"title": "device_heater_mode_eco",
"cmd": "mode",
"value": "eco",
"valueType": 2,
"isSelected": false,
"attention": [
"mode",
"ecolevel",
"poweron",
"oscangle"
],
"controls": [
{
"type": 4,
"valueType": 1,
"title": "device_control_temp",
"startColor": "#FFD666",
"endColor": "#FF7214",
"cmd": [
"ecolevel"
],
"value": 85,
"startValue": 41,
"endValue": 95,
"groupId": 0,
"isSelected": false,
"unit": "\u2109"
}
]
},
{
"icon": "ic_hsh_item_fanonly",
"title": "device_heater_mode_fan_only",
"cmd": "mode",
"value": "coolair",
"valueType": 2,
"isSelected": false,
"attention": [
"mode",
"poweron",
"oscangle"
],
"controls": []
}
]
},
"timer": {
"maxHour": 23
},
"cards": [
{
"type": 2,
"title": "home_temp",
"icon": "",
"image": "",
"url": "",
"show": true
},
{
"type": 8,
"title": "",
"icon": "",
"image": "",
"url": "dreo://nav/device/schedule?deviceSn={sn}",
"show": true,
"key": "",
"minVersion": "2.2.2"
},
{
"type": 6,
"title": "device_settings_title",
"icon": "ic_setting",
"image": "",
"url": "dreo://nav/device/setting?deviceSn=${sn}",
"show": true,
"key": "setting"
}
],
"feature": {
"schedule": {
"enable": true,
"localSupport": true,
"module": [
{
"type": "HeFi",
"version": "0.0.1"
}
]
}
},
"preference": [
{
"id": "270",
"type": "Display List",
"title": "dev_ctrl_heater_display",
"image": "ic_display",
"reverse": false
},
{
"id": "200",
"type": "Panel Sound",
"title": "device_control_panelsound",
"image": "ic_mute",
"reverse": true,
"cmd": "muteon"
},
{
"id": "220",
"type": "Child Lock",
"title": "device_control_childlock",
"image": "ic_child_lock",
"reverse": false,
"cmd": "childlockon"
},
{
"id": "250",
"type": "Open Window Detection",
"title": "dev_ctrl_open_win_dect",
"image": "ic_winopen",
"cmd": "winopenon"
},
{
"id": "280",
"type": "Show Temp",
"title": "ambient_temp_always_on",
"image": "ic_temp_unit_show",
"reverse": false,
"cmd": "dispmode"
},
{
"id": "230",
"type": "Temperature Unit",
"title": "device_control_temp_unit",
"image": "ic_temp_unit"
},
{
"id": "240",
"type": "Temperature Calibration",
"title": "device_control_temp_calibration",
"image": "ic_temp_cal"
}
],
"control": [
{
"swingtype": true,
"hideSafeMode": true
}
],
"category": "Space Heater",
"version": {
"minControlVer": "2.2.2",
"minPairingVer": "2.0.0"
}
},
"mainConf": {
"isSmart": true,
"isWifi": true,
"isBluetooth": true,
"isVoiceControl": true
},
"resourcesConf": {
"imageSmallSrc": "https://resources.dreo-cloud.com/app/202306/20bad19da722a44238bb81ae3a6b87b689.png",
"imageFullSrc": "https://resources.dreo-cloud.com/app/202307/259dd80ef20e50432195beab4dc1939160.zip",
"imageSmallDarkSrc": "",
"imageFullDarkSrc": ""
},
"servicesConf": [
{
"key": "user_manual",
"value": "https://resources.dreo-cloud.com/app/202310/12e3d6cbd972e04025a44e8ff09f096552.pdf"
}
],
"userManuals": [
{
"icon": "https://resources.dreo-cloud.com/app/202309/7c299b4e04b3842c3b7efe11e8b13b88d.png",
"url": "https://resources.dreo-cloud.com/app/202310/12e3d6cbd972e04025a44e8ff09f096552.pdf",
"desc": "Wall-mounted Heater"
},
{
"icon": "https://resources.dreo-cloud.com/app/202309/71392605cead140a282abedfcdd49bbdf.png",
"url": "https://resources.dreo-cloud.com/app/202310/12a5ec101b8fa04ce2a65956acdce8e0ab.pdf",
"desc": "Wall-mounted Heater with ALCI Plug"
},
{
"icon": "https://resources.dreo-cloud.com/app/202309/75e96dbcf73e14cb1ba94172c55968c11.png",
"url": "https://resources.dreo-cloud.com/app/202310/121c4cbb7fff054a72a105a74d1cb703aa.pdf",
"desc": "Wall-mounted Heater with Safety Plug"
}
]
}
]
}
}
},
"devices": {
"fans": [],
"heaters": [
{
"_device_definition": {
"__type": "<class 'custom_components.dreo.pydreo.models.DreoDeviceDetails'>",
"repr": "DreoDeviceDetails(preset_modes=['H1', 'H2', 'H3'], range={'heat_range': (1, 3), 'ecolevel_range': (41, 95)}, hvac_modes=['coolair', 'hotair', 'eco', 'off'], swing_modes=['off', 'on', <HeaterOscillationAngles.SIXTY: '60\u00b0'>, <HeaterOscillationAngles.NINETY: '90\u00b0'>, <HeaterOscillationAngles.ONE_TWENTY: '120\u00b0'>])"
},
"_name": "Tylers Heater",
"_device_id": "...",
"_sn": "REDACTED",
"_brand": "Dreo",
"_model": "DR-HSH009S",
"_productId": "...",
"_productName": "Heater",
"_deviceName": "Tylers Heater",
"_shared": false,
"_series": null,
"_seriesName": "Wall-mounted Heater",
"_color": "w",
"_dreo": {
"__type": "<class 'custom_components.dreo.pydreo.PyDreo'>",
"repr": "<custom_components.dreo.pydreo.PyDreo object at 0x7f39bd090ec0>"
},
"_is_on": false,
"_feature_key_names": {},
"raw_state": {
"code": 0,
"msg": "OK",
"data": {
"mixed": {
"lightsenon": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"wifi_rssi": {
"state": -43,
"timestamp":<PHONE_NUMBER>
},
"poweron": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"scheid": {
"state": 0,
"timestamp":<PHONE_NUMBER>
},
"timeron": {
"state": {
"du": 0,
"ts":<PHONE_NUMBER>
},
"timestamp": null
},
"scheon": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"mode": {
"state": "eco",
"timestamp":<PHONE_NUMBER>
},
"mcuon": {
"state": true,
"timestamp":<PHONE_NUMBER>
},
"network_latency": {
"state": 43,
"timestamp":<PHONE_NUMBER>
},
"module_hardware_model": {
"state": "HeFi",
"timestamp":<PHONE_NUMBER>
},
"mcu_firmware_version": {
"state": "1.0.72",
"timestamp":<PHONE_NUMBER>
},
"otp_in_plug": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"cooldown": {
"state": 0,
"timestamp":<PHONE_NUMBER>
},
"temperature": {
"state": 69,
"timestamp":<PHONE_NUMBER>
},
"winopened": {
"state": 0,
"timestamp":<PHONE_NUMBER>
},
"frostproton": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"winopenon": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"module_hardware_mac": "REDACTED",
"ptcon": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"muteon": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"mcu_hardware_model": {
"state": "SC95F8613B",
"timestamp":<PHONE_NUMBER>
},
"wifi_ssid": "REDACTED",
"tempunit": {
"state": 1,
"timestamp":<PHONE_NUMBER>
},
"frostprotwk": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"wrong": {
"state": 0,
"timestamp":<PHONE_NUMBER>
},
"module_firmware_version": {
"state": "2.0.1",
"timestamp":<PHONE_NUMBER>
},
"connected": {
"state": true,
"timestamp":<PHONE_NUMBER>
},
"timeroff": {
"state": {
"du": 0,
"ts": 0
},
"timestamp": null
},
"_ota": {
"state": 0,
"timestamp":<PHONE_NUMBER>
},
"ledkepton": {
"state": true,
"timestamp":<PHONE_NUMBER>
},
"ecolevel": {
"state": 70,
"timestamp":<PHONE_NUMBER>
},
"frostprottemp": {
"state": 45,
"timestamp":<PHONE_NUMBER>
},
"childlockon": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"htalevel": {
"state": 3,
"timestamp":<PHONE_NUMBER>
},
"dispmode": {
"state": "temp",
"timestamp":<PHONE_NUMBER>
},
"oscangle": {
"state": 120,
"timestamp":<PHONE_NUMBER>
},
"tempoffset": {
"state": 0,
"timestamp":<PHONE_NUMBER>
}
},
"sn": "REDACTED",
"productId": "...",
"region": "us-east-2"
}
},
"_attr_cbs": [
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b80eccc0>"
},
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b80efe20>"
},
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b7e00c20>"
},
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b6678400>"
},
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b6679a80>"
},
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b6679940>"
},
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b6679bc0>"
},
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b6679d00>"
}
],
"_lock": {
"__type": "<class '_thread.lock'>",
"repr": "<unlocked _thread.lock object at 0x7f39bccdbe40>"
},
"_mode": "coolair",
"_htalevel": 3,
"_oscon": null,
"_oscangle": 120,
"_temperature": 74,
"_mute_on": false,
"_fixed_conf": null,
"_dev_on": null,
"_timer_on": 0,
"_cooldown": 0,
"_ptc_on": false,
"_light_on": null,
"_ctlstatus": null,
"_timer_off": 0,
"_ecolevel": 70,
"_childlockon": false,
"_tempoffset": 0
},
{
"_device_definition": {
"__type": "<class 'custom_components.dreo.pydreo.models.DreoDeviceDetails'>",
"repr": "DreoDeviceDetails(preset_modes=['H1', 'H2', 'H3'], range={'heat_range': (1, 3), 'ecolevel_range': (41, 95)}, hvac_modes=['coolair', 'hotair', 'eco', 'off'], swing_modes=['off', 'on', <HeaterOscillationAngles.SIXTY: '60\u00b0'>, <HeaterOscillationAngles.NINETY: '90\u00b0'>, <HeaterOscillationAngles.ONE_TWENTY: '120\u00b0'>])"
},
"_name": "Matts Heater",
"_device_id": "...",
"_sn": "REDACTED",
"_brand": "Dreo",
"_model": "DR-HSH009S",
"_productId": "...",
"_productName": "Heater",
"_deviceName": "Matts Heater",
"_shared": false,
"_series": null,
"_seriesName": "Wall-mounted Heater",
"_color": "w",
"_dreo": {
"__type": "<class 'custom_components.dreo.pydreo.PyDreo'>",
"repr": "<custom_components.dreo.pydreo.PyDreo object at 0x7f39bd090ec0>"
},
"_is_on": false,
"_feature_key_names": {},
"raw_state": {
"code": 0,
"msg": "OK",
"data": {
"mixed": {
"lightsenon": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"wifi_rssi": {
"state": -47,
"timestamp":<PHONE_NUMBER>
},
"poweron": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"scheid": {
"state": 0,
"timestamp":<PHONE_NUMBER>
},
"timeron": {
"state": {
"du": 0,
"ts": 0
},
"timestamp": null
},
"scheon": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"mode": {
"state": "eco",
"timestamp":<PHONE_NUMBER>
},
"mcuon": {
"state": true,
"timestamp":<PHONE_NUMBER>
},
"network_latency": {
"state": 52,
"timestamp":<PHONE_NUMBER>
},
"module_hardware_model": {
"state": "HeFi",
"timestamp":<PHONE_NUMBER>
},
"mcu_firmware_version": {
"state": "1.0.72",
"timestamp":<PHONE_NUMBER>
},
"otp_in_plug": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"cooldown": {
"state": 0,
"timestamp":<PHONE_NUMBER>
},
"temperature": {
"state": 70,
"timestamp":<PHONE_NUMBER>
},
"winopened": {
"state": 0,
"timestamp":<PHONE_NUMBER>
},
"frostproton": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"winopenon": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"module_hardware_mac": "REDACTED",
"ptcon": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"muteon": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"mcu_hardware_model": {
"state": "SC95F8613B",
"timestamp":<PHONE_NUMBER>
},
"wifi_ssid": "REDACTED",
"tempunit": {
"state": 1,
"timestamp":<PHONE_NUMBER>
},
"frostprotwk": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"wrong": {
"state": 0,
"timestamp":<PHONE_NUMBER>
},
"module_firmware_version": {
"state": "2.0.1",
"timestamp":<PHONE_NUMBER>
},
"connected": {
"state": true,
"timestamp":<PHONE_NUMBER>
},
"timeroff": {
"state": {
"du": 0,
"ts": 0
},
"timestamp": null
},
"_ota": {
"state": 0,
"timestamp":<PHONE_NUMBER>
},
"ledkepton": {
"state": true,
"timestamp":<PHONE_NUMBER>
},
"ecolevel": {
"state": 75,
"timestamp":<PHONE_NUMBER>
},
"frostprottemp": {
"state": 45,
"timestamp":<PHONE_NUMBER>
},
"childlockon": {
"state": false,
"timestamp":<PHONE_NUMBER>
},
"htalevel": {
"state": 1,
"timestamp":<PHONE_NUMBER>
},
"dispmode": {
"state": "temp",
"timestamp":<PHONE_NUMBER>
},
"oscangle": {
"state": 120,
"timestamp":<PHONE_NUMBER>
},
"tempoffset": {
"state": 0,
"timestamp":<PHONE_NUMBER>
}
},
"sn": "REDACTED",
"productId": "...",
"region": "us-east-2"
}
},
"_attr_cbs": [
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b80ecb80>"
},
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b7e00220>"
},
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b7e00ae0>"
},
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b6679e40>"
},
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b6679f80>"
},
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b667a0c0>"
},
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b6b0d300>"
},
{
"__type": "<class 'function'>",
"repr": "<function DreoBaseDeviceHA.async_added_to_hass..update_state at 0x7f39b6b0cea0>"
}
],
"_lock": {
"__type": "<class '_thread.lock'>",
"repr": "<unlocked _thread.lock object at 0x7f39bcf45c40>"
},
"_mode": "eco",
"_htalevel": 1,
"_oscon": null,
"_oscangle": 120,
"_temperature": 72,
"_mute_on": false,
"_fixed_conf": null,
"_dev_on": null,
"_timer_on": 0,
"_cooldown": 0,
"_ptc_on": false,
"_light_on": null,
"_ctlstatus": null,
"_timer_off": 0,
"_ecolevel": 75,
"_childlockon": false,
"_tempoffset": 0
}
]
}
}
}

BTW I tried to get the fan oscillating angles to show up but it doesnt for me either. I thought it was my fault for maybe messing up the repo on HACS but I just got that update and 0.0.4 beta so I'm thinking it's not me.

OK, thanks @pringleprng - I screwed stuff up with v0.0.4 - removed that and put in v0.0.5, but I don't think that will fix it. Could I ask you to enable debug logging for dreo, then post your debug logs from a restart of homeassistant core - that will have dumps that I hope will give me some insight into what's going on.

FWIW I have the WH739S (which is identical to the WH719S and WH729S except for the type of plug that each offers) and I tried adding it today, but the log is reporting it is an unsupported model.
2024-03-11 16:20:25.156 WARNING (SyncWorker_0) [pydreo] Unknown fan model: DR-HSH009S

I restarted HASS with debug enabled and here's the interesting part:
2024-03-15 15:21:33.752 INFO (SyncWorker_7) [pydreo] Dreo Auth reports user region as: NA
2024-03-15 15:21:33.752 DEBUG (SyncWorker_7) [pydreo] Login successful
2024-03-15 15:21:33.869 DEBUG (SyncWorker_3) [pydreo] Calling Dreo API: {devicelist}
2024-03-15 15:21:33.869 DEBUG (SyncWorker_3) [pydreo] =======call_api=============================
2024-03-15 15:21:33.869 DEBUG (SyncWorker_3) [pydreo] [get] calling '/api/v2/user-device/device/list' api
2024-03-15 15:21:33.869 DEBUG (SyncWorker_3) [pydreo] API call URL:
  https://app-api-us.dreo-cloud.com/api/v2/user-device/device/list
2024-03-15 15:21:33.869 DEBUG (SyncWorker_3) [pydreo] API call headers:
  {"ua": "dreo/2.5.12 (sdk_gphone64_arm64;android 13;Scale/2.625)", "lang": "en", "content-type": "application/json; charset=UTF-8", "accept-encoding": "gzip", "user-agent": "okhttp/4.9.1", "authorization": "Bearer 6015d70f-6e06-47c5-bfa0-<REDACTED>"}
2024-03-15 15:21:33.869 DEBUG (SyncWorker_3) [pydreo] API call json:
  {"acceptLanguage": "en", "method": "devices", "pageNo": "1", "pageSize": "100"}
2024-03-15 15:21:34.200 DEBUG (SyncWorker_3) [pydreo] API response:

  {"code": 0, "msg": "OK", "data": {"currentPage": 1, "pageSize": 100, "totalNum": 1, "totalPage": 1, "list": [{"deviceId": "1750982642146217985", "sn": "1643940769442639873-0566ab60c5581a88:001:0000000000w", "brand": "Dreo", "model": "DR-HSH009S", "productId": "1643940769442639873", "productName": "Heater", "deviceName": "Garage Heater", "shared": false, "series": null, "seriesName": "Wall-mounted Heater", "color": "w", "controlsConf": {"template": "DR-HSH009S", "lottie": {"key": "poweron", "frames": [{"value": 0, "frame": [0]}, {"value": 1, "frame": [3]}]}, "schedule": {"duration": [{"text": "schedule_control_turnoff_never", "desc": "schedule_control_turnoff_never_desc", "time": 0}, {"text": "schedule_control_turnoff_30min", "desc": "schedule_control_turnoff_30min_desc", "time": 1800}, {"text": "schedule_control_turnoff_1h", "desc": "schedule_control_turnoff_1h_desc", "time": 3600}, {"text": "schedule_control_turnoff_2h", "desc": "schedule_control_turnoff_2h_desc", "time": 7200}, {"text": "schedule_control_turnoff_4h", "desc": "schedule_control_turnoff_4h_desc", "time": 14400}, {"text": "schedule_control_turnoff_6h", "desc": "schedule_control_turnoff_6h_desc", "time": 21600}, {"text": "schedule_control_turnoff_8h", "desc": "schedule_control_turnoff_8h_desc", "time": 28800}], "modes": [{"icon": "ic_hsh_item_heat", "title": "device_heater_mode_heat", "cmd": "mode", "value": "hotair", "valueType": 2, "isSelected": true, "attention": ["mode", "htalevel", "poweron", "oscangle"], "controls": [{"type": 1, "title": "device_control_mode_manual_level", "cmd": ["htalevel"], "value": 3, "valueType": 1, "startValue": 0, "validValue": 1, "periodColor": "#FF9500", "endValue": 3, "groupId": 0, "startColor": "#FFD666", "endColor": "#FF7214", "isSelected": false, "preUnit": "H"}]}, {"icon": "ic_hsh_item_eco", "title": "device_heater_mode_eco", "cmd": "mode", "value": "eco", "valueType": 2, "isSelected": false, "attention": ["mode", "ecolevel", "poweron", "oscangle"], "controls": [{"type": 4, "valueType": 1, "title": "device_control_temp", "startColor": "#FFD666", "endColor": "#FF7214", "cmd": ["ecolevel"], "value": 85, "startValue": 41, "endValue": 95, "groupId": 0, "isSelected": false, "unit": "\u2109"}]}, {"icon": "ic_hsh_item_fanonly", "title": "device_heater_mode_fan_only", "cmd": "mode", "value": "coolair", "valueType": 2, "isSelected": false, "attention": ["mode", "poweron", "oscangle"], "controls": []}]}, "timer": {"maxHour": 23}, "cards": [{"type": 2, "title": "home_temp", "icon": "", "image": "", "url": "", "show": true}, {"type": 8, "title": "", "icon": "", "image": "", "url": "dreo://nav/device/schedule?deviceSn={sn}", "show": true, "key": "", "minVersion": "2.2.2"}, {"type": 6, "title": "device_settings_title", "icon": "ic_setting", "image": "", "url": "dreo://nav/device/setting?deviceSn=${sn}", "show": true, "key": "setting"}], "feature": {"schedule": {"enable": true, "localSupport": true, "module": [{"type": "HeFi", "version": "0.0.1"}]}}, "preference": [{"id": "270", "type": "Display List", "title": "dev_ctrl_heater_display", "image": "ic_display", "reverse": false}, {"id": "200", "type": "Panel Sound", "title": "device_control_panelsound", "image": "ic_mute", "reverse": true, "cmd": "muteon"}, {"id": "220", "type": "Child Lock", "title": "device_control_childlock", "image": "ic_child_lock", "reverse": false, "cmd": "childlockon"}, {"id": "250", "type": "Open Window Detection", "title": "dev_ctrl_open_win_dect", "image": "ic_winopen", "cmd": "winopenon"}, {"id": "280", "type": "Show Temp", "title": "ambient_temp_always_on", "image": "ic_temp_unit_show", "reverse": false, "cmd": "dispmode"}, {"id": "230", "type": "Temperature Unit", "title": "device_control_temp_unit", "image": "ic_temp_unit"}, {"id": "240", "type": "Temperature Calibration", "title": "device_control_temp_calibration", "image": "ic_temp_cal"}], "control": [{"swingtype": true, "hideSafeMode": true}], "category": "Space Heater", "version": {"minControlVer": "2.2.2", "minPairingVer": "2.0.0"}}, "mainConf": {"isSmart": true, "isWifi": true, "isBluetooth": true, "isVoiceControl": true}, "resourcesConf": {"imageSmallSrc": "https://resources.dreo-cloud.com/app/202306/20bad19da722a44238bb81ae3a6b87b689.png", "imageFullSrc": "https://resources.dreo-cloud.com/app/202307/259dd80ef20e50432195beab4dc1939160.zip", "imageSmallDarkSrc": "", "imageFullDarkSrc": ""}, "servicesConf": [{"key": "user_manual", "value": "https://resources.dreo-cloud.com/app/202310/12e3d6cbd972e04025a44e8ff09f096552.pdf"}], "userManuals": [{"icon": "https://resources.dreo-cloud.com/app/202309/7c299b4e04b3842c3b7efe11e8b13b88d.png", "url": "https://resources.dreo-cloud.com/app/202310/12e3d6cbd972e04025a44e8ff09f096552.pdf", "desc": "Wall-mounted Heater"}, {"icon": "https://resources.dreo-cloud.com/app/202309/71392605cead140a282abedfcdd49bbdf.png", "url": "https://resources.dreo-cloud.com/app/202310/12a5ec101b8fa04ce2a65956acdce8e0ab.pdf", "desc": "Wall-mounted Heater with ALCI Plug"}, {"icon": "https://resources.dreo-cloud.com/app/202309/75e96dbcf73e14cb1ba94172c55968c11.png", "url": "https://resources.dreo-cloud.com/app/202310/121c4cbb7fff054a72a105a74d1cb703aa.pdf", "desc": "Wall-mounted Heater with Safety Plug"}]}]}}

2024-03-15 15:21:34.205 DEBUG (SyncWorker_3) [pydreo] pydreo._process_devices
2024-03-15 15:21:34.205 DEBUG (SyncWorker_3) [pydreo] New device list initialized
2024-03-15 15:21:34.205 DEBUG (SyncWorker_3) [pydreo] found device with model DR-HSH009S
2024-03-15 15:21:34.206 WARNING (SyncWorker_3) [pydreo] Unknown fan model: DR-HSH009S
2024-03-15 15:21:34.206 DEBUG (SyncWorker_3) [pydreo] {'deviceId': '1750982642146217985', 'sn': '1643940769442639873-0566ab60c5581a88:001:0000000000w', 'brand': 'Dreo', 'model': 'DR-HSH009S', 'productId': '1643940769442639873', 'productName': 'Heater', 'deviceName': 'Garage Heater', 'shared': False, 'series': None, 'seriesName': 'Wall-mounted Heater', 'color': 'w', 'controlsConf': {'template': 'DR-HSH009S', 'lottie': {'key': 'poweron', 'frames': [{'value': 0, 'frame': [0]}, {'value': 1, 'frame': [3]}]}, 'schedule': {'duration': [{'text': 'schedule_control_turnoff_never', 'desc': 'schedule_control_turnoff_never_desc', 'time': 0}, {'text': 'schedule_control_turnoff_30min', 'desc': 'schedule_control_turnoff_30min_desc', 'time': 1800}, {'text': 'schedule_control_turnoff_1h', 'desc': 'schedule_control_turnoff_1h_desc', 'time': 3600}, {'text': 'schedule_control_turnoff_2h', 'desc': 'schedule_control_turnoff_2h_desc', 'time': 7200}, {'text': 'schedule_control_turnoff_4h', 'desc': 'schedule_control_turnoff_4h_desc', 'time': 14400}, {'text': 'schedule_control_turnoff_6h', 'desc': 'schedule_control_turnoff_6h_desc', 'time': 21600}, {'text': 'schedule_control_turnoff_8h', 'desc': 'schedule_control_turnoff_8h_desc', 'time': 28800}], 'modes': [{'icon': 'ic_hsh_item_heat', 'title': 'device_heater_mode_heat', 'cmd': 'mode', 'value': 'hotair', 'valueType': 2, 'isSelected': True, 'attention': ['mode', 'htalevel', 'poweron', 'oscangle'], 'controls': [{'type': 1, 'title': 'device_control_mode_manual_level', 'cmd': ['htalevel'], 'value': 3, 'valueType': 1, 'startValue': 0, 'validValue': 1, 'periodColor': '#FF9500', 'endValue': 3, 'groupId': 0, 'startColor': '#FFD666', 'endColor': '#FF7214', 'isSelected': False, 'preUnit': 'H'}]}, {'icon': 'ic_hsh_item_eco', 'title': 'device_heater_mode_eco', 'cmd': 'mode', 'value': 'eco', 'valueType': 2, 'isSelected': False, 'attention': ['mode', 'ecolevel', 'poweron', 'oscangle'], 'controls': [{'type': 4, 'valueType': 1, 'title': 'device_control_temp', 'startColor': '#FFD666', 'endColor': '#FF7214', 'cmd': ['ecolevel'], 'value': 85, 'startValue': 41, 'endValue': 95, 'groupId': 0, 'isSelected': False, 'unit': '℉'}]}, {'icon': 'ic_hsh_item_fanonly', 'title': 'device_heater_mode_fan_only', 'cmd': 'mode', 'value': 'coolair', 'valueType': 2, 'isSelected': False, 'attention': ['mode', 'poweron', 'oscangle'], 'controls': []}]}, 'timer': {'maxHour': 23}, 'cards': [{'type': 2, 'title': 'home_temp', 'icon': '', 'image': '', 'url': '', 'show': True}, {'type': 8, 'title': '', 'icon': '', 'image': '', 'url': 'dreo://nav/device/schedule?deviceSn={sn}', 'show': True, 'key': '', 'minVersion': '2.2.2'}, {'type': 6, 'title': 'device_settings_title', 'icon': 'ic_setting', 'image': '', 'url': 'dreo://nav/device/setting?deviceSn=${sn}', 'show': True, 'key': 'setting'}], 'feature': {'schedule': {'enable': True, 'localSupport': True, 'module': [{'type': 'HeFi', 'version': '0.0.1'}]}}, 'preference': [{'id': '270', 'type': 'Display List', 'title': 'dev_ctrl_heater_display', 'image': 'ic_display', 'reverse': False}, {'id': '200', 'type': 'Panel Sound', 'title': 'device_control_panelsound', 'image': 'ic_mute', 'reverse': True, 'cmd': 'muteon'}, {'id': '220', 'type': 'Child Lock', 'title': 'device_control_childlock', 'image': 'ic_child_lock', 'reverse': False, 'cmd': 'childlockon'}, {'id': '250', 'type': 'Open Window Detection', 'title': 'dev_ctrl_open_win_dect', 'image': 'ic_winopen', 'cmd': 'winopenon'}, {'id': '280', 'type': 'Show Temp', 'title': 'ambient_temp_always_on', 'image': 'ic_temp_unit_show', 'reverse': False, 'cmd': 'dispmode'}, {'id': '230', 'type': 'Temperature Unit', 'title': 'device_control_temp_unit', 'image': 'ic_temp_unit'}, {'id': '240', 'type': 'Temperature Calibration', 'title': 'device_control_temp_calibration', 'image': 'ic_temp_cal'}], 'control': [{'swingtype': True, 'hideSafeMode': True}], 'category': 'Space Heater', 'version': {'minControlVer': '2.2.2', 'minPairingVer': '2.0.0'}}, 'mainConf': {'isSmart': True, 'isWifi': True, 'isBluetooth': True, 'isVoiceControl': True}, 'resourcesConf': {'imageSmallSrc': 'https://resources.dreo-cloud.com/app/202306/20bad19da722a44238bb81ae3a6b87b689.png', 'imageFullSrc': 'https://resources.dreo-cloud.com/app/202307/259dd80ef20e50432195beab4dc1939160.zip', 'imageSmallDarkSrc': '', 'imageFullDarkSrc': ''}, 'servicesConf': [{'key': 'user_manual', 'value': 'https://resources.dreo-cloud.com/app/202310/12e3d6cbd972e04025a44e8ff09f096552.pdf'}], 'userManuals': [{'icon': 'https://resources.dreo-cloud.com/app/202309/7c299b4e04b3842c3b7efe11e8b13b88d.png', 'url': 'https://resources.dreo-cloud.com/app/202310/12e3d6cbd972e04025a44e8ff09f096552.pdf', 'desc': 'Wall-mounted Heater'}, {'icon': 'https://resources.dreo-cloud.com/app/202309/71392605cead140a282abedfcdd49bbdf.png', 'url': 'https://resources.dreo-cloud.com/app/202310/12a5ec101b8fa04ce2a65956acdce8e0ab.pdf', 'desc': 'Wall-mounted Heater with ALCI Plug'}, {'icon': 'https://resources.dreo-cloud.com/app/202309/75e96dbcf73e14cb1ba94172c55968c11.png', 'url': 'https://resources.dreo-cloud.com/app/202310/121c4cbb7fff054a72a105a74d1cb703aa.pdf', 'desc': 'Wall-mounted Heater with Safety Plug'}]}

followed by a couple notifications that a message was received for an unsupported device:
2024-03-15 15:21:44.209 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-03-15 15:21:44.209 DEBUG (DreoWebSocketStream) [pydreo] Received message for unknown or unsupported device. SN:<PHONE_NUMBER>442639873-0566ab60c5581a88:001:0000000000w
2024-03-15 15:21:44.209 DEBUG (DreoWebSocketStream) [pydreo] Message: {'method': 'report', 'devicesn': '1643940769442639873-0566ab60c5581a88:001:0000000000w', 'messageid': '18a2c5be-964f-4d49-baaf-289cc66213f6', 'timestamp':<PHONE_NUMBER>081, 'reported': {'temperature': 45}}

Hope that helps!

This is what I have

I'm also having the same card with an DR-HSH009AS model. On the debug it does appears supported but it won't show up.

@mikeoertli - Hmm. That's interesting, because if it's an unknown model, what should show up is this message (yes, there is a redundant heater word in the message):
"Unknown fan, heater or heater model: XXX"`
So what that tells me is that you're not running the version that I have published out of my repo - https://github.com/andy-cooper/hass-dreo/tree/oscangle. You should set that as a custom repository in HACS and then install that after uninstalling the Dreo integration that you currently have installed.
@ptmgcorp - your image shows up as empty, unfortunately. However, if yours is a DR-HSH009AS, then it wasn't supported by my code because I didn't know that existed. I've just added it.
The current release on my fork is https://github.com/andy-cooper/hass-dreo/releases/tag/v0.0.8-beta

@andy-cooper - Thank you for your response. The DR-HSH009AS is new model same as the DR-HSH009S. The different is that it has an ALCI Safety Plug, not much of a difference. As of right now, according to the debug. The unit model number shows up as a DR-HSH009S, but it is working. Just that the climate card doesn't load. So for me, by removing 3 lines of codes in  your climate.py.
 if self.device.poweron is not None:
     supported_features |= ClimateEntityFeature.TURN_OFF
     supported_features |= ClimateEntityFeature.TURN_ON

The climate card shows up and works as expected, except that is missing the OSCILATE button or option from Device Info and the climate card itself as shown here https://github.com/JeffSteinbok/hass-dreo/issues/62#issuecomment-1974863139 You may know why :)

On the part of removing the code, that's weird. What version of home assistant core are you running? I had to put those lines in because there's a deprecated warning for defining poweron but not specifying ClimateEntityFeature.TURN_ON and TURN_OFF, so I tried to fix that. I also updated the requirements to be 2024.2 required.
@ptmgcorp - can you try enabling debug mode and restarting home assistant to get debug logs for me? From the System > Logs area? I want to see if my latest logging statements show up.
Also, when you've done that, could you also use the wall heater's remote and set the different oscillation angles so that we can get debug logs of what commands show up? I'm a little baffled by what's going on, TBH.

@ptmgcorp - Oh, and could you update to the latest release on the oscangle branch before you do any of the above?

@andy-cooper - Yeah, I've done that but no avail. But that can be  the issue since I'm in version 2023.11 due to other plug-ins incompatibilities. It's why I haven't move to any other versions. But I will do some tests and upgrade the HA version. Let me work on my end and follow your requirements first. After that, I will do as requested.

@ptmgcorp - Ah, gotcha. Yeah - that will explain why you have to remove those 3 lines of code. Without those 3 lines you should be fine on 2023.11.  The debug logs are far more important, and I'll see if I can find a way to make it work with both 2023.11 and 2024.2 without re-introducing the deprecation warnings. Thanks so much for being a guinea pig here!

@andy-cooper - Well, I did a bench test on a separate HA VM. Updated to 2024.2. Download your master branch codes. Everything pops up normal without removing the 3 lines of codes in the climate.py file. Except I still don't have the osculate angle shown on the card. Here is the debug codes when pressing the 4 different modes on the remote.
2024-03-17 16:37:40.575 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-03-17 16:37:40.575 DEBUG (DreoWebSocketStream) [pydreo] {Living Room}: got {{'method': 'report', 'devicesn': '1643940769442639873-65e50fbd10551564:001:0000000000w', 'messageid': '2a04b649-1bdc-4a55-8d1d-e98a97740e6c', 'timestamp':<PHONE_NUMBER>, 'reported': {'oscangle': 120}}} message **
2024-03-17 16:37:40.575 DEBUG (DreoWebSocketStream) [pydreo] PyDreoHeater:handle_server_update(Living Room): {'method': 'report', 'devicesn': '1643940769442639873-65e50fbd10551564:001:0000000000w', 'messageid': '2a04b649-1bdc-4a55-8d1d-e98a97740e6c', 'timestamp':<PHONE_NUMBER>, 'reported': {'oscangle': 120}}
2024-03-17 16:37:40.575 INFO (DreoWebSocketStream) [pydreo] oscangle reported: 120
2024-03-17 16:37:40.638 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:40.638 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:40.638 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:40.638 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:40.638 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:43.807 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-03-17 16:37:43.807 DEBUG (DreoWebSocketStream) [pydreo] {Living Room}: got {{'method': 'report', 'devicesn': '1643940769442639873-65e50fbd10551564:001:0000000000w', 'messageid': '50956fb7-ba21-40e8-a550-539b3c7bf31a', 'timestamp':<PHONE_NUMBER>, 'reported': {'oscangle': 90}}} message **
2024-03-17 16:37:43.808 DEBUG (DreoWebSocketStream) [pydreo] PyDreoHeater:handle_server_update(Living Room): {'method': 'report', 'devicesn': '1643940769442639873-65e50fbd10551564:001:0000000000w', 'messageid': '50956fb7-ba21-40e8-a550-539b3c7bf31a', 'timestamp':<PHONE_NUMBER>, 'reported': {'oscangle': 90}}
2024-03-17 16:37:43.808 INFO (DreoWebSocketStream) [pydreo] oscangle reported: 90
2024-03-17 16:37:43.832 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:43.832 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:43.832 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:43.832 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:43.832 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:46.244 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-03-17 16:37:46.244 DEBUG (DreoWebSocketStream) [pydreo] {Living Room}: got {{'method': 'report', 'devicesn': '1643940769442639873-65e50fbd10551564:001:0000000000w', 'messageid': 'a994967e-55e9-4520-8989-b9e10b562e92', 'timestamp':<PHONE_NUMBER>, 'reported': {'oscangle': 60}}} message **
2024-03-17 16:37:46.244 DEBUG (DreoWebSocketStream) [pydreo] PyDreoHeater:handle_server_update(Living Room): {'method': 'report', 'devicesn': '1643940769442639873-65e50fbd10551564:001:0000000000w', 'messageid': 'a994967e-55e9-4520-8989-b9e10b562e92', 'timestamp':<PHONE_NUMBER>, 'reported': {'oscangle': 60}}
2024-03-17 16:37:46.244 INFO (DreoWebSocketStream) [pydreo] oscangle reported: 60
2024-03-17 16:37:46.351 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:46.351 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:46.351 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:46.351 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:46.351 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:48.559 DEBUG (DreoWebSocketStream) [pydreo] CommandTransport::_ws_consumer_handler - got message
2024-03-17 16:37:48.559 DEBUG (DreoWebSocketStream) [pydreo] {Living Room}: got {{'method': 'report', 'devicesn': '1643940769442639873-65e50fbd10551564:001:0000000000w', 'messageid': 'da8b686d-cef7-4071-a304-d89dda4ba986', 'timestamp':<PHONE_NUMBER>, 'reported': {'oscangle': 0}}} message **
2024-03-17 16:37:48.559 DEBUG (DreoWebSocketStream) [pydreo] PyDreoHeater:handle_server_update(Living Room): {'method': 'report', 'devicesn': '1643940769442639873-65e50fbd10551564:001:0000000000w', 'messageid': 'da8b686d-cef7-4071-a304-d89dda4ba986', 'timestamp':<PHONE_NUMBER>, 'reported': {'oscangle': 0}}
2024-03-17 16:37:48.559 INFO (DreoWebSocketStream) [pydreo] oscangle reported: 0
2024-03-17 16:37:48.638 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:48.638 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:48.638 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:48.638 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on
2024-03-17 16:37:48.638 DEBUG (MainThread) [dreo] DreoSwitchHA:is_on

OK, thanks. The master branch doesn't have fixes for the oscangle, whereas the oscangle branch does, so I'm not surprised it doesn't show up with the master branch. The good news is that the correct parameter - oscangle - is what I'm using, so when you do get to see the oscillation angles in "swing mode", you should be able to set them.
So we have to figure out why you're not seeing them if you're using the oscangle branch. Any chance you could download the code from that branch and test with it? The URL is https://github.com/andy-cooper/hass-dreo/tree/oscangle - note the "oscangle" in the URL name.

@andy-cooper - I don't see a PR for your OscAngle branch; is that forthcoming?  Also, I went ahead and published a new release with the latest from main.
Lastly, @andy-cooper - Can I make you a contributor to this repo so you can approve PRs and such?  If you want to reach me, you can find me at @jeffstei on discord.

Hi @JeffSteinbok - I was working off of the fork because I wanted to try to get things going with a quick test/re-test cycle, so hadn't gotten a PR to main together as yet. That's because a lot of what I'm doing w.r.t. the wall-mounted fans is a bit of guesswork and experimentation because I don't have one.
Regarding being a contributor - of course; that's entirely your prerogative, and I'd be quite happy to approve PRs and such. I think I still have a discord account, but don't generally use it - I'll take a look and see what it is :).
Regarding PRs - let me put one together for the latest changes I have on the branch.

Thanks - I may have to pull back 0.6.3 because as soon as I moved to it, I lost my horizontal/vertical angle controls.  Does it need your update that's not in main yet?
I hardly ever use discord, let me check out the Discussion feature on GitHub, see if it works.
From: andy-cooper @.>
Sent: Sunday, March 17, 2024 7:27 PM
To: JeffSteinbok/hass-dreo @.>
Cc: Jeff Steinbok @.>; Mention @.>
Subject: Re: [JeffSteinbok/hass-dreo] Dreo wall mounted heater DR-HSH009S (Issue #62)
Hi @JeffSteinbokhttps://github.com/JeffSteinbok - I was working off of the fork because I wanted to try to get things going with a quick test/re-test cycle, so hadn't gotten a PR to main together as yet. That's because a lot of what I'm doing w.r.t. the wall-mounted fans is a bit of guesswork and experimentation because I don't have one.
Regarding being a contributor - of course; that's entirely your prerogative, and I'd be quite happy to approve PRs and such. I think I still have a discord account, but don't generally use it - I'll take a look and see what it is :).
Regarding PRs - let me put one together for the latest changes I have on the branch.

Reply to this email directly, view it on GitHubhttps://github.com/JeffSteinbok/hass-dreo/issues/62#issuecomment-2002762554, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ABX5XT3PVJUPP6SQKD5PTXDYYZGF3AVCNFSM6AAAAAA6MYNG3WVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDAMBSG43DENJVGQ.
You are receiving this because you were mentioned.Message ID<EMAIL_ADDRESS>

Ohhh - that's bad, sorry! It's possible that it's because of 3 lines of code that I added to deal with a deprecation warning that came in 2024.2 - https://github.com/JeffSteinbok/hass-dreo/pull/77/commits/0e2347b747feb2564d6c2779eed8ad94bd963fff#diff-bf878eff7e3e02ed865b7bcdd74c96686fb2538e83fc72fa8a07c96452bea210R201
but I'm not sure if that's in the release or not, it's been a few weeks since I looked at it.
I've made a PR with all of the latest changes that I've made to my fork's branch - LOL, I see you just merged it.
Test with that before a release to see if that solves the issue.

Where did you see the deprecation warning?
I've been so swamped with work recently I haven't had time to play with this.
From: andy-cooper @.>
Sent: Sunday, March 17, 2024 7:39 PM
To: JeffSteinbok/hass-dreo @.>
Cc: Jeff Steinbok @.>; Mention @.>
Subject: Re: [JeffSteinbok/hass-dreo] Dreo wall mounted heater DR-HSH009S (Issue #62)
Ohhh - that's bad, sorry! It's possible that it's because of 3 lines of code that I added to deal with a deprecation warning that came in 2024.2 - 0e2347b#diff-bf878eff7e3e02ed865b7bcdd74c96686fb2538e83fc72fa8a07c96452bea210R201https://github.com/JeffSteinbok/hass-dreo/commit/0e2347b747feb2564d6c2779eed8ad94bd963fff#diff-bf878eff7e3e02ed865b7bcdd74c96686fb2538e83fc72fa8a07c96452bea210R201
but I'm not sure if that's in the release or not, it's been a few weeks since I looked at it.
I've made a PR with all of the latest changes that I've made to my fork's branch - LOL, I see you just merged it.
Test with that before a release to see if that solves the issue.

Reply to this email directly, view it on GitHubhttps://github.com/JeffSteinbok/hass-dreo/issues/62#issuecomment-2002771306, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ABX5XTZT5GQHMNMWKXUS33LYYZHTTAVCNFSM6AAAAAA6MYNG3WVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDAMBSG43TCMZQGY.
You are receiving this because you were mentioned.Message ID<EMAIL_ADDRESS>

https://developers.home-assistant.io/blog/2024/01/24/climate-climateentityfeatures-expanded/
I found that after I saw the deprecation warning in the HA core log.

Should be working in latest release.

@andy-cooper - I'm pretty sure the WH model nubmers aren't what's in the JSON and they should be fixed to prefix with DR instead.  Can you have a look at models.py?

@JeffSteinbok - if I recall correctly, the WH model numbers were added for people who had those and were reporting them in issues. I only have the DR-HSH004S, so can't really check too much what the JSON contains. Let me look and see what I can find ...

So it's possible that those were put in as an attempt to get WH719S, WH729S and WH739S working, but those may well be reported as a DR-HSH009S or DRHSH009AS. That said - see above https://github.com/JeffSteinbok/hass-dreo/issues/62#issuecomment-1936847858 where @pringleprng has a WH739S. Perhaps we can get a JSON from them?


Spaces in a query parameter are not taken into account

Expected Behavior
When typing a string that contains spaces as the value of a query parameter, it is expected that the string is exactly what has been typed in.
For example, if the query parameter is used to pass a geographical address to the API method and I type the following address:

Rue de la Rigourdière, 35510 Cesson-Sévigné

Then it is expected that the value of the query parameter is this address:

Actual Behavior
However it is not the current behaviour: spaces are not taken into account and the query parameter value looks like the print screen below after typing all the characters on the keyboard:

One has to either go back/up into the string using the mouse pointer and/or using the backspace key multiple times in order to make Insomnia accept one single space. Which is pretty annoying.
This behaviour appeared recently but could be observed at least in the previous release.
Reproduction Steps

Add a query parameter
Type a string that contains spaces
Confirm that all spaces are missing from the string

Is there an existing issue for this?

[X] I have searched the issue tracker for this problem.

Additional Information
Insomnia Help information:

Version: Insomnia 10.1.0
Build date: 16/10/2024
OS: Windows_NT x64 10.0.19045
Electron: 31.4.0
Node: 20.16.0
Node ABI: 125
V8: <IP_ADDRESS>-electron.0
Architecture: x64

Windows System information:

Edition: Windows 10 Entreprise
Version: 22H2
Installed: 05/05/2022
Build: 19045.4894
Windows Feature Experience Pack 1000.19060.1000.0

Insomnia Version
10.1.0
What operating system are you using?
Windows
Operating System Version
Windows_NT x64 10.0.19045
Installation method
Download from insomnia.rest
Last Known Working Insomnia version
No response

I'm facing the same issue after update. This is a serious bug which is hampering much. Please fix the issue.

Here same, OS: Manjaro Linux x86_64,  GNOME 47.2.
Insomnia version: 10.2.0

Still here on arch / Endevouros with KDE Plasma

It seems related to #7739


Typescript support - FormData type errors persist!

I'm still running into this problem...
node_modules/mailgun.js/dist/index.d.ts(5,51): error TS2749: 'FormData' refers to a value, but is being used as a
type here. Did you mean 'typeof FormData'?
node_modules/mailgun.js/dist/lib/client.d.ts(30,69): error TS2304: Cannot find name 'FormData'.
node_modules/mailgun.js/dist/lib/request.d.ts(13,62): error TS2304: Cannot find name 'FormData'.
node_modules/mailgun.js/dist/lib/request.d.ts(23,32): error TS2304: Cannot find name 'FormData'.

I saw some past issues in Github about FormData error like this, but didn't manage to find any steps to help me resolve this issue.  These are my versions...
  "dependencies": {
   ...
    "form-data": "^4.0.0",
    "mailgun.js": "^3.4.0",
  },
  "devDependencies": {
    ...
    "@types/form-data": "^2.5.0",
    "@types/node": "^14.17.3",
    "typescript": "^4.3.2"
  },

and my usage is pretty typical (but let me know if you need a code example).
Any help appreciated.  Right now I'm hacking files in Mailgun's /dist folder; but that's not a long term solution.  My clients are even asking if we should move away from Mailgun.

We're having the same problem. This was reported a long time ago in #113 and they closed the issue with #135 , but as several people have pointed in the issue's comments the error wasn't fixed. We too are considering moving away from Mailgun since we're stuck on a version with a vulnerable dependency.

Hello.
I published a new version 3.4.1.
These changes should fix an issue with the incompatible formData interface.
Please, let me know If the new version won't fix an issue for you.

@olexandr-mazepa this fixes the FormData errors, thanks!
We're still waiting for #150 to be implemented, otherwise we can't switch to this library.


Deploy to staging github action broken with updated action version

https://github.com/Flagsmith/edge-proxy/actions/runs/8065487035/job/22031385021#step:3:28

SSE moved here: https://github.com/Flagsmith/flagsmith-sse

This action is still broken tho?

This action is still broken tho?

That workflow file does not exist any more


Add natural earth provinces

Added States/Provinces for all countries, expanding from just US states.
I added the following to regionmask/regionmask/defined_regions/natural_earth.py
    @property
    def states_provinces_10(self):
        if self._states_provinces_10 is None:
            opt = dict(
                resolution="10m",
                category="cultural",
                name="admin_1_states_provinces",
                title="Natural Earth States/Provinces: 10m"
            )

            self._states_provinces_10 = _obtain_ne(**opt)
        return self._states_provinces_10

These shapefiles had some Nonetype values in the abbreviations metadata which threw errors for me so I just added this line to regionmask/regionmask/core/regions.py. I don't think it's the best way to fix this, but it shouldn't affect the behavior of anything else and I wasn't sure how else to do it:
abbrevs = ['None' if abbr is None else abbr for abbr in self.abbrevs]
abbrevs = " ".join(abbrevs)

Codecov Report

Merging #94 into master will decrease coverage by 0.32%.
The diff coverage is 25%.

@@            Coverage Diff             @@
##           master      #94      +/-   ##
==========================================
- Coverage   99.14%   98.81%   -0.33%
==========================================
  Files          19       19
  Lines        1517     1524       +7
==========================================
+ Hits         1504     1506       +2
- Misses         13       18       +5

Impacted Files
Coverage Δ

regionmask/core/regions.py
92.3% <0%> (-0.6%)
:arrow_down:

regionmask/defined_regions/natural_earth.py
94.5% <33.33%> (-4.32%)
:arrow_down:

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update ab09990...54f2beb. Read the comment docs.

This is my first time working with Codecov and writing a test... I think I added an appropriate test? How do I get Codecov to recompute?

Thanks for the PR! There are some things missing. Should not be too much work I hope. Let me know if you need help with anything.

[ ] The abbreviations should probably not be None. They are also used for selection and labelling. Could you undo this part of the PR. We could either use the name or "r{number}", or drop the ones that have no abbreviation. I'll have a look and will let you know. Or maybe you have an opinion?
It might be a good idea to relax this constraint, but this is for another PR ;)

[ ] I would also like to address #95 first.

[x] The codecov conditions are quite strict. Don't worry about that.

[ ] It would also be nice if you could add the States/ Provinces with resolution "50m"

[ ] Could you add a test in: https://github.com/mathause/regionmask/blob/master/regionmask/test/test_defined_regions.py

[ ] Could you give yourself credit in: https://github.com/mathause/regionmask/blob/master/docs/whats_new.rst

[ ] Also some docs in: https://github.com/mathause/regionmask/blob/master/docs/defined_countries.rst. Add the "States/ Provinces" to the list at the beginning and the following example (add both before the "US States"):

States/ Provinces
=================

.. ipython:: python

    states_provinces = regionmask.defined_regions.natural_earth.states_provinces_50 # or 10 if you don't add these

    states_provinces.plot(add_label=False);

    @savefig plotting_states_provinces.png width=6in
    plt.tight_layout()

Ok, #95 is fixed - could you please merge master.
I also checked the 50m states/provinces. They only include some countries (US/ Canada/ Australia, ...) so I think it does not make sense to include them.
What I just realised - there are 97 of duplicate names:
from cartopy.io import shapereader
import geopandas

resolution="10m"
category="cultural"
name="admin_1_states_provinces"
shpfilename = shapereader.natural_earth(resolution, category, name)
df = geopandas.read_file(shpfilename, encoding='utf-8')

d = df["name"]
d.loc[d.duplicated()]

or
d.loc[d.duplicated()].unique()

I am not so sure what to do with those :|


adding ca-certificate type, optional for redis, mysql, postgresql

To support BC compliance we'll need to turn on TLS for postgresql again. Once on, the client will need it and the same is true for Redis and mysql. I made this an optional field so it's backwards-compat.
resolves: https://github.com/massdriver-cloud/massdriver/issues/1435

Some thoughts after reviewing this:
There might be a mix-up here between the certificate authority (CA), and the actual certificate (Cert) itself.  It looks like what you're adding to the artifact is the certificate authority info, but some of the field descriptions imply that the certificate is for "connecting".  I believe the CA belongs to the server and is used to generate (and renew) the actual certificate, which the client also needs.  The certificate encrypts the connection, and the CA cert will protect against MitM attacks.
Have you been able to get one of these DBs to work connecting as a client using SSL? I think that should probably be the first step so we fully understand what the client needs, since that will inform what data goes into the artifact.

Some thoughts after reviewing this:
There might be a mix-up here between the certificate authority (CA), and the actual certificate (Cert) itself. It looks like what you're adding to the artifact is the certificate authority info, but some of the field descriptions imply that the certificate is for "connecting". I believe the CA belongs to the server and is used to generate (and renew) the actual certificate, which the client also needs. The certificate encrypts the connection, and the CA cert will validate the authenticity of the actual cert to protect against MitM attacks.
Have you been able to get one of these DBs to work connecting as a client using SSL? I think that should probably be the first step so we fully understand what the client needs, since that will inform what data goes into the artifact.

TL;DR sounds like we're punting, but I think you make some good points.
First good point on naming. "CA cert" is probably confusing, since those are two things. I was using the Terraform attribute name (server_ca_cert) but between the CA and the cert, it's the cert. The docs have slightly different fields but here are links to the attributes I'd use if we do this in the future.

SQL / PostgresQL - docs
Redis - docs


OCPBUGS-25894: operator: stop removing kube-apiserver-slos asset

It was dropped in 4.12.z and triggers audit log errors

/cherrypick release-4.15

/jira refresh

/lgtm

/lgtm


[Fix][Carthage] Remove Submodules file

Hello,
Since the commit b49959c646fcac567a4b0cfe87dad7b14b343300, this is not working for carthage anymore.
I got the error: "Parse error: expected submodule commit SHA in output of task (ls-tree -z 9c413d35c3b0f14dd2a817c866415afd9a40e4db Carthage/Checkouts/RxSwift) but encountered: "
After some research, apparently, it's because the submodules have been removed.
https://github.com/Carthage/Carthage/issues/135
So, removing the .gitmodules file should do the job.

Thanks a lot for contributing! I've invited you to join the RxSwiftCommunity GitHub organization – no pressure to accept! If you'd like more information on what that means, check out our contributor guidelines and feel free to reach out with any questions.


rook hostpath to blockdevice

What type of PR is this?

What this PR does / why we need it:
This PR adds a kurl binary to move from hostpath-based rook installations to purely osd-based rook.
Which issue(s) this PR fixes:

Fixes #
Special notes for your reviewer:

Steps to reproduce

Does this PR introduce a user-facing change?

NONE

This is a component of a larger set of changes, and will need release notes once all of those are in.
While moving from hostpath to osd-based storage is a requirement for a rook 1.0 to 1.4+ migration, it is not sufficient on its own.
Does this PR require documentation?


libcurl3

ATLAS requires libcurl3, but libcurl4 is current with Ubuntu. Error messages  occur in ARK Server Tools when using libcurl3 and error messages occur in ATLAS Server Tools when using libcurl4.
Most likely this is due to the version of Unreal Engine (4.5) ATLAS is currently developed under.

This seems to have been corrected in recent updates. Closing topic.


update the URL in the README to point to my game

@sujinecho Please review thanks

:shipit:

/play secret

Sound doesn't work...

Seems like an addon called campfire is needed


A little work in the formatting.

I tried to submit the list to the main Awesome repository but there is some fine tuning that we need to do in order to be added. I just made a few changes. I left untouched the icons but that is your call if you like to remove it. I will continue looking for more awesome material about TypeScript.
Regards,
Jaime

Hi @jamesxv7,
Thank you for your pull request!
In fact, when I read their contributing and formatting guide which is on 80% nonsence (just IMO), my first thought was: "No way I will ever do anything to add this repo there".
And it's not true that:

JavaScript in TypeScript. Inspired by the awesome lists.

In fact, I was inspired by awesme-javascript and awesome-backbone and awesome-awesomeness...
On the other hand, I apreciate the work you have done for this repo.
Thank you for your contribution.
Merged!

Thanks for the openness @dzharii and for the merge. Just for my information, when you said you were inspired by awesome-javascript, awesome-backbone and awesome-awesomeness did you refers to the following repositories:

awesome-awesomes
awesome-javascript
awesome-backbone

I understand that would be ideal to also include that has been inspired by awesome-awesomes list. I can work that on the next PR.
Being added to the awesome-awesomes list or sindresorhus/awesome lists will greatly help give visibility to TypeScript. In my opinion TS is a great piece of technology and everybody should give it a try, even in these early development stages.

Thank you, @jamesxv7,
Yes, thoose are the repositories I ment ;) I would apreciate if you prepare a pull request with those and other things you are willing to submit.
For instance, backbone is very related to typescript, just because it has a good architecture without any "magic", so that it has a really good TypeScript declaration file on DefinitelyTyped.
The same thing for d3.js.
On the other hand... we cannot add everything that is on DefinitelyTyped...

just some :cherries:-pick


replace Avahi with ZeroConf for cross platform;add fake LED for testing

Use zeroconf instead of avahi to avoid the need to install additional Linux dependencies and to facilitate the use of this library on Windows.
Add a fake_onoff_led example to facilitate debugging without hardware dependencies.

Neat! Thank you!
Please run pre-commit to get the nitpicky things fixed for you.

I noticed that the CI fails because the following two files are missing copyright information.
Error: # MISSING COPYRIGHT AND LICENSING INFORMATION

The following files have no copyright and licensing information:
* circuitmatter/clusters/measurement/temperature_measurement.py
* circuitmatter/device_types/sensor/temperature_sensor.py

But they were not introduced by my code, but from this commit.
Should I simply add the following statement in front of these two files to pass the CI?
# SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries
#
# SPDX-License-Identifier: MIT

Should I simply add the following statement in front of these two files to pass the CI?

Lets wait for #26 because I think it'll fix that error.

Should I simply add the following statement in front of these two files to pass the CI?

Lets wait for #26 because I think it'll fix that error.

#26 is merged.

@ihidchaos Any news?

@ihidchaos Any news?

I found some problems in the test on Windows, and I need to modify and test it again. The completion time is to be determined, and I have marked it as a draft.

@ihidchaos Any news?

I found some problems in the test on Windows, and I need to modify and test it again. The completion time is to be determined, and I have marked it as a draft.

Did you try using codespacesas a workaround?

@ihidchaos Any news?

I found some problems in the test on Windows, and I need to modify and test it again. The completion time is to be determined, and I have marked it as a draft.

Did you try using codespaces as a workaround?

Sorry, after some investigation this is not a Windows platform issue. In fact I found it so difficult to use the python zeroconf library for subtype mdns broadcasts that I decided to give up.


what is sass? sass is a assembled language?

Hi, I read the code and think the core for accelerating the rate of computing is depended on  the sass files.
But, its codes is a new thing for me? whether sass is a programming language? Is there a tutorial for this language?
And, whether it likes the assembly language which is related to the cpu types?

Yes many of our performance-critical GPU kernels are written in SASS rather than CUDA C. SASS is the assembly code which runs on NVIDIA GPUs. We use an assembler for the Maxwell/Pascal architecture in particular which was written by Scott Gray. There are some tutorials and explanations on the github page: https://github.com/NervanaSystems/maxas


Remember feature and Strong Session

As far as I can see here, the remember feature is not compatible with strong session. Also, behavior confirmed in my projects. I need to use basic instead.
https://github.com/miguelgrinberg/flasky/blob/master/app/auth/views.py#L35
https://github.com/miguelgrinberg/flasky/blob/9bcab0e17504629b4bfe7ca557f1fc44d920f767/app/__init__.py#L17

This is unfortunate but correct.
The version of Flask-Login that I used back when I wrote the application for the book was 0.2.9, and in this release the use of strong session protection along with the remember me cookie worked, by having the remember me setting take precedence over the strong session protection check when present. That functionality broke in later versions of Flask-Login, and the author believes strong sessions and remember me should not be used together anyway, so he has not accepted the request to restore this functionality to the way it was in 0.2.9.
I guess I should change the strong session setting to basic in the code, to avoid any confusions.

Closing this issue, as it does not apply to the second edition of the book.


Stalled data after executing (nested) mutation

I faced stalled data after executing a nested mutation in the last week. As discussed in this forum post, I execute a nested mutation and try to load a fresh copy afterwards.
const result = await context.db.mutation.updateInvitation({
    data: {
        status: "ACCEPTED",
        user: {
        create: {
            username: args.data.username,
            password,
            salt,
            emailAddresses: {
            create: {
                primary: true,
                address: args.data.email,
                status: "PENDING",
                verificationCode: createVerificationCode()
            }
            }
        }
        }
    },
    where: {
        id: invitation.id
    }
});

const user = await context.db.query.user({
    where: {
        username: args.data.username
    }
});

The user object is always null. Please note that this is just one scenario. It is basically transferable to each case where you mutate data and try to load it afterwards.
After some digging, I just disabled the cache mechanism of the dataloader completely by passing {cache: false} to the instantiation: https://github.com/graphcool/http-link-dataloader/blob/325217908a6b799246b648f16c9170c2d4c5628a/src/BatchedGraphQLClient.ts#L17 – This leads to a correct result, but isn't a proper solution for a production environment. I would love to hear your thoughts on establishing a different caching behaviour, like clearing the cache after executing a mutation, etc. What do you think? :)
Reference: https://github.com/facebook/dataloader#clearing-cache
Edit:
Some notes about how I disabled the cache in dataloader. I edited the node_modules/http-link-dataloader/dist/src/BatchedGraphQLClient.js directly in order to check if disabling the cache fixed my problem – what it did. You have to change the line
this.dataloader = new DataLoader(this.load);

to
this.dataloader = new DataLoader(this.load, { cache: false });

@akoenig I'm looking to test your workaround in my app, but am struggling to find where the DataLoader is instantiated.
Did you make this change in your node_modules?

@hoodsy Ya, had to mention that in the original description. Yes, I edited node_modules/http-link-dataloader/dist/src/BatchedGraphQLClient.js and changed the line
this.dataloader = new DataLoader(this.load);

to
this.dataloader = new DataLoader(this.load, { cache: false });

Data loader is supposed to be used on a per request basis. This is from the docs:

Typically, DataLoader instances are created when a Request begins, and are not used once the Request ends.

So let's see where http-link-dataloader is using it. Aha. in the constructor of BatchedGraphQLClient: (thanks @akoenig  👍 )
https://github.com/graphcool/http-link-dataloader/blob/a3cd49cae6772945d711bef5967036d8cecce0af/src/BatchedGraphQLClient.ts#L17
which is created once in the constructor of a HTTPLinkDataLoader (which is an ApolloLink)

And in the docs here it says:

That means if you don't want to cache anymore, just create a new instance of BatchedHTTPLink.  A good fit for this is every incoming HTTP request in a server environment - on each new HTTP request a new BatchedHTTPLink instance is created.

So the consumer of this HTTPLinkDataloader should create it on every request.
Let's take a look at the code in prisma-binding:
 const httpLink = new HTTPLinkDataloader({
    uri: endpoint,
    headers: { Authorization: `Bearer ${token}` },
  })

This piece of code is invoked exactly once.  In the constructor of the Prisma-binding instance.
AFAIK this constructor is usually is supposed to be invoked once, too, and not on a per request basis as suggested here. (its the public interface of prisma-binding). Is that correct?
This was just a short paperchase trough the repos, but is it correct that prisma-binding is using only one instance of http-link-dataloader, which is using only one instance of data-loader that is caching everything or did i miss something?

Anyone know how to implement this workaround in a deployed environment? It's difficult to access node_modules outside of dev.

For those looking for an interim workaround, as discussed here:
// instead of this
ctx.db.query.posts({...})
// use this
getPrismaLink().query.posts({...})

// create a new prisma binding instance on demand
export const getPrismaLink = (debug: boolean = false): Prisma => new Prisma({
  endpoint: requiredEnvVars.PRISMA_ENDPOINT
  secret: requiredEnvVars.PRISMA_SECRET,
  debug: debug
})

this doesn't seem to work with my deployed endpoint

hm, hitting this problem too on simple mutations w/ connect args. @timsuchanek  is this an issue w/ http-link-dataloader  ? will rolling back to a previous version of prisma-binding help here?
the solution @nickluger  posted doesn't work in my case.
I run this query to retrieve user to check authorization:
const getPrismaLink = (): Prisma =>
   new Prisma({
        endpoint: process.env.PRISMA_ENDPOINT,
        secret: process.env.PRISMA_SECRET,
        debug: true
    });

const QUERY = `{
    id
    email
    purchases {
        item {
            somethingElse {
                id
            }
        }
    }
 }`

const user = getPrismaLink().query.user({ where: { id: 'some-user-id' } }, QUERY)

But when I create new a new purchaseRecord via this mutation, the record doesn't show up under user.purchases until I restart the server:
const newPurchaseId = await ctx.db.mutation.createPurchaseRecord(
            {
                data: {
                    pricePaid: storeItem.price,
                    user: { connect: { id: userId } },
                    item: { connect: { id: storeItemId } }
                }
            },
            '{ id }'
        );

I haven't tried killing the caching in http-link-dataloader b/c i don't want to mess w/ node_modules yet. hoping there's another solution!

👍 I'm also experiencing this issue. Using @nickluger's solution doesn't work - I have to modify node_modules to set caching to false.

I'm using nick's solution and it works – although without any caching, my app makes a number of duplicate requests

Had this same issue after updating, rolled back my package.json to the previous version and it fixed it. Currently using<EMAIL_ADDRESS><EMAIL_ADDRESS>and<EMAIL_ADDRESS>

Thanks for reporting everybody! The cache is now disabled by default in the DataLoader to prevent these cases.
If you still want the caching activated, you can provide the cacheResults: true to the options of the HttpLink.
Prisma Binding 1.5.15 includes this fix.


Files Constant Crashes

Description
Files crashes either on right click, or when previewing file. Closes itself. Needs to be reopend.
Steps To Reproduce

Open files
Activate columns layout
Toggle the Info Panel on (Preview Mode)
Navigate to a file PDF or PPT file located 3 or 4 levels down, starting from the parent folder.

Requirements
Files should not timeout during navigation.
Files Version
<IP_ADDRESS>
Windows Version
10.0.19045.4894
Log File
debug.log

Thank you, a fix for right clicking will be included in the next release.

Thank you for the report, we're tracking this issue in #16193.


Integrate support for GitHub comments

The theme supports disqus comments by default. There are several threads around with different solutions to use alternatives.
One interesting alternative when a site is hosted on GitHub is to use GitHub issues to store a post's comments. This repository has an implementation that includes git hooks to create the issue for a post when the post gets pushed.
The proposal here is to add support for GitHub comments to this theme. This would involve

Integrating code from the above linked repository. There may be some cleanup involved to fix the directory structure and the formatting.
Modify the _config.yml so that the user can select between disqus, github or no comment. Each option may have additional specific options.

I'd be happy to help implement this. But I wanted to get your feedback before embarking on this...

Looks cool. Do you know if there's a way for "guests" to add comments without having to login in with a GitHub account?

From what I saw, it seems to limit commenting to people who have a github account. So this would probably not fit all audiences. On the other hand, it acts as a kind of spam filter...

This would be quite useful

:+1: I would be interested in this feature too.


[WMPC] New object type Workload Management Process Classes

We should put an AFF Example Object for WMPC into package TEST_AFF_EXAMPLES

I close this PR. No updates for more then one year.