NEWS
MyStrom Switch ohne Cloud
-
Die MyStrom-Dinger sind recht einfach gestrickt und können direkt und ohne Umwege ausgelesen werden. Eine Beschreibung der Möglichkeiten (sowie Gefahren, sollte jemand von aussen drauf zugreifen können): https://api.mystrom.ch/
Was das Skript macht: es ruft die Report Webseite eines MyStrom-Switches auf,lLiest die Daten (JSON-Format) aus und speichert den Verbrauchswert als Zahl ab. Zudem werden die letzten x Werte als Liste/Array gespeichert und daraus der Durchschnitts der letzten x Messpunkte berechnet.
Der Vorteil: es reicht, den MyStrom-Switch in das eigene Netzwerk zu integrieren (geht z.B. über WPS oder auch das Troubleshooting-Tool), aber zum Auslesen der Daten braucht es keine Cloud und kein MyStrom-Account. Es funktioniert also alles auch ohne I-Net Anbindung.
Installation:
- Den in der Variable datapath hinterlegten Datenpfad unter Obejket erzeugen. Ich nutze für jeden Switch ein eigenes Unterverzeichnis unter MyStrom
- Drei Variablen im Datenpfad erzeugen: conumption_array (Typ array), consumption_average (Zahl), consumption_current (Zahl)
- Entweder die IP-Adresse oder den Rechnernamen des Switch in der Variable myStromAdapterName hinterlegen
- Wenn gewünscht die Anzahl der Messwerte zur Mittelwertsbildung ändern und die Abruffrequenz (derzeitig alle 10 Sekunden) anpassen.
- JS-Programm speichern und starten.
// Rechnername des Adapters var myStromAdapterName = "myStrom-Switch-B16674.home"; // Pfad zur Speicherung der Daten var datapath = "0_userdata.0.myStrom.Switch-B16674"; var max_datapoints = 10; var consumption_list; var myStrom; // Berechnet den Durschnittswert einer gegebenen Liste function mathMean(myList) { return myList.reduce(function(x, y) {return x + y;}) / myList.length; } if (getState(datapath+".consumption_array").val) { consumption_list = getState(datapath+".consumption_array").val; } else { consumption_list = []; setState(datapath+".consumption_array", consumption_list, true); } schedule("*/10 * * * * *", async function () { // Pull data from Switch API -> JSON format result request("http://"+myStromAdapterName+"/report", function (err, state, body){ if (body) { //console.log(JSON.stringify(body)); //console.log(body); myStrom = JSON.parse(body); console.log(myStrom.power); console.log(myStrom.temperature); // store newest data point in array, drop anything above while (consumption_list.length >= max_datapoints) { consumption_list.shift(); } consumption_list.push(myStrom.power).val; setState(datapath+".consumption_array", consumption_list, true); setState(datapath+".consumption_current", myStrom.power, true); setState(datapath+".consumption_average", Math.round((mathMean(consumption_list))*10)/10, true); console.log(consumption_list); } else { log('Request meldet Fehler: ' + err, 'error'); } }); });