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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
--[[ %% 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. :)