• Uitstekend advies
  • Voor 16.30 uur besteld vandaag verstuurd
  • Bijna altijd bereikbaar (+31 73 762 0 762)
  • Maandag koopavond

FIBARO HC2 ICY Thermostaat koppeling

FIBARO Home Center 2 en ICY (essent) E-thermostaat | Wij leggen uit hoe

Al geruime tijd zijn we op zoek om ook de ICY thermostaat te kunnen uitlezen en aansturen. Sinds de komst van HTTPS ondersteuning in de FIBARO HC2 lijkt er steeds meer mogelijk en dus tijd om eens diep in de code te graven. Het resultaat is dat het werkt maar dat het nog niet in de buurt komt van de plugins die FIBARO zelf aanlevert. 

ICY E-thermostaat

Deze thermostaat is al langere tijd gewoon te koop en via een account bij E-thermostaat aan te sturen vanaf de smartphone. Het is een basic on/off thermostaat maar kan prima geprogrammeerd worden op schema's, vorst protectie en beweging. In de Vera was al langere tijd een plugin beschikbaar voor deze thermostaat maar nu is het ook mogelijk deze in de FIBARO HC2 beperkt aan te sturen

HET FIBARO HTTPS PROTOCOL

Helaas is de mogelijkheid van HTTPS (secure communicatie) van de HC2 voorlopig alleen beschikbaar voor plugins en in scenes. Het is dus nog niet mogelijk dit rechtstreeks vanuit een virtueel apparaat te doen. Dat is jammer want maakt de werking uiteindelijk wat omslachtig. 

Wat hebben we gedaan:


-2 Global Variables aangemaakt voor het opslaan van de security token en de UID van de thermostaat

FIBARO HC2 e-thermostaat koppeling

-Predfined Variable voor de ingestelde temperaturen

Predfined Variable

- Een virtueel apparaat aangemaakt dat bestaat uit 2 labels en 3 knoppen. (klik hier voor de .vfib)

Virtueel Apparaat

- Een scene om gegevens op te halen

- 1 scene om de temperatuur te zetten
 

HOE WERKT HET APPARAAT

In de main loop van het virtuele apparaat wordt iedere 300 seconden de scene afgeroepen om de gegevens op te halen. Hiermee wordt ook het security token ververst.

--Put the data scene ID in here
fibaro:startScene(233)

fibaro:sleep(300*1000)

Iedere knop in de thermostaat zet de bijbehorende variabele en haalt dan 1 seconden later de data op zodat deze "bijna" meteen zichtbaar wordt. (in dit geval 20 graden)

fibaro:setGlobal("ICY", "20");
fibaro:sleep(1*1000)
fibaro:startScene(233);

DE SCENES

De eerste scene is gemaakt om de gegevens op te halen. Hier zit ook de functie om een security token te verkrijgen. De allereerste keer zal het proberen data op te halen, maar niet lukken omdat er nog geen security token is. Bij die foutmelding haalt hij dan een security token op. Bij de tweede run moet het dus lukken.

--[[
%% properties

%% globals
--]]


--Import the virtual ICY thermostat and look up the ID. Fill in Below
local VirtualICY = 232


--Fill in your login details for the ICY thermostat
local username='myICYusername'
local password='myICYpassword'


--This gets a security token from ICY
function GetToken()
        local http = net.HTTPClient({ timeout = 3000 })
        local message='username='..username..'&password='..password
        local controlHeaders = {['content-type'] = 'application/x-www-form-urlencoded'}
        http:request('https://portal.icy.nl/login', {
        options = {
                    headers = {
                      ['content-type'] = 'application/x-www-form-urlencoded',
                      },
                    method = 'POST',
                    data=message
               },
        success = function(param)
                if param.status == 200 then
                print('Succes STATUS: ', param.status)
                  local responds = json.decode(param.data)
                  local token = responds.token
                  local serialthermostat1 = responds.serialthermostat1
                  fibaro:setGlobal('ICYuid',serialthermostat1)
                  fibaro:setGlobal('IcyToken',token)
                end
        end,
        error = function(error)      end
        })
end


--This reads the details of the current settings
function ReadData()
          local SecurityToken = fibaro:getGlobal('IcyToken')
          
        local http = net.HTTPClient({ timeout = 3000 })
        local request_body=''

        http:request('https://portal.icy.nl/data', {
        options = {
                    headers= {
            ['content-type'] = 'application/x-www-form-urlencoded',
            ['session-token'] = SecurityToken,
            },
                    method = 'GET',
                    data=request_body
               },
      
        success = function(param)
        if param.status == 200 then
                print('Data Receiving: ', param.status)
                  local json_input = json.decode(param.data)
                local temperature1 = json_input.temperature1
                    print('Set temp: ', temperature1)
                fibaro:call(VirtualICY, "setProperty", "ui.TempSet.value",temperature1)
                temperature2 = json_input.temperature2
                    print('Current temp: ',temperature2)
                  fibaro:call(VirtualICY, "setProperty", "ui.TempNow.value",temperature2);
                  serial = json_input.serialthermostat1
        elseif param.status == 401 then
              --This is where we need to get a new token
            GetToken()
          end
        end,
        error = function(error)      end
        })

end

ReadData()

De tweede scene wordt getriggerd door een verandering van de Predefined Variabele met de temperaturen. Haalt dan die temperature op en stuurt het naar de thermostaat.

--[[
%% properties
%% globals
ICY
--]]

function setTemp(targettemp)
        local serialthermostat1 = fibaro:getGlobal('ICYuid')
        local SecurityToken = fibaro:getGlobal('IcyToken')

              local request_body= 'uid=' .. serialthermostat1
              message = request_body .. '&temperature1=' .. targettemp
              print(message)
              local data_length = string.len(message)
              print(data_length)
            local http = net.HTTPClient({ timeout = 3000 })

            http:request('https://portal.icy.nl/data', {
            options = {
                    headers= {
            ['content-type'] = 'application/x-www-form-urlencoded',
            ['session-token'] = SecurityToken,
            },
                    method = 'POST',
                    data=message
               },

        success = function(param)
        fibaro:debug(json.encode(param))
        if param.status == 200 then
                print('Data Receiving: ', param.status)
                  --print(param.data)
--                  local json_input = json.decode(param.data)
--                temperature1 = json_input.temperature1
--                    print('Set temp: ', temperature1)
--                temperature2 = json_input.temperature2
--                    print('Current temp: ',temperature2)
                
          end
        end,
        error = function(error)      end
        })

end
NewTemp = fibaro:getGlobalValue("ICY")
setTemp(NewTemp)

 

Dit zou moeten werken. 

Tips/ commentaar etc welkom!

 

ROBBshop

 

 

Er zijn geen producten beschikbaar op deze pagina.

 
Klantenservice telefoonnummer

+31737620762
ma-vrij: 10:00-17:00 en za 10:00-15:00

 
Adres

Gasstraat Oost 14A 5349 AV Oss Nederland

Google maps