Shelly Scripting #3: Stromverbrauch und Sensordaten in der Cloud visualisieren
Shelly Scripting Stromverbrauch visualisieren â genau darum geht es in diesem Beitrag. Ich zeige dir, wie du mithilfe von Shelly Scripting die Daten deines Shelly 1PM Gen3, ergĂ€nzt durch das Addon und einen DHT22-Sensor, flexibel erfassen, verarbeiten und in die Cloud ĂŒbertragen kannst, um sie dort ĂŒbersichtlich zu visualisieren.
https://youtu.be/SXejhvuD2zQ
Mit Shelly Scripting kannst du dein GerĂ€t so programmieren, dass es die Messwerte automatisch und regelmĂ€Ăig an den Cloud-Service ThingSpeak sendet. Dies geschieht im Hintergrund mithilfe von Timern, sodass keine manuelle Interaktion erforderlich ist.
Im letzten Beitrag habe ich bereits gezeigt, wie du die Daten als JSON speichern kannst. Hier machen wir den nĂ€chsten Schritt und zeigen, wie du mit Shelly Scripting und ThingSpeak die Daten in einem ĂŒbersichtlichen Dashboard visualisierst. So kannst du sowohl aktuelle Werte ĂŒberwachen als auch historische Daten analysieren.
Shelly 1PM mit Addon und Sensor zum Erfassen von Stromverbrauch und Umweltdaten
Um den Stromverbrauch zu messen, hast du die Wahl zwischen dem Shelly 1PM und dem Shelly 2PM. Der Shelly 1PM Mini ist besonders kompakt und eignet sich hervorragend fĂŒr kleine BaurĂ€ume.
Shelly i4 Gen3
Wenn du jedoch â wie in diesem Beitrag gezeigt â zusĂ€tzlich Umweltdaten wie Temperatur und Luftfeuchtigkeit erfassen möchtest, benötigst du die gröĂere Version des Shelly 1PM. Nur diese bietet die Möglichkeit, das Addon fĂŒr Sensoren wie den DHT22 aufzustecken. Du kannst aber auch den "normalen" Shelly 1 Plus oder den Shelly i4 Gen3 verwenden wenn du auch das Feature zum messen des Stromverbrauchs verzichen kannst.
Benötigten Ressourcen fĂŒr diesen Beitrag
Wenn du diesen Beitrag nachstellen möchtest, dann benötigst du:
- einen Shelly 1PM* oder Shelly 2PM*
- ein Shelly AddOn*
- ein DHT22 Sensor* mit 3-Adriger Zuleitung
Wenn du nur die Umweltdaten auslesen und ein GerÀt schalten möchtest, also auf den Stromverbrauch verzichten kannst, dann empfehle ich dir den Shelly 1 Plus*.
Shelly, AddOn & DHT22 Sensor inkl. Zuleitung
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du ĂŒber diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beitrĂ€gt, diesen Blog zu unterstĂŒtzen. Der Preis fĂŒr dich bleibt dabei unverĂ€ndert. Vielen Dank fĂŒr deine UnterstĂŒtzung!
Anschluss des DHT22 via AddOn an den Shelly
Im Beitrag Shelly Plus #2: Shelly Plus AddOn habe ich dir bereits das kleine Modul welches du auf den Shelly Stecken kannst vorgestellt. Hier möchte ich kurz auf die Features eingehen und aufzeigen wie du dieses mit dem Shelly 1PM verbindest und einen DHT22 Sensor einrichtest.
RĂŒckseite Shelly AddOn
Du kannst an den Shelly AddOn bis zu 3 DS18B20 Sensoren oder einen DHT22 Sensor (ĂŒber die Pins VCC, DATA und GND) anschlieĂen.
Shelly AddOn mit DHT22 Sensor
Shelly AddOn mit DS18B20 Sensor
Einrichten des Sensors in der Shelly Smart Control App
Sobald der Sensor mit dem AddOn angeschlossen wurde, mĂŒssen wir diesen in der App "Shelly Smart Control" einrichten. Wie du dieses machst, habe ich dir bereits im Beitrag Shelly Plus #2: Shelly Plus AddOn erlĂ€utert.
https://youtu.be/-6hS4BTGP_0
Anschluss eines Verbrauchers an den Shelly 1PM
Damit wir einen Stromverbrauch messen können, benötigen wir auch einen Stromverbraucher. In meinem Fall schlieĂe ich wieder eine Lampe nach folgendem Schema an.
Der Shelly und die Lampe wird wiefolgt angeschlossen:
- Shelly 1PM
- N - Neutralleiter (blau)
- L - Leiter (braun)
- O - Ausgang "L" zur Lampe
- Lampe
- Fassung "auĂen" - Neutralleiter (blau)
- Fassung "unten" - Leiter (braun)
Schaltung - Shelly 1PM mit Lampe
Im nachfolgenden Video erlĂ€utere ich dir, wie du eine Lampe am Shelly Plus 1 Mini anschlieĂt und in der App einrichtest.
https://youtu.be/r3-TEb3K_xM
Auslesen der Sensordaten via Shelly Script
m ersten Schritt lesen wir die Sensordaten in ein JSON-Objekt ein. Das JSON-Format bietet den Vorteil, dass es unsere Daten strukturiert und organisiert speichert. Dadurch können wir ĂŒber einen Key gezielt auf die entsprechenden Werte zugreifen, ohne fĂŒr jede MessgröĂe eine separate Variable anlegen zu mĂŒssen.
let data = {
voltage: 0, //Spannung in Volt
current: 0, //Stromaufnahme in Ampere
apower: 0, //Leistungsaufnahme in Watt
temperature: 0, //Temperatur in °C
humidity: 0 //rel. Luftfeuchtigkeit in %
};
(SelbstverstĂ€ndlich wĂ€re es auch möglich, die Werte in einzelne Variablen zu speichern. Allerdings sorgt das JSON-Format fĂŒr eine ĂŒbersichtlichere und flexiblere Handhabung, besonders wenn die Anzahl der Datenpunkte wĂ€chst.)
Diese Struktur hilft uns, die Daten effizient weiterzuverarbeiten und spÀter in einem Cloud-Service wie ThingSpeak zu speichern oder zu visualisieren.
let powerResult = Shelly.getComponentStatus("Switch:0");
data.voltage = powerResult.voltage;
data.current = powerResult.current;
data.apower = powerResult.apower;
let temperaturResult = Shelly.getComponentStatus("temperature:100");
data.temperature = temperaturResult.tC;
let humidityResult = Shelly.getComponentStatus("humidity:100");
data.humidity = humidityResult.rh;
Einrichten eines Accounts bei Thinkspeak
Nachdem wir die Daten ermittelt haben, richten wir ein Account bei Thinkspeak ein.
FĂŒr diesen Account benötigst du eine gĂŒltige Mail, Land, sowie Vorname und Nachname.
Solltest du nach einer MathLab Lizenz gefragt werden so öffne die nachfolgende Adresse um direkt auf Thinkspeak zugreifen zu können.
https://thingspeak.mathworks.com
ZugrifssbeschrÀnkungen des kostenfreien Accounts
Der kostenfreie Account kann pro Tag nur 8219 Requests empfangen.
Wenn du dich bei Thinkspeak angemeldet und noch keinen Channel eingerichtet hast sollte dein Dashboard wiefolgt aussehen.
Mit einem klick auf "New Channel" erstellst du ein neuen Kanal bzw. Dashboard an welchen du deine Daten senden kannst.
Einrichten eines Channels fĂŒr den Stromverbrauch & die Umweltdaten
ZunĂ€chst vergeben wir dem Channel einen Namen und benennen die Felder 1 bis 5 mit den Typen unserer ermittelten Daten. Damit wir weitere Felder verwenden können, mĂŒssen wir jeweils die Checkbox markieren.
Wenn du nach unten Scrollst dann findest du dort die grĂŒne SchaltflĂ€che "Save" mit welcher du die Einstellungen ĂŒbernimmst.
API Key fĂŒr den schreibzugriff auf den Channel via HTTP Request
Wenn du den neuen Channel angelegt hast, dann siehst du bereits einige leere Diagramme und Reiter. Im Reiter "API Keys" findest du deinen API Key zum schreiben und lesen von Daten. ZunĂ€chst interessiert uns hier nur der "Write API Key". Diesen Key kannst du ĂŒber die SchaltflĂ€che "Generate New Write API Key" jederzeit neu erstellen!
Absenden eines HTTP Request via Postman
Mit dem kostenfreien Tool Postman kannst du sehr einfach REST-Schnittstellen wie der von Thinkspeak ansprechen und ermitteln wie dieser Request aufgebaut werden muss ohne das du eine Zeile Code schreiben musst. Dieses Tool habe ich bereits im letzten Beitrag eingesetzt um die Schnittstelle zu jsonbin.io zu bedienen.
Der Link ist dann wiefolgt :
https://api.thingspeak.com/update?api_key=Q1930CQB0EBK2FRF&field1=231&field2=8.5&field3=2.8&field4=25&field5=35
Wenn du oben rechts auf die SchaltflÀche "Send" klickst, wird die Adresse aufgerufen und du erhÀlst bei erfolg ein "200 OK".
Diesen Request mĂŒssen wir nun im Shelly Script nachbauen. Wie du einen HTTP Request aus einem Shelly Script aufbaust und absendest hatte ich dir im letzten Beitrag Shelly Scripting #2: Sensordaten in der Cloud speichern und abrufen wie erwĂ€hnt mit jsonbin.io erlĂ€utert, dieses ist hier Ă€hnlich einfach und du kannst die Funktion recyceln.
Absenden der ermittelten Daten via HTTP Request vom Shelly mit Script
In diesem Abschnitt zeige ich dir, wie du mit Shelly Scripting den Stromverbrauch und die eines angeschlossenen DHT22-Sensors regelmĂ€Ăig an ThingSpeak sendest und dort visualisieren kannst. Dazu wird der Code in einzelne Blöcke zerlegt, um die Funktionsweise besser zu verstehen.
Stromverbrauch & Sensordaten eines Shelly auf dem Dashboard von ThingSpeak
Basis-Setup und Datenstruktur
Im ersten Schritt definieren wir die Basis-URL fĂŒr den HTTP-Request an ThingSpeak und erstellen ein JSON-Objekt (data), das die gemessenen Werte wie Spannung, Strom, Leistung, Temperatur und Luftfeuchtigkeit speichert.
// Basis-URL der ThingSpeak-API mit API-SchlĂŒssel.
const baseUrl = "https://api.thingspeak.com/update?api_key=Q1930CQB0EBK2FRF";
// JSON-Objekt zur Organisation der Sensordaten.
let data = {
voltage: 0, // Spannung in Volt.
current: 0, // StromstÀrke in Ampere.
apower: 0, // Leistung in Watt.
temperature: 0, // Temperatur in °C.
humidity: 0 // Luftfeuchtigkeit in %.
};
Konfiguration des HTTP-Requests
Hier erstellen wir die grundlegenden Parameter fĂŒr den HTTP-Request. Die URL wird spĂ€ter dynamisch mit den Messwerten ergĂ€nzt.
// Parameter fĂŒr den HTTP-Request.
let parameter = {
method: "GET", // HTTP-Methode GET fĂŒr ThingSpeak.
url: baseUrl, // URL wird spÀter mit Daten ergÀnzt.
headers: { "Content-Type": "application/json" } // Optionaler Header fĂŒr JSON.
};
RegelmĂ€Ăige Datenerfassung und Verarbeitung
Ein Timer wird eingerichtet, der alle 2 Sekunden die Sensordaten vom Shelly und dem angeschlossenen Sensor abruft. Die erfassten Daten werden im JSON-Objekt data gespeichert.
// Timer: Alle 2 Sekunden Sensordaten abrufen.
Timer.set(2000, true, function() {
// Erfassen der Stromverbrauchsdaten (Spannung, StromstÀrke, Leistung).
let powerResult = Shelly.getComponentStatus("Switch:0");
data.voltage = powerResult.voltage;
data.current = powerResult.current;
data.apower = powerResult.apower;
// Erfassen der Temperatur vom DHT22-Sensor.
let temperaturResult = Shelly.getComponentStatus("temperature:100");
data.temperature = temperaturResult.tC;
// Erfassen der Luftfeuchtigkeit vom DHT22-Sensor.
let humidityResult = Shelly.getComponentStatus("humidity:100");
data.humidity = humidityResult.rh;
// Debugging: Ausgabe der aktuellen Messwerte in der Konsole.
print(data);
URL mit Sensordaten ergÀnzen
Die erfassten Messwerte werden dynamisch an die Basis-URL angehÀngt. ThingSpeak erwartet die Daten in Form von field1, field2, etc.
// ErgÀnzen der URL mit den Sensordaten.
var url = baseUrl;
url += "&field1=" + data.voltage; // Feld 1: Spannung.
url += "&field2=" + data.current; // Feld 2: StromstÀrke.
url += "&field3=" + data.apower; // Feld 3: Leistung.
url += "&field4=" + data.temperature; // Feld 4: Temperatur.
url += "&field5=" + data.humidity; // Feld 5: Luftfeuchtigkeit.
// URL in die HTTP-Parameter ĂŒbernehmen.
parameter.url = url;
HTTP-Request absenden
Zum Abschluss wird ein HTTP-Request an ThingSpeak gesendet, um die Daten zu ĂŒbertragen. Die Antwort des Servers wird im Debug-Log angezeigt, und etwaige Fehler werden ausgegeben.
// Senden des HTTP-Requests an ThingSpeak.
Shelly.call(
"HTTP.Request", parameter,
function(result, error_code, error_message) {
if (error_code != 0) {
// Fehler: Ausgabe der Fehlermeldung.
print("Fehler beim Senden der Daten: " + error_message);
} else {
// Erfolgreicher Request: Ausgabe der Serverantwort.
print("Daten erfolgreich gesendet: ");
print(result);
}
}
);
});
Gesamter Code
Hier ist der vollstĂ€ndige Code, der die einzelnen Schritte zusammenfĂŒhrt, um mithilfe von Shelly Scripting Stromverbrauch visualisieren zu können. In regelmĂ€Ăigen Intervallen werden die Stromverbrauchs- und Sensordaten deines Shelly erfasst und automatisch auf einem Dashboard dargestellt:
/*
Der Code dient zum Ermitteln der Sensordaten eines DHT22-Sensors am Shelly 1PM Gen3.
ZusÀtzlich wird der Stromverbrauch einer LED-Lampe (Spannung, StromstÀrke und Leistung) erfasst.
Die Daten werden anschlieĂend mithilfe eines HTTP-GET-Requests an ThingSpeak gesendet.
*/
const baseUrl = "https://api.thingspeak.com/update?api_key=Q1930CQB0EBK2FRF";
// Basis-URL fĂŒr die ThingSpeak API. Der API-SchlĂŒssel authentifiziert den Zugriff auf den Kanal.
let data = {
voltage: 0, // Spannung der LED-Lampe in Volt.
current: 0, // StromstÀrke der LED-Lampe in Ampere.
apower: 0, // Momentane Leistungsaufnahme der LED-Lampe in Watt.
temperature: 0, // Temperaturwert des DHT22-Sensors in °C.
humidity: 0 // Luftfeuchtigkeit des DHT22-Sensors in Prozent.
};
let parameter = {
method: "GET", // Die HTTP-Methode ist GET, um Daten an ThingSpeak zu senden.
url: baseUrl, // URL wird dynamisch mit Sensordaten ergÀnzt.
headers: { "Content-Type": "application/json" } // Header, der den Inhaltstyp angibt.
};
// Timer, der alle 2000 ms (2 Sekunden) ausgefĂŒhrt wird.
Timer.set(2000, true, function() {
// Abrufen der Stromverbrauchsdaten vom Shelly (Spannung, Strom, Leistung).
let powerResult = Shelly.getComponentStatus("Switch:0");
data.voltage = powerResult.voltage; // Spannung in Volt.
data.current = powerResult.current; // StromstÀrke in Ampere.
data.apower = powerResult.apower; // Leistungsaufnahme in Watt.
// Abrufen der Temperaturdaten vom DHT22-Sensor.
let temperaturResult = Shelly.getComponentStatus("temperature:100");
data.temperature = temperaturResult.tC; // Temperatur in °C.
// Abrufen der Luftfeuchtigkeitsdaten vom DHT22-Sensor.
let humidityResult = Shelly.getComponentStatus("humidity:100");
data.humidity = humidityResult.rh; // Luftfeuchtigkeit in %.
// Debugging: Ausgabe der erfassten Daten im Konsolen-Log.
print(data);
// ErgÀnzen der URL mit den Sensordaten (ThingSpeak-Felder 1 bis 5).
var url = baseUrl;
url += "&field1=" + data.voltage; // Feld 1: Spannung.
url += "&field2=" + data.current; // Feld 2: StromstÀrke.
url += "&field3=" + data.apower; // Feld 3: Leistung.
url += "&field4=" + data.temperature; // Feld 4: Temperatur.
url += "&field5=" + data.humidity; // Feld 5: Luftfeuchtigkeit.
// URL wird in den Request-Parameter ĂŒbernommen.
parameter.url = url;
// HTTP-GET-Request an ThingSpeak senden.
Shelly.call(
"HTTP.Request", parameter,
function(result, error_code, error_message) {
// Fehlerbehandlung: Fehlermeldung wird im Debug-Log ausgegeben.
if (error_code != 0) {
print(error_message);
} else {
// Erfolgsfall: Die Antwort von ThingSpeak wird ausgegeben.
print(result);
}
}
);
});
Fazit und Ausblick zu Shelly Scripting Stromverbrauch visualisieren
In diesem Beitrag habe ich dir gezeigt, wie du mit Shelly Scripting die Messdaten deines Shelly 1PM Gen3 und eines angeschlossenen DHT22-Sensors erfassen und regelmĂ€Ăig an ThingSpeak sendest.
Read the full article