Heat Genius Hub integration?

OK. Got progress…

I didn’t understand that to “Install” the app in SmartThings and such, you need select the app in the developer portal and then go to “Simulate” and Set Location and submit authentication and device settings there and “Update”.

[EDIT: I have been able to add and configure the app inST Classic Android app.]

I found good STT intro material eventually (link below) and this led me to the right place for your instructions.
https://docs.smartthings.com/en/latest/getting-started/first-smartapp.html#first-smartapp-tutorial

Note, my attempts to set up the app in SmartThings classic still don’t work. That is clearly not the way, or at least, it isn’t supported with the dynamic page setup in this SmartApp. [EDIT: See above. This does work after all.]

Upshot is I can now Add my devices. That’s great progress, as it is clearly coming from my Genius Hub. They then show up on my phone in both:

  • the Samsung SmartThings app, and
  • the Classic SmartThings app

In the Classic app, I can then see the devices listed as Things, with Hall Lamp “ON” and Libing Room, Our House and Study all showing “0 degrees”. I can tap through to look at these zones and there is a view that shows temperature and options to override etc, but it all looks a bit “null” with zero degrees etc.

In the Samsung app, I can’t seem to get much from the devices. The Hall Lamp shows “On” and I think I can toggle off. The others kind of know they want to talk about temperature, but report “Checking status…” on the dashboard and then show Battery 0%, Illuminance 0 lx and Temperature 0 (Heating Temperature 1.67) when I select them. This is, i guess, similar to the Classic which seems to have no information from the devices.

In summary, good progress, and I’m probably just still doing more wrong than right. :slight_smile:

Hopefully nobody minds me logging my progress and experience here!

Keep logging! Super helpful for those of us who are a few months behind…

I’d reply a bit quicker, but I don’t know how to set up my settings to get notifications of posts in the thread - I only get notified if I get a mention.

@nigelmwilliams7 I’ve also had a bit of trouble with needing to reauthenticate. After first noticing the server url change (hub-server-1 to hub-server-2) with a 308 redirect, I built in some handling for this. But since then I’ve seen comms fail with a different code - which I’ve not handled yet. It’s really not obvious how the situation of changing urls is supposed to be dealt with - it might become a bit clearer when the folks at Genius Hub publish their api. I’ll try in the meantime to build a bit better error handling.

This might also be related to the logged error reported by @Lewis_King (thanks!). Changing proxy url is a difficult situation to test as it’s not under my control. I’ll check it out.

But @Lewis_King I’ve only ever installed in the classic app, and it’s been a really straightforward process. I don’t think the new app can actually install smart apps, except now for a small number of SmartThings-defined ones. (The new app is generally pretty rubbish for using devices too - you might be able to switch switches on and off, but I don’t think you’d get any functionality on the rooms. And that’s not just for this - I can’t imagine anyone using the new app under any circumstances, once they’ve used the classic.) Try hitting the refresh tile on any of the devices - this should if it’s all working refresh all devices. If there are auth issues, you’ll need to hit it twice. Please post up any other useful log messages.

I believe I’ve fixed that error you logged @Lewis_King. It was a difference in the way headers are retrieved from the sync and async http responses. Grab the latest, and retry please.

I’ve also made an attempt at improving the handling of changing proxy urls, so you hopefully shouldn’t see so many auth errors when this changes.

There’s an endpoint (called ‘checkin’) on a different api which provides the proxy hostname. I now make a request to this to retrieve the hostname before the initial authentication, and then periodically every 3 hours. So if the hostname changes, it should be able to reconnect without manual intervention after at most 3 hours, even if the api doesn’t send back the 308 response which I expect.

It occurred to me while adding this in that installation would previously only work if the active hostname was hub-server-1.heatgenius.co.uk. Once installed, if it changed to hub-server-2 after install, that would probably get picked up; but it wouldn’t be possible to install if hub-server-2 was the active hostname.

Hope this fixes your issues @nigelmwilliams7 and @Lewis_King.

Thanks and appreciate all your work

I am experimenting with a pi and home assistant right now and awaiting my hubitat box. Plan to move away from attached using MQTT but get true localisation

I will attempt to document the journey for.the community

Sure not alone

Stt (predictive text suggested "attached’)

Hi and thanks for replies @cumpstey and co.

I’m having some trouble still, but hacking away. I will try to get a better understanding of my issue and share logs when I can.

Meanwhile - are you developing / testing locally / using SDK, or just on the portal with “publish”? I’m editing code and popping debug lines and catch-try blocks in to try and understand where things are failing, with little knowledge of groovy or STT. An easier debug would be great if you have a pointer (article or whatnot that helped you). No matter if not. I’ll share / reach out as I go.

I’ve had a Zipabox for a while, and recently bought the SmartThings hub then almost immediately Hubitat. I’m in the process of trying to figure out how MQTT can fit into this, without requiring me to write a whole lot of code; and trying to figure out a family-acceptable ui. Both seem difficult.

Not yet installed Home Assistant, but am intending to shortly to have a look. GeoffAtHome has written a Genius Hub integration. Though this is still polling so won’t provide proper real-time triggers, it can (like for Hubitat) poll significantly more often being on the local network.

I’m just testing on the portal by changing code and publishing, just like you are. It seems a pretty long-winded way to go about it, but I don’t know any other.

My knowledge of the groovy language - and java - was zero before I started playing with SmartThings, but if you know other languages groovy seems pretty quick to pick up (until you hit walls in SmartThings’s implementation).

I’ve only just this morning found that the ‘smart apps’ link from the list of hubs is not the same as the ‘smart apps’ link in the main nav - it provides a display of what’s in the smart app’s state, which would have helped a lot. (While the Hubitat ui is lacking a lot of things, it makes this information about installed apps significantly more obvious.) You should be able to check there that the hub hostname it’s connecting to (state.apiServer) is the same as that used if you go to the Genius Hub web app at https://geniushub.co.uk/app/.

If you’re still having trouble after yesterday’s updates, can you post up the whole live log generated as you install the app and set up a couple of zones? Make sure debug logging is enabled in the app. I might be able to spot something, knowing what it’s supposed to be doing.

So when I awoke this morning the SmartApp wasnt waiting for me to re authenicate…
So stability for 15 hours.

Seen the new update to the SmartApp on your rep and updated and still no request to re-authenicate

Happy New Year! :slight_smile:

Sorry for slow reply. Grabbing a few minutes to try again on this. I’ll keep digging as I’ll get a better idea how it works, but any pointers or solutions appreciated!

I’m getting an error somewhere in processing mappings for children I think. Error goes like this in log…
debug getChildDevices(false), children=3
error Cannot get property ‘val’ on null object @line -1 (doCall)

So, I uninstalled the SmartApp completely in case any state settings could be causing issues from previous version. I reinstalled from the latest source (committed 30th Dec).

I started this up, entered credentials in the dev portal, and selected three of my zones

  1. House (one house thermostat device)
  2. Living Room (one TRV device and one Room Sensor)
  3. Craft Room (one TRV)

I was including Living Room because it’s been working the best - the errors I get seem to crop up some time after processing mappings for this zone.

Anyway, I did this and forgot debug, went back, added debug, and added one more zone
4. Bedroom - Main (one TRV)

Log below from dev portal, with debug:

[GUID-REMOVED] 4:07:25 PM: error java.lang.NullPointerException: Cannot get property ‘val’ on null object @line -1 (doCall)
[GUID-REMOVED] 4:07:25 PM: debug getChildDevices(false), children=4
[GUID-REMOVED] 4:07:25 PM: debug updateAllZonesResponseHandler: [tm:2019-01-01T16:07:24+0000, ts:1546358844, error:0, data:[[iType:1, iOverrideDuration:3600, tmBoilerWeekly:38250, bIsActive:true, iID:0, weatherData:[message:, timestamp:0, humidity:66, status:0, precipitation:0, uv:0, weather_type:2, feels_like:2, temperature:4], mappings:[15:[site/0xD7D76F98/22, site/0xD7D76F98/20/TEMPERATURE], 14:[site/0xD7D76F98/19, site/0xD7D76F98/23], 11:[site/0xD7D76F98/18], 12:[site/0xD7D76F98/17], 3:[site/0xD7D76F98/11], 2:[site/0xD7D76F98/10], 1:[site/0xD7D76F98/9], 10:[site/0xD7D76F98/7], 0:[site/0xD7D76F98/3, site/0xD7D76F98/4, site/0xD7D76F98/4/HEATING], 7:[site/0xD7D76F98/15], 6:[site/0xD7D76F98/14], 5:[site/0xD7D76F98/13, site/0xD7D76F98/21, site/0xD7D76F98/5], 4:[site/0xD7D76F98/12, site/0xD7D76F98/16, site/0xD7D76F98/20], 9:[site/0xD7D76F98/4/TEMPERATURE, site/0xD7D76F98/4/HEATING]], strTime:16:07:17, iFlags:0, iMode:1, bOutRequestHeat:false, trigger:[linkChildActive:0, test:0, preheat:0, boost:0, setpoint:0, reactive:0, output:0, linkChildOutput:0], datapoints:[[val:86, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:Battery, type:Int, val_prev:86], [val:21, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:HEATING_1, type:Float, val_prev:21], [val:1, confirmedValue:false, val_pend:1, lastUpdate:0, path:site/0xD7D76F98/3, addr:SwitchBinary, type:Int, val_prev:1], [val:17.940001, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:TEMPERATURE, type:Float, val_prev:17.940001]], zoneSubType:0, iBaseMode:1, lOptions:3, bPrimaryZone:true, fPV:17.940001, iOverrideMode:1, iFlagActualKit:1, lstIssues:, strBuildDate:Dec 18 2018, log:, iPriority:0, strName:Our House, bHeatEnabled:true, fExternalPV:4, iFlagExpectedKit:1, iBoostTimeRemaining:1800, nodes:[[childValues:[LibraryType:[val:Routing Slave, confirmedValue:false, val_pend:Routing Slave, lastUpdate:0, path:site/0xD7D76F98/3, addr:LibraryType, type:String, val_prev:Routing Slave], location:[val:Our House, confirmedValu…[TRUNCATED]
[GUID-REMOVED] 4:07:24 PM: trace Genius Hub Integration: fetchZonesAsync
[GUID-REMOVED] 4:07:24 PM: trace Genius Hub Integration: refresh
[GUID-REMOVED] 4:07:24 PM: debug getChildDevices(false), children=4
[GUID-REMOVED] 4:07:24 PM: debug Child device GENIUS-14 already exists. Not creating.
[GUID-REMOVED] 4:07:24 PM: trace Genius Hub Integration: createChildDevice
[GUID-REMOVED] 4:07:24 PM: debug Device created: Bedoom - Main
[GUID-REMOVED] 4:07:23 PM: debug Creating room 6 with label ‘Bedoom - Main’ and device handler Genius Hub Room
[GUID-REMOVED] 4:07:23 PM: trace Genius Hub Integration: createChildDevice
[GUID-REMOVED] 4:07:23 PM: debug Child device GENIUS-1 already exists. Not creating.
[GUID-REMOVED] 4:07:23 PM: trace Genius Hub Integration: createChildDevice
[GUID-REMOVED] 4:07:23 PM: debug Child device GENIUS-0 already exists. Not creating.
[GUID-REMOVED] 4:07:23 PM: trace Genius Hub Integration: createChildDevice
[GUID-REMOVED] 4:07:23 PM: debug getChildDevices(false), children=3
[GUID-REMOVED] 4:07:23 PM: trace Genius Hub Integration: updateChildDevices
[GUID-REMOVED] 4:07:02 PM: warn Unknown device type: 5 Extension-UFH
[GUID-REMOVED] 4:06:58 PM: error java.lang.NullPointerException: Cannot get property ‘val’ on null object @line -1 (doCall)
[GUID-REMOVED] 4:06:58 PM: debug getChildDevices(false), children=3
[GUID-REMOVED] 4:06:56 PM: debug getChildDevices(false), children=3
[GUID-REMOVED] 4:06:55 PM: debug getChildDevices(false), children=3
[GUID-REMOVED] 4:06:44 PM: error java.lang.NullPointerException: Cannot get property ‘val’ on null object @line -1 (doCall)
[GUID-REMOVED] 4:06:44 PM: debug getChildDevices(false), children=3
[GUID-REMOVED] 4:06:42 PM: debug getChildDevices(false), children=3
[GUID-REMOVED] 4:06:41 PM: debug getChildDevices(false), children=0
[GUID-REMOVED] 4:06:33 PM: warn Unknown device type: 5 Extension-UFH

Longer logging since this ran…

Restarted with a load of additional debug lines all in format:
LK: DO: [function]: [next-action]
LK: DONE: [function]: [last-action]

The error in the log seems to happen somewhere in updateAllZonesResponseHandler, but does not appear to be completely consistent based on my log messages.

@ 16:37 it was right after: debug LK: DONE: updateAllZonesResponseHandler: getGeniusId
@ 16:46 it was right after: debug LK: DO: updateAllZonesResponseHandler: getGeniusType
@ 16:56 it was right after: debug LK: DONE: updateAllZonesResponseHandler: getGeniusId
@ 17:01 it was right after: debug LK: DONE: updateAllZonesResponseHandler: response.json.data.find
@ 17:16 it was right after: debug LK: DO: updateAllZonesResponseHandler: response.json.data.find

Extended log attached…

[GUID-REMOVED] 5:26:46 PM: debug LK: DO: updateAllZonesResponseHandler: response.json.data.find
[GUID-REMOVED] 5:26:46 PM: debug LK: DONE: updateAllZonesResponseHandler: getChildDevices
[GUID-REMOVED] 5:26:46 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 5:26:46 PM: debug updateAllZonesResponseHandler: [tm:2019-01-01T17:26:44+0000, ts:1546363604, error:0, data:[[iType:1, iOverrideDuration:3600, tmBoilerWeekly:38310, bIsActive:false, iID:0, weatherData:[message:, timestamp:0, humidity:66, status:0, precipitation:0, uv:0, weather_type:2, feels_like:2, temperature:4], mappings:[15:[site/0xD7D76F98/22, site/0xD7D76F98/20/TEMPERATURE], 14:[site/0xD7D76F98/19, site/0xD7D76F98/23], 11:[site/0xD7D76F98/18], 12:[site/0xD7D76F98/17], 3:[site/0xD7D76F98/11], 2:[site/0xD7D76F98/10], 1:[site/0xD7D76F98/9], 10:[site/0xD7D76F98/7], 0:[site/0xD7D76F98/3, site/0xD7D76F98/4, site/0xD7D76F98/4/HEATING], 7:[site/0xD7D76F98/15], 6:[site/0xD7D76F98/14], 5:[site/0xD7D76F98/13, site/0xD7D76F98/21, site/0xD7D76F98/5], 4:[site/0xD7D76F98/12, site/0xD7D76F98/16, site/0xD7D76F98/20], 9:[site/0xD7D76F98/4/TEMPERATURE, site/0xD7D76F98/4/HEATING]], strTime:17:26:37, iFlags:0, iMode:1, bOutRequestHeat:false, trigger:[linkChildActive:0, test:0, preheat:0, boost:0, setpoint:0, reactive:0, output:0, linkChildOutput:0], datapoints:[[val:86, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:Battery, type:Int, val_prev:86], [val:21, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:HEATING_1, type:Float, val_prev:21], [val:0, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/3, addr:SwitchBinary, type:Int, val_prev:0], [val:17.879999, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:TEMPERATURE, type:Float, val_prev:17.879999]], zoneSubType:0, iBaseMode:1, lOptions:3, bPrimaryZone:true, fPV:17.879999, iOverrideMode:1, iFlagActualKit:1, lstIssues:, strBuildDate:Dec 18 2018, log:, iPriority:0, strName:Our House, bHeatEnabled:false, fExternalPV:4, iFlagExpectedKit:1, iBoostTimeRemaining:1800, nodes:[[childValues:[LibraryType:[val:Routing Slave, confirmedValue:false, val_pend:Routing Slave, lastUpdate:0, path:site/0xD7D76F98/3, addr:LibraryType, type:String, val_prev:Routing Slave], location:[val:Our House, confirmedVa…[TRUNCATED]
[GUID-REMOVED] 5:26:46 PM: debug getChildDevices(false), children=4
[GUID-REMOVED] 5:26:44 PM: trace Genius Hub Integration: fetchZonesAsync
[GUID-REMOVED] 5:26:44 PM: trace Genius Hub Integration: refresh
[GUID-REMOVED] 5:23:53 PM: debug Tunnel server url: hub-server-2.heatgenius.co.uk
[GUID-REMOVED] 5:23:53 PM: debug Response: 200; [data:[external_ip:[IP-REMOVED], hub_release:5.3.0, internal_ip:192.168.1.101, last_checkin:2019-01-01 17:21:55, tunnel:[connect_time:2019-01-01 12:01:45, disconnect_reason:null, disconnect_time:0000-00-00 00:00:00, last_update:2019-01-01 17:23:32, server_name:hub-server-2.heatgenius.co.uk]], error:0, tm:2019-01-01T17:23:47+0000, ts:1546363427]
[GUID-REMOVED] 5:23:52 PM: trace Genius Hub Integration: checkIn
[GUID-REMOVED] 5:21:46 PM: debug LK: DO: updateAllZonesResponseHandler: switch (geniusType)
[GUID-REMOVED] 5:21:46 PM: debug LK: DONE: updateAllZonesResponseHandler: getGeniusType
[GUID-REMOVED] 5:21:46 PM: debug LK: DONE: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 5:21:46 PM: debug LK: DO: updateAllZonesResponseHandler: response.json.data.find
[GUID-REMOVED] 5:21:46 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusType
[GUID-REMOVED] 5:21:46 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 5:21:46 PM: debug LK: DONE: updateAllZonesResponseHandler: getChildDevices
[GUID-REMOVED] 5:21:46 PM: debug getChildDevices(false), children=4
[GUID-REMOVED] 5:21:46 PM: debug updateAllZonesResponseHandler: [tm:2019-01-01T17:21:45+0000, ts:1546363305, error:0, data:[[iType:1, iOverrideDuration:3600, tmBoilerWeekly:38310, bIsActive:false, iID:0, weatherData:[message:, timestamp:0, humidity:66, status:0, precipitation:0, uv:0, weather_type:2, feels_like:2, temperature:4], mappings:[15:[site/0xD7D76F98/22, site/0xD7D76F98/20/TEMPERATURE], 14:[site/0xD7D76F98/19, site/0xD7D76F98/23], 11:[site/0xD7D76F98/18], 12:[site/0xD7D76F98/17], 3:[site/0xD7D76F98/11], 2:[site/0xD7D76F98/10], 1:[site/0xD7D76F98/9], 10:[site/0xD7D76F98/7], 0:[site/0xD7D76F98/3, site/0xD7D76F98/4, site/0xD7D76F98/4/HEATING], 7:[site/0xD7D76F98/15], 6:[site/0xD7D76F98/14], 5:[site/0xD7D76F98/13, site/0xD7D76F98/21, site/0xD7D76F98/5], 4:[site/0xD7D76F98/12, site/0xD7D76F98/16, site/0xD7D76F98/20], 9:[site/0xD7D76F98/4/TEMPERATURE, site/0xD7D76F98/4/HEATING]], strTime:17:21:42, iFlags:0, iMode:1, bOutRequestHeat:false, trigger:[linkChildActive:0, test:0, preheat:0, boost:0, setpoint:0, reactive:0, output:0, linkChildOutput:0], datapoints:[[val:86, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:Battery, type:Int, val_prev:86], [val:21, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:HEATING_1, type:Float, val_prev:21], [val:0, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/3, addr:SwitchBinary, type:Int, val_prev:0], [val:17.92, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:TEMPERATURE, type:Float, val_prev:17.92]], zoneSubType:0, iBaseMode:1, lOptions:3, bPrimaryZone:true, fPV:17.92, iOverrideMode:1, iFlagActualKit:1, lstIssues:, strBuildDate:Dec 18 2018, log:, iPriority:0, strName:Our House, bHeatEnabled:false, fExternalPV:4, iFlagExpectedKit:1, iBoostTimeRemaining:1800, nodes:[[childValues:[LibraryType:[val:Routing Slave, confirmedValue:false, val_pend:Routing Slave, lastUpdate:0, path:site/0xD7D76F98/3, addr:LibraryType, type:String, val_prev:Routing Slave], location:[val:Our House, confirmedValue:false, v…[TRUNCATED]
[GUID-REMOVED] 5:21:46 PM: debug LK: DO: updateAllZonesResponseHandler: getChildDevices
[GUID-REMOVED] 5:21:45 PM: trace Genius Hub Integration: fetchZonesAsync
[GUID-REMOVED] 5:21:45 PM: trace Genius Hub Integration: refresh
[GUID-REMOVED] 5:16:46 PM: error java.lang.NullPointerException: Cannot get property ‘val’ on null object @line -1 (doCall)
[GUID-REMOVED] 5:16:46 PM: debug LK: DO: updateAllZonesResponseHandler: response.json.data.find
[GUID-REMOVED] 5:16:46 PM: debug LK: DONE: updateAllZonesResponseHandler: getGeniusType
[GUID-REMOVED] 5:16:46 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusType
[GUID-REMOVED] 5:16:46 PM: debug LK: DONE: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 5:16:46 PM: debug LK: DONE: updateAllZonesResponseHandler: getChildDevices
[GUID-REMOVED] 5:16:46 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 5:16:46 PM: debug getChildDevices(false), children=4
[GUID-REMOVED] 5:16:44 PM: trace Genius Hub Integration: fetchZonesAsync
[GUID-REMOVED] 5:16:44 PM: trace Genius Hub Integration: refresh
[GUID-REMOVED] 5:11:46 PM: debug LK: DONE: updateAllZonesResponseHandler: response.json.data.find
[GUID-REMOVED] 5:11:46 PM: debug LK: DO: updateAllZonesResponseHandler: response.json.data.find
[GUID-REMOVED] 5:11:46 PM: debug LK: DONE: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 5:11:46 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusType
[GUID-REMOVED] 5:11:46 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 5:11:46 PM: debug LK: DONE: updateAllZonesResponseHandler: getChildDevices
[GUID-REMOVED] 5:11:46 PM: debug getChildDevices(false), children=4
[GUID-REMOVED] 5:11:46 PM: debug updateAllZonesResponseHandler: [tm:2019-01-01T17:11:45+0000, ts:1546362705, error:0, data:[[iType:1, iOverrideDuration:3600, tmBoilerWeekly:38310, bIsActive:false, iID:0, weatherData:[message:, timestamp:0, humidity:66, status:0, precipitation:0, uv:0, weather_type:2, feels_like:2, temperature:4], mappings:[15:[site/0xD7D76F98/22, site/0xD7D76F98/20/TEMPERATURE], 14:[site/0xD7D76F98/19, site/0xD7D76F98/23], 11:[site/0xD7D76F98/18], 12:[site/0xD7D76F98/17], 3:[site/0xD7D76F98/11], 2:[site/0xD7D76F98/10], 1:[site/0xD7D76F98/9], 10:[site/0xD7D76F98/7], 0:[site/0xD7D76F98/3, site/0xD7D76F98/4, site/0xD7D76F98/4/HEATING], 7:[site/0xD7D76F98/15], 6:[site/0xD7D76F98/14], 5:[site/0xD7D76F98/13, site/0xD7D76F98/21, site/0xD7D76F98/5], 4:[site/0xD7D76F98/12, site/0xD7D76F98/16, site/0xD7D76F98/20], 9:[site/0xD7D76F98/4/TEMPERATURE, site/0xD7D76F98/4/HEATING]], strTime:17:11:43, iFlags:0, iMode:1, bOutRequestHeat:false, trigger:[linkChildActive:0, test:0, preheat:0, boost:0, setpoint:0, reactive:0, output:0, linkChildOutput:0], datapoints:[[val:86, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:Battery, type:Int, val_prev:86], [val:21, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:HEATING_1, type:Float, val_prev:21], [val:0, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/3, addr:SwitchBinary, type:Int, val_prev:0], [val:17.940001, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:TEMPERATURE, type:Float, val_prev:17.940001]], zoneSubType:0, iBaseMode:1, lOptions:3, bPrimaryZone:true, fPV:17.940001, iOverrideMode:1, iFlagActualKit:1, lstIssues:, strBuildDate:Dec 18 2018, log:, iPriority:0, strName:Our House, bHeatEnabled:false, fExternalPV:4, iFlagExpectedKit:1, iBoostTimeRemaining:1800, nodes:[[childValues:[LibraryType:[val:Routing Slave, confirmedValue:false, val_pend:Routing Slave, lastUpdate:0, path:site/0xD7D76F98/3, addr:LibraryType, type:String, val_prev:Routing Slave], location:[val:Our House, confirmedVa…[TRUNCATED]
[GUID-REMOVED] 5:11:46 PM: debug LK: DO: updateAllZonesResponseHandler: getChildDevices
[GUID-REMOVED] 5:11:44 PM: trace Genius Hub Integration: fetchZonesAsync
[GUID-REMOVED] 5:11:44 PM: trace Genius Hub Integration: refresh
[GUID-REMOVED] 5:06:46 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusType
[GUID-REMOVED] 5:06:46 PM: debug LK: DONE: updateAllZonesResponseHandler: getChildDevices
[GUID-REMOVED] 5:06:46 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 5:06:46 PM: debug getChildDevices(false), children=4
[GUID-REMOVED] 5:06:46 PM: debug LK: DONE: updateAllZonesResponseHandler: getGeniusType
[GUID-REMOVED] 5:06:46 PM: debug LK: DONE: updateAllZonesResponseHandler: response.json.data.find
[GUID-REMOVED] 5:06:44 PM: trace Genius Hub Integration: fetchZonesAsync
[GUID-REMOVED] 5:06:44 PM: trace Genius Hub Integration: refresh
[GUID-REMOVED] 5:01:46 PM: error java.lang.NullPointerException: Cannot get property ‘val’ on null object @line -1 (doCall)
[GUID-REMOVED] 5:01:46 PM: debug LK: DONE: updateAllZonesResponseHandler: response.json.data.find
[GUID-REMOVED] 5:01:46 PM: debug LK: DO: updateAllZonesResponseHandler: switch (geniusType)
[GUID-REMOVED] 5:01:46 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusType
[GUID-REMOVED] 5:01:46 PM: debug LK: DO: updateAllZonesResponseHandler: response.json.data.find
[GUID-REMOVED] 5:01:46 PM: debug LK: DONE: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 5:01:45 PM: trace Genius Hub Integration: fetchZonesAsync
[GUID-REMOVED] 5:01:45 PM: trace Genius Hub Integration: refresh
[GUID-REMOVED] 4:56:47 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 4:56:47 PM: error java.lang.NullPointerException: Cannot get property ‘val’ on null object @line -1 (doCall)
[GUID-REMOVED] 4:56:47 PM: debug LK: DONE: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 4:56:47 PM: debug updateAllZonesResponseHandler: [tm:2019-01-01T16:56:46+0000, ts:1546361806, error:0, data:[[iType:1, iOverrideDuration:3600, tmBoilerWeekly:38310, bIsActive:false, iID:0, weatherData:[message:, timestamp:0, humidity:66, status:0, precipitation:0, uv:0, weather_type:2, feels_like:2, temperature:4], mappings:[15:[site/0xD7D76F98/22, site/0xD7D76F98/20/TEMPERATURE], 14:[site/0xD7D76F98/19, site/0xD7D76F98/23], 11:[site/0xD7D76F98/18], 12:[site/0xD7D76F98/17], 3:[site/0xD7D76F98/11], 2:[site/0xD7D76F98/10], 1:[site/0xD7D76F98/9], 10:[site/0xD7D76F98/7], 0:[site/0xD7D76F98/3, site/0xD7D76F98/4, site/0xD7D76F98/4/HEATING], 7:[site/0xD7D76F98/15], 6:[site/0xD7D76F98/14], 5:[site/0xD7D76F98/13, site/0xD7D76F98/21, site/0xD7D76F98/5], 4:[site/0xD7D76F98/12, site/0xD7D76F98/16, site/0xD7D76F98/20], 9:[site/0xD7D76F98/4/TEMPERATURE, site/0xD7D76F98/4/HEATING]], strTime:16:56:36, iFlags:0, iMode:1, bOutRequestHeat:false, trigger:[linkChildActive:0, test:0, preheat:0, boost:0, setpoint:0, reactive:0, output:0, linkChildOutput:0], datapoints:[[val:86, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:Battery, type:Int, val_prev:86], [val:21, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:HEATING_1, type:Float, val_prev:21], [val:0, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/3, addr:SwitchBinary, type:Int, val_prev:0], [val:17.98, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:TEMPERATURE, type:Float, val_prev:17.98]], zoneSubType:0, iBaseMode:1, lOptions:3, bPrimaryZone:true, fPV:17.98, iOverrideMode:1, iFlagActualKit:1, lstIssues:, strBuildDate:Dec 18 2018, log:, iPriority:0, strName:Our House, bHeatEnabled:false, fExternalPV:4, iFlagExpectedKit:1, iBoostTimeRemaining:1800, nodes:[[childValues:[LibraryType:[val:Routing Slave, confirmedValue:false, val_pend:Routing Slave, lastUpdate:0, path:site/0xD7D76F98/3, addr:LibraryType, type:String, val_prev:Routing Slave], location:[val:Our House, confirmedValue:false, v…[TRUNCATED]
[GUID-REMOVED] 4:56:47 PM: debug LK: DO: updateAllZonesResponseHandler: getChildDevices
[GUID-REMOVED] 4:56:45 PM: trace Genius Hub Integration: fetchZonesAsync
[GUID-REMOVED] 4:56:45 PM: trace Genius Hub Integration: refresh
[GUID-REMOVED] 4:51:47 PM: debug LK: DO: updateAllZonesResponseHandler: switch (geniusType)
[GUID-REMOVED] 4:51:47 PM: debug LK: DONE: updateAllZonesResponseHandler: getGeniusType
[GUID-REMOVED] 4:51:47 PM: debug LK: DO: updateAllZonesResponseHandler: response.json.data.find
[GUID-REMOVED] 4:51:47 PM: debug LK: DONE: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 4:51:47 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusType
[GUID-REMOVED] 4:51:47 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 4:51:47 PM: debug LK: DONE: updateAllZonesResponseHandler: getChildDevices
[GUID-REMOVED] 4:51:47 PM: debug getChildDevices(false), children=4
[GUID-REMOVED] 4:51:45 PM: trace Genius Hub Integration: fetchZonesAsync
[GUID-REMOVED] 4:51:45 PM: trace Genius Hub Integration: refresh
[GUID-REMOVED] 4:46:46 PM: debug LK: DONE: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 4:46:46 PM: debug getChildDevices(false), children=4
[GUID-REMOVED] 4:46:46 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 4:46:46 PM: debug LK: DO: updateAllZonesResponseHandler: switch (geniusType)
[GUID-REMOVED] 4:46:46 PM: debug LK: DONE: updateAllZonesResponseHandler: getChildDevices
[GUID-REMOVED] 4:46:46 PM: error java.lang.NullPointerException: Cannot get property ‘val’ on null object @line -1 (doCall)
[GUID-REMOVED] 4:46:46 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusType
[GUID-REMOVED] 4:46:44 PM: trace Genius Hub Integration: fetchZonesAsync
[GUID-REMOVED] 4:46:44 PM: trace Genius Hub Integration: refresh
[GUID-REMOVED] 4:41:44 PM: trace Genius Hub Integration: fetchZonesAsync
[GUID-REMOVED] 4:41:44 PM: trace Genius Hub Integration: refresh
[GUID-REMOVED] 4:37:06 PM: error java.lang.NullPointerException: Cannot get property ‘val’ on null object @line -1 (doCall)
[GUID-REMOVED] 4:37:06 PM: debug LK: DONE: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 4:37:05 PM: debug getChildDevices(false), children=4
[GUID-REMOVED] 4:37:05 PM: debug updateAllZonesResponseHandler: [tm:2019-01-01T16:37:04+0000, ts:1546360624, error:0, data:[[iType:1, iOverrideDuration:3600, tmBoilerWeekly:38310, bIsActive:false, iID:0, weatherData:[message:, timestamp:0, humidity:66, status:0, precipitation:0, uv:0, weather_type:2, feels_like:2, temperature:4], mappings:[15:[site/0xD7D76F98/22, site/0xD7D76F98/20/TEMPERATURE], 14:[site/0xD7D76F98/19, site/0xD7D76F98/23], 11:[site/0xD7D76F98/18], 12:[site/0xD7D76F98/17], 3:[site/0xD7D76F98/11], 2:[site/0xD7D76F98/10], 1:[site/0xD7D76F98/9], 10:[site/0xD7D76F98/7], 0:[site/0xD7D76F98/3, site/0xD7D76F98/4, site/0xD7D76F98/4/HEATING], 7:[site/0xD7D76F98/15], 6:[site/0xD7D76F98/14], 5:[site/0xD7D76F98/13, site/0xD7D76F98/21, site/0xD7D76F98/5], 4:[site/0xD7D76F98/12, site/0xD7D76F98/16, site/0xD7D76F98/20], 9:[site/0xD7D76F98/4/TEMPERATURE, site/0xD7D76F98/4/HEATING]], strTime:16:36:57, iFlags:0, iMode:1, bOutRequestHeat:false, trigger:[linkChildActive:0, test:0, preheat:0, boost:0, setpoint:0, reactive:0, output:0, linkChildOutput:0], datapoints:[[val:86, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:Battery, type:Int, val_prev:86], [val:21, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:HEATING_1, type:Float, val_prev:21], [val:0, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/3, addr:SwitchBinary, type:Int, val_prev:0], [val:18.1, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:TEMPERATURE, type:Float, val_prev:18.1]], zoneSubType:0, iBaseMode:1, lOptions:3, bPrimaryZone:true, fPV:18.1, iOverrideMode:1, iFlagActualKit:1, lstIssues:, strBuildDate:Dec 18 2018, log:, iPriority:0, strName:Our House, bHeatEnabled:false, fExternalPV:4, iFlagExpectedKit:1, iBoostTimeRemaining:1800, nodes:[[childValues:[LibraryType:[val:Routing Slave, confirmedValue:false, val_pend:Routing Slave, lastUpdate:0, path:site/0xD7D76F98/3, addr:LibraryType, type:String, val_prev:Routing Slave], location:[val:Our House, confirmedValue:false, val_…[TRUNCATED]
[GUID-REMOVED] 4:37:05 PM: debug LK: DONE: updateAllZonesResponseHandler: getChildDevices
[GUID-REMOVED] 4:37:05 PM: debug LK: DO: updateAllZonesResponseHandler: getChildDevices
[GUID-REMOVED] 4:37:03 PM: debug LK: DO: createChildDevice: getChildDevice
[GUID-REMOVED] 4:37:03 PM: trace Genius Hub Integration: createChildDevice
[GUID-REMOVED] 4:37:03 PM: debug Child device GENIUS-1 already exists. Not creating.
[GUID-REMOVED] 4:37:03 PM: debug getChildDevices(false), children=4
[GUID-REMOVED] 4:37:03 PM: debug LK: DONE: createChildDevice: getChildDevice
[GUID-REMOVED] 4:37:03 PM: debug LK: DONE: updateChildDevices: getGeniusId
[GUID-REMOVED] 4:37:03 PM: trace Genius Hub Integration: createChildDevice
[GUID-REMOVED] 4:37:03 PM: debug LK: DONE: createChildDevice: getChildDevice
[GUID-REMOVED] 4:37:03 PM: debug LK: DO: updateChildDevices: getGeniusId
[GUID-REMOVED] 4:37:03 PM: debug LK: DONE: updateChildDevices: assign id
[GUID-REMOVED] 4:37:03 PM: debug LK: DONE: updateChildDevices: assign id
[GUID-REMOVED] 4:37:03 PM: debug LK: DO: updateChildDevices: getGeniusId
[GUID-REMOVED] 4:37:03 PM: debug LK: DONE: updateChildDevices: getGeniusId
[GUID-REMOVED] 4:37:03 PM: debug LK: DONE: updateChildDevices: assign id
[GUID-REMOVED] 4:37:03 PM: debug LK: DO: updateChildDevices: disjoint
[GUID-REMOVED] 4:35:30 PM: debug getChildDevices(false), children=4
[GUID-REMOVED] 4:35:30 PM: debug LK: DONE: updateAllZonesResponseHandler: getChildDevices
[GUID-REMOVED] 4:35:29 PM: debug LK: DONE: updateChildDevices: getGeniusId
[GUID-REMOVED] 4:35:29 PM: debug LK: DO: updateChildDevices: disjoint
[GUID-REMOVED] 4:35:29 PM: debug LK: DO: updateChildDevices: assign id
[GUID-REMOVED] 4:35:29 PM: debug LK: DO: updateChildDevices: getGeniusId
[GUID-REMOVED] 4:35:29 PM: debug LK: DO: updateChildDevices: assign id
[GUID-REMOVED] 4:35:29 PM: debug LK: DO: updateChildDevices: disjoint
[GUID-REMOVED] 4:35:29 PM: debug LK: DONE: updateChildDevices: assign id
[GUID-REMOVED] 4:35:29 PM: debug LK: DO: updateChildDevices: getGeniusId
[GUID-REMOVED] 4:35:29 PM: debug LK: DONE: updateChildDevices: getGeniusId
[GUID-REMOVED] 4:35:29 PM: debug LK: DONE: updateChildDevices: getChildDevices
[GUID-REMOVED] 4:35:29 PM: debug getChildDevices(false), children=4
[GUID-REMOVED] 4:35:29 PM: debug LK: DO: updateChildDevices: getChildDevices
[GUID-REMOVED] 4:33:44 PM: debug LK: DO: updateAllZonesResponseHandler: response.json.data.find
[GUID-REMOVED] 4:33:44 PM: debug LK: DO: updateAllZonesResponseHandler: switch (geniusType)
[GUID-REMOVED] 4:33:44 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusType
[GUID-REMOVED] 4:33:44 PM: debug updateAllZonesResponseHandler: [tm:2019-01-01T16:33:43+0000, ts:1546360423, error:0, data:[[iType:1, iOverrideDuration:3600, tmBoilerWeekly:38310, bIsActive:false, iID:0, weatherData:[message:, timestamp:0, humidity:66, status:0, precipitation:0, uv:0, weather_type:2, feels_like:2, temperature:4], mappings:[15:[site/0xD7D76F98/22, site/0xD7D76F98/20/TEMPERATURE], 14:[site/0xD7D76F98/19, site/0xD7D76F98/23], 11:[site/0xD7D76F98/18], 12:[site/0xD7D76F98/17], 3:[site/0xD7D76F98/11], 2:[site/0xD7D76F98/10], 1:[site/0xD7D76F98/9], 10:[site/0xD7D76F98/7], 0:[site/0xD7D76F98/3, site/0xD7D76F98/4, site/0xD7D76F98/4/HEATING], 7:[site/0xD7D76F98/15], 6:[site/0xD7D76F98/14], 5:[site/0xD7D76F98/13, site/0xD7D76F98/21, site/0xD7D76F98/5], 4:[site/0xD7D76F98/12, site/0xD7D76F98/16, site/0xD7D76F98/20], 9:[site/0xD7D76F98/4/TEMPERATURE, site/0xD7D76F98/4/HEATING]], strTime:16:33:34, iFlags:0, iMode:1, bOutRequestHeat:false, trigger:[linkChildActive:0, test:0, preheat:0, boost:0, setpoint:0, reactive:0, output:0, linkChildOutput:0], datapoints:[[val:86, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:Battery, type:Int, val_prev:86], [val:21, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:HEATING_1, type:Float, val_prev:21], [val:0, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/3, addr:SwitchBinary, type:Int, val_prev:0], [val:18.1, confirmedValue:false, val_pend:0, lastUpdate:0, path:site/0xD7D76F98/4, addr:TEMPERATURE, type:Float, val_prev:18.1]], zoneSubType:0, iBaseMode:1, lOptions:3, bPrimaryZone:true, fPV:18.1, iOverrideMode:1, iFlagActualKit:1, lstIssues:, strBuildDate:Dec 18 2018, log:, iPriority:0, strName:Our House, bHeatEnabled:false, fExternalPV:4, iFlagExpectedKit:1, iBoostTimeRemaining:1800, nodes:[[childValues:[LibraryType:[val:Routing Slave, confirmedValue:false, val_pend:Routing Slave, lastUpdate:0, path:site/0xD7D76F98/3, addr:LibraryType, type:String, val_prev:Routing Slave], location:[val:Our House, confirmedValue:false, val_…[TRUNCATED]
[GUID-REMOVED] 4:33:42 PM: trace Genius Hub Integration: fetchZonesAsync
[GUID-REMOVED] 4:33:42 PM: trace Genius Hub Integration: refresh
[GUID-REMOVED] 4:29:28 PM: debug LK: DO: updateAllZonesResponseHandler: getChildDevices
[GUID-REMOVED] 4:29:28 PM: debug LK: DO: updateAllZonesResponseHandler: getGeniusId
[GUID-REMOVED] 4:29:26 PM: debug LK: DO: updateChildDevices: assign id
[GUID-REMOVED] 4:29:26 PM: debug LK: DONE: createChildDevice: getChildDevice
[GUID-REMOVED] 4:29:26 PM: trace Genius Hub Integration: createChildDevice
[GUID-REMOVED] 4:29:26 PM: debug LK: DONE: updateChildDevices: getGeniusId
[GUID-REMOVED] 4:29:26 PM: debug LK: DO: updateChildDevices: disjoint
[GUID-REMOVED] 4:29:26 PM: debug LK: DONE: updateChildDevices: getChildDevices
[GUID-REMOVED] 4:29:26 PM: debug LK: DO: updateChildDevices: getChildDevices
[GUID-REMOVED] 4:29:26 PM: debug LK: DONE: updateChildDevices: assign id
[GUID-REMOVED] 4:29:26 PM: debug LK: DONE: updateChildDevices: getGeniusId
[GUID-REMOVED] 4:29:26 PM: trace Genius Hub Integration: updated
[GUID-REMOVED] 4:29:26 PM: debug LK: DO: updateChildDevices: disjoint
[GUID-REMOVED] 4:29:26 PM: debug LK: DO: updateChildDevices: assign id
[GUID-REMOVED] 4:29:26 PM: debug LK: DO: updateChildDevices: getGeniusId
[GUID-REMOVED] 4:29:26 PM: debug LK: DONE: updateChildDevices: assign id
[GUID-REMOVED] 4:29:26 PM: debug LK: DO: updateChildDevices: getGeniusId

Just a thought here. In order to use the new HeatGenius API I believe your HG hub needs to be running the matching ‘new’ firmware. I am not sure whether the hubs have been automatically upgraded by a push from HG.

What HG hub firmware versions are you running @nigelmwilliams7 and @Lewis_King ? You may not be able to get this working until HG release it - unless you are in the beta program.

Obviously local api is way preferable to Internet api too, especially if on Hubitat

I can’t see any merit in wanting to take the system control away from HG either. That’s what you bought it for, their expertise in heating algorithms. Having ST perform this directly is just a waste, you may as well just buy ZWave or ZigBee TRVs and temp sensors and directly pair them to ST.

However supplementing the functionality of HG with ST extras does seem interesting but bear in mind that even varying start times from ST messes with things like predictive start. As would for example forcing the boiler ON when HG believes it’s OFF or vv. You don’t want to disrupt the modelling that HG is using.

An advanced geofencing system could be a nice addition though.

1 Like

@xAPPO the killer use case for integration for me is presence. If I’m putting presence sensors in each room for HG, then I would like to use their state information for lighting and curtains/blinds too. But I can only do this if I can expose that state information through an API in some way.

Hi there
I like the idea of the integration to provide additional information both ways.
I have 2 STT Motion sensors in our lounge that can also measure the temperature as well as a HeatGenius Room Sensor.
I wanted to implement Use Cases to override in certain instances the Footprint mode for an hour.
Does that make sense?

Currently I am running firmware 5.2.6, and App 5.2.4

@Lewis_King It looks like there’s a device somewhere in your system which isn’t returning either a Battery or LUMINANCE value, where I’m expecting it from the behaviour of mine. I’ll try to make these optional. My hub’s running v5.2.2.

Re comments from @xAPPO - I agree that nobody should be aiming to take ultimate control away from the Genius hub; it controls the heating better than anything that ST can do right now. This just provides an alternative interface for manual override though - it won’t mess up the Genius logic any more than setting up an override in the Genius app or on the physical radiator valve would. Control of heating (perhaps surprisingly?) wasn’t in my mind when I started this - I had two bugbears which I reckoned this would fix, and the actual heating control just came as a byproduct:

  • You have no real control of switches - they’re always on a schedule, so you can’t just switch one on and expect it to remain on. It’s meant that for the last three years we’ve had these supposedly smart switches plugged in which we can’t use, whereas now they’re happily controlling a lamp and the Christmas tree.
  • You get no notification of a low battery unless you open up the app. It’s supposed to be the kind of system you set up and ignore, but until you don’t have to open up the app periodically it’s really not - and this would make it so. (I’ve not actually set up this notification yet, but at least now I can!)

One thing which really isn’t possible right now is triggering events in other systems based on the Genius motion sensors (as @squirblej and @nigelmwilliams7 have just commented on while I’ve been typing!). I’d like to do this too, and if the Genius hub provided any realtime triggers (MQTT would seem a good way for them to build it in) I’d buy more sensors - but polling the api just isn’t a solution for sensing motion.

If HeatGenius could provide a reliable IFTTT bridge then this would provide sufficient for overriding purposing. I have created a virtual switch for each significant room, I use the temperature readings from the STT to check and then if the temp is below a certain temp I can turn on the virtual switch which will be trapped thru IFTT and override that room for an hour.

What other use cases are you thinking of?

I’d like to hook motion into lights too. I often end up going into my office with full hands in the dark, and automatic lights would be nice. I’ve already got the motion sensor there.

@Lewis_King Please try the latest commit now. I’ve added in a check that battery and luminance values actually exist before accessing them.