NEWS
Projekt: Shelly plus1 AddOn Temperaturen mit JS auslesen
-
In meiner kurzen IoBroker-„Laufbahn“ seit Oktober 2024 habe ich eifrigst an dem wundervollen OpenSource-Tool einige praktische Anwendungsbeispiele erprobt. Eines davon ist das automatisierte Auslesen von 3 Temperatursensoren und die 10-minütige Speicherung der Werte in einer MySQL-Datenbank. Das Projekt läuft seit 3 Wochen im Testbetrieb und wird ein Teil meiner geplanten Heizungssteuerung mit IoBroker. Darin befindet sich auch ein Luftsolarkollektor der deutschen Firma Grammer Solar, den ich seit 2007 nicht mehr missen möchte. In diesem Projekt wurde bewusst auf den Shelly-Adapter verzichtet, weil ich als Programmier-Freak gerne die Freiheiten in JavaScript genieße.
Hardware:
• RaspBerry Pi 4 mit 4 GB RAM im Hutschienengehäuse; Linux Debian an USB2-Stick mit 256 GB
• Shelly Plus1 mit AddOn
• 3 x Temperatursensoren DS18B20Adapter:
• JavascriptAblauf:
• An den Shelly Plus1 mit AddOn werden die Temperatursensoren angeschlossen und anschließend in der eingestellten IP-Adresse im Internet-Browser unter dem Punkt „Add-on“ konfiguriert.In dieser Web-Oberfläche kann man auch sofort die Temperaturen ablesen.
• Im IoBroker wechselt man zu „Objekte“ und legt folgende Datenpunkte zuerst unter „javascript.0.scriptEnabled.Eigene_Datenpunkte“ an:
javascript.0.scriptEnabled.Eigene_Datenpunkte.ShellyPlus1_01.Aussentemperatur
javascript.0.scriptEnabled.Eigene_Datenpunkte.ShellyPlus1_01. Innentemperatur
javascript.0.scriptEnabled.Eigene_Datenpunkte.ShellyPlus1_01. Luftsolartemperatur• Dann legt man die gleichen DP unter „alias.0.Klimatisierung (als Beispiel)“ an und referenziert sie auf die DP unter „javascript.0.scriptEnabled.Eigene_Datenpunkte“ und aktiviert – wahlweise - die automatische SQL-Speicherung (Zahnrad rechts im Datenpunkt). Die DP sind aber auch ohne SQL-Speicherung direkt in Skripts verwendbar:
alias.0.Klimatisierung.ShellyPlus1_01.Aussentemperatur
alias.0.Klimatisierung.ShellyPlus1_01.Innentemperatur
alias.0.Klimatisierung.ShellyPlus1_01.LuftsolartemperaturDazu habe ich von mehreren Forums_Usern den wertvollen Tipp gelesen, dass eine eigene DP-Struktur unter alias.0.xxx... sehr hilfreich in Blick auf die Übersichtlichkeit ist. Meine Struktur schaut teils so aus:
• Im IoB wechselt man dann zu „Skripte – neues Skript (+) – JavaScript“ und legt folgendes Skript an:
var data; schedule("*/10 * * * * *", async () => { httpGet('http://192.168.xxx.xxx/rpc/temperature.getstatus?id=100', { timeout: 2000, responseType: 'text' }, async (err, response) => { data = (() => { try { setState('alias.0.Klimatisierung.ShellyPlus1_01.Aussentemperatur', getAttr(JSON.parse(response.data), 'tC'), true); } catch (e) { return {}; } })(); }); httpGet('http://192.168. xxx.xxx /rpc/temperature.getstatus?id=101', { timeout: 2000, responseType: 'text' }, async (err, response) => { data = (() => { try { setState('alias.0.Klimatisierung.ShellyPlus1_01.Innentemperatur', getAttr(JSON.parse(response.data), 'tC'), true); } catch (e) { return {}; } })(); }); httpGet('http://192.168. xxx.xxx /rpc/temperature.getstatus?id=102', { timeout: 2000, responseType: 'text' }, async (err, response) => { data = (() => { try { setState('alias.0.Klimatisierung.ShellyPlus1_01.Luftsolartemperatur', getAttr(JSON.parse(response.data), 'tC'), true); } catch (e) { return {}; } })(); }); });
Dieses Skript aktiviert man mit Klick auf den roten Pfeil und damit läuft es dann alle 10 Minuten. Die Zeit kann jeder beliebig einstellen. Die Werte werden – wahlweise - in die MySQL-Datenbanktabelle „ts_number“ geschrieben. Die MySQL-Tabellen habe ich selbst angelegt – wiederum aufgrund von Internet-Recherchen (ich bin halt ein Datenbank-Fan):
CREATE TABLE sources( id INTEGER NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, PRIMARY KEY (id)) ENGINE = InnoDB; CREATE UNIQUE INDEX IX_sources01 ON sources(name); CREATE TABLE datapoints( id INTEGER NOT NULL AUTO_INCREMENT, name TEXT NOT NULL, type INTEGER NOT NULL, PRIMARY KEY (id)) ENGINE = InnoDB; CREATE UNIQUE INDEX IX_datapoints01 ON datapoints(name); CREATE TABLE ts_number( id INTEGER NOT NULL AUTO_INCREMENT, ts BIGINT NOT NULL, val REAL, ack BOOLEAN, q INTEGER NULL, _from INTEGER NOT NULL, PRIMARY KEY (id,ts)) ENGINE = InnoDB; CREATE INDEX IX_ts_number01 ON ts_number(ts); CREATE INDEX IX_ts_number02 ON ts_number(id); CREATE INDEX IX_ts_number03 ON ts_number(id);
Die Abfrage für die Visualisierung (auch von Zeitreihen) lautet:
CREATE OR REPLACE VIEW vw_temperaturen AS SELECT a.id, from_unixtime(SUBSTRING(a.ts, 1, 10)) AS tsDate, a.val AS GradC, b.name, c.name as sourcename FROM ts_number a LEFT OUTER JOIN datapoints b ON a.id = b.id LEFT OUTER JOIN sources c ON a._from = c.id WHERE a.id in (xx, yy,zz) AND a.q = 0; //siehe Tabelle datapoints
Diese Abfrage lässt sich etwa bei den IoB-Diagrammen einsetzen:
Nun – das war es. Ich freue mich, wenn das Beispiel für manche von euch verwendbar ist.
Beste Grüße aus dem Mühlviertel, hf