! LET OP ! LEES EERST: !
Aangezien een gebruiker mij de opmerking gaf dat manuele aanpassingen aan de thermostaat altijd overschreven werden door de Fibaro programmatie, en dat in zijn geval niet wenselijk was, heb ik een 2e versie gemaakt van het device en de scene. Nu kan je perfect de twee combineren. Manuele aanpassingen hebben voorrang op de geprogrammeerde instelling, tot de volgende programmeerstap eraan komt, en dan gaat hij verder met de geprogrammeerde temperatuur.
Zie ook het grafiekje hieronder:
Voor de download van het tt_nestdevicev2
Na versie 4.110 heb je de nieuwe nodig: tt_nestdevicev3
Ondertussen al 1 klein bugje ontdekt… in het virtueel Device staat de start-url als “https://developer-api.nest.com” ; dit moet echter “https://developer-api.nest.com/” zijn.
Dit kan je rechtzetten in de code van het virtueel device en met het aanmaken van een knop die : “fibaro:call(NestButtonId,”setProperty”,”ui.url.value”,”https://developer-api.nest.com/”)” doet en deze dan uit te voeren.
Voor de code v2 van de Scene:
update – 13/3: versie 2.1
--[[ %% properties %% events %% globals --]] local NestButton= local setpincode=fibaro:getValue(NestButton,"ui.pincode.value") local acccode=fibaro:getValue(NestButton,"ui.acccode.value") local thermoid=fibaro:getValue(NestButton,"ui.thermoid.value") local uri=fibaro:getValue(NestButton,"ui.url.value") function capture307(status) if (tonumber(status.status)==307) then fibaro:call(NestButton, "setProperty","ui.url.value","https://"..status.headers.Location:match('^%w+://([^/]+)').."/") fibaro:debug("307 Status - URL cached ".."https://"..status.headers.Location:match('^%w+://([^/]+)').."/") else result = json.decode(status.data) if (result~=nil) then --fibaro:debug("200 Result - returning") else fibaro:debug("200 Result - nil response") end return result end end function doRequest(url,options) local selfhttp = net.HTTPClient({timeout=2000}) selfhttp:request(url,options) end --have pincode, not acccode; get acccode if (acccode=="") then if (setpincode~="") then fibaro:call(NestButton,"setProperty","ui.log.value",'access code request') fibaro:debug('running access code request') local body="code="..setpincode.."&client_id=85678ff8-99b5-47e5-b3fb-320dce57b9e6&client_secret=obH3q6WhTpzkdI5mL3zqRq3VT&grant_type=authorization_code" --fibaro:debug(body) doRequest("https://api.home.nest.com/oauth2/access_token?"..body,{ options={ method = 'POST', timeout = 5000 }, success=function(status) fibaro:debug("Received Access Code") result=capture307(status) fibaro:call(NestButton,"setProperty","ui.acccode.value","Bearer "..result['access_token']) end, error = function(status) fibaro:debug("error "..status) end }) end fibaro:sleep(1100) end -- have acccode not thermoid; get thermostat id if (acccode~="") and (thermoid=="") then fibaro:call(NestButton,"setProperty","ui.log.value",'thermostat id request') doRequest(uri.."devices/thermostats",{ options={ headers = { ['Content-Type'] = "application/json", ['Authorization'] = acccode }, method = 'GET', timeout = 5000 }, success=function(status) local result=capture307(status) if (result~=nil) then local tid="" for k in pairs(result) do tid=k end fibaro:call(NestButton,"setProperty","ui.thermoid.value",tid) fibaro:call(NestButton,"setProperty","ui.setpoint.value","-1") fibaro:call(NestButton,"setProperty","ui.oldsetp.value","-1") fibaro:call(NestButton,"setProperty","ui.oldtosetp.value","-1") fibaro:debug("Received Thermostat ID") end end, error = function(status) fibaro:debug("error "..status) end }) fibaro:sleep(1100) end -- have accode and thermoid if (acccode~="") and (thermoid~="") then fibaro:call(NestButton,"setProperty","ui.log.value",'data update request') doRequest(uri.."devices/thermostats/"..thermoid,{ options={ headers = { ['Content-Type'] = "application/json", ['Authorization'] = acccode }, method = 'GET', timeout = 5000 }, success=function(status) local result=capture307(status) if (result~=nil) then fibaro:debug("Received Thermostat Data") if (result["temperature_scale"]=="C") then fibaro:call(NestButton,"setProperty","ui.scale.value","°C") fibaro:call(NestButton,"setProperty","ui.curtemp.value",result["ambient_temperature_c"]) fibaro:call(NestButton,"setProperty","ui.settemp.value",result["target_temperature_c"]) local sp=fibaro:getValue(NestButton,"ui.setpoint.value") if (tonumber(sp)==-1) then fibaro:call(NestButton,"setProperty","ui.setpoint.value",result["target_temperature_c"]) fibaro:call(NestButton,"setProperty","ui.oldsetp.value",result["target_temperature_c"]) fibaro:call(NestButton,"setProperty","ui.oldtosetp.value",result["target_temperature_c"]) end local ocsp=tonumber(fibaro:getValue(NestButton,"ui.oldsetp.value")) -- (ocsp<>csp) => manual change, overrule tsp change => ocsp:=csp & otsp:=csp & tsp:=csp if (ocsp~=tonumber(result["target_temperature_c"])) then fibaro:call(NestButton,"setProperty","ui.setpoint.value",result["target_temperature_c"]) fibaro:call(NestButton,"setProperty","ui.oldsetp.value",result["target_temperature_c"]) fibaro:call(NestButton,"setProperty","ui.oldtosetp.value",result["target_temperature_c"]) end else fibaro:call(NestButton,"setProperty","ui.scale.Label","°F") fibaro:call(NestButton,"setProperty","ui.curtemp.value",result["ambient_temperature_f"]) fibaro:call(NestButton,"setProperty","ui.settemp.value",result["target_temperature_f"]) local sp=fibaro:getValue(NestButton,"ui.setpoint.value") if (tonumber(sp)==-1) then fibaro:call(NestButton,"setProperty","ui.setpoint.value",result["target_temperature_f"]) fibaro:call(NestButton,"setProperty","ui.oldsetp.value",result["target_temperature_f"]) fibaro:call(NestButton,"setProperty","ui.oldtosetp.value",result["target_temperature_f"]) end local ocsp=tonumber(fibaro:getValue(NestButton,"ui.oldsetp.value")) -- (ocsp<>csp) => manual change, overrule tsp change => ocsp:=csp & otsp:=csp & tsp:=csp if (ocsp~=tonumber(result["target_temperature_f"])) then fibaro:call(NestButton,"setProperty","ui.setpoint.value",result["target_temperature_f"]) fibaro:call(NestButton,"setProperty","ui.oldsetp.value",result["target_temperature_f"]) fibaro:call(NestButton,"setProperty","ui.oldtosetp.value",result["target_temperature_f"]) end end fibaro:call(NestButton,"setProperty","ui.curhum.value",result["humidity"]) fibaro:call(NestButton,"setProperty","ui.online.value",result["is_online"]) end end, error = function(status) fibaro:debug("error "..status) end }) fibaro:sleep(1100) end --have all, setpoint initialised if (acccode~="") and (thermoid~="") and (tonumber(fibaro:getValue(NestButton,"ui.setpoint.value"))~=-1) then fibaro:call(NestButton,"setProperty","ui.log.value",'checking setpoint') local csp=tonumber(fibaro:getValue(NestButton,"ui.settemp.value")) local ocsp=tonumber(fibaro:getValue(NestButton,"ui.oldsetp.value")) local tsp=tonumber(fibaro:getValue(NestButton,"ui.setpoint.value")) local otsp=tonumber(fibaro:getValue(NestButton,"ui.oldtosetp.value")) -- (otsp<>tsp) => prog change (and update ness) => -- => otsp:=tsp & PUT tsp + success = csp:=tsp & ocsp=tsp & otsp=tsp if (otsp~=tsp) then local pmsg="" fibaro:debug("SetTempFrom : "..csp.." To: "..tsp) if (fibaro:getValue(NestButton,"ui.scale.value")=="°C") then pmsg='{"target_temperature_c": '..tsp..'}' else pmsg='{"target_temperature_f": '..tsp..'}' end fibaro:call(NestButton,"setProperty","ui.log.value",'changing setpoint from '..csp.." to "..tsp) doRequest(uri.."devices/thermostats/"..thermoid,{ options={ headers = { ['Content-Type'] = "application/json", ['Authorization'] = acccode }, method = 'PUT', data = pmsg, timeout = 5000 }, success=function(status) local result=capture307(status) if (result~=nil) then fibaro:debug("Temperature Set OK") if (result["target_temperature_c"]~=nil) then fibaro:call(NestButton,"setProperty","ui.settemp.value",result["target_temperature_c"]) fibaro:call(NestButton,"setProperty","ui.oldsetp.value",result["target_temperature_c"]) fibaro:call(NestButton,"setProperty","ui.oldtosetp.value",result["target_temperature_c"]) end if (result["target_temperature_f"]~=nil) then fibaro:call(NestButton,"setProperty","ui.settemp.value",result["target_temperature_f"]) fibaro:call(NestButton,"setProperty","ui.oldsetp.value",result["target_temperature_f"]) fibaro:call(NestButton,"setProperty","ui.oldtosetp.value",result["target_temperature_f"]) end end end, error = function(status) fibaro:debug("error "..status) if (status=="Connection refused") then fibaro:call(NestButton,"setProperty","ui.url.value","https://developer-api.nest.com/") fibaro:debug("Resetting Nest URL") end end }) end fibaro:sleep(1100) end
Mijn vorige reactie komt te vervallen.
Heb nu de id’s in de scene en VD aangepast en het lijkt te gaan werken, de accesscode wordt opgehaald, maar het script komt niet verder dan dat.
De scene debug window geeft aan error host not found (authoritative).
De developer url heb ik wel afgesloten met een /
wat nu?
Hey Ruud, host-not-found lijkt mij een DNS error; welke URL staat bij het nest-device ingevuld ?
Ik heb juist hetzelfde voor. Werd er ergens een oplossing voor gepubliceerd?
Ik krijg een error bij het gebruik van V3 TT_NestDevicev3 and Nestscene V2.1
op mijn HC2 versie 4.520
De error is:
[DEBUG] 00:12:15: 2018-12-09 00:12:15.636070 [ fatal] Unknown exception: /opt/fibaro/scenes/7.lua:196: unexpected symbol near char(194)
Hey ! Kan je me de code van je scene (bij advanced) even hier kopiëren of naar mij mailen op luckas(at)luckas.be, dan kijk ik het na.
Er zitten vreemde tekens in het error block op 196, als je van UTF8 naar ANSI converteerd worden ze zichtbaar. Het error block daar even opnieuw typen fixed het probleem.
Tevens wellicht handig om even te vermelden dat aan het begin de variabele
local NestButton=
ingevuld moet worden
en in de startup van het device het id van de scene moet worden ingevuld
Dag Luckas, vergeet vorige post. Ik ben gewoon opnieuw begonnen maar heb eerst alle aanpassingen doorgevoerd alvorens de GET pin te drukken. Dit blijkt de correcte manier te zijn.
Vraag : Wat met de aansturing van de verwarmingsketel? Is dit ook mogelijk?
Hi Luks,
Was er al een oplossing voor het probleem met de foutcode van dhr. de Hoop.
Krijg nml dezelfde foutmelding…
[DEBUG] 18:37:11: 2019-01-23 18:37:11.899176 [ fatal] Unknown exception: /opt/fibaro/scenes/19.lua:199: unexpected symbol near char(194)
ps; zie nergens in je uitleg of er een ” Variable” of een “ingestelde Variable” aangemaakt moet worden.
Hallo Luckas,
Heb je de vorige email nog ontvangen, nog geen reactie mogen ontvangen.
Ik heb ook de zelfde foutmelding als hierboven; (HC2 4.530)
[DEBUG] 00:12:15: 2018-12-09 00:12:15.636070 [ fatal] Unknown exception: /opt/fibaro/scenes/7.lua:196: unexpected symbol near char(194)
Is hier een oplossing voor.
Hey,
Ik heb nooit de code opgestuurd gekregen; alleen volgende reactie: “vergeet vorige post. Ik ben gewoon opnieuw begonnen maar heb eerst alle aanpassingen doorgevoerd alvorens de GET pin te drukken. Dit blijkt de correcte manier te zijn.”
Hi Luckas,
Can you help us with some details in english?
I would like to try this scene with nest on my HC2.
Thank you!
Hi Luckas,
Het ziet er allemaal zo mooi uit en krijg het voor geen mogelijkheid werkend.
Scene blijft met de foutmelding komen om de 2 minuten, waar ik helaas geen antwoord op krijg.
Is de foutmelding ergens aan te herleiden, of wat kan ik nog doen.
Hoi
Welke versie heb ik nodig voor HC2 V 4.540?
Grt
Twan
Hey, normaal pak je gewoon de laatste versie van de code hier op de site. Hou er wel rekening mee dat nieuwe users problemen kunnen ondervinden omdat Nest zijn developer program aan het herwerken is en er dus geen extra users meer authenticatie kunnen krijgen.
Hoi Luckas
Waar kan ik info vinden waar ik mijn Netatmo developer (Client ID en secret) moet invullen?
Het al wel aan mij liggen maar ik kan het niet vinden
Grt
Twan