! LET OP ! LEES EERST: !
NEST en Google
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