Giter Club home page Giter Club logo

wiserhomeassistantplatform's People

Contributors

angrycamel avatar asantaga avatar charlesomer avatar choppedpork avatar djbanks avatar jchasey avatar lgo44 avatar markchalloner avatar michthom avatar msalway avatar msp1974 avatar phixion avatar psblah avatar technofreak74 avatar wrt54g avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wiserhomeassistantplatform's Issues

HomeAssistant Packaging

Once we have stability the following needs to be done to be able to package up as part of HA

  • WiserAPI needs to be deployed to Pypi
  • Requirements and dependencies set
  • Check for HA coding standards adherance

No 'boost' mode

Options for the room are 'Heat/Cool' and 'Auto'. Seem to be missing 'Boost'.

wiser.climate platform error on Hassio 0.96.2

The climate platform has been re-architected in V 0.96 of Home Assistant. Please see this link: https://developers.home-assistant.io/blog/2019/07/03/climate-cleanup.html

Unfortunately, this means that the climate platform no longer loads. This is the error in the log file:

2019-07-21 11:59:38 ERROR (MainThread) [homeassistant.setup] Unable to prepare setup for platform wiser.climate: Platform not found (cannot import name 'STATE_AUTO' from 'homeassistant.components.climate.const' (/usr/src/homeassistant/homeassistant/components/climate/const.py)).

I am running V 0.96.2 of HA and the lastest release of the wiser custom component.

Keep up the good work. Thanks.

Remove Custom Components support for 1.9

Remove custom components support for 1.9
Users should now

  1. Manual Update : Copy the wiser directory into the custom_components directory
  2. Use HACS (Home Assistant Component Store) - Recommended

setup not working for me - seems like JSON parse issue

Using latest release I get;
2018-11-30 18:43:51 ERROR (MainThread) [homeassistant.setup] Error during setup of component wiser
Traceback (most recent call last):
File "f:\python\homeassistant\lib\site-packages\homeassistant\setup.py", line 148, in _async_setup_component
component.setup, hass, processed_config) # type: ignore
File "C:\Users\spw\AppData\Local\Programs\Python\Python36-32\lib\concurrent\futures\thread.py", line 56, in run
result = self.fn(*self.args, **self.kwargs)
File "C:\Users\spw\AppData\Roaming.homeassistant\custom_components\wiser.py", line 44, in setup
hass.data[DATA_KEY] = WiserHubHandle(hubHost, password, scan_interval)
File "C:\Users\spw\AppData\Roaming.homeassistant\custom_components\wiser.py", line 63, in init
self.wiserHub=wiserHub.wiserHub(self.ip,self.secret)
File "C:\Users\spw\AppData\Roaming.homeassistant\custom_components\wiserAPI\wiserHub.py", line 29, in init
self.refreshData() # Issue first refresh in init
File "C:\Users\spw\AppData\Roaming.homeassistant\custom_components\wiserAPI\wiserHub.py", line 42, in refreshData
for valveId in smartValves:
TypeError: 'NoneType' object is not iterable

attached is the JSON dump obtained by doing a wireshark while HA was doing it's discovery.
wiser debug network trace2.txt

Give me feedback here!

Hey all,

Use this issue to comment, feedback etc to me about this component.

I created this issue/feedback thing because github doesnt have a way of sending emails/feedbacks to components anywhere.. Issues work!

Trouble with the new boost function

I love this Add-on, it is probably the thing that made me buy the Wiser system in the first place.

I love the new inclusion of boost but I can't get it to work. I get the following error:

Log Details (ERROR) Sun Jan 05 2020 16:34:04 GMT+0000 (Greenwich Mean Time) Error setting mode to error boost Traceback (most recent call last): File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 133, in handle_call_service connection.context(msg), File "/usr/src/homeassistant/homeassistant/core.py", line 1235, in async_call await asyncio.shield(self._execute_service(handler, service_call)) File "/usr/src/homeassistant/homeassistant/core.py", line 1260, in _execute_service await handler.func(service_call) File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 205, in handle_service self._platforms.values(), func, call, service_name, required_features File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 336, in entity_service_call future.result() # pop exception if have File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 358, in _handle_service_platform_call await getattr(entity, func)(**data) File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 421, in async_set_preset_mode await self.hass.async_add_executor_job(self.set_preset_mode, preset_mode) File "/usr/local/lib/python3.7/concurrent/futures/thread.py", line 57, in run result = self.fn(*self.args, **self.kwargs) File "/config/custom_components/wiser/climate.py", line 200, in set_preset_mode self.handler.set_room_mode(self.roomId, preset_mode, boost_temp, boost_time) File "/config/custom_components/wiser/__init__.py", line 157, in set_room_mode boost_time) File "/usr/local/lib/python3.7/site-packages/wiserHeatingAPI/wiserHub.py", line 328, in setRoomMode raise Exception("Error setting mode to error {} ".format(mode)) Exception: Error setting mode to error boost

And

Log Details (ERROR) Sun Jan 05 2020 16:48:31 GMT+0000 (Greenwich Mean Time) Set Room mode to boost resulted in 400

Thanks for any help you can offer, and keep up the awesome work!

Unable to start up platform

I get this error in log when I restart home assistant after configuring WiserHomeAssistant with HACS. I'm unable to add WiserHomeAssistant as an integration (apologies if something simple I'm new to HA). Thanks

Error while setting up platform wiser
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 158, in _async_setup_platform
await asyncio.wait_for(asyncio.shield(task), SLOW_SETUP_MAX_WAIT)
File "/usr/local/lib/python3.7/asyncio/tasks.py", line 442, in wait_for
return fut.result()
File "/usr/local/lib/python3.7/concurrent/futures/thread.py", line 57, in run
result = self.fn(*self.args, **self.kwargs)
File "/config/custom_components/wiser/climate.py", line 56, in setup_platform
handler.update()
File "/config/custom_components/wiser/init.py", line 106, in update
self.wiserHubInstance = wiserHub.wiserHub(self.ip, self.secret)
File "/usr/local/lib/python3.7/site-packages/wiserHeatingAPI/wiserHub.py", line 47, in init
self.refreshData() # Issue first refresh in init
File "/usr/local/lib/python3.7/site-packages/wiserHeatingAPI/wiserHub.py", line 87, in refreshData
self.hubIP), headers=self.headers, timeout=TIMEOUT).json()
File "/usr/local/lib/python3.7/site-packages/requests/models.py", line 897, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/local/lib/python3.7/site-packages/simplejson/init.py", line 525, in loads
return _default_decoder.decode(s)
File "/usr/local/lib/python3.7/site-packages/simplejson/decoder.py", line 370, in decode
obj, end = self.raw_decode(s)
File "/usr/local/lib/python3.7/site-packages/simplejson/decoder.py", line 400, in raw_decode
return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

lock after/during hub poll

I probably don't have enough information to help nail this down yet, but I'm happy to add debug if required:

Every so often, ie between once per day and once per week, my home assistant grinds to a halt. That is to say that is it running, but no longer /doing/ anything useful. A restart always fixes it, but it also blats the log. Today I saved the log before restarting.

The relevant section would seem to be here:

2020-01-08 11:20:30 INFO (SyncWorker_1) [custom_components.wiser] Skipping update (data already gotten within scan interval)
2020-01-08 11:21:01 INFO (SyncWorker_4) [custom_components.wiser] Update Requested
2020-01-08 11:21:01 INFO (SyncWorker_3) [custom_components.wiser] Update Requested
2020-01-08 11:21:01 INFO (SyncWorker_4) [custom_components.wiser] Scan Interval exceeeded, updating Wiser DataSet from hub
2020-01-08 11:21:01 INFO (SyncWorker_4) [wiserHeatingAPI.wiserHub] Updating Wiser Hub Data
2020-01-08 11:21:11 WARNING (MainThread) [homeassistant.helpers.entity] Update of switch.wiser_away_mode is taking over 10 seconds
2020-01-08 11:21:11 WARNING (MainThread) [homeassistant.helpers.entity] Update of sensor.wiser_hot_water is taking over 10 seconds
2020-01-08 11:21:25 INFO (SyncWorker_2) [custom_components.wiser] Update Requested
2020-01-08 11:21:31 WARNING (MainThread) [homeassistant.components.switch] Updating wiser switch took longer than the scheduled update interval 0:00:30
2020-01-08 11:21:31 WARNING (MainThread) [homeassistant.components.sensor] Updating wiser sensor took longer than the scheduled update interval 0:00:30
2020-01-08 11:21:35 WARNING (MainThread) [homeassistant.helpers.entity] Update of climate.wiser_upstairs_landing is taking over 10 seconds

From that point onwards no more data is received into HA from wiser, and no actions taken in HA effect the wiser config (ie trying to turn off away mode). The above messages about updates taking longer than the scheduled interval repeat.

Looking further down the logs, the 'infection' spreads to pretty much everything else around 6 hours later, ie at that point many other things fail to update in the scheduled update interval, and
the HA API is no longer responding to the gui.

Could the Hub update be failing and this component isn't handling it gracefully?

I'm happy to do stuff to help debug this if I can, the only thing that springs to mind right now is setting up a tcpdump to capture the Hub updates.

I'd really like to get to the bottom of this, your module is really useful and I'm grateful that you've taken the time to release it.

Add Boiler Percentage Demand in Climate

I would like to request that Boiler Percentage Demand is added as one of the available stats in the Climate element. I was using an OpenHAB Wiser component and it had percentage demand as an option.

I have had a play with it and identified the string that is needed:-

return self.handler.getHubData().getRoom(self.roomId).get("PercentageDemand")

Thank-you

Multiple warning messages with no TRV Valves

Runing HA 0.96.2 and the latest version of the master branch of the wiser custom component.

I am running the Smart Hub (with hot water control), I purchased 2 TRV Valves but have not yet taken them out of the box. Every 5 mins the following messages are logged in the HA log.

2019-07-21 11:59:57 WARNING (SyncWorker_18) [custom_components.wiser.wiserAPI.wiserHub] Room doesnt contain any smart valves, maybe an error/corruption??
2019-07-21 11:59:57 WARNING (SyncWorker_16) [custom_components.wiser.wiserAPI.wiserHub] Room doesnt contain any smart valves, maybe an error/corruption??

Problem setting away/home modes

Hiya, thanks for this component your work is very much appreciated.

Running Hassio 0.99.3 & wiser 1.5 via HACS, default setup with all kit reporting status correctly.

Having an issue setting away mode, see the following error:

"Failed to call service switch/turn_on. Error setting Home/Away, error {"Type":"Away","SetPoint":50}

Not too sure why it won't change the home/away status via simple switch click?

Setting away mode raises error but does work

Switching away mode causes the following error although it does change the mode.

If I can I'll try and see what's causing the issue.

Error setting Home/Away , error {"Type":"Away","SetPoint":120} Traceback (most recent call last): File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 133, in handle_call_service connection.context(msg), File "/usr/src/homeassistant/homeassistant/core.py", line 1235, in async_call await asyncio.shield(self._execute_service(handler, service_call)) File "/usr/src/homeassistant/homeassistant/core.py", line 1260, in _execute_service await handler.func(service_call) File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 205, in handle_service self._platforms.values(), func, call, service_name, required_features File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 336, in entity_service_call future.result() # pop exception if have File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 358, in _handle_service_platform_call await getattr(entity, func)(**data) File "/usr/local/lib/python3.7/concurrent/futures/thread.py", line 57, in run result = self.fn(*self.args, **self.kwargs) File "/config/custom_components/wiser/switch.py", line 64, in turn_on self.handler.set_away_mode(True, self.awayTemperature) File "/config/custom_components/wiser/__init__.py", line 163, in set_away_mode self.wiserHubInstance.setHomeAwayMode(mode, away_temperature) File "/usr/local/lib/python3.7/site-packages/wiserHeatingAPI/wiserHub.py", line 169, in setHomeAwayMode raise Exception("Error setting Home/Away , error {} ".format(self.response.text)) Exception: Error setting Home/Away , error {"Type":"Away","SetPoint":120} Failed to call service switch/turn_off. Error setting Home/Away , error {"Type":"None","SetPoint":0}

possible 1.9dev bug

reposted

testing 1.9dev

all my climate entries have gone missing after restart
error in log see below
tia
after about 30 minutes the climate entries did manage to populate
does not seam to error all the time - mostly errors are as below but sometimes other random errors
i have restarted the heat hub and hassio server a number of times

2020-02-05 17:18:54 INFO (SyncWorker_16) [wiserHeatingAPI.wiserHub] Updating Wiser Hub Data
2020-02-05 17:18:56 DEBUG (SyncWorker_16) [wiserHeatingAPI.wiserHub] Wiser Hub Data received {'System': {'PairingStatus': 'Paired', 'TimeZoneOffset': 0, 'AutomaticDaylightSaving': True, 'SystemMode': 'Heat', 'FotaEnabled': True, 'ValveProtectionEnabled': False, 'EcoModeEnabled': True, 'AwayModeAffectsHotWater': False, 'AwayModeSetPointLimit': 160, 'BoilerSettings': {'ControlType': 'HeatSourceType_RelayControlled', 'FuelType': 'Gas', 'CycleRate': 'CPH_6', 'OnOffHysteresis': 5}, 'CoolingModeDefaultSetpoint': 210, 'CoolingAwayModeSetpointLimit': 240, 'ComfortModeEnabled': True, 'PreheatTimeLimit': 10800, 'DegradedModeSetpointThreshold': 180, 'UnixTime': 1580923080, 'ActiveSystemVersion': '2.44.0-0b3fba4327', 'BrandName': 'WiserHeat', 'CloudConnectionStatus': 'Connected', 'LocalDateAndTime': {'Year': 2020, 'Month': 'February', 'Date': 5, 'Day': 'Wednesday', 'Time': 1718}, 'HeatingButtonOverrideState': 'Off', 'HotWaterButtonOverrideState': 'Off', 'OpenThermConnectionStatus': 'Disconnected'}, 'Cloud': {'Environment': 'Prod', 'DetailedPublishing': False, 'EnableDiagnosticTelemetry': False, 'WiserApiHost': 'api-nl.wiserair.com', 'BootStrapApiHost': 'bootstrap.gl.struxurewarecloud.com'}, 'HeatingChannel': [{'id': 1, 'Name': 'Channel-1', 'RoomIds': [1, 2, 4, 5, 6, 7, 8, 9, 10, 11], 'PercentageDemand': 100, 'DemandOnOffOutput': 'On', 'HeatingRelayState': 'On', 'IsSmartValvePreventingDemand': False}], 'HotWater': [{'id': 2, 'OverrideType': 'None', 'ScheduleId': 1000, 'Mode': 'Manual', 'ManualWaterHeatingState': 'Off', 'WaterHeatingState': 'Off', 'ScheduledWaterHeatingState': 'Off', 'HotWaterRelayState': 'Off', 'HotWaterDescription': 'FromManualMode'}], 'Room': [{'id': 1, 'ManualSetPoint': 190, 'ScheduleId': 1, 'ComfortModeScore': 409, 'HeatingRate': 1162, 'SmartValveIds': [2], 'Name': 'Mum bedroom', 'Mode': 'Auto', 'DemandType': 'Modulating', 'WindowDetectionActive': False, 'ControlSequenceOfOperation': 'HeatingOnly', 'HeatingType': 'HydronicRadiator', 'CalculatedTemperature': 196, 'CurrentSetPoint': 150, 'PercentageDemand': 0, 'ControlOutputState': 'Off', 'WindowState': 'Closed', 'SetpointOrigin': 'FromSchedule', 'DisplayedSetPoint': 150, 'ScheduledSetPoint': 150, 'RoundedAlexaTemperature': 195, 'ComfortTarget': 230, 'EffectiveMode': 'Auto', 'PercentageDemandForItrv': 0}, {'id': 2, 'ManualSetPoint': 150, 'ScheduleId': 2, 'ComfortModeScore': 963, 'HeatingRate': 1094, 'SmartValveIds': [8], 'Name': 'Mums bath room', 'Mode': 'Auto', 'DemandType': 'Modulating', 'WindowDetectionActive': False, 'ControlSequenceOfOperation': 'HeatingOnly', 'HeatingType': 'HydronicRadiator', 'CalculatedTemperature': 207, 'CurrentSetPoint': 150, 'PercentageDemand': 0, 'ControlOutputState': 'Off', 'WindowState': 'Closed', 'SetpointOrigin': 'FromSchedule', 'DisplayedSetPoint': 150, 'ScheduledSetPoint': 150, 'RoundedAlexaTemperature': 205, 'ComfortTarget': 220, 'EffectiveMode': 'Auto', 'PercentageDemandForItrv': 0}, {'id': 4, 'ManualSetPoint': 150, 'ScheduleId': 4, 'HeatingRate': 1200, 'SmartValveIds': [4], 'Name': 'Old kitchen', 'Mode': 'Auto', 'DemandType': 'Modulating', 'WindowDetectionActive': False, 'ControlSequenceOfOperation': 'HeatingOnly', 'HeatingType': 'HydronicRadiator', 'CalculatedTemperature': 206, 'CurrentSetPoint': 200, 'PercentageDemand': 0, 'ControlOutputState': 'Off', 'WindowState': 'Closed', 'SetpointOrigin': 'FromSchedule', 'DisplayedSetPoint': 200, 'ScheduledSetPoint': 200, 'RoundedAlexaTemperature': 205, 'EffectiveMode': 'Auto', 'PercentageDemandForItrv': 0}, {'id': 5, 'ManualSetPoint': 120, 'ScheduleId': 5, 'HeatingRate': 1200, 'SmartValveIds': [5], 'Name': 'Hall', 'Mode': 'Auto', 'DemandType': 'Modulating', 'WindowDetectionActive': False, 'ControlSequenceOfOperation': 'HeatingOnly', 'HeatingType': 'HydronicRadiator', 'CalculatedTemperature': 205, 'CurrentSetPoint': 190, 'PercentageDemand': 0, 'ControlOutputState': 'Off', 'WindowState': 'Closed', 'SetpointOrigin': 'FromSchedule', 'DisplayedSetPoint': 190, 'ScheduledSetPoint': 190, 'RoundedAlexaTemperature': 205, 'EffectiveMode': 'Auto', 'PercentageDemandForItrv': 0}, {'id': 6, 'ManualSetPoint': 150, 'ScheduleId': 6, 'ComfortModeScore': 6781, 'HeatingRate': 3731, 'RoomStatId': 3, 'SmartValveIds': [6], 'Name': 'Back room', 'Mode': 'Auto', 'DemandType': 'Modulating', 'WindowDetectionActive': False, 'ControlSequenceOfOperation': 'HeatingOnly', 'HeatingType': 'HydronicRadiator', 'CalculatedTemperature': 217, 'CurrentSetPoint': 225, 'PercentageDemand': 58, 'ControlOutputState': 'On', 'WindowState': 'Closed', 'SetpointOrigin': 'FromComfortMode', 'DisplayedSetPoint': 225, 'ScheduledSetPoint': 180, 'RoundedAlexaTemperature': 215, 'ComfortTarget': 225, 'EffectiveMode': 'Auto', 'PercentageDemandForItrv': 58}, {'id': 7, 'ManualSetPoint': 120, 'ScheduleId': 7, 'ComfortModeScore': 3231, 'HeatingRate': 2074, 'SmartValveIds': [7], 'Name': 'Front room', 'Mode': 'Auto', 'DemandType': 'Modulating', 'WindowDetectionActive': False, 'ControlSequenceOfOperation': 'HeatingOnly', 'HeatingType': 'HydronicRadiator', 'CalculatedTemperature': 236, 'CurrentSetPoint': 250, 'PercentageDemand': 100, 'ControlOutputState': 'On', 'WindowState': 'Closed', 'SetpointOrigin': 'FromSchedule', 'DisplayedSetPoint': 250, 'ScheduledSetPoint': 250, 'RoundedAlexaTemperature': 235, 'EffectiveMode': 'Auto', 'PercentageDemandForItrv': 100}, {'id': 8, 'ManualSetPoint': 100, 'ScheduleId': 8, 'ComfortModeScore': 1343, 'HeatingRate': 1080, 'SmartValveIds': [9], 'Name': 'Top floor', 'Mode': 'Manual', 'DemandType': 'Modulating', 'WindowDetectionActive': False, 'ControlSequenceOfOperation': 'HeatingOnly', 'HeatingType': 'HydronicRadiator', 'CalculatedTemperature': 129, 'CurrentSetPoint': 100, 'PercentageDemand': 0, 'ControlOutputState': 'Off', 'WindowState': 'Closed', 'SetpointOrigin': 'FromManualMode', 'DisplayedSetPoint': 100, 'ScheduledSetPoint': 180, 'RoundedAlexaTemperature': 130, 'EffectiveMode': 'Manual', 'PercentageDemandForItrv': 0}, {'id': 9, 'ManualSetPoint': 120, 'ScheduleId': 9, 'ComfortModeScore': 615, 'HeatingRate': 1564, 'SmartValveIds': [10], 'Name': 'Top bath room', 'Mode': 'Auto', 'DemandType': 'Modulating', 'WindowDetectionActive': False, 'ControlSequenceOfOperation': 'HeatingOnly', 'HeatingType': 'HydronicRadiator', 'CalculatedTemperature': 180, 'CurrentSetPoint': 170, 'PercentageDemand': 0, 'ControlOutputState': 'Off', 'WindowState': 'Closed', 'SetpointOrigin': 'FromSchedule', 'DisplayedSetPoint': 170, 'ScheduledSetPoint': 170, 'RoundedAlexaTemperature': 180, 'EffectiveMode': 'Auto', 'PercentageDemandForItrv': 0}, {'id': 10, 'ManualSetPoint': 150, 'ScheduleId': 10, 'ComfortModeScore': 2482, 'HeatingRate': 1828, 'SmartValveIds': [11], 'Name': 'Middle Toilet', 'Mode': 'Auto', 'DemandType': 'Modulating', 'WindowDetectionActive': False, 'ControlSequenceOfOperation': 'HeatingOnly', 'HeatingType': 'HydronicRadiator', 'CalculatedTemperature': 192, 'CurrentSetPoint': 170, 'PercentageDemand': 0, 'ControlOutputState': 'Off', 'WindowState': 'Closed', 'SetpointOrigin': 'FromSchedule', 'DisplayedSetPoint': 170, 'ScheduledSetPoint': 170, 'RoundedAlexaTemperature': 190, 'EffectiveMode': 'Auto', 'PercentageDemandForItrv': 0}, {'id': 11, 'ManualSetPoint': 150, 'ScheduleId': 11, 'ComfortModeScore': 310, 'HeatingRate': 1080, 'SmartValveIds': [12], 'Name': 'Back Bedroom', 'Mode': 'Auto', 'DemandType': 'Modulating', 'WindowDetectionActive': False, 'ControlSequenceOfOperation': 'HeatingOnly', 'HeatingType': 'HydronicRadiator', 'CalculatedTemperature': 186, 'CurrentSetPoint': 160, 'PercentageDemand': 0, 'ControlOutputState': 'Off', 'WindowState': 'Closed', 'SetpointOrigin': 'FromSchedule', 'DisplayedSetPoint': 160, 'ScheduledSetPoint': 160, 'RoundedAlexaTemperature': 185, 'EffectiveMode': 'Auto', 'PercentageDemandForItrv': 0}], 'Device': [{'id': 0, 'NodeId': 0, 'ProductType': 'Controller', 'ProductIdentifier': 'Controller', 'ActiveFirmwareVersion': '2.44.0', 'ModelIdentifier': 'WT724R1S0902', 'DeviceLockEnabled': False, 'DisplayedSignalStrength': 'VeryGood', 'ReceptionOfController': {'Rssi': -58}}, {'id': 3, 'NodeId': 11778, 'ProductType': 'RoomStat', 'ProductIdentifier': 'RoomStat', 'ActiveFirmwareVersion': '04E1000900042002', 'ModelIdentifier': 'Thermostat', 'HardwareVersion': '1', 'SerialNumber': '086BD7FFFEF573A9', 'ProductModel': 'Thermostat', 'OtaImageQueryCount': 0, 'LastOtaImageQueryCount': 1, 'ParentNodeId': 0, 'DeviceLockEnabled': False, 'DisplayedSignalStrength': 'Medium', 'BatteryVoltage': 30, 'BatteryLevel': 'Normal', 'ReceptionOfController': {'Rssi': -79, 'Lqi': 84}, 'ReceptionOfDevice': {'Rssi': -76, 'Lqi': 96}}, {'id': 2, 'NodeId': 38699, 'ProductType': 'iTRV', 'ProductIdentifier': 'iTRV', 'ActiveFirmwareVersion': '0201000000042002', 'ModelIdentifier': 'iTRV', 'HardwareVersion': '0', 'SerialNumber': 'CCCCCCFFFE7C8702', 'ProductModel': 'iTRV', 'OtaImageQueryCount': 0, 'LastOtaImageQueryCount': 1, 'ParentNodeId': 35505, 'DeviceLockEnabled': False, 'DisplayedSignalStrength': 'Medium', 'BatteryVoltage': 29, 'BatteryLevel': 'Normal', 'ReceptionOfController': {'Rssi': -73, 'Lqi': 108}, 'ReceptionOfDevice': {'Rssi': -81, 'Lqi': 76}}, {'id': 4, 'NodeId': 7613, 'ProductType': 'iTRV', 'ProductIdentifier': 'iTRV', 'ActiveFirmwareVersion': '0201000000042002', 'ModelIdentifier': 'iTRV', 'HardwareVersion': '0', 'SerialNumber': 'CCCCCCFFFE7FC0F5', 'ProductModel': 'iTRV', 'OtaImageQueryCount': 0, 'LastOtaImageQueryCount': 1, 'ParentNodeId': 0, 'DeviceLockEnabled': False, 'DisplayedSignalStrength': 'Medium', 'BatteryVoltage': 30, 'BatteryLevel': 'Normal', 'ReceptionOfController': {'Rssi': -71, 'Lqi': 116}, 'ReceptionOfDevice': {'Rssi': -71, 'Lqi': 116}}, {'id': 5, 'NodeId': 59042, 'ProductType': 'iTRV', 'ProductIdentifier': 'iTRV', 'ActiveFirmwareVersion': '0201000000042002', 'ModelIdentifier': 'iTRV', 'HardwareVersion': '0', 'SerialNumber': 'CCCCCCFFFE7FC0EE', 'ProductModel': 'iTRV', 'OtaImageQueryCount': 0, 'LastOtaImageQueryCount': 1, 'ParentNodeId': 0, 'DeviceLockEnabled': False, 'DisplayedSignalStrength': 'Medium', 'BatteryVoltage': 30, 'BatteryLevel': 'Normal', 'ReceptionOfController': {'Rssi': -75, 'Lqi': 100}, 'ReceptionOfDevice': {'Rssi': -75, 'Lqi': 100}}, {'id': 6, 'NodeId': 1914, 'ProductType': 'iTRV', 'ProductIdentifier': 'iTRV', 'ActiveFirmwareVersion': '0201000000042002', 'ModelIdentifier': 'iTRV', 'HardwareVersion': '0', 'SerialNumber': 'CCCCCCFFFE7C8E06', 'ProductModel': 'iTRV', 'OtaImageQueryCount': 0, 'LastOtaImageQueryCount': 1, 'ParentNodeId': 0, 'DeviceLockEnabled': False, 'DisplayedSignalStrength': 'Medium', 'BatteryVoltage': 30, 'BatteryLevel': 'Normal', 'ReceptionOfController': {'Rssi': -74, 'Lqi': 104}, 'ReceptionOfDevice': {'Rssi': -74, 'Lqi': 104}}, {'id': 7, 'NodeId': 35011, 'ProductType': 'iTRV', 'ProductIdentifier': 'iTRV', 'ActiveFirmwareVersion': '0201000000042002', 'ModelIdentifier': 'iTRV', 'HardwareVersion': '0', 'SerialNumber': '14B457FFFE769487', 'ProductModel': 'iTRV', 'OtaImageQueryCount': 0, 'LastOtaImageQueryCount': 1, 'ParentNodeId': 35505, 'DeviceLockEnabled': False, 'DisplayedSignalStrength': 'Medium', 'BatteryVoltage': 30, 'BatteryLevel': 'Normal', 'ReceptionOfController': {'Rssi': -77, 'Lqi': 92}, 'ReceptionOfDevice': {'Rssi': -81, 'Lqi': 76}}, {'id': 8, 'NodeId': 11320, 'ProductType': 'iTRV', 'ProductIdentifier': 'iTRV', 'ActiveFirmwareVersion': '0201000000042002', 'ModelIdentifier': 'iTRV', 'HardwareVersion': '0', 'SerialNumber': '086BD7FFFEF38BC3', 'ProductModel': 'iTRV', 'OtaImageQueryCount': 0, 'LastOtaImageQueryCount': 1, 'ParentNodeId': 35505, 'DeviceLockEnabled': False, 'DisplayedSignalStrength': 'Medium', 'BatteryVoltage': 30, 'BatteryLevel': 'Normal', 'ReceptionOfController': {'Rssi': -77, 'Lqi': 92}, 'ReceptionOfDevice': {'Rssi': -81, 'Lqi': 76}}, {'id': 9, 'NodeId': 5751, 'ProductType': 'iTRV', 'ProductIdentifier': 'iTRV', 'ActiveFirmwareVersion': '0201000000042002', 'ModelIdentifier': 'iTRV', 'HardwareVersion': '0', 'SerialNumber': 'CCCCCCFFFE7C7A11', 'ProductModel': 'iTRV', 'OtaImageQueryCount': 0, 'LastOtaImageQueryCount': 4, 'ParentNodeId': 0, 'DeviceLockEnabled': False, 'DisplayedSignalStrength': 'Good', 'BatteryVoltage': 30, 'BatteryLevel': 'Normal', 'ReceptionOfController': {'Rssi': -62, 'Lqi': 152}, 'ReceptionOfDevice': {'Rssi': -66, 'Lqi': 136}}, {'id': 10, 'NodeId': 39298, 'ProductType': 'iTRV', 'ProductIdentifier': 'iTRV', 'ActiveFirmwareVersion': '0201000000042002', 'ModelIdentifier': 'iTRV', 'HardwareVersion': '0', 'SerialNumber': 'CCCCCCFFFE7C767F', 'ProductModel': 'iTRV', 'OtaImageQueryCount': 0, 'LastOtaImageQueryCount': 1, 'ParentNodeId': 35505, 'DeviceLockEnabled': False, 'DisplayedSignalStrength': 'VeryGood', 'BatteryVoltage': 30, 'BatteryLevel': 'Normal', 'ReceptionOfController': {'Rssi': -59, 'Lqi': 164}, 'ReceptionOfDevice': {'Rssi': -81, 'Lqi': 76}}, {'id': 11, 'NodeId': 64125, 'ProductType': 'iTRV', 'ProductIdentifier': 'iTRV', 'ActiveFirmwareVersion': '0201000000042002', 'ModelIdentifier': 'iTRV', 'HardwareVersion': '0', 'SerialNumber': 'CCCCCCFFFE7C8E72', 'ProductModel': 'iTRV', 'OtaImageQueryCount': 0, 'LastOtaImageQueryCount': 1, 'ParentNodeId': 35505, 'DeviceLockEnabled': False, 'DisplayedSignalStrength': 'Good', 'BatteryVoltage': 31, 'BatteryLevel': 'Normal', 'ReceptionOfController': {'Rssi': -69, 'Lqi': 124}, 'ReceptionOfDevice': {'Rssi': -81, 'Lqi': 76}}, {'id': 12, 'NodeId': 17135, 'ProductType': 'iTRV', 'ProductIdentifier': 'iTRV', 'ActiveFirmwareVersion': '0201000000042002', 'ModelIdentifier': 'iTRV', 'HardwareVersion': '0', 'SerialNumber': '086BD7FFFEF56395', 'ProductModel': 'iTRV', 'OtaImageQueryCount': 0, 'LastOtaImageQueryCount': 1, 'ParentNodeId': 0, 'DeviceLockEnabled': False, 'DisplayedSignalStrength': 'Poor', 'BatteryVoltage': 30, 'BatteryLevel': 'Normal', 'ReceptionOfController': {'Rssi': -82, 'Lqi': 72}, 'ReceptionOfDevice': {'Rssi': -83, 'Lqi': 68}}, {'id': 13, 'NodeId': 35505, 'ProductType': 'SmartPlug', 'ProductIdentifier': 'HeimanSmartplug', 'ActiveFirmwareVersion': '', 'ModelIdentifier': 'SmartPlug', 'HardwareVersion': '', 'SerialNumber': '000D6F0014F70B19', 'ProductModel': '', 'OtaImageQueryCount': 0, 'LastOtaImageQueryCount': 0, 'DeviceLockEnabled': False, 'DisplayedSignalStrength': 'Good', 'ReceptionOfDevice': {'Rssi': -81, 'Lqi': 76}}], 'Zigbee': {'Error72Reset': 3, 'JPANCount': 11, 'NetworkChannel': 25, 'NoSignalReset': 3, 'SuppressApsAcks': True, 'ZigbeeModuleVersion': 'R311 B021019', 'ZigbeeEUI': '14B457FFFE767F49'}, 'UpgradeInfo': [{'id': 1, 'FirmwareFilename': '0201000000042002FOTA.BIN'}, {'id': 2, 'FirmwareFilename': '0401000000010005FOTA.BIN'}, {'id': 3, 'FirmwareFilename': '0401010100010005FOTA.BIN'}, {'id': 4, 'FirmwareFilename': '0441000000010005FOTA.BIN'}, {'id': 5, 'FirmwareFilename': '0441010100010005FOTA.BIN'}, {'id': 6, 'FirmwareFilename': '04E1000900042002FOTA.BIN'}, {'id': 7, 'FirmwareFilename': '05E1000900000023FOTA.BIN'}, {'id': 8, 'FirmwareFilename': '0A00000000032000FOTA.BIN'}], 'SmartValve': [{'id': 2, 'MountingOrientation': 'Vertical', 'SetPoint': 150, 'MeasuredTemperature': 196, 'PercentageDemand': 0, 'WindowState': 'Closed'}, {'id': 4, 'MountingOrientation': 'Vertical', 'SetPoint': 200, 'MeasuredTemperature': 206, 'PercentageDemand': 0, 'WindowState': 'Closed'}, {'id': 5, 'MountingOrientation': 'Vertical', 'SetPoint': 190, 'MeasuredTemperature': 205, 'PercentageDemand': 0, 'WindowState': 'Closed'}, {'id': 6, 'MountingOrientation': 'Vertical', 'SetPoint': 225, 'MeasuredTemperature': 233, 'PercentageDemand': 77, 'WindowState': 'Closed', 'ExternalRoomStatTemperature': 217}, {'id': 7, 'MountingOrientation': 'Vertical', 'SetPoint': 250, 'MeasuredTemperature': 236, 'PercentageDemand': 100, 'WindowState': 'Closed'}, {'id': 8, 'MountingOrientation': 'Vertical', 'SetPoint': 150, 'MeasuredTemperature': 207, 'PercentageDemand': 0, 'WindowState': 'Closed'}, {'id': 9, 'MountingOrientation': 'Vertical', 'SetPoint': 100, 'MeasuredTemperature': 129, 'PercentageDemand': 0, 'WindowState': 'Closed'}, {'id': 10, 'MountingOrientation': 'Vertical', 'SetPoint': 170, 'MeasuredTemperature': 180, 'PercentageDemand': 0, 'WindowState': 'Closed'}, {'id': 11, 'MountingOrientation': 'Vertical', 'SetPoint': 170, 'MeasuredTemperature': 192, 'PercentageDemand': 0, 'WindowState': 'Closed'}, {'id': 12, 'MountingOrientation': 'Vertical', 'SetPoint': 160, 'MeasuredTemperature': 186, 'PercentageDemand': 0, 'WindowState': 'Closed'}], 'RoomStat': [{'id': 3, 'SetPoint': 225, 'MeasuredTemperature': 217, 'MeasuredHumidity': 39}], 'SmartPlug': [{'id': 13, 'ScheduleId': 2000, 'ManualState': 'Off', 'Name': 'Cooling fan', 'Mode': 'Manual', 'AwayAction': 'Off', 'OutputState': 'Off', 'ControlSource': 'FromManualMode', 'ScheduledState': 'Off'}], 'DeviceCapabilityMatrix': {'Roomstat': True, 'ITRV': True, 'SmartPlug': True, 'UFH': False, 'UFHFloorTempSensor': False, 'UFHDewSensor': False, 'HACT': False, 'LACT': False}, 'Schedule': [{'id': 1, 'Monday': {'SetPoints': [{'Time': 810, 'DegreesC': 230}, {'Time': 900, 'DegreesC': 150}, {'Time': 2015, 'DegreesC': 230}, {'Time': 2130, 'DegreesC': 190}]}, 'Tuesday': {'SetPoints': [{'Time': 810, 'DegreesC': 230}, {'Time': 900, 'DegreesC': 150}, {'Time': 2015, 'DegreesC': 230}, {'Time': 2130, 'DegreesC': 190}]}, 'Wednesday': {'SetPoints': [{'Time': 810, 'DegreesC': 230}, {'Time': 900, 'DegreesC': 150}, {'Time': 2015, 'DegreesC': 230}, {'Time': 2130, 'DegreesC': 190}]}, 'Thursday': {'SetPoints': [{'Time': 810, 'DegreesC': 230}, {'Time': 900, 'DegreesC': 150}, {'Time': 2015, 'DegreesC': 230}, {'Time': 2130, 'DegreesC': 190}]}, 'Friday': {'SetPoints': [{'Time': 810, 'DegreesC': 230}, {'Time': 900, 'DegreesC': 150}, {'Time': 2015, 'DegreesC': 230}, {'Time': 2130, 'DegreesC': 190}]}, 'Saturday': {'SetPoints': [{'Time': 810, 'DegreesC': 230}, {'Time': 900, 'DegreesC': 150}, {'Time': 2015, 'DegreesC': 230}, {'Time': 2130, 'DegreesC': 190}]}, 'Sunday': {'SetPoints': [{'Time': 810, 'DegreesC': 230}, {'Time': 900, 'DegreesC': 150}, {'Time': 2015, 'DegreesC': 230}, {'Time': 2130, 'DegreesC': 190}]}, 'Type': 'Heating'}, {'id': 2, 'Monday': {'SetPoints': [{'Time': 735, 'DegreesC': 240}, {'Time': 830, 'DegreesC': 150}, {'Time': 1915, 'DegreesC': 220}, {'Time': 2130, 'DegreesC': 150}]}, 'Tuesday': {'SetPoints': [{'Time': 735, 'DegreesC': 240}, {'Time': 830, 'DegreesC': 150}, {'Time': 1915, 'DegreesC': 220}, {'Time': 2130, 'DegreesC': 150}]}, 'Wednesday': {'SetPoints': [{'Time': 735, 'DegreesC': 240}, {'Time': 830, 'DegreesC': 150}, {'Time': 1915, 'DegreesC': 220}, {'Time': 2130, 'DegreesC': 150}]}, 'Thursday': {'SetPoints': [{'Time': 735, 'DegreesC': 240}, {'Time': 830, 'DegreesC': 150}, {'Time': 1915, 'DegreesC': 220}, {'Time': 2130, 'DegreesC': 150}]}, 'Friday': {'SetPoints': [{'Time': 735, 'DegreesC': 240}, {'Time': 830, 'DegreesC': 150}, {'Time': 1915, 'DegreesC': 220}, {'Time': 2130, 'DegreesC': 150}]}, 'Saturday': {'SetPoints': [{'Time': 735, 'DegreesC': 240}, {'Time': 830, 'DegreesC': 150}, {'Time': 1915, 'DegreesC': 220}, {'Time': 2130, 'DegreesC': 150}]}, 'Sunday': {'SetPoints': [{'Time': 735, 'DegreesC': 240}, {'Time': 830, 'DegreesC': 150}, {'Time': 1915, 'DegreesC': 220}, {'Time': 2130, 'DegreesC': 150}]}, 'Type': 'Heating'}, {'id': 4, 'Monday': {'SetPoints': [{'Time': 630, 'DegreesC': 190}, {'Time': 830, 'DegreesC': 150}, {'Time': 1630, 'DegreesC': 200}, {'Time': 2230, 'DegreesC': 150}]}, 'Tuesday': {'SetPoints': [{'Time': 630, 'DegreesC': 190}, {'Time': 830, 'DegreesC': 150}, {'Time': 1630, 'DegreesC': 200}, {'Time': 2230, 'DegreesC': 150}]}, 'Wednesday': {'SetPoints': [{'Time': 630, 'DegreesC': 190}, {'Time': 830, 'DegreesC': 150}, {'Time': 1630, 'DegreesC': 200}, {'Time': 2230, 'DegreesC': 150}]}, 'Thursday': {'SetPoints': [{'Time': 630, 'DegreesC': 190}, {'Time': 830, 'DegreesC': 150}, {'Time': 1630, 'DegreesC': 200}, {'Time': 2230, 'DegreesC': 150}]}, 'Friday': {'SetPoints': [{'Time': 630, 'DegreesC': 190}, {'Time': 830, 'DegreesC': 150}, {'Time': 1630, 'DegreesC': 200}, {'Time': 2230, 'DegreesC': 150}]}, 'Saturday': {'SetPoints': [{'Time': 700, 'DegreesC': 190}, {'Time': 1000, 'DegreesC': 170}, {'Time': 1600, 'DegreesC': 200}, {'Time': 2300, 'DegreesC': 150}]}, 'Sunday': {'SetPoints': [{'Time': 700, 'DegreesC': 190}, {'Time': 1000, 'DegreesC': 170}, {'Time': 1600, 'DegreesC': 200}, {'Time': 2300, 'DegreesC': 150}]}, 'Type': 'Heating'}, {'id': 5, 'Monday': {'SetPoints': [{'Time': 30, 'DegreesC': 120}, {'Time': 730, 'DegreesC': 190}, {'Time': 915, 'DegreesC': 205}, {'Time': 1015, 'DegreesC': 190}]}, 'Tuesday': {'SetPoints': [{'Time': 30, 'DegreesC': 120}, {'Time': 730, 'DegreesC': 190}, {'Time': 915, 'DegreesC': 205}, {'Time': 1015, 'DegreesC': 190}]}, 'Wednesday': {'SetPoints': [{'Time': 30, 'DegreesC': 120}, {'Time': 730, 'DegreesC': 190}, {'Time': 915, 'DegreesC': 205}, {'Time': 1015, 'DegreesC': 190}]}, 'Thursday': {'SetPoints': [{'Time': 30, 'DegreesC': 120}, {'Time': 730, 'DegreesC': 190}, {'Time': 915, 'DegreesC': 205}, {'Time': 1015, 'DegreesC': 190}]}, 'Friday': {'SetPoints': [{'Time': 30, 'DegreesC': 120}, {'Time': 730, 'DegreesC': 190}, {'Time': 915, 'DegreesC': 205}, {'Time': 1015, 'DegreesC': 190}]}, 'Saturday': {'SetPoints': [{'Time': 30, 'DegreesC': 120}, {'Time': 730, 'DegreesC': 190}]}, 'Sunday': {'SetPoints': [{'Time': 30, 'DegreesC': 120}, {'Time': 730, 'DegreesC': 190}]}, 'Type': 'Heating'}, {'id': 6, 'Monday': {'SetPoints': [{'Time': 900, 'DegreesC': 200}, {'Time': 1000, 'DegreesC': 180}, {'Time': 1800, 'DegreesC': 225}, {'Time': 2359, 'DegreesC': 150}]}, 'Tuesday': {'SetPoints': [{'Time': 900, 'DegreesC': 200}, {'Time': 1000, 'DegreesC': 180}, {'Time': 1800, 'DegreesC': 225}, {'Time': 2359, 'DegreesC': 150}]}, 'Wednesday': {'SetPoints': [{'Time': 900, 'DegreesC': 200}, {'Time': 1000, 'DegreesC': 180}, {'Time': 1800, 'DegreesC': 225}, {'Time': 2359, 'DegreesC': 150}]}, 'Thursday': {'SetPoints': [{'Time': 900, 'DegreesC': 200}, {'Time': 1000, 'DegreesC': 180}, {'Time': 1800, 'DegreesC': 225}, {'Time': 2359, 'DegreesC': 150}]}, 'Friday': {'SetPoints': [{'Time': 900, 'DegreesC': 200}, {'Time': 1000, 'DegreesC': 180}, {'Time': 1800, 'DegreesC': 225}, {'Time': 2359, 'DegreesC': 150}]}, 'Saturday': {'SetPoints': [{'Time': 900, 'DegreesC': 200}, {'Time': 1000, 'DegreesC': 180}, {'Time': 1800, 'DegreesC': 225}, {'Time': 2359, 'DegreesC': 150}]}, 'Sunday': {'SetPoints': [{'Time': 900, 'DegreesC': 200}, {'Time': 1000, 'DegreesC': 180}, {'Time': 1800, 'DegreesC': 225}, {'Time': 2359, 'DegreesC': 150}]}, 'Type': 'Heating'}, {'id': 7, 'Monday': {'SetPoints': [{'Time': 800, 'DegreesC': 230}, {'Time': 945, 'DegreesC': 190}, {'Time': 1640, 'DegreesC': 250}, {'Time': 2050, 'DegreesC': 210}, {'Time': 2259, 'DegreesC': 120}]}, 'Tuesday': {'SetPoints': [{'Time': 800, 'DegreesC': 230}, {'Time': 945, 'DegreesC': 190}, {'Time': 1640, 'DegreesC': 250}, {'Time': 2050, 'DegreesC': 210}, {'Time': 2259, 'DegreesC': 120}]}, 'Wednesday': {'SetPoints': [{'Time': 800, 'DegreesC': 230}, {'Time': 945, 'DegreesC': 190}, {'Time': 1640, 'DegreesC': 250}, {'Time': 2050, 'DegreesC': 210}, {'Time': 2259, 'DegreesC': 120}]}, 'Thursday': {'SetPoints': [{'Time': 800, 'DegreesC': 230}, {'Time': 945, 'DegreesC': 190}, {'Time': 1640, 'DegreesC': 250}, {'Time': 2050, 'DegreesC': 210}, {'Time': 2259, 'DegreesC': 120}]}, 'Friday': {'SetPoints': [{'Time': 800, 'DegreesC': 230}, {'Time': 945, 'DegreesC': 190}, {'Time': 1640, 'DegreesC': 250}, {'Time': 2050, 'DegreesC': 210}, {'Time': 2259, 'DegreesC': 120}]}, 'Saturday': {'SetPoints': [{'Time': 800, 'DegreesC': 230}, {'Time': 1640, 'DegreesC': 250}, {'Time': 2050, 'DegreesC': 210}, {'Time': 2359, 'DegreesC': 120}]}, 'Sunday': {'SetPoints': [{'Time': 800, 'DegreesC': 230}, {'Time': 1640, 'DegreesC': 250}, {'Time': 2050, 'DegreesC': 210}, {'Time': 2359, 'DegreesC': 120}]}, 'Type': 'Heating'}, {'id': 8, 'Monday': {'SetPoints': [{'Time': 730, 'DegreesC': 200}, {'Time': 830, 'DegreesC': 180}, {'Time': 2130, 'DegreesC': 200}, {'Time': 2230, 'DegreesC': 150}]}, 'Tuesday': {'SetPoints': [{'Time': 730, 'DegreesC': 200}, {'Time': 830, 'DegreesC': 180}, {'Time': 2130, 'DegreesC': 200}, {'Time': 2230, 'DegreesC': 150}]}, 'Wednesday': {'SetPoints': [{'Time': 730, 'DegreesC': 200}, {'Time': 830, 'DegreesC': 180}, {'Time': 2130, 'DegreesC': 200}, {'Time': 2230, 'DegreesC': 150}]}, 'Thursday': {'SetPoints': [{'Time': 730, 'DegreesC': 200}, {'Time': 830, 'DegreesC': 180}, {'Time': 2130, 'DegreesC': 200}, {'Time': 2230, 'DegreesC': 150}]}, 'Friday': {'SetPoints': [{'Time': 730, 'DegreesC': 200}, {'Time': 830, 'DegreesC': 180}, {'Time': 2130, 'DegreesC': 200}, {'Time': 2230, 'DegreesC': 150}]}, 'Saturday': {'SetPoints': [{'Time': 730, 'DegreesC': 200}, {'Time': 830, 'DegreesC': 180}, {'Time': 2130, 'DegreesC': 200}, {'Time': 2230, 'DegreesC': 150}]}, 'Sunday': {'SetPoints': [{'Time': 730, 'DegreesC': 200}, {'Time': 830, 'DegreesC': 180}, {'Time': 2130, 'DegreesC': 200}, {'Time': 2230, 'DegreesC': 150}]}, 'Type': 'Heating'}, {'id': 9, 'Monday': {'SetPoints': [{'Time': 830, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 170}, {'Time': 2230, 'DegreesC': 120}]}, 'Tuesday': {'SetPoints': [{'Time': 830, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 170}, {'Time': 2230, 'DegreesC': 120}]}, 'Wednesday': {'SetPoints': [{'Time': 830, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 170}, {'Time': 2230, 'DegreesC': 120}]}, 'Thursday': {'SetPoints': [{'Time': 830, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 170}, {'Time': 2230, 'DegreesC': 120}]}, 'Friday': {'SetPoints': [{'Time': 830, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 170}, {'Time': 2230, 'DegreesC': 120}]}, 'Saturday': {'SetPoints': [{'Time': 830, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 170}, {'Time': 2230, 'DegreesC': 120}]}, 'Sunday': {'SetPoints': [{'Time': 830, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 170}, {'Time': 2230, 'DegreesC': 120}]}, 'Type': 'Heating'}, {'id': 10, 'Monday': {'SetPoints': [{'Time': 800, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 170}, {'Time': 2230, 'DegreesC': 150}]}, 'Tuesday': {'SetPoints': [{'Time': 800, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 170}, {'Time': 2230, 'DegreesC': 150}]}, 'Wednesday': {'SetPoints': [{'Time': 800, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 170}, {'Time': 2230, 'DegreesC': 150}]}, 'Thursday': {'SetPoints': [{'Time': 800, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 170}, {'Time': 2230, 'DegreesC': 150}]}, 'Friday': {'SetPoints': [{'Time': 800, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 170}, {'Time': 2230, 'DegreesC': 150}]}, 'Saturday': {'SetPoints': [{'Time': 800, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 170}, {'Time': 2230, 'DegreesC': 150}]}, 'Sunday': {'SetPoints': [{'Time': 800, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 170}, {'Time': 2230, 'DegreesC': 150}]}, 'Type': 'Heating'}, {'id': 11, 'Monday': {'SetPoints': [{'Time': 15, 'DegreesC': 190}, {'Time': 45, 'DegreesC': 150}, {'Time': 830, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 160}]}, 'Tuesday': {'SetPoints': [{'Time': 15, 'DegreesC': 190}, {'Time': 45, 'DegreesC': 150}, {'Time': 830, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 160}]}, 'Wednesday': {'SetPoints': [{'Time': 15, 'DegreesC': 190}, {'Time': 45, 'DegreesC': 150}, {'Time': 830, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 160}]}, 'Thursday': {'SetPoints': [{'Time': 15, 'DegreesC': 190}, {'Time': 45, 'DegreesC': 150}, {'Time': 830, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 160}]}, 'Friday': {'SetPoints': [{'Time': 15, 'DegreesC': 190}, {'Time': 45, 'DegreesC': 150}, {'Time': 830, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 160}]}, 'Saturday': {'SetPoints': [{'Time': 15, 'DegreesC': 190}, {'Time': 45, 'DegreesC': 150}, {'Time': 830, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 160}]}, 'Sunday': {'SetPoints': [{'Time': 15, 'DegreesC': 190}, {'Time': 45, 'DegreesC': 150}, {'Time': 830, 'DegreesC': 190}, {'Time': 930, 'DegreesC': 160}]}, 'Type': 'Heating'}, {'id': 1000, 'Monday': {'SetPoints': [{'Time': 830, 'DegreesC': -200}]}, 'Tuesday': {'SetPoints': [{'Time': 830, 'DegreesC': -200}]}, 'Wednesday': {'SetPoints': [{'Time': 830, 'DegreesC': -200}]}, 'Thursday': {'SetPoints': [{'Time': 830, 'DegreesC': -200}]}, 'Friday': {'SetPoints': [{'Time': 830, 'DegreesC': -200}]}, 'Saturday': {'SetPoints': [{'Time': 830, 'DegreesC': -200}]}, 'Sunday': {'SetPoints': [{'Time': 830, 'DegreesC': -200}]}, 'Type': 'HotWater'}, {'id': 2000, 'Monday': {'SetPoints': [{'Time': 1200, 'DegreesC': -200}]}, 'Tuesday': {'SetPoints': [{'Time': 1200, 'DegreesC': -200}]}, 'Wednesday': {'SetPoints': [{'Time': 1200, 'DegreesC': -200}]}, 'Thursday': {'SetPoints': [{'Time': 1200, 'DegreesC': -200}]}, 'Friday': {'SetPoints': [{'Time': 1200, 'DegreesC': -200}]}, 'Saturday': {'SetPoints': [{'Time': 1200, 'DegreesC': -200}]}, 'Sunday': {'SetPoints': [{'Time': 1200, 'DegreesC': -200}]}, 'Type': 'HotWater'}]}
2020-02-05 17:18:56 DEBUG (SyncWorker_16) [wiserHeatingAPI.wiserHub] valve2roomMap{2: {'roomId': 1, 'roomName': 'Mum bedroom'}, 8: {'roomId': 2, 'roomName': 'Mums bath room'}, 4: {'roomId': 4, 'roomName': 'Old kitchen'}, 5: {'roomId': 5, 'roomName': 'Hall'}, 3: {'roomId': 6, 'roomName': 'Back room'}, 6: {'roomId': 6, 'roomName': 'Back room'}, 7: {'roomId': 7, 'roomName': 'Front room'}, 9: {'roomId': 8, 'roomName': 'Top floor'}, 10: {'roomId': 9, 'roomName': 'Top bath room'}, 11: {'roomId': 10, 'roomName': 'Middle Toilet'}, 12: {'roomId': 11, 'roomName': 'Back Bedroom'}}
2020-02-05 17:18:59 ERROR (MainThread) [aioharmony.hubconnector] 172.16.10.200: Exception on post: Cannot connect to host 172.16.10.200:8088 ssl:None [Connect call failed ('172.16.10.200', 8088)]
2020-02-05 17:18:59 ERROR (MainThread) [aioharmony.hubconnector] 172.16.10.200: Unable to retrieve HUB id
2020-02-05 17:18:59 WARNING (MainThread) [homeassistant.components.harmony.remote] living room: Unable to connect to HUB.
2020-02-05 17:18:59 WARNING (MainThread) [homeassistant.components.remote] Platform harmony not ready yet. Retrying in 60 seconds.
2020-02-05 17:19:15 WARNING (MainThread) [homeassistant.config_entries] Config entry for wled not ready yet. Retrying in 40 seconds.
2020-02-05 17:19:23 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 284, in async_update_ha_state
self._async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 327, in _async_write_ha_state
attr.update(self.state_attributes or {})
File "/config/custom_components/wiser/climate.py", line 424, in state_attributes
attrs = super().state_attributes
File "/usr/src/homeassistant/homeassistant/components/climate/init.py", line 254, in state_attributes
data[ATTR_PRESET_MODE] = self.preset_mode
File "/config/custom_components/wiser/climate.py", line 350, in preset_mode
preset = WISER_PRESET_TO_HASS[wiser_preset.lower()]
KeyError: 'fromcomfortmode'

"CalculatedTemperature" & errors when no TRV in a room

Hi - thanks for this component. All the important stuff is working really well 👍

The errors below recur every minute or so. I wonder if it is because I have set up some rooms which do not have devices in yet (my order for more TRVs hasn't arrived yet!). Just a thought

I'm using Home Assistant 0.84.6 and a Wiser HeatHubR (single zone). I also see the HotWater errors there's an open issue for.

2019-01-03 22:00:46 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/homeassistant/helpers/entity.py", line 239, in async_update_ha_state
    attr = self.state_attributes or {}
  File "/usr/local/lib/python3.6/site-packages/homeassistant/components/climate/__init__.py", line 225, in state_attributes
    self.hass, self.current_temperature, self.temperature_unit,
  File "/config/custom_components/climate/wiser.py", line 73, in current_temperature
    temp=self.handler.getHubData().getRoom(self.roomId).get("CalculatedTemperature")/10
TypeError: unsupported operand type(s) for /: 'NoneType' and 'int'
2019-01-03 22:00:46 ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/homeassistant/helpers/entity.py", line 239, in async_update_ha_state
    attr = self.state_attributes or {}
  File "/usr/local/lib/python3.6/site-packages/homeassistant/components/climate/__init__.py", line 225, in state_attributes
    self.hass, self.current_temperature, self.temperature_unit,
  File "/config/custom_components/climate/wiser.py", line 73, in current_temperature
    temp=self.handler.getHubData().getRoom(self.roomId).get("CalculatedTemperature")/10
TypeError: unsupported operand type(s) for /: 'NoneType' and 'int'

Cant Control temperature

When I adjust the temp, I get this error:

`2019-12-21 18:00:05 ERROR (MainThread) [homeassistant.components.websocket_api.http.connection.140577434436560] SetRoomTemperature : value of temperature must be between 50 and 300 OR -200(off)
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 133, in handle_call_service
    connection.context(msg),
  File "/usr/src/homeassistant/homeassistant/core.py", line 1235, in async_call
    await asyncio.shield(self._execute_service(handler, service_call))
  File "/usr/src/homeassistant/homeassistant/core.py", line 1260, in _execute_service
    await handler.func(service_call)
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 205, in handle_service
    self._platforms.values(), func, call, service_name, required_features
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 336, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 360, in _handle_service_platform_call
    await func(entity, data)
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 519, in async_service_temperature_set
    await entity.async_set_temperature(**kwargs)
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 380, in async_set_temperature
    ft.partial(self.set_temperature, **kwargs)
  File "/usr/local/lib/python3.7/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/wiser/climate.py", line 175, in set_temperature
    self.handler.set_room_temperature(self.roomId, target_temperature)
  File "/config/custom_components/wiser/__init__.py", line 143, in set_room_temperature
    target_temperature)
  File "/usr/local/lib/python3.7/site-packages/wiserHeatingAPI/wiserHub.py", line 178, in setRoomTemperature
    raise Exception("SetRoomTemperature : value of temperature must be between 50 and 300 OR -200(off)")
Exception: SetRoomTemperature : value of temperature must be between 50 and 300 OR -200(off)`

Collaboration question

I discovered this repository a few days ago and it's looking really nice. I'd been working on a similar project over christmas but haven't got to the Home Assistant part yet. I've been working on a core python library for the Wiser API that I had planned to use as the backend to making a Home Assistant component but you've already got a good platform started! I've published my library here: https://github.com/connor9/python-draytonwiser-api

As I was mostly finished the first version of my python library before discovering this project I've made a first pass attempt to see if they would be compatible and it was pretty easy to interchange the wiserAPI/wiserHub part with this library. I've got that example in a fork of this project here: https://github.com/connor9/wiserHomeAssistantPlatform (The library is not in pypi yet so on my test system I copied the library into the custom_components directory to allow wiserHomeAssistantPlatform to find it.)

I've already started adding the PATCH request to Wiser Hub features to this library including functions for setting the boost on rooms. i.e. get_room(3).set_boost(30, 21). I've also built in testing to the library to hopefully make testing the various strange edge cases of the Wiser REST API easier to develop for. I was wondering if you had any interest in collaborating and integrating with this library? I'd like to contribute to making the wiserHomeAssistantPlatform a great component for Home Assistant but I'm also interested in making the generic python library great for non-Home Assistant use cases.

Enh : Add Mesh details showing nodeId and parentNodeId

Within the devices payload there are two elements
NodeId and ParentNodeId

For TRVs and RoomStats

  • If parentNodeId == 0 then the connection to the hub is direct
  • If parentNodeId !=0 then the connection to the hub is via a SmartPlug/Range Extender whos Id is parentNodeId

Adding this to the iTRV and RoomStat data payloads as rawdata
Also adding a computed attribute called "HubConnection" which will be either

  • Direct

This is really useful to know when diagnosing/mapping how you trvs are communicating to the wiser hub..

Fab, really well thought out system this wiser stuff is..

1.8 cannot import name 'TEMP_MINIMUM'

just deployed v1.8 using HACS:

Component error: wiser - cannot import name 'TEMP_MINIMUM' from 'wiserHeatingAPI.wiserHub' (/usr/local/lib/python3.7/site-packages/wiserHeatingAPI/wiserHub.py)

The component doesn't initialise

Heating Boost request

Hi,
It would be nice to have the ability not just to update the temperature of the Thermostat / iTRV, but to be able to call for a Boost, like you do in the app.
This would allow to use external sensors to adjust the temperature in the room without changing the actual configuration of the iTRV.
Thanks.

HA won't restart after enabling config

Installed the component as per the instructions. Added the config to the YAML and rebooted. Couldn't reconnect to HA. Had to physically reboot the server.

HA came back but there are no devices/entities listed. Can't find anything for Wiser. Nothing in the logs points to an issue.

Rooms with no devices display in the UI

A room that I had created in the Drayton Mobile App shows in the HA UI, even though all devices have been removed and it is no longer visible in the Drayton UI.

Set point temperature can show incorrectly if Eco Mode enabled

Haven't noticed this before and don't know whether a software update from Wiser has made some changes, but when Eco mode enabled the CurrentSetPoint, which is used to display in the UI the target temp can be different to the schedule temp (not sure if true for manual set temps) and also to what is displayed in the app.

The app must use DisplayedSetPoint and therefore so should the custom_component. Postman output below to show the issue. See also setpointOrigin showing 'FromEcoIQ' - haven't seen this before either!

{ "id": 1, "ManualSetPoint": 230, "OverrideType": "EcoIQ", "OverrideSetpoint": 150, "ScheduleId": 1, "HeatingRate": 1200, "SmartValveIds": [ 4 ], "UfhRelayIds": [], "Name": "Lounge", "Mode": "Auto", "DemandType": "Modulating", "WindowDetectionActive": false, "ControlSequenceOfOperation": "HeatingOnly", "HeatingType": "HydronicRadiator", "CalculatedTemperature": 233, "CurrentSetPoint": 150, "PercentageDemand": 0, "ControlOutputState": "Off", "WindowState": "Closed", "SetpointOrigin": "FromEcoIQ", "DisplayedSetPoint": 230, "ScheduledSetPoint": 230, "AwayModeSuppressed": false, "RoundedAlexaTemperature": 235, "EffectiveMode": "Auto", "PercentageDemandForItrv": 0 }

Support for modes of operation

Having taken a look at your excellent HA integration, I was wondering if it would support my use case.

My use case is as follows:

  • When I work from home, I want to switch off all the radiators in the rest of the house apart from the study.
  • When the family is at home, I want the whole house heated
  • When my girlfriend is at home, only the bedroom needs heating, so switch off all the radiators in the rest of the house

So I need to be able to define "modes of operation". I don't think this equates to zones, as the rooms overlap.

Right now I have a Salus iT500 system, but that is not properly integrated with HA, so I was thinking of buying a new heating controller and a bunch of TRVs

Does your HA extension support my use case? (assuming I buy the Wiser kit).

Wiser Components dont update unless there is a change

@jchasey @hueytech
Hey guys,

Ive noticed that the UI doesnt change the "last updated" text unless there is a state change. Normally this works fine but I have noticed sometimes the data has gaps (in grafana for example).

This is kinda "as expected" and HA only wants track changes.
Now I can "force" HA to force a state change every 10mins , which kinda commits the changes, is this useful or will it be just noise?

I think its just noise, but i thought Id ask

R1.9 DEV wiser.get_schedule bug?

Noticed that the Get Schedule service is rounding all my temperatures to 0 dec places.

Monday:

  • Time: 07:30
    Temp: 16 ### should read 15.5
  • Time: 15:00
    Temp: 20 ### should read 19.5
  • Time: 21:15
    Temp: 20 ### should read 19.5
  • Time: 22:30
    Temp: 14 ### should read 14.5

Should line 46 in 'util.py' "value = round(value / 10)" be changed to "value = round(value / 10 , 1)"

Thanks to both you and all the other contributors for making Wiser so much more useful!

Info Only : Hub doesnt report all devices battery data for a period of time after reboot

Whilst testing I noticed that the TRVs/RoomStats dont show the battery data all the time.

I rebooted my hub and then I noticed that only 2/10 devices where reporting battery levels. In this case the code doesnt show anything...

After a while the battery level appears but I dont think HA will see it because the devices arent recreated on each interval..

I'll think of a workaround for this, but logging this as a "FYI"

potential typo on line 198 of wiserHub.py

Firstly massive thank you for writing this addon :-)

In your readme there is an example yaml config with the following:

wiser:
  host: 
  password: 
  scan_interval: 300
  minimum: -5
  boost_temp: 24
  boost_time: 30

Using this example I get the following error within Home Assistant:

Configuration invalid
Invalid config for [wiser]: [boost_time] is an invalid option for [wiser]. Check: wiser->boost_time. (See /config/configuration.yaml, line 48). Please check the docs at https://home-assistant.io/components/wiser/

I beliew that either you have a typo on line 189 of wiserHub.py and boost_time_temp should read boost_time or you have a typo in the readme doc and boost_time should read boost_temp_time

#Set Room Mode (Manual, Boost or Auto)
    def setRoomMode(self,roomId, mode,boost_temp=20,boost_temp_time=30):
        # TODO
        _LOGGER.debug("Set Mode {} for a room {} ".format(mode,roomId))
        if (mode.lower()=="auto"):

Errors with HeatHub with no hot water control

Hi - the code to connect to the HeatHub is great thank-you! I have an issue with lots of errors in the Home Assistant logs though as my HeatHub is a model with no hot water control, just heating. Is it possible to disable the checking of the hot water status? Error message is as follows...

Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/homeassistant/helpers/entity.py", line 232, in async_update_ha_state
state = self.state
File "/config/custom_components/sensor/wiser.py", line 188, in state
return self.handler.getHubData().getHotwaterRelayStatus()
File "/config/custom_components/wiserAPI/wiserHub.py", line 124, in getHotwaterRelayStatus
return self.wiserHubData.get("HotWater")[0].get("WaterHeatingState")
TypeError: 'NoneType' object is not subscriptable

Heathub details are...

vendor Drayton Wiser
product type Controller
model identifier WT714R1S0902
device lock enabled false
displayed signal strength VeryGood
firmware 2.26.16

Thanks!

Google home integration via home assistant

Hi,
I don't think this is a bug - more likely an error on my part:

The drayton wiser integration is working well for me with home assistant
I have home assistant linked into google home
If I ask google home "what is the temperature in the X room" is replies "the Wiser X room is set to auto"

This last statement is correct...but do you know how home assistant decides which bit of information it has from the Wiser unit to respond with when a request comes in from google home? It seems in this case it is responding with the unit state "auto" rather than it's temperature....

Error in switch.py, self.awayTemperature in update()

Hey, love this component, thanks :) however this has been bugging me for a couple of months or so; I see errors when setting away mode via HA with the switch, and then the component will freeze and not respond or update or anything until HA is restarted.

I saw a couple of related issues that have opened and closed last few weeks / months, but my error persists with latest 1.7 update (using HACS). Very helpfully I don't have a note of the exact error but it is something like 'setAwayHome temperature can only be between 5 and 30 or -20 (Off)'.

I had a look around (I am familiar with code, but to be honest never used github properly as a contributor, so I will just point out the bits here, sorry) and found that switch.py update method, line 44/45 should read:

        self.awayTemperature = self.handler.get_hub_data().getSystem(). \
            get('AwayModeSetPointLimit')/10

rather than the current

        self.awayTemperature = self.handler.get_hub_data().getSystem(). \
            get('AwayModeSetPointLimit')

to match line 36/37 in 'init' method.

Without this, it was trying to send an away mode setpoint with the raw api value of 140 (14 deg c) instead of 14, and this was failing the bounds checking (5-30 or -20) in wiserHub.py.

I'm not sure how this switch error would cause the whole component (including climate components etc) to freeze up, but I will keep an eye on it next few days.

Ta, Joe

SmartPlug : Add Auto/Manual Mode Swtich

within the smartplug data set the ManualState attribute is toggled to indicate manual or schedule mode

[
{
"id": 15,
"ScheduleId": 2000,
"ManualState": "Off",
"Name": "Smartplug",
"Mode": "Manual",
"AwayAction": "Off",
"OutputState": "Off",
"ControlSource": "FromManualMode",
"ScheduledState": "Off"
}
]

Mode toggles from Manual to Auto

Enhancement
Add controls to SmartPlug Implementation to cover this. Future Enh would be to set custom schedules using API (if people need it)

Internal API Optimize Refreshes

From msp1974
Have also noticed that we (he says 'we' like it wasn't his poor coding! )are calling the forced refresh twice when setting away mode and switches. Once in the switch.py file and once in init.py when calling api.

eradicate duplicate refresh

Wiser Platform fails in latest version 0.89.1

When I upgrade to the latest HA version (0.89.1) the Wiser platform fails to load. I'm not sure if it's related to the upcoming changes to the way custom components are named within HA. Is anybody else having an issue with 0.89.1?

Room doesnt contain any smart valves, maybe an error/corruption

Just upgraded to the latest set of code and got some new errors:

Room doesnt contain any smart valves, maybe an error/corruption
6:34 AM custom_components/wiserAPI/wiserHub.py (WARNING)

Get 4 of these in sequence - I have 3 trvs and the main sensor - probably not a coincidence.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤ī¸ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.