NEST Scene v1

! LET OP ! LEES EERST: !

NEST en Google

Maak in je Fibaro HC2 een nieuwe Scene aan in LUA. Zet in de “General” tab het maximum aantal simultane processen voor deze scene op “1”. In de Advanced tab voeg je volgende code in:

--[[
%% properties
%% events
%% globals
--]]
local NestButton=0 --id of the virtual device

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: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"])
              		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_c"])
              		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 different from requested
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=fibaro:getValue(NestButton,"ui.settemp.value")
  	local tsp=fibaro:getValue(NestButton,"ui.setpoint.value")
  	if (tonumber(csp)~=tonumber(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"])
          		end
          		if (result["target_temperature_f"]~=nil) then
            		fibaro:call(NestButton,"setProperty","ui.settemp.value",result["target_temperature_f"])
          		end
          	end
        end
       })
    end
  fibaro:sleep(1100)
end

Sla deze scene op en onthou het ID dat toegekend wordt aan de scene. Dit kan je aflezen bovenaan in de balk van je internet browser (…/fibaro/en/scenes/edit.html?id=59)  => 59

Ga vervolgens verder met het aanmaken van het virtual device.

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.