Nest Device en Scene v2

! 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:

img099

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

15 reacties op “Nest Device en Scene v2”

  1. 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?

  2. 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)

    1. 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.

    2. 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

  3. 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?

  4. 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.

  5. 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.

    1. 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.”

    1. 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.

    1. 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.

  6. 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

Een reactie achterlaten

Je e-mailadres zal niet getoond worden. Vereiste velden zijn gemarkeerd met *

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.