Website-Icon Dein Smart Home Blog

netatmo Regen- & Windmesser-Daten im Fibaro HC2 anzeigen lassen

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:

Debug-Fenster bei aktiviertem Debug-Modus (debug = 1)

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.

In rot wird signalisiert, dass noch Variablen eingerichtet werden müssen

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:

Debug-Fenster bei deaktiviertem Debug-Modus (debug = 0)

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

Die mobile Version verlassen