! 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