So eine triviale Funktion, aber dennoch vermissen diese viele von euch im Fibaro Home Center! So kannst du Sensorwerte speichern und grafisch in einem Diagramm darstellen.
Auf der Weboberfläche des Fibaro Home Center, unter dem Menüpunkt "Verbrauch", hast du natürlich die Möglichkeit die Verbrauchswerte von deinen Geräten (Energiemessfunktion vorausgesetzt) einzusehen. Du kannst diese in einem Diagramm darzustellen und sogar Werte aus den verschiedenen Räumen zusammenzufassen und diese auch vergleichen.
Auch den Temperaturverlauf der einzelnen Räume-, sowie auch der einzelnen Temperatursensoren je Raum kann man sich hier anzeigen lassen. Aber an dieser Stelle beginnen schon die ersten Probleme. Ich kann nur jeweils die Temperatursensoren des Raumes "loggen" und im Diagramm anzeigen. Was aber, wenn ich nun die vom Motion Sensor gemessene IST Temperatur mit der SOLL Temperatur des Danfoss Thermostat vergleichen möchte? Keine Chance!
Auch gibt es keine Möglichkeit, zum Beispiel die gemessene Luftfeuchtigkeit in einem Verlaufsdiagramm darzustellen, oder die eines Helligkeitssensors.
Als ich damals zum ersten Mal den Z-Weather hier auf siio vorgestellt hatte, blickte ich ziemlich neidisch auf die Devolo Home Control Zentrale sowie auch auf den homee. Bei diesen Smart Home Zentralen können "out-of-the-box" mit allen Werten Diagramme erstellt werden. Und erst so macht eine Wetterstation Sinn! Was nützt es mir, wenn ich nur Livedaten meines Z-Weather sehe? Da kann ich auch aus dem Fenster schauen, um zu sehen, dass es windig ist. Ich möchte die Daten wie Außentemperatur, Windstärke, Taupunkt, Luftfeuchtigkeit usw. aufzeichnen und grafisch in einem Diagramm darstellen!
Das hat mich wirklich gewurmt! Als das Thema Z-Weather[icons icon="icon-link" color="#1e73be" size="13"] erneut in der Community aufkam, brachte Sascha den hilfreichen Hinweis: Im englischen Fibaro Forum, hat Dave Harrison ein relativ simples LUA Script vorgestellt, welches die Werte beliebiger Sensoren und Geräte welche mit dem Home Center verbunden sind ausliest um diese dann per http Request an das Webportal: maker.smartliving.io - zu senden. Smartliving.io ist eine Plattform, welche die Daten speichert und automatisch in grafischen Diagrammen aufbereitet.
Wie du das Script einsetzt und was du dafür vorbereiten musst, das liest du hier!
Account auf smartliving.io erstellen
Logisch, zunächst benötigst du einen Account auf maker.smartliving.io, in welchem du die Daten speichern und später abrufen kannst. Zum anlegen des Accounts, benötigst du lediglich eine gültig eMail Adresse, einen Wunsch-Nickname und dein individuelles Passwort. Danach erhältst du eine eMail, in welcher du via Klick auf einen Link die Gültigkeit deiner eMail Adresse bestätigen musst. Danach bist du schon im Besitz eines Accounts auf maker.smartliving.io :-) easy!
Smartliving.io Account erstellen
smartliving.io - Gerät verbinden
Nach dem ersten Login landest du auf deinem noch recht leeren Dashbboard. Beginne mit dem hinzufügen von einem Gerät. Naja, so wirklich physisch verbinden wir hier nichts, wir tun nur so - virtuell eben.
[alert variation="alert-info"]Im nächsten Schritt werden wir diesem "Gerät" Sensordaten zuordnen. Alle Daten die du in einem "Gerät" sammelst, kannst du später in einem gemeinsamen Diagramm darstellen. [/alert]
Du kannst dein erstes Gerät frei benennen. Nenne es zum Beispiel "Fibaro Home Center 2", oder wenn du alle Temperaturen deines Hauses in einem Diagramm haben möchtest, so benenne es beispielsweise als "Temperaturen-Räume" - wie du willst. Der Name lässt sich später auch ändern und du kannst auch noch beliebig weitere "Geräte" erstellen.
[carousel arrows="display" buttons="display"]
[panel title="smartliving - device erstellen"]
Smartliving - Device erstellen
[/panel]
[panel title="smartliving - device erstellen"]
Smartliving - Device erstellen
[/panel]
[panel title="smartliving - device erstellen"]
Smartliving - Device benennen
[/panel]
[/carousel]
Für unser kleines Tutorial hier, bleibe ich gleich mal bei meinem größten Wunsch, die Sensorwerte des Z-Weather aufzuzeichnen. Also benenne ich das Gerät schlicht als "Wetterdaten"
Nach dem Erstellen des "Device" bekommst du schon folgende wichtige Daten angezeigt:
- Client id
- Client key
Dies sind später in der Fibaro LUA Szene deine Authorisierungsdaten, damit die LUA Szene in deinen smartliving.io Account schreiben darf.
Authcode Daten für API Call
smartliving.io - Asset erstellen
Danach kannst du sogenannte "Asset´s" anlegen. Dies sind die Sensordaten, welche wir speichern und grafisch darstellen wollen. Pro "Device" (das was wir im letzten Schritt erstellt haben) sind bis zu 16 Assets möglich. Um in unserem Beispiel zu bleiben, erstelle ich nun als erstes "Asset" den Sensor "Z-Weather Windgeschwindigkeit".
Smartliving -Asset erstellen
Nachdem du nun auch das "Asset" erstellt hast, klicke auf den Namen. Hier findest du oben rechts ein "Zahnrad"-Symbol, über welches du zu den Details gelangst. Hier finden wir nun alle Infos welche wir benötigen: die Client id und den Client key, welchen wir bereits vorhin unter "Device" schon erhalten haben. Zusätzlich bekommen wir hier auch die eindeutige id für dieses Asset:
- Asset id
An dieser Stelle siehst du unten in dem Feld "Profile", das der "type" auf "string" steht. Strings können nicht in Diagrammen ausgewertet werden. Daher musst du diese hier auf "number" umstellen. Dazu einfach in das Feld klicken, das Wort "string" löschen und "number" eintragen. Danach mit dem Button "SET" bestätigen. En großer grüner Banner im Fuß der Seite sollte nun den Erfolg vermelden.
[carousel arrows="display" buttons="display"]
[panel title="smartliving - asset erstellen"]
Smartliving.io Asset
[/panel]
[panel title="smartliving - asset erstellen"]
Smartliving.io Asset Einstellungen
[/panel]
[panel title="smartliving - asset erstellen"]
[/panel]
[/carousel]
Fibaro Home Center - LUA Szene erstellen
Wir wechseln auf die Oberfläche des Home Center 2 und gehen dort, zum erstellen von LUA Szenen, wie gewohnt über den Menüpunkt: Szenen -> Szene hinzufügen -> LUA Szene. Hier fügst du folgenden LUA Code ein. In alter bewährter Weise, poste ich jetzt erstmal das vollständige Script von Dave Harrison (leicht von Daniel modifiziert) und im Anschluss schauen wir uns die wichtigsten Stellen einmal an, um zu verstehen was da passiert. (Was Daniel genau modifiziert hat, - das erkläre ich im Abschnitt Trigger)
--[[ %% properties %% autostart %% events %% globals --]] -- Scene : Smart Living Test -- Version : 1.1 -- Date Created : 09 June 2016 -- Last Changed : 19 June 2016 -- HC Version : Home Center 2 v4.080 -- Created By : Dave Harrison -- Purpose : To test sending data to SmartLiving.io -- Trigger : Triggered by the Timer Scene updating the fifteenMinuteTimer global variable --==================================================== -------------------- Declaration: Local Variables --==================================================== local debug = true local sourceTrigger = fibaro:getSourceTrigger() local devices = { loungeTemperature = {deviceId = 28, assetId = "46259176a77ed70b83138702"}, loungeThermostat = {deviceId = 27, assetId = "464b8ba0e8ced21cf391b773"} } --==================================================== -------------------- Functions --==================================================== local function log(str) if debug then fibaro:debug(str); end; end local function errorlog(str) fibaro:debug("<font color='red'>"..str.."</font>"); end local function sendData (assetId, requestBody) local clientID = "xxxxxxxxx" -- Replace xxxxxxxxx with your Client Id local clientKey = "yyyyyyyyyyy" -- Replace yyyyyyyyyyy with your Client Key local url = "https://api.smartliving.io/asset/" .. assetId .. "/state" local httpClient = net.HTTPClient({timeout=5000}) local httpHeaders = { ["Auth-ClientId"] = clientID, ["Auth-ClientKey"] = clientKey, ["Content-Type"] = "application/json", } httpClient:request(url, { options={ headers = httpHeaders, data = requestBody, method = 'PUT', timeout = 5000 }, success = function(response) if (response.status >= 200 and response.status < 300) then log(assetId .. ": " .. response.status .. " - successful") else errorlog(assetId .. ": " .. "ERROR") end end, error = function(error) errorlog(assetId .. ": " .. "ERROR") log(error) end }) end --==================================================== -------------------- Main --==================================================== -- Send data to SmartLiving -- ------------------------ if (sourceTrigger["type"] == "autostart") then fibaro:debug('Autostart') local requestData = {} local currentDateISO = os.date("%Y-%m-%dT%XZ") local currentDateTime = os.time() -- Check each device and format the request data for i, device in pairs(devices) do requestData = {value = tonumber(fibaro:getValue(device.deviceId, "value")), at = currentDateISO} local requestBody = json.encode(requestData) log(i .. ": " .. requestBody) -- Send the data sendData(device.assetId, requestBody) setTimeout(sendData, 300*1000) end else fibaro:debug('Trigger') local requestData = {} local currentDateISO = os.date("%Y-%m-%dT%XZ") local currentDateTime = os.time() -- Check each device and format the request data for i, device in pairs(devices) do requestData = {value = tonumber(fibaro:getValue(device.deviceId, "value")), at = currentDateISO} local requestBody = json.encode(requestData) log(i .. ": " .. requestBody) -- Send the data sendData(device.assetId, requestBody) end end
Wir beginnen in Zeile 39-40. Das sollte recht selbsterklärend sein, hier geht es um die Authentifizierungs-Daten für den http Aufruf.
local clientID = "xxxxxxxxx" -- Replace xxxxxxxxx with your Client Id local clientKey = "yyyyyyyyyyy" -- Replace yyyyyyyyyyy with your Client Key
Diese Daten wurden zum einen nach dem erstellen des "Device" im smartliving.io angezeigt und du findest diese auch noch einmal, wenn du in die Einstellungen (Zahnrad Symbol) deines erstellten "Asset" gehts.
Fibaro Home Center - Sensordaten abfragen und loggen
Kommen wir zum spannenden Teil - dieser findet sich in Zeile 29-30. Hier siehst du, das ein Temperatursensor mit der ID 28, sowie ein Thermostat mit der ID 27 abgefragt wird. Dies erfolgt über den Befehl:
local devices = { loungeTemperature = {deviceId = XX, assetId = "xxxxxxxxxxxxxxxxxxxxxxx"}, loungeThermostat = {deviceId = 27, assetId = "464b8ba0e8ced21cf391b773"}, }
"loungeTemperature" ist dabei nur eine Variable, damit du später nachvollziehen kannst, welcher Sensor hier abgefragt wird. Da der Variablen-Name an keiner weiteren Stelle im Script verwendet wird, kannst du diesen frei vergeben. Soll heißen, du kannst es auch "Sensor1", oder "ZWeatherWind" nennen.
Genau diese Nummer trägst du bei "deviceId = XX, ein. Die "assetId" kennst du bereits. Diese wird dir angezeigt, wenn du in deinem smartliving.io Account unter "Asset" oben rechts auf das "Zahnrad"-Symbol klickst.
[alert variation="alert-info"]Kurzum, an dieser Stelle verknüpfst du also deinen physikalischen Z-Wave Sensor / Gerät (deviceID) mit dem virtuellen Sensor (assetID).[/alert]
Genau nach diesem Schema kannst du nun beliebig weitere Sensoren abfragen und den Wert an die Assets senden. Versuch es doch gleich nochmal mit der zweiten Zeile: "loungeThermostat".
- neues Asset in smartliving.io anlegen
- Asset öffnen - > Zahnrad Symbol
- in Profile von "string" auf "number" ändern
- asset ID merken / notieren / kopieren / wissen wo es steht :-)
- im Fibaro HC den gewünschten Sensor suchen - ID ermitteln
- deviceID und assetID in der LUA Szene anpassen
Für alle die es interessiert, an welcher Stelle die Module / Geräte IDs abgefragt werden - dies passiert ab Zeile 82. Dort findest du:
requestData = {value = tonumber(fibaro:getValue(device.deviceId, "value")), at = currentDateISO}
Der Befehl "tonumber" macht aus dem Wert, welcher durch "fibaro:getValue" abgefragt wird, aus einem String eine Nummer. HA! Da haben wir es wieder, die Story mit String und Number ;-)
at = currentDateISO fügt das Datum und die Uhrzeit an, welches mit an smartliving.io übergeben wird, um den Zeitpunkt auf der X-Achse im Verlaufsdiagramm korrekt zu setzen.
Testlauf
Dann speicher die LUA Szene doch einfach mal ab. Im Debug sollte nun in etwa soetwas erscheinen:
[DEBUG] 14:01:59: Autostart
[DEBUG] 14:01:59: loungeTemperature: {"at":"2016-11-04T14:01:59Z","value":2}
[DEBUG] 14:02:00: 9oy00mXS6hLrdMR9TOa0aXpF: 200 - successful
Zuerst werden die Werte ausgelesen, gefolgt von "at" dem Datum und der Uhrzeit. Wenn alle Sensoren ausgelesen sind, werden die Werte an smartliving.io gesendet. War dies erfolgreich meldet der Debug eine "200 - successful" zurück und du siehst den Wert direkt im Asset auf smartlivin.io.
Trigger
Im Debug steht etwas von "Autostart". Da du sicherlich nicht 24h vor deinem PC sitzen und manuell auf "Szene ausführen" klicken möchtest, benötigst du einen Trigger. Ein Trigger oder auf Deutsch ein Auslöser, startet die Szene. Auslöser unterscheiden sich in:
- Zeittrigger
- Gerätetrigger
Zeittrigger können die Szene intervallbasiert starten, ein Gerätetrigger startet die Szene, sobald sich sein Zustand oder Wert verändert. Dies hat Daniel an der original Szene von Dave Harrison modifiziert, damit du diese je nach deinen Wünschen nutzen kannst.
Zeittrigger - Autostart
Falls du mit dem Script eine Temperaturkurve loggen möchtest, um Beispielsweise die SOLL Temperatur der Heizungsthermostate auf die aktuelle IST Temperatur zu legen, dann ist ein Zeit Trigger sinnvoll, welcher beispielsweise intervallbasiert alle 15 Minuten die Szene startet.
In dem Beispielscript oben, hat Daniel eine Modifizierung zum original Script eingebaut, wodurch die Szene mit einem Autostart-Trigger automatisch gestartet wird. In Zeile 94 definiert der folgende Befehl den Intervall, in welchem die Szene getriggert wird:
setTimeout(sendData, 300*1000)
Die Zeitangabe 300*1000 lässt die Szene für 300 Sekunden (also 5 Minuten) pausieren, bevor diese erneut ausgeführt wird. Möchtest du den Intervall auf beispielsweise 15 Minuten erhöhen, so trage dort 900*1000 ein.
Gerätetrigger
Zurück zu unserem Beispiel, dem Z-Weather. Da dieser nicht mit einer Batterie ausgestattet ist, sondern ein Solarpanel einen internen Kondensator lädt, wird das das wakeup-Intervall des Gerätes von einem Energiemanagement variiert. So sendet der Z-Weather an sonnigen Tagen alle 15 Minuten neue Messwerte, an bewölkten Tagen ca. alle 2h und an dunklen Wintertagen kann das Aufwachen bis zu 5h dauern. Hier wäre ein Zeitintervall also suboptimal und das Diagramm welches daraus entsteht, wäre nicht aussagekräftig.
Daher nutzen wir hierfür einen Gerätetrigger. Dazu musst du lediglich im Header der Szene das Wort: %% autostart entfernen und im Bereich %% Properties die Geräte ID eintragen, welche die Szene starten soll:
--[[ %% properties 28 value %% events %% globals --]]
Würde sich oben im Beispiel der Zustand, oder der Sensorwert (value) des Gerätes mit der ID 28 ändern, so würde dies die Szene starten. Verwendest du mehrere Geräte im Script, so kannst du die Szene auch von mehreren Geräten triggern lassen. Hierzu einfach weitere Geräte IDs in den Properties Bereich hinzufügen. Bedeutet für den Z-Weather: wacht dieser auf und sendet einen neuen Wert an das Fibaro Home Center, so würde die Szene starten und der neue Wert wird sofort an dein smartliving.io Account gesendet.
Dank Daniels Modifikation, siehst du im Debug der Szene dann:
[DEBUG] 14:03:53: Trigger
[DEBUG] 14:03:53: loungeTemperature: {"value":2,"at":"2016-11-04T14:03:53Z"}
[DEBUG] 14:03:54: 9oy00mXS6hLrdMR9TOa0aXpF: 200 - successful
Diagramm
Bevor du einen Kaffee trinken gehst, während smartliving.io deine Daten sammelt, musst du noch etwas ganz wichtiges aktivieren. Gehe dazu auf dein erstelltes Device (dort wo du alle Assets in einer Übersicht angezeigt bekommst) und klicke oben rechts auf das "Zahnrad"-Symbol um den Schieberegler: Storing device activity - auf "aktiv" zu setzen.
[carousel]
[panel title="smartliving - Store data"]
smartliving.io Store Data
[/panel]
[panel title="smartliving - Store data"]
smartliving.io Store Data
[/panel]
[/carousel]
Danach kannst du auf den Tab: "Activity" wechseln und solltest bereits die ersten Werte als Datenpunkte im Diagramm sehen. Per Klick auf die Sensoren, werden diese dem Diagramm hinzugefügt bzw. bei wiederholtem Klick aus der Betrachtung ausgeschlossen. Die Art des Diagramms (Säulen- oder Liniendiagramm), kannst du unten im Fuß auswählen.
Anwendungsbeispiele:
So lassen sich nun endlich die Wetterdaten des Z-Weather grafisch darstellen und wenn dann der Z-Rain in den Handel kommt, können auch dessen Werte über die gefallene Regenmenge schön in einem Säulendiagramm dargestellt werden.
Neben meiner Tätigkeit als Hobby-Meteorologe, nutze ich das Script ausserdem um meine Heizpläne zu optimieren. So erfasse ich die SOLL Temperatur aller meiner POPP Heizungsthermostate[icons icon="icon-link" color="#1e73be" size="13"]. Zwar baugleich zu den Danfoss LC-13, übermitteln diese aber auch die vom Heizungsthermostat gemessene IST Temperatur. So ließe sich die Heizkurve besser verstehen und optimieren.
[carousel arrows="display" buttons="display"]
[panel title="Diagramme"]
5°C Absenktemperatur Fenster offen
[/panel]
[panel title="Diagramme"]
[/panel]
[/carousel]
Theoretisch, könnte man soweit gehen, dass man auf die IST und SOLL Heizkurve auch die Bewegungserkennung legt. So würde man über einen längeren Zeitraum sehen, falls man einen Raum auf Komfortemperatur heizt, diesen aber in dem Zeitblock sehr oder gar nicht nutzt.
Diagramme 2 go - smartliving Smartphone App
Für unterwegs gibt es auch die Smartliving iOS App und Smartliving Android App. Hier kannst du zwar nicht die gemeinsamen Diagramme (Activitys) einsehen, aber du kannst den Datenverlauf in einem Diagramm je Sensor / Gerät darstellen. Dafür gehst du in die Assets und dort wieder auf das "Zahnrad" Symbol. Unten neben dem Tab Profile - in welchem wir vorhin von String auf Number umgestellt haben findest du den Bereich "Control".
Kopiere folgende Befehlskette in das Feld und bestätige es über den Button "SET".
{ "name": "chart", "extras": { "type": "line-chart", "timescale": "7d" } }
Die Angabe "timescale": 7d steht für die Zeitskala von 7 Tagen. Das kannst du wie folgt anpassen:
60m
: 60 minutes (1 Stunde)24h
: 24 hours (1 Tag)7d
: 7 Tage30d
: 30 Tage
Jetzt nur noch oben rechts über das PIN Symbol dieses Asset dem Dashbaord hinzufügen und es wird beim Öffnen der App mitgeladen.
[carousel arrows="display" buttons="display"]
[panel title="Diagramme in der Smartphone App"]
Diagramme in der App
[/panel]
[panel title="Diagramme in der Smartphone App"]
Diagramme in der App
[/panel]
[/carousel]
Hier ist so einiges möglich! .. und für was nutzt du die Diagramme? Berichte uns davon in den Kommentaren!