Titel van het project

Dit project in het kort
Wat maken we slim :
Hoe lang ben je er ongeveer mee bezig :
Moeilijkheidsgraad : Beginner / Gevorderd / Moeilijk
.
Gebruikte producten in dit project
FIBARO Home Center 2 en ICY (essent) E-thermostaat | Wij leggen uit hoe
De ICY E-thermostaat - gewoon te koop! - kun je via een account bij E-thermostaat aansturen met je smartphone. Het is een basic on/off thermostaat, die je prima kunt programmeren op schema's, vorstprotectie en beweging. In de Vera is een plugin beschikbaar voor deze thermostaat, en het is ook mogelijk deze in de FIBARO HC2 aan te sturen, zij het beperkt. Maar: het komt nog niet in de buurt van de plugins die FIBARO zelf aanlevert.
HET FIBARO HTTPS-PROTOCOL
De mogelijkheid van HTTPS (secure communicatie) van de HC2 is 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 dat maakt de werking uiteindelijk wat omslachtig.
Wat hebben we gedaan:
- Twee global variables aangemaakt voor het opslaan van de security token en de UID van de thermostaat.
- Predfined variable voor de ingestelde temperaturen.
- Een virtueel apparaat aangemaakt dat bestaat uit twee labels en drie knoppen. (klik hier voor de .vfib)
- Een scene gemaakt om gegevens op te halen.
- 1 scene gemaakt om de temperatuur te zetten.
HOE WERKT HET APPARAAT
In de mainloop 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 een seconde 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 eerste keer zal het data ophalen 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 wel 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. Het haalt die temperatuur op en stuurt deze 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 en commentaar zijn welkom!