Nachdem wir ja bereits den netatmo Windmesser und die netatmo Welcome in das Fibaro HomeCenter 2 integrieren konnten, darf der Regenmesser natürlich auch nicht fehlen. Wie es geht, könnt Ihr jetzt hier nachlesen.
Als Basis für unsere Szene dient uns das Skript des netatmo Windmesser. Das Skript kann nun die Werte beider Sensoren, also dem Windmesser, sowie auch des Regensensor per API auf den netatmo Servern abfragen und in Variablen speichern, sowie in einem Virtuellen Device darstellen. Solltet Ihr einen von den beiden Sensoren nicht besitzen: Kein Problem, das wird durch das Skript automatisch geprüft und die Werte werden dann nicht auf den netatmo Servern abgefragt.
Sofern Ihr noch keinen Regenmesser besitzt, könnt Ihr diesen übrigens für derzeit 62 € bei zum Beispiel bei Cyberport käuflich erwerben.
Neue Funktionen des netatmo Skriptes:
- Skript erkennt automatisch, welche zusätzlichen Sensoren (neben der Wetterstation + Outdoormodul) eingerichtet sind und fragt nur die eingerichteten Sensoren ab
- Für die Regenmenge werden 4 Werte abgefragt: Regenmenge stündlich, täglich, wöchentlich und monatlich
- Prüfung, ob alle benötigten Variablen korrekt eingerichtet sind
- Debug ist abschaltbar
- Bugfix: Das Skript stürzt nicht mehr ab, wenn die API seitens netatmo nicht zu erreichen ist, sondern gibt eine Fehlermeldung unabhängig von den Debug-Einstellungen aus
Beim erstmaligem Start wird es zu 98 % zu einer Fehlermeldung kommen. Dies liegt daran, dass die Variablen noch nicht eingerichtet sind. Ihr werdet durch das Skript informiert, welche Variablen noch über das Variablen-Panel eingerichtet werden müssen. Dies sind die im Bild gezeigten. Wenn Ihr die Variablen eingerichtet habt, dann läuft die Szene normal und ohne Änderungen weiter.
netatmo Skript:
Das einzige, was Ihr an dem Skript noch ändern müsst, sind eure Daten der Seite dev.netatmo.com. Solltet Ihr auch das Virtuelle Device (findet Ihr am Ende des Textes) nutzen wollen, so müsst Ihr zusätzlich noch die ID von dem virtuellen Device in der Zeile 15 auf eure ID anpassen.
In der Zeile 13 könnt Ihr als Option den Debug-Modus aktivieren oder deaktivieren (0 = deaktiviert; 1 = aktiviert).
Wenn Ihr den Debug deaktiviert, dann erscheinen nur folgende zwei Zeilen im Debug. Das Skript erneuert danach alle 5 min die Werte:
An der lokalen Variablen "refresh" solltet Ihr keine Änderungen vornehmen. Die Daten werden von der jeweiligen Station nur alle 5 min zu den netatmo Servern übertragen, weshalb eine kürzere Refresh-Zeit zwischen den Anfragen keinen Sinn machen würde.
--[[
%% properties
%% autostart
%% globals
--]]
-- DIESE DATEN ANPASSEN
local client_id = 'CLIENT_ID'
local client_secret = 'CLIENT_SECRET'
local username = 'MAIL'
local password = 'PASSWORD'
local refresh = 300
local debug = 1
local vd_ID = 178
-- AB HIER NICHTS MEHR ANPASSEN
local token = ''
local request_body = ''
local rains = {hour = -1000, day = -1000, week = -1000, month = -1000}
local sourceTrigger = fibaro:getSourceTrigger()
Debug = function ( color, message )
fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
DebugError = function ( color, message )
fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
Debug( 'orange', 'netatmo Zusatzmodul Integration v.1.2 gestartet.' )
Debug( 'white', 'Daten werden alle 5 min aktualisiert. Bei debug = 0 wird nichts debuggt' )
function oAuth(nextFunction)
local request_body = 'grant_type=password&client_id=' .. client_id .. '&client_secret=' .. client_secret .. '&username=' .. username .. '&password=' .. password .. '&scope=read_station'
getResponseData('https://api.netatmo.net/oauth2/token', request_body,
function(data)
if (data.access_token ~= nil) then
token = data.access_token
if (debug == 1) then
Debug( 'green', 'oAuth 2.0 durchgeführt.' )
end
getDevices()
fibaro:call(vd_ID, 'pressButton', '9')
else
DebugError( 'red', 'oAuth 2.0 konnte nicht durchgeführt werden! Bitte die Anmeldedaten überprüfen')
end
end
)
setTimeout(oAuth, refresh*1000);
end
function getResponseData(url, body, func)
local http = net.HTTPClient()
http:request(url, {
options = {
method = 'POST',
headers = {
['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
},
data = body
},
success = function(response)
func(json.decode(response.data))
end
})
end
function getDevices()
getResponseData('https://api.netatmo.net/api/devicelist','access_token='..token,
function(data)
if (data.body ~= nil) then
if (debug == 1) then
Debug( 'green', 'netatmo Sensoren werden gesucht...' );
end
for _, v in pairs(data.body.modules) do
--fibaro:debug('Tabelle auslesen')
if (v.data_type[1] == 'Rain') then
rain_id = v._id
if (debug == 1) then
Debug( 'green', 'Regensensor ' ..rain_id.. ' erkannt.' );
end
if rain_id ~= nil then
getSumRain(60 * 60, 'hour')
getSumRain(60 * 60 * 24, 'day')
getSumRain(60 * 60 * 24 * 7, 'week')
getSumRain(60 * 60 * 24 * 30, 'month')
end
elseif (v.data_type[1] == 'Wind') then
wind_id = v._id
if (debug == 1) then
Debug( 'green', 'Windmesser ' ..rain_id.. ' erkannt.' );
end
if wind_id ~= nil then
getmeasureWind()
end
end
int_id = data.body.devices[1]._id
end
else
DebugError( 'red', 'device-list konnte nicht abgefragt werden! Bitte nächsten Durchlauf abwarten')
end
end
)
end
function getmeasureWind()
request_body_wind = 'access_token='..token..'&device_id='..int_id..'&module_id='..wind_id..'&scale=max&type=WindStrength,WindAngle,GustStrength,GustAngle&date_end=last'
getResponseData('https://api.netatmo.net/api/getmeasure', request_body_wind,
function(getData)
if (getData.body ~= nil) then
if (debug == 1) then
Debug( 'green', 'Windmesser wird ausgelesen...' );
end
WindStrength = getData.body[1].value[1][1]
WindAngle = getData.body[1].value[1][2]
GustStrength = getData.body[1].value[1][3]
GustAngle= getData.body[1].value[1][4]
if (debug == 1) then
Debug( 'green', 'Windgeschwindigkeit: ' .. WindStrength .. ' km/h' );
end
if fibaro:getGlobalValue('windstaerke') ~= nil then
fibaro:setGlobal('windstaerke', WindStrength)
else
DebugError( 'red', 'Varible windstaerke nicht gefunden. Bitte anlegen')
end
if fibaro:getGlobalValue('windrichtung') ~= nil then
fibaro:setGlobal('windrichtung', WindAngle)
else
DebugError( 'red', 'Varible windrichtung nicht gefunden. Bitte anlegen')
end
if fibaro:getGlobalValue('boenstaerke') ~= nil then
fibaro:setGlobal('boenstaerke', GustStrength)
else
DebugError( 'red', 'Varible boenstaerke nicht gefunden. Bitte anlegen')
end
if fibaro:getGlobalValue('boenrichtung') ~= nil then
fibaro:setGlobal('boenrichtung', GustAngle)
else
DebugError( 'red', 'Varible boenrichtung nicht gefunden. Bitte anlegen')
end
if (debug == 1) then
Debug( 'green', 'Windmesser auslesen beendet.' );
end
else
DebugError( 'red', 'API-Call konnte nicht durchgeführt werden! API nicht erreichbar! Bitte nächsten Durchlauf abwarten.')
end
end
)
end
function getSumRain(dauer, variable)
local now = os.time();
getResponseData('https://api.netatmo.net/api/getmeasure','access_token='..token..'&device_id='..int_id..'&module_id='..rain_id..'&scale=1hour&type=sum_rain&real_time=true&date_begin='..os.date('!%c', (now - dauer)),
function(data)
local sum_rain = 0
for k, v in pairs(data.body) do
for l, w in pairs(v.value) do
sum_rain = sum_rain + w[1]
end
end
if fibaro:getGlobalValue('rain_' ..variable) ~= nil then
fibaro:setGlobal('rain_' ..variable, sum_rain)
else
DebugError( 'red', 'Varible rain_' ..variable.. ' nicht gefunden. Bitte anlegen')
end
if (debug == 1) then
fibaro:debug('Regenmenge: ' ..sum_rain.. ' mm2 (' .. variable .. ')')
end
end
)
end
if (sourceTrigger['type'] == 'autostart') then
oAuth();
end
Und natürlich, wie versprochen, gibt es das passende Virtuell Device dazu. Das könnt Ihr euch hier (klickt einfach auf das Bild) herunterladen. Dies könnt Ihr dann einfach über "Add/Remove device" importieren. Achtet dabei bitte drauf, dass die Datei die Endung .vfib hat.
Solltet Ihr noch weitere Ideen haben, was man mit der Integration umsetzen kann, dann würden wir uns über eure Kommentare freuen. Ihr könnt euch für die Szene und das Virtuelle Device noch die zwei Icons herunterladen. :)

