Shelly Verbrauchs-Historie für Tag, Woche, Monat, Jahr

Lesedauer: 9 Minuten

Hinweis: für dieses Skript steht ein Update zur Verfügung!
Es wird nun auch der Shelly 3EM unterstützt.

In der Shelly Cloud App für iOS oder Android sieht man natürlich immer auf einen Blick, wie der Verbrauch der einzelnen oder aller Shelly ist.
Was ist aber, wenn man diese Daten auch gerne Offline zur weiteren Verarbeitung speichern möchte?
Hier stößt man leider schnell auf ein Problem, das der Verbrauch des Shelly zwar abgelesen werden kann – jedoch nur der Verbrauch seit dem letzten Neustart.

Somit würde sich der Verbrauch immer verändern, wenn der Shelly aufgrund von Stromausfall oder Software-Update neugestartet wurde.

Hierzu habe ich mir lange Gedanken gemacht und ein Skript entwickelt, welches die Werte aus den einzelnen Shelly in einer einstellbaren Zeit abfragt und in eigene Datenpunkte speichert. Auch ist eine Korrektur von Reboot Werten vorhanden. Somit werden die Zähler der temporären Berechnung genullt, sobald festgestellt wurde, das der Shelly neu gestartet wurde. Dies hat keinen Einfluss auf die gesamte Berechnung des Verbrauchs – im Gegenteil: Die Berechnung des Verbrauchs wird genauer!

Übersicht der Funktionen

Folgende Verbrauchswerte stehen in der Historie für jeden der Shelly zur Verfügung:

FunktionBeschreibung
Verbrauch heuteabgefragter Verbrauch heute
Verbrauch gesternabgefragter Verbrauch gestern
Verbrauch diese Wocheabgefragter Verbrauch für die gesamte Woche
Verbrauch letzte Wocheabgefragter Verbrauch für die gesamte letzte Woche
Verbrauch dieser Monatabgefragter Verbrauch für den gesamten Monat
Verbrauch letzter Monatabgefragter Verbrauch für den gesamten letzten Monat
Verbrauch dieses Jahrabgefragter Verbrauch für das gesamte Jahr
Verbrauch letztes Jahrabgefragter Verbrauch für das gesamte letzte Jahr
Verbrauch Gesamtabgefragter Verbrauch gesamt
NameZugewiesener Name des Shelly zum einfachen Wiederfinden
Übersicht über die einzelnen Datenpunkte

Screenshot der verfügbaren Variablen

Screenshot der verfügbaren Variablen
Screenshot der verfügbaren Variablen

Installation des Shelly Adapter

Installation des Shelly Adapter
Installation des Shelly Adapter

Nach kurzer Zeit stehen die Datenpunkte aller gefundenen Shellys unter shelly.0 zur Verfügung.

Skript

/*
 * @copyright 2021 Stephan Kreyenborg <stephan@kreyenborg.koeln>
 *
 * @author 2021 Stephan Kreyenborg <stephan@kreyenborg.koeln>
 *
 * Dieses Skript dient zur freien Verwendung in ioBroker zur Verbrauchserfassung der Shelly Geräte.
 * Jegliche Verantwortung liegt beim Benutzer. Das Skript wurde unter Berücksichtigung der bestmöglichen Nutzung
 * und Performance entwickelt.
 * Der Entwickler versichert, das keine böswilligen Systemeingriffe im originalen Skript vorhanden sind.
 *
 * Sollte das Skript wider Erwarten nicht korrekt funktionieren, so hast Du jederzeit die Möglichkeit, Dich auf
 * https://www.kreyenborg.koeln
 * für Unterstützung zu melden. Jedes Skript besitzt seine eigene Kommentarseite, auf der,
 * nach zeitlicher Möglichkeit des Autors, Hilfe angeboten wird. Ein Anrecht hierauf besteht nicht!
 * 
 * Ansprüche gegenüber Dritten bestehen nicht. 
 * 
 * Skript Name:      Shelly-Verbrauch
 * Skript Version:   1.60
 * Erstell-Datum:    08. Oktober 2021 | Update: 20. Juli 2022
 * 
 */

// Datenpunkte neu erstellen
var ueberschreiben = false;

// Hauptdatenpunkt unterhalb javascript
var datenpunkt = "ShellyVerbrauch."; // Abschließender Punkt !!! WICHTIG !!!

// Verbrauchs Objekte der einzelnen Shelly
var objekt = ["gesamt", "dieses_jahr", "letztes_jahr", "letzter_monat", "dieser_monat", "letzte_woche",
    "diese_woche", "gestern", "heute", "alter_wert", "aktueller_wert"
];

// Beschreibung der Objekte
var beschreibung = ["Gesamter Vebrauch des Shelly", "Verbrauch aktuelles Jahr", "Verbrauch letztes Jahr",
    "Verbrauch letzten Monat", "Verbrauch aktueller Monat", "Verbrauch letzte Woche", "Verbrauch diese Woche",
    "Verbrauch gestern", "Verbrauch heute", "Messwert alt", "Messwert neu"
];

// Datenpunkt der Shelly (Standard: shelly.0)
var shelly_dp = "shelly.0";

// Datenpunkte der Shelly (!!! Bitte nicht ändern !!!)
var shellyDps = $('state[id=' + shelly_dp + '.*.*.Energy]');

// Datenpunkte der Shelly 3EM DP
var shelly3EMDps = $('state[id=' + shelly_dp + '.*.*.Total]');

// Datenpunkte der Shelly 3EM DP - Total
var shelly3EMTotalDps = $('state[id=' + shelly_dp + '.*.*.ConsumedPower]');

// Datenpunkte der Shelly 3EM DP - Total
var shelly3EMTotalReturned = $('state[id=' + shelly_dp + '.*.*.Total_Returned]');

// Datenpunkte der Shelly Namen (!!! Bitte nicht ändern !!!)
var shellyDpsName = $('state[id=' + shelly_dp + '.*.name]');

// Shelly Verbrauch aktualisieren - nachts um 00:00 Uhr
function shelly_vebrauch_tag() {
    // Nochmals das Tagesupdate durchlaufen, damit die restlichen Werte gelesen werden
    shelly_verbrauch_update();

    // Datumsvariable
    var heute = new Date();

    // Heute zu Gestern verschieben. Täglich um 00:00 Uhr
    verschiebe_verbrauch_objekt("heute", "gestern");
    log("Shelly Verbrauch: Werte für gestern und heute aktualisiert!");

    // aktuelle Woche in letzte Woche verschieben. Am Montag um 00:00 Uhr
    if (heute.getDay() === 1) {
        verschiebe_verbrauch_objekt("diese_woche", "letzte_woche");
        log("Shelly Verbrauch: Werte für diese und letzte Woche aktualisiert!");
    }

    // aktueller Monat in letzten Monat verschieben. Am 1. des Monats um 00:00 Uhr
    if (heute.getDate() === 1) {
        verschiebe_verbrauch_objekt("dieser_monat", "letzter_monat");
        log("Shelly Verbrauch: Werte für diesen und letzten Monat aktualisiert!");
    }

    // aktuelles Jahr in letztes Jahr verschieben. Am 1. des Monats am 1. Monat um 00:00 Uhr
    if (heute.getDate() === 1 && heute.getMonth() === 0) {
        verschiebe_verbrauch_objekt("dieses_jahr", "letztes_jahr");
        log("Shelly Verbrauch: Werte für dieses und letztes Jahr aktualisiert!");
    }
}

// Tagesverbrauch alle 15 Min von der Original Variable des Shelly in eigene Variable kopieren
function shelly_verbrauch_update() {
    var anzahl_updates = 0;
    var anzahl_reboots = 0;
    var anzahl_gleich = 0;
    shellyDps.each(function (id, i) {
        var shelly_verbrauch = getState(id).val;
        // Einige Shelly haben keine Verbrauchswerte (noch nicht)
        if (shelly_verbrauch != null) {
            // Hole aktuellen Wert, um zu kontrollieren, ob ein Reboot stattgefunden hat
            var aktueller_wert = getState(shelly_DP(id) + "aktueller_wert").val;
            var alter_wert = 0;
            // Prüfe alten und neuen Wert
            if (shelly_verbrauch > aktueller_wert) {
                // Verbrauchswert ist größer als alter Wert -> es wurde kein Reboot durchgeführt
                setState(shelly_DP(id) + "alter_wert", aktueller_wert, true);
                alter_wert = aktueller_wert;
                anzahl_updates++;
            }
            if (aktueller_wert > shelly_verbrauch) {
                // Verbrauchswert ist kleiner als alter Wert -> es wurde ein Reboot durchgeführt
                setState(shelly_DP(id) + "alter_wert", 0, true);
                alter_wert = 0;
                anzahl_reboots++;
            }
            if (shelly_verbrauch == aktueller_wert) {
                // Verbrauchswert ist gleich wie alter Wert -> kein Update notwendig
                alter_wert = aktueller_wert;
                anzahl_gleich++;
            }

            setState(shelly_DP(id) + "aktueller_wert", shelly_verbrauch, true);
            // Alter und neuer Wert -> aktuelle Differenz

            var verbrauch = parseFloat(shelly_verbrauch) - alter_wert;
            // Tagesverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "heute", verbrauch);

            // Wochenverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "diese_woche", verbrauch);

            // Monatsverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "dieser_monat", verbrauch);

            // Jahresverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "dieses_jahr", verbrauch);

            // Gesamten Vebrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "gesamt", verbrauch);
        }
    });
    shelly3EMDps.each(function (id, i) {
        var shelly_verbrauch = getState(id).val;
        // Einige Shelly haben keine Verbrauchswerte (noch nicht)
        if (shelly_verbrauch != null) {
            // Hole aktuellen Wert, um zu kontrollieren, ob ein Reboot stattgefunden hat
            var aktueller_wert = getState(shelly_DP(id) + "aktueller_wert").val;
            var alter_wert = 0;
            // Prüfe alten und neuen Wert
            if (shelly_verbrauch > aktueller_wert) {
                // Verbrauchswert ist größer als alter Wert -> es wurde kein Reboot durchgeführt
                setState(shelly_DP(id) + "alter_wert", aktueller_wert, true);
                alter_wert = aktueller_wert;
                anzahl_updates++;
            }
            if (aktueller_wert > shelly_verbrauch) {
                // Verbrauchswert ist kleiner als alter Wert -> es wurde ein Reboot durchgeführt
                setState(shelly_DP(id) + "alter_wert", 0, true);
                alter_wert = 0;
                anzahl_reboots++;
            }
            if (shelly_verbrauch == aktueller_wert) {
                // Verbrauchswert ist gleich wie alter Wert -> kein Update notwendig
                alter_wert = aktueller_wert;
                anzahl_gleich++;
            }

            setState(shelly_DP(id) + "aktueller_wert", shelly_verbrauch, true);
            // Alter und neuer Wert -> aktuelle Differenz

            var verbrauch = parseFloat(shelly_verbrauch) - alter_wert;
            // Tagesverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "heute", verbrauch);

            // Wochenverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "diese_woche", verbrauch);

            // Monatsverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "dieser_monat", verbrauch);

            // Jahresverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "dieses_jahr", verbrauch);

            // Gesamten Vebrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "gesamt", verbrauch);
        }
    });
    shelly3EMTotalDps.each(function (id, i) {
        var shelly_verbrauch = getState(id).val;
        // Einige Shelly haben keine Verbrauchswerte (noch nicht)
        if (shelly_verbrauch != null) {
            // Hole aktuellen Wert, um zu kontrollieren, ob ein Reboot stattgefunden hat
            var aktueller_wert = getState(shelly_DP(id) + "aktueller_wert").val;
            var alter_wert = 0;
            // Prüfe alten und neuen Wert
            if (shelly_verbrauch > aktueller_wert) {
                // Verbrauchswert ist größer als alter Wert -> es wurde kein Reboot durchgeführt
                setState(shelly_DP(id) + "alter_wert", aktueller_wert, true);
                alter_wert = aktueller_wert;
                anzahl_updates++;
            }
            if (aktueller_wert > shelly_verbrauch) {
                // Verbrauchswert ist kleiner als alter Wert -> es wurde ein Reboot durchgeführt
                setState(shelly_DP(id) + "alter_wert", 0, true);
                alter_wert = 0;
                anzahl_reboots++;
            }
            if (shelly_verbrauch == aktueller_wert) {
                // Verbrauchswert ist gleich wie alter Wert -> kein Update notwendig
                alter_wert = aktueller_wert;
                anzahl_gleich++;
            }

            setState(shelly_DP(id) + "aktueller_wert", shelly_verbrauch, true);
            // Alter und neuer Wert -> aktuelle Differenz

            var verbrauch = parseFloat(shelly_verbrauch) - alter_wert;
            // Tagesverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "heute", verbrauch);

            // Wochenverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "diese_woche", verbrauch);

            // Monatsverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "dieser_monat", verbrauch);

            // Jahresverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "dieses_jahr", verbrauch);

            // Gesamten Vebrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id), "gesamt", verbrauch);
        }
    });
    shelly3EMTotalReturned.each(function (id, i) {
        var shelly_verbrauch = getState(id).val;
        // Einige Shelly haben keine Verbrauchswerte (noch nicht)
        if (shelly_verbrauch != null) {
            // Hole aktuellen Wert, um zu kontrollieren, ob ein Reboot stattgefunden hat
            var aktueller_wert = getState(shelly_DP(id, true) + "aktueller_wert").val;
            var alter_wert = 0;
            // Prüfe alten und neuen Wert
            if (shelly_verbrauch > aktueller_wert) {
                // Verbrauchswert ist größer als alter Wert -> es wurde kein Reboot durchgeführt
                setState(shelly_DP(id, true) + "alter_wert", aktueller_wert, true);
                alter_wert = aktueller_wert;
                anzahl_updates++;
            }
            if (aktueller_wert > shelly_verbrauch) {
                // Verbrauchswert ist kleiner als alter Wert -> es wurde ein Reboot durchgeführt
                setState(shelly_DP(id, true) + "alter_wert", 0, true);
                alter_wert = 0;
                anzahl_reboots++;
            }
            if (shelly_verbrauch == aktueller_wert) {
                // Verbrauchswert ist gleich wie alter Wert -> kein Update notwendig
                alter_wert = aktueller_wert;
                anzahl_gleich++;
            }

            setState(shelly_DP(id, true) + "aktueller_wert", shelly_verbrauch, true);
            // Alter und neuer Wert -> aktuelle Differenz

            var verbrauch = parseFloat(shelly_verbrauch) - alter_wert;
            // Tagesverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id, true), "heute", verbrauch);

            // Wochenverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id, true), "diese_woche", verbrauch);

            // Monatsverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id, true), "dieser_monat", verbrauch);

            // Jahresverbrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id, true), "dieses_jahr", verbrauch);

            // Gesamten Vebrauch aktualisieren
            aktualisiere_vebrauch_objekt(shelly_DP(id, true), "gesamt", verbrauch);
        }
    });
    aktualisiere_namen();
    log("Shelly Verbrauch: Verbrauchswerte aktualisiert: " + anzahl_updates + " | Reboots korrigiert: " + anzahl_reboots + " | Unveränderte Werte: " + anzahl_gleich);
}

// aktualisiert das jeweilige Verbrauchs-Objekt und addiert den Verbrauch dazu
function aktualisiere_vebrauch_objekt(dp, objekt, wert) {
    // Hole alten Verbrauch
    let alter_verbrauch = getState(dp + objekt).val;
    let verbrauch = 0;
    // Kein Wert vorhanden - nutze den übermittelten Wert
    if (alter_verbrauch < 1 || alter_verbrauch == null) {
        verbrauch = parseFloat(wert)
    } else {
        verbrauch = parseFloat(alter_verbrauch) + parseFloat(wert);
    }
    setState(dp + objekt, parseFloat(verbrauch.toFixed(2)), true);
}

// Verschiebt das jeweilige Verbrauchs-Objekt und nullt den Ursprung (Tag, Woche, Monat, Jahr)
function verschiebe_verbrauch_objekt(von, nach) {
    $('state[id=*.' + datenpunkt + '*.*.' + von + ']').each(function (id, i) {
        // Temporärer Gruppen-Datenpunkt
        var tmp_dp = id.slice(0, -(von.length));
        var verbrauch = getState(id).val;
        if (verbrauch != null) {
            setState(tmp_dp + nach, verbrauch, true);
        }
        // Setze "von" zurück
        setState(id, 0, true);
    });
}

// Funktion um die aktuellen Namen des Shelly abzuholen
function aktualisiere_namen() {
    if (typeof extendObject === "function") {
        shellyDpsName.each(function (id, i) {
            if (existsState(id)) {
                setState(shelly_DP_Name(id), String(getState(id).val), true);
                extendObject("javascript.0." + shelly_DP_Name_Main(id), {
                    common: {
                        name: String(getState(id).val),
                        desc: String(getState(id).val)
                    },
                    type: "channel"
                });
            }
        });
    }
}

// Erstelle die benötigten Datenpunkte
function datenpunkte_erstellen() {
    // Anzahl der gefundenen Shelly
    var anzahl = shellyDps.length;

    shellyDps.each(function (id, j) {
        var initial_wert = 0.0;
        for (var i = 0; i < objekt.length; i++) {
            // Startwerte werden nur bei alter_wert und aktueller_wert eingetragen
            if (i > 8) {
                initial_wert = getState(id).val;
            }
            createState(shelly_DP(id) + objekt[i], initial_wert, ueberschreiben, {
                name: beschreibung[i],
                desc: beschreibung[i],
                type: "number",
                role: "value.power",
                unit: "Wh"
            });
        }
    });

    // Anzahl der gefundenen Shelly 3EM
    var anzahl_3em = shelly3EMDps.length;

    shelly3EMDps.each(function (id, j) {
        var initial_wert = 0.0;
        for (var i = 0; i < objekt.length; i++) {
            // Startwerte werden nur bei alter_wert und aktueller_wert eingetragen
            if (i > 8) {
                initial_wert = getState(id).val;
            }
            createState(shelly_DP(id) + objekt[i], initial_wert, ueberschreiben, {
                name: beschreibung[i],
                desc: beschreibung[i],
                type: "number",
                role: "value.power",
                unit: "Wh"
            });
        }
    });

    // Anzahl der gefundenen Shelly 3EM - Total
    var anzahl_3em_total = shelly3EMTotalDps.length;

    shelly3EMTotalDps.each(function (id, j) {
        var initial_wert = 0.0;
        for (var i = 0; i < objekt.length; i++) {
            // Startwerte werden nur bei alter_wert und aktueller_wert eingetragen
            if (i > 8) {
                initial_wert = getState(id).val;
            }
            createState(shelly_DP(id) + objekt[i], initial_wert, ueberschreiben, {
                name: beschreibung[i],
                desc: beschreibung[i],
                type: "number",
                role: "value.power",
                unit: "Wh"
            });
        }
    });

    // Anzahl der gefundenen Shelly 3EM - Total
    var anzahl_3em_total_returned = shelly3EMTotalReturned.length;

    shelly3EMTotalReturned.each(function (id, j) {
        var initial_wert = 0.0;
        for (var i = 0; i < objekt.length; i++) {
            // Startwerte werden nur bei alter_wert und aktueller_wert eingetragen
            if (i > 8) {
                initial_wert = getState(id).val;
            }
            createState(shelly_DP(id, true) + objekt[i], initial_wert, ueberschreiben, {
                name: beschreibung[i],
                desc: beschreibung[i],
                type: "number",
                role: "value.power",
                unit: "Wh"
            });
        }
    });

    // Alle Datenpunkte erstellt. Frage ersten Verbrauch ab!
    log("Shelly Verbrauch: Datenpunkte erstellt! Erster Verbrauch steht nach 30 Sekunden zur Verfügung! Anzahl gefundener Shelly Datenpunkte: " + (anzahl_3em + anzahl + anzahl_3em_total + anzahl_3em_total_returned));
    setTimeout(shelly_verbrauch_update, 30000);

    // Datenpunkte für die Namen der Shelly erstellen
    shellyDpsName.each(function (id, j) {
        createState(shelly_DP_Name(id), "", ueberschreiben, {
            name: "Name des Shelly",
            desc: "Name des Shelly",
            type: "string",
            role: "value",
            unit: ""
        });
    });
}

/**
 * Wenn 3EM DP, dann anderen Wert zurückgeben
 * @param {any} dp
 * @param {boolean} extended
 */
function shelly_DP(dp, extended = false) {
    dp = dp.split(".");
    dp = datenpunkt + dp[2] + "." + dp[3];
    if (extended) {
        dp = dp + "_Returned.";
    } else {
        dp = dp + ".";
    }
    return dp;
}

function shelly_DP_Name(dp) {
    dp = dp.split(".");
    dp = datenpunkt + dp[2] + "." + dp[3];
    return dp;
}

function shelly_DP_Name_Main(dp) {
    dp = dp.split(".");
    dp = datenpunkt + dp[2];
    return dp;
}

function shelly_verbrauch_erster_start() {
    log("Shelly Verbrauch: Erster Start des Skriptes! Datenpunkte werden erstellt!");
    // Datenpunkte werden erstellt
    datenpunkte_erstellen();
}

// Erster Start und Initialisierung
shelly_verbrauch_erster_start();

// Alle 15 Minuten das Skript für den Tagesverbrauch ausführen
schedule('*/15 * * * *', shelly_verbrauch_update);

// Nachts um 24 Uhr werden die Werte in andere Variablen gespeichert, um den Verlauf zu erstellen
schedule('0 0 * * *', shelly_vebrauch_tag);

Datenpunkte

Nachdem das Skript angelaufen ist und regelmäßig die Verbräuche der Shelly abgefragt wurden, findest Du diese im Datenpunkt: javascript.0.ShellyVerbrauch

Fehlersuche

Fehlermeldung im Log

javascript.0 2022-01-25 17:41:56.234	error	Function "extendObject" is not allowed. Use adapter settings to allow it.

Solltest Du diese Fehlermeldung erhalten, dann werden die Namen deiner Shelly dem Datenpunkt nicht zugewiesen. Hierzu musst Du im Javascript – Adapter die Funktion “setObject” erlauben. Dies bedeutet, das Skripte die Eigenschaften von Objekten verändern dürfen. Hier dient es dazu, dem Objekt den Namen des jeweiligen Shelly zu geben.

Neue Shelly eingebunden, das Skript liest die Daten nicht aus!

Solltest Du zur Laufzeit des Skripts neue Shelly eingebunden haben, so kannst du das Skript einmal stoppen und erneut starten. Dann werden auch die passenden Datenpunkte für die neuen Shelly gefunden und ausgelesen.

Wie hat Dir der Beitrag gefallen?
Bewertung: 4.9/5 - abgegebene Bewertungen: 21

476 Gedanken zu „Shelly Verbrauchs-Historie für Tag, Woche, Monat, Jahr

  1. Dominik Antworten

    Hi Stephan,

    ich wollte mich nur bedanken! Skript läuft super (Hab noch “vorgestern” und “drittletzter Tag” und “vorletzte Woche” ergänzt, macht keine Probleme)

    Viele Grüße,

    Dominik

  2. Frank Röder Antworten

    Hallo Stephan, ich nutze dein Script seit 2020 mit der Version 1.0.
    Läuft sehr gut, vielen Dank für die Bereitstellung.
    Habe eben gesehen, das es die Version 1.40 gibt.
    Was muß man tun, um das Script auf die neue Version zu bekommen?
    Und sind meine bisherigen Daten dann weg oder kann man diese sichern und dann weiterverwenden?
    Vielen Dank im Vorraus.

    Gruß
    Frank

    • Stephan Autor des BeitragsAntworten

      Hallo Frank,
      das ist sehr löblich 😉

      Das neue Skript baut auf das “alte” auf – das heißt, du kannst das vorherige einfach mit dem Inhalt des Neuen ersetzen.
      Alle Daten bleiben erhalten.

      Gruß,
      Stephan

  3. Tim Antworten

    Ich habe nochmal eine Frage. Der Zähler ‘Heute’ wird bei mir nicht um 0 Uhr, sondern um 22 Uhr zurückgesetzt.
    Heißt, die Zeit stimmt wohl irgendwo nicht. Weißt du wo ich das beheben kann?
    Gruß
    Tim

    • Stephan Autor des BeitragsAntworten

      Hallo Tim,
      per SSH auf dem System abändern.
      Wenn es ein Raspberry ist, mit dem Befehl:
      sudo raspi-config
      Einstellungen / Raspberry-Pi-Konfiguration / Lokalisierung / Zeitzone festlegen

      Gruß,
      Stephan

      • Tim Antworten

        Das System läuft als Docker auf einer Synology. Die Zeit und Zeitzone ist dort richtig eingestellt.
        Auch die Zeiten im Log im ioBroker werden korrekt angezeigt … 🙁

        • Stephan Autor des BeitragsAntworten

          Hallo Tim,
          Ist die Zeit im Docker Image auch richtig?
          Was zeigt denn time via ssh?
          Die richtige Uhrzeit?

          • Tim

            “time” klappte nicht aber “date” zeigt mir gerade: Mo 10. Mai 20:21:41 CEST 2021

          • Stephan Autor des Beitrags

            Hallo Tim,
            stimmt denn Zeile 325 bei Dir mit dem vom Skript überein?

            Gruß,
            Stephan

          • Tim

            Alles gut, habe den Fehler gefunden.
            InfluxDB läuft in einem eigene Docker und dort war die Zeitzone falsch 🙁
            Danke für den richtigen entsprechenden Hinweis 🙂

  4. Ralf O. Antworten

    Hallo Stephan
    der Shelly Adapter ist installiert!!!
    Habe zb.
    shelly.1.SHEM-3#68C63AFAE138#1
    shelly.1.SHSW-PM#E8DB84D7A5A4#1

    Gruß Ralf

    • Ralf O. Antworten

      Hallo Stefan
      der Ordner ist auch vorhanden.
      javascript.0.scriptEnabled.ShellyVerbrauch.ShellyVerbrauch

      Gruß Ralf

      • Stephan Autor des BeitragsAntworten

        Hallo Ralf,
        Schau mal in Zeile 40 des Skript.
        Dort ist der Standard Datenpunkt shelly.0
        Ändere diesen einmal in shelly.1 für Deinen Fall ab. Dann sollten die Shelly auch gefunden werden 😉

        Gruß,
        Stephan

        • Ralf O. Antworten

          Hallo Stephan
          Danke für deine Geduld es hat jetzt funktioniert !!!!!!!
          Super

          Gruß Ralf

          • Stephan Autor des Beitrags

            Hallo Ralf,
            gerne doch 😉

            Viel Spaß damit!

            Gruß,
            Stephan

  5. Ralf O. Antworten

    Hallo bei mir werden die Datenpunkte nicht erzeugt??
    was kann Ich da machen.

    • Stephan Autor des BeitragsAntworten

      Hallo Ralf,
      das ist natürlich nicht so erfreulich. Erscheinen denn Fehlermeldungen im Log?
      Wenn ja, welche?

      Gruß,
      Stephan

      • Ralf O. Antworten

        Hallo
        Das steht im Log:
        07:57:53.683 info javascript.0 (4251) Stop script script.js.ShellyVerbrauch
        07:57:53.698 info javascript.0 (4251) Start javascript script.js.ShellyVerbrauch
        07:57:53.750 info javascript.0 (4251) script.js.ShellyVerbrauch: Shelly Verbrauch: Erster Start des Skriptes! Datenpunkte werden erstellt!
        07:57:53.751 info javascript.0 (4251) script.js.ShellyVerbrauch: Shelly Verbrauch: Datenpunkte erstellt! Erster Verbrauch steht nach 30 Sekunden zur Verfügung! Anzahl gefundener Shelly Datenpunkte: 0
        07:57:53.757 info javascript.0 (4251) script.js.ShellyVerbrauch: registered 0 subscriptions and 2 schedules
        07:58:23.752 info javascript.0 (4251) script.js.ShellyVerbrauch: Shelly Verbrauch: Verbrauchswerte aktualisiert: 0 | Reboots korrigiert: 0 | Unveränderte Werte: 0

        • Stephan Autor des BeitragsAntworten

          Hallo Ralf,
          Danke für den Auszug. Dort ist auch zu finden, das keine Shelly gefunden wurden.
          Den Shelly Adapter hast Du installiert?
          Welche Shelly sollten denn gefunden werden?

  6. Tim Antworten

    Nochmal eine andere Frage, gibt es einen Grund, wieso du die Werte nicht bestätigt in die DPs schreibst?

    • Stephan Autor des BeitragsAntworten

      Hallo Tim,
      hat keinen bestimmten Grund. Ich habe keine zusätzliche Kontrolle in der Abfrage, ob der Datenpunkt beschrieben wurde, da das Skript ja regelmäßig arbeitet.

      Gruß,
      Stephan

      • Tim Antworten

        Ok, habe nun bei allen “setState” einfach ein true angehangen.
        Hast du schon was neues, wie man den Namen bei den root DPs in das Feld Beschreibung bekommt?

          • Stephan Autor des Beitrags

            Hallo Tim,
            das Skript hat ein Update bekommen. Die Namen der Shelly sollten nun auch im Hauptverzeichnis sichtbar sein.
            Zusätzlich werden alle Datenpunkte bestätigt gespeichert.

            Viel Spaß damit 😉

            Gruß,
            Stephan

          • Tim

            Klasse!! – Hat geklappt
            Vielen Dank 🙂

  7. Tim Antworten

    Moin, danke erstmal für das Skript.
    Habe es seit einigen Wochen laufen und bin gerade dabei, die Daten über influxdb und Grafana ‘aufzuhübschen’. Dafür sammel ich über influxdb den Wert “gesamt” bei allen Shellys ein und werte diese entsprechend aus.
    Dabei ist mit aufgegfallen, dass die getrackten Werte deines Skriptes leider ziemlich von denen, die Shelly selber über die App anzeigt, abweichen.
    Bsp: Gefrierschrank laut Shelly-App heute 226 Wh, laut deinem Skript nur 127 Wh … der Unterschied ist schon krass.
    Auch bei anderen Werten ist mir das aufgefallen. Weißt du woran das liegen kann? Liegt das evtl. am Zeitintervall von 15 Minuten?

    • Tim Antworten

      Ach so und noch eine Frage:
      Ist es irgendwie möglich, den Namen des jeweiligen Shelly’s im Feld “Name” auch in den Hauptdatenpunkt anzeigen zu lassen?
      Also, das man im ioBroker schon direkt hinter den Datenpunkt “SHPLG-S#xxxxxx#1” den entsprechenden Namen sieht.
      Beim ShellyAdapter ist das auch so und es erleichtert die Suche wenn man mehrere Shelly’s im Einsatz hat. Derzeit muss man alle Datenpunkte nacheinander aufklappen um den Namen zu sehen.

    • Stephan Autor des BeitragsAntworten

      Hallo Tim,
      Ich habe das Skript selbst im Einsatz und kann eine kleine, zu vernachlässigende Abweichung feststellen.

      Wählst Du denn bei der Shelly App auch hinten “Benutzerdefiniert” aus oder vorne “24 Stunden”?
      Die 24 Stunden beinhalten logischerweise auch Daten vom Vortag. Somit kann die Abweichung auftreten.

      Auch ist der beste Datenpunkt für die influxDB “heute” und nicht gesamt.

      Gruß,
      Stephan

      • Tim Antworten

        Moin Stephan, danke für die schnelle Reaktion.
        Das mit dem Reiter “Benutzerdefiniert” war ein sehr guter Hinweis.
        Ich war natürlich auf dem Reiter “24 Stunden” – denkfehlr.

        Nutze ich Ansicht “Benutzerdefiniert” und gehe auf “heute”, habe ich dennoch Unterschiede:
        Server: App 930 Wh | Skript: 818 Wh
        Kühschrank: App 1.58 kWh | Skript: 1.33 kWh

        Bin bei influxdb noch neu…. wieso ist “heute” am besten?
        Der Wert setzt sich doch immer um 0 Uht zurück. Ist das für den Gesamtverbrauch etc nicht kontraproduktiv?
        Danke auf jedenfall schon einmal für den Hinweis!

        VG Tim

        • Stephan Autor des BeitragsAntworten

          Hallo Tim,
          ich habe soeben alle meine Shelly Plugs einmal geprüft und konnte feststellen, dass sie sich in etwa 1-5Wh von der Shelly App unterscheiden. Diesen Unterschied würde ich einmal als Rundungsfehler sehen. Wäre noch wichitg zu wissen, welchen Shelly Adapter Du benutzt – ich verwende 4.0.7.

          Könntest Du einmal in dem Objekt vom Shelly Adapter schauen, welche Werte dort stehen?

          Ich nutze selbst die influxDB und auch genau den Datenpunkt “heute”, da dieser, wie Du richtig erkannt hast, sich nachts nullt 😉
          Dadurch hat man bei Grafana immer neue Werte und kann diese Prima anzeigen lassen.

          Als Beispiel für influxDB nutze ich folgende Abfrage für den Shelly Plug:
          SELECT max("value") FROM "Shelly Schrank" WHERE $timeFilter GROUP BY time(24h) fill(linear)

          Shelly Schrank ist somit der Name (alias), den ich beim Speichern im influxDB nutze.
          Gruß,
          Stephan

          • Tim

            Hi Stephan,
            ich habe ebenfalls die Version 4.0.7 installiert.
            Seltsam, dass es bei dir nur so kleine Abweichungen sind. Läuft dein Skript alle 15 Minuten oder öfter? Habe es nun mal auf 5 Minuten gestellt. Weiß aber nicht, ob das wirklich eine Änderung bewirkt.

            Ich probiere es mal mit “heute” 🙂
            Kannst du damit dann auch den Wochen / Monats / … Verbauch anzeigen lassen?

          • Stephan Autor des Beitrags

            Hallo Tim,
            das muss sich ja herausfinden lassen, wieso bei Dir größere Abweichungen auftreten.
            Die Aktualisierung meines Skriptes ist nur die Verzögerung – sprich: Shelly übermittelt die Werte in die eigenen Datenpunkte und mein Skript berechnet sie dann (im 15 Minutentakt). Somit haben meine Werte halt die entsprechende Verzögerung.

            Du kannst bei Grafana den Zeitbereich dann selbst bestimmen. Monat, Jahr oder auch Tag bzw. Zeitraum: von bis.

            Gruß,
            Stephan

          • Tim

            Ich schaue mir das mit dem Wert “heute” mal die nächsten Tage an und vergleiche das ganze.
            Danke dir schon einmal für die Unterstützung!

          • Stephan Autor des Beitrags

            Prima, melde Dich gerne zurück und dann analysieren wir weiter 😉

            Gruß,
            Stephan

          • Tim

            So, habe es paar Tage mal beobachtet.
            Es ist besser geworden, aber noch nicht perfekt 😉
            Seltsam sind die Schwankungen. Bei machen Shellys passt es fast auf den Watt (ioBroker 1554 Wh – App 1.52 KwH), bei anderen ist der Unterschied schon größer (ioBroker 623 Wh – App 596 Wh).

            Wie gesagt, ist nicht mehr tragsisch, aber verstehen tue ich das nicht 🙂

          • Stephan Autor des Beitrags

            Hallo Tim,
            Wie sieht denn der original Shelly Datenpunkt aus?
            Wenn der Datenpunkt schon falsch ist, kann mein Skript auch nur den falschen Wert verwenden. Hier müsste man dann mal schauen, ob es Sinn macht, den Shelly Adapter einmal zu stoppen und den Datenpunkt im Shelly Datenpunkt zu Nullen und dann den Adapter neuzustarten. Dann vielleicht mal schauen – wäre mein Vorschlag dazu.

            Gruß,
            Stephan

          • Tim

            Soweit ich es sehe, sind die Werte “Energy” und “aktueller_Wert” identisch.
            Meintest du das?

            Welchen DP sollte ich denn leeren, Energy?

          • Stephan Autor des Beitrags

            Hallo Tim,
            Wenn die Werte identisch sind, dann übernimmt mein Skript die korrekten Werte und der Fehler ist woanders.
            Ist jetzt allerdings schwer, ins Blaue zu raten, wo man beginnen könnte.
            Ich vermute, das vielleicht der Cloud-Service nicht so sauber arbeitet?

            Ich würde vielleicht einfach mal hingehen und den Shelly Adapter stoppen, dann die Steckdose neustarten und dann wieder den Adapter zu starten.
            Dann die Beobachtung weiterführen …

            Gruß,
            Stephan

          • Tim

            Hallo Stephan,
            ich danke dir für deine Hilfe.
            Werde das mit den Shellys bei Zeiten mal machen – im Grunde klappt ja aber erstmal alles. 🙂
            Gruß
            Tim

          • Stephan Autor des Beitrags

            Hallo Tim,
            gerne, das bringt so eine Seite mit sich, das man eben versucht zu helfen 😉
            Und, jede Antwort dazu hilft vielleicht auch wem.

            Angenehme Zeit!
            Gruß,
            Stephan

  8. Cino Antworten

    Kann dieser Skript auch ins negative rechnen? Ich speise in eine Phase ein. Die momentanwerte der Leistung gehen dann in der Shelly App ins Negative.

    • Stephan Autor des BeitragsAntworten

      Hallo Cino,
      Das käme auf den Versuch an.
      Du kannst es gerne ausprobieren und Dich zurückmelden.

      Gruß,
      Stephan

  9. Daniel Antworten

    Vielen Dank für die tolle Arbeit
    Wäre es noch möglich für den Shelly 3EM , den totalen Stromverbrauch als zusätlichen Datenpunkt abzubilden?

    Mfg Daniel

    • Stephan Autor des BeitragsAntworten

      Hallo Daniel,
      danke für Deine Rückmeldung.

      Den totalen Stromverbrauch kannst Du selbst über die verschiedenen Datenpunkte addieren lassen. Das Skript erledigt nur die Verwaltung der Datenpunkte zur besseren Übersicht.

      Gruß,
      Stephan

    • Stephan Autor des BeitragsAntworten

      Hallo Daniel,
      seit eben steht die neue Version des Skriptes zur Verfügung und kann nun auch die 3 Phasen zusammen darstellen.

      Gruß,
      Stephan

  10. Tom B Antworten

    Hallo Stephan

    das ist genau das Skiript das ich gesucht habe um den Ertrag meiner PV Anlage zu ermitteln.
    Leider habe ivh on Java Script noch keine Ahnung. Ist es möglich, dass statt alle 15 minuten alle 5 oder sogar jede Minute ein Wert gesetzt wird? Denn so habe ich teils sehr starke Abweichungen.
    Herzlichen Dank für deine Mühe

    • Stephan Autor des BeitragsAntworten

      Hallo Tom,
      in Zeile 304 im Skript kannst du die Abfrage anpassen.
      schedule('*/15 * * * *', shelly_verbrauch_update); heisst hier, dass es alle 15 Minuten ausgeführt wird.

      Für jede Minute änderst Du die 15 in 1.
      schedule('*/1 * * * *', shelly_verbrauch_update);

      Abweichungen sollten eigentlich nicht auftreten, da der Shelly die Werte ja speichert und das Skript sie abfragt.

      Gruß,
      Stephan

  11. Pingback: Sonoff/Tasmota Verbrauchs-Historie für Tag, Woche, Monat, Jahr | Kreyenborg.koeln

  12. Markus Antworten

    Tolle Sache….was mir gefallen würde….
    die saldierende Zählung des 3EM, also wenn die Summe der 3Phasen ins Minus geht und das Addieren einzelner Shelly´s.
    Sonst mega tolle Arbeit 🙂

    • Stephan Autor des BeitragsAntworten

      Hallo Markus,
      danke für das Feedback. Die einzelnen Phasen werden einzeln dargestellt, da diese auch für weitere Berechnungen genutzt werden können.
      Wenn Du nun eine Summe in VIS darstellen möchtest, kannst Du diese Datenpunkte einfach dort addieren.

      Gruß,
      Stephan

  13. Apfelbaum Antworten

    Howdy – tolles Skript, HUT AB!
    Frage: Ist es möglich das Skript so zu modifizieren, dass es einen Datenpunkt für die Shelly 3EMs gibt, der den Gesamtverbrauch aller 3 Phasen zusammenrechnet und in kw/h ausgibt (also auch “heute”,gestern”,”diese Woche”,”letzte Woche”, usw.)?

    Schön wäre auch, wenn man optional Minuswerte(durch Messungenauigkeiten) bestimmter Shelly 3EMs (die man dann eben im Skript eintragen muss) von der jeweiligen Berechnung ausschließen könnte – also z.B. die Funktion implementieren jedoch durch Kommentarfunktion deaktivieren. – verstehst du wie ich das meine?

    Gruß Apfelbaum

    • Stephan Autor des BeitragsAntworten

      Hallo,
      das Skript kannst Du nach Deinen Belieben anpassen. Eine zusammenfassende Berechnung ist von meiner Seite aus nicht vorgesehen.
      Wenn Du dies nach Deinen Wünschen anpassen möchtest, ist dies möglich 😉

      Gruß,
      Stephan

      • Stephan Autor des BeitragsAntworten

        Hallo,
        seit eben steht die neue Version des Skriptes zur Verfügung und kann nun auch die 3 Phasen zusammen darstellen.

        Gruß,
        Stephan

  14. Dumpfbacke Antworten

    Sehr schön: Tut genau das was es soll und nicht mehr.
    iobroker läuft bei mir auf einem FreeNAS in einem Jail.

    Danke.

  15. Tobias Antworten

    Hallo Patrick,
    danke für das Skript. Läuft gut und gibt interessante Einblicke in die Verbräuche
    Ein Fehler tritt auf bei einem Shelly 2.5 / Shutter, der nicht aktiv (versorgt) ist (mein Test-Device) und dessen Datenpunkt Shutter/Energy = “null” ist. Da ich nicht firm in Javascript bin, kann ich den Code nicht ändern. Die Änderung des DP von Hand auf “0” führt aber zu einer jetzt fehlerfreien Ausführung. Fehler-Log:
    You are assigning a string to the state “javascript.0.ShellyVerbrauch.SHSW-25#xxx#1.Shutter.aktueller_wert” which expects a number.
    at script.js.common.Shelly_Verbrauch:110:13
    Schön wäre noch, durch eine globale Variable die Logs zu unterbinden und nur im Debug Fall zu aktivieren. Den ganzen Javascript Adapter will ich aber wegen anderer Skripts nicht in diesen Zustand setzen.
    Interessiert wäre ich an einem gleichen Skript für sonoff/Tasmota. Ich habe 8 Stück SP111 Zwischenstecker als Schaltaktoren.
    Nochmals Dank für deine Arbeit.

    • Stephan Autor des BeitragsAntworten

      Hallo Tobias,
      danke für die Rückmeldung. Ich weiß jetzt nicht, woher Du Patrick liest, aber mein Name ist Stephan 😉
      Die Protokoll Funktion kannst Du selbst entfernen. Jede Zeile beginnend mit “log” kannst Du entfernen. Dann erscheint kein Log-Eintrag mehr.

      Wenn Du mir die Datenpunkte für die Tasmota zur Verfügung stellst, lässt sich das Skript sicherlich erweitern.

      • Tobias Antworten

        Hallo Stephan,
        entschuldige die Namensverwechslung und Dank für deine Antwort.
        Das mit den Log Einträgen hat funktioniert.
        Die DP sehen wie folgt aus (hoffe unter den vielen ist das für dich wichtige dabei:
        sonoff.0
        Tasmota1
        ENERGY_Current state Tasmota1 ENERGY Current
        ENERGY_Factor state Tasmota1 ENERGY Factor
        ENERGY_Power state Tasmota1 ENERGY Power
        ENERGY_Today state Tasmota1 ENERGY Today
        ENERGY_Total state Tasmota1 ENERGY Total
        ENERGY_Voltage state Tasmota1 ENERGY Voltage
        ENERGY_Yesterday state Tasmota1 ENERGY Yesterday
        EnergyReset_Today state Tasmota1 EnergyReset Today
        EnergyReset_Total state Tasmota1 EnergyReset Total
        EnergyReset_Yesterday state Tasmota1 EnergyReset Yesterday
        POWER state Tasmota1 POWER

        Noch eine weitere Frage: zumeist werden die DP heute unter 0_userdata.0 angelegt und nicht unter dem Adapter javascript.0
        Was ist dafür zu ändern?
        Danke

  16. Patrick Antworten

    Hallo, Script läuft, es wird auch ein Ordner erstellt, jedoch ist in dem Ordner sonst nichts weiter drin. Es werden keine Daten gefüllt. Ich nutze einen Shelly EM3. Könnte es vllt an dem Datenpunkt Energy liegen? Dieser heißt bei dem EM3 “value.totalconsumend”.

    • Stephan Autor des BeitragsAntworten

      Hallo Patrick,
      danke für den Hinweis. Leider besitze ich keinen EM3 und konnte so die Datenpunkte nicht einbinden.
      Gerne kann ich das Skript erweitern, wenn Du mir die Datenpunkte des EM3 einmal zur Verfügung stellen könntest – Stephan@Kreyenborg.koeln

      Danke 😉

      • Holger Etzel Antworten

        Hallo,

        gibt es schon eine Erweiterung des Skript für den Shelly 3em?

        Gruß
        Holger

        • Stephan Autor des BeitragsAntworten

          Hallo Holger,
          Ja 😉
          Seit eben wird der 3EM unterstützt. Es wird jede Phase einzeln abgebildet.

          • Thomas K.

            Hi,

            vielen Dank für das Script. Könntest du es bitte so erweitern, dass es für den 3EM auch ein Total gibt? Sprich die Summer der drei Phasen.

            Grüße & Danke
            Thomas

          • Stephan Autor des Beitrags

            Hallo Thomas,
            die Erweiterung befindet sich aktuell im Test und wird im Laufe der nächsten Woche zur Verfügung stehen.
            Bis dahin müsste ich Dich noch ein wenig um Geduld bitten 😉

            Gruß & ein smartes Wochenende,
            Stephan

          • Stephan Autor des Beitrags

            Hallo Thomas,
            seit eben steht die neue Version des Skriptes zur Verfügung und kann nun auch die 3 Phasen zusammen darstellen.

            Gruß,
            Stephan

          • Thomas K.

            @Stephan.

            Vielen Dank. Wie kann das Update erfolgen? Skript stoppen und DP löschen oder einfach überkopieren und neu starten?

            Oben ist das Script vom 08.10.21 die aktuelle Version?

            Grüße
            Thomas

          • Stephan Autor des Beitrags

            Hallo Thomas,
            das Update funktioniert wie folgt.
            !!! Bitte keine Datenpunkte löschen !!!
            – Skript stoppen
            – neuen Inhalt von hier in das Skript kopieren
            – Skript starten

            Alle Daten bleiben erhalten 😉

            Gruß,
            Stephan

    • Stephan Autor des BeitragsAntworten

      Hallo Patrick,
      seit eben steht die neue Version des Skriptes zur Verfügung und kann nun auch die 3 Phasen zusammen darstellen.

      Gruß,
      Stephan

  17. abase21 Antworten

    ..ich habe das Script im Einsatz! Funktioniert sehr gut – mir ging es hauptsächlich darum, den Stromverbrauch meiner Gartenpumpe und meines Untertischgerätes (Außenküche) im Auge zu behalten. Vielen Dank!

  18. Yvonne Antworten

    Hallo,

    super! Vielen Dank!
    Genau das wonach ich gesucht habe 😉

    Hatte es mit SourceAnalytix probiert, doch das ist scheinbar (lt. diversen Kommis in Foren) ziemlich buggy
    und für mich auch viel zu viele Datenpunkte. Ich will einfach nur die Shellys korrekt aufzeichnen.

    Bin noch relativ neu in iobroker, daher weiß ich nicht genau wie & wo ich das nun einfügen muss und
    auch nicht an welcher Stelle ich meinen Startwert (alter_wert) im Script eintragen muss…!?
    (Muss ggf. noch iwas eingestellt werden?)
    Kann mir bitte jemand helfen?

    Danke!

    • Stephan Autor des BeitragsAntworten

      Hallo Yvonne,
      dieses Skript wird im Bereich “Javascript” eingefügt.

      Bei ioBroker auf der linken Seite unter “Skripte” zu finden 😉

      Dort bei “Common” den gesamten Text des Skriptes einfügen, abspeichern und auf den Play Button drücken. Die Datenpunkte werden automatisch gefüllt.
      Es ist kein Benutzereingriff notwendig – auch keine Startvariablen.

      Gruß,
      Stephan

      • Jürgen Antworten

        Hallo, bist du so nett und erklärst mir, wie ich das kopierte Skript in das Common reinbekomme?
        LG Jucky

        • Stephan Autor des BeitragsAntworten

          Hallo Jürgen,
          wenn Du im ioBroker auf “Skripte” gehst, dort den Ordner “common” markierst, das + Zeichen anklickst, Javascript auswählst und einen Namen vergibst, hast Du ein leeres Skript im “common”-Bereich erzeugt.

          Gruß,
          Stephan

          • Leo Kroschewski

            Hallo,
            bin so weit gekommen, dass ich ein leeres Skript erzeugt habe.
            Jetzt komme ich aber nicht weiter.
            Kann im leeren Skript nichts einfügen.

            Gruß,
            Leo

          • Stephan Autor des Beitrags

            Hallo Leo,
            Du musst ein leeres Javascript-Skript anlegen. Dann kannst Du den Code problemlos einfügen.

            Gruß,
            Stephan

          • Leo

            Hallo Stephan,
            stehe auf dem Schlauch. Habe im IoBroker ein neues leeres Skript angelegt. Komme aber nicht weiter, weil ich da nichts reinkopieren kann.
            Was meinst Du eigentlich mit ” Du musst ein leeres Javascript-Skript anlegen. ” ?

            Gruß
            Leo

          • Stephan Autor des Beitrags

            Du gehst im Menü links auf Skripte. In dem Fenster oben auf das Plus-Zeichen, in dem sich öffnenden Fenster wählst Du Javascript. Dann vergibst Du einen Namen und dann kannst du etwas eingeben.
            Ein wenig Grundverständnis lässt sich auch mit Google finden 😉

          • Leo

            Hallo Stephan,
            wenn ich wüsste, wonach ich googeln soll, dann hätte ich das schon getan.
            Trotzdem vielen Dank.

            Gruß
            Leo

          • Stephan Autor des Beitrags

            Wie Du das Skript einfügen kannst, hatte ich ja beschrieben. Danach hätte man z.B. googlen können, wie dies geht 😉
            Nichts für ungut.

            Klappt es denn nun?

          • Leo

            Hi Stephan,
            klappt nicht.
            Kann Deinen Code, den ich zuvor in die Zwischenablage kopiert habe, nicht in das neu angelegte und geöffnete Java-Script im IoBroker einfügen.

            Gruß
            Leo

          • Stephan Autor des Beitrags

            Das kann ich mir beim Besten Willen nicht.
            Schick mir doch mal per Mail einen Screenshot von dem Bereich in ioBroker, wo der Code eingefügt werden soll.

          • Leo

            Hallo Stephan,

            das Skript läuft jetzt und schreibt Werte. Was aber nicht so schön ist, der IoBroker protokolliert alle 15 Minuten einen Satz Warnmeldungen.
            Könntest die mal kurz anschauen?

            javascript.0
            2022-11-10 02:45:00.051 warn at processTimers (node:internal/timers:502:7)
            javascript.0
            2022-11-10 02:45:00.051 warn at listOnTimeout (node:internal/timers:559:17)
            javascript.0
            2022-11-10 02:45:00.051 warn at Timeout._onTimeout (/opt/iobroker/node_modules/node-schedule/lib/Invocation.js:228:7)
            javascript.0
            2022-11-10 02:45:00.050 warn at /opt/iobroker/node_modules/node-schedule/lib/Invocation.js:268:28
            javascript.0
            2022-11-10 02:45:00.050 warn at Job.invoke (/opt/iobroker/node_modules/node-schedule/lib/Job.js:171:15)
            javascript.0
            2022-11-10 02:45:00.050 warn at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1565:34)
            javascript.0
            2022-11-10 02:45:00.050 warn at Object.shelly_verbrauch_update (script.js.Shelly3EM:95:11)
            javascript.0
            2022-11-10 02:45:00.050 warn at Object.result.each (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:915:29)
            javascript.0
            2022-11-10 02:45:00.050 warn at script.js.Shelly3EM:96:24
            javascript.0
            2022-11-10 02:45:00.048 warn getState "shelly.0.SHSW-25#C476E3#2.Relay1.Energy" not found (3) states[id]=null
            javascript.0
            2022-11-10 02:45:00.048 warn at processTimers (node:internal/timers:502:7)
            javascript.0
            2022-11-10 02:45:00.048 warn at listOnTimeout (node:internal/timers:559:17)
            javascript.0
            2022-11-10 02:45:00.048 warn at Timeout._onTimeout (/opt/iobroker/node_modules/node-schedule/lib/Invocation.js:228:7)
            javascript.0
            2022-11-10 02:45:00.048 warn at /opt/iobroker/node_modules/node-schedule/lib/Invocation.js:268:28
            javascript.0
            2022-11-10 02:45:00.047 warn at Job.invoke (/opt/iobroker/node_modules/node-schedule/lib/Job.js:171:15)

            Gruß
            Leo

          • Stephan Autor des Beitrags

            Hallo Leo,
            eigentlich steht dort doch schon alles drin.

            Signifikant ist hier:
            2022-11-10 02:45:00.048 warn getState "shelly.0.SHSW-25#C476E3#2.Relay1.Energy" not found (3) states[id]=null

            Das sagt aus, das entweder der Shelly entfernt wurde oder nicht richtig im Shelly Adapter vorhanden ist.

          • Leo

            Hallo Stephan,
            jetzt funktioniert es einwandfrei.
            Vielen Dank für das Script und Deine Hilfe.

            Gruß,
            Leo

  19. Ecke Antworten

    Klasse Script, danach habe ich schon länger gesucht. Danke.
    Eine direkte Umrechnung in kWh wäre noch toll.

    • Stephan Autor des BeitragsAntworten

      Vielen Dank 😉

      Die Umrechnung kann ja mit (Wh/1000) auch in dem jeweilig benötigten Bereich erfolgen.
      Ich hatte es in Wh gelassen, da ich so auch kleinere Werte ablesen kann und bei den Werten, wo ich weiss, dass sie “größer” werden, rechne ich mit Wh/1000 um.

      • Thomas Antworten

        Hallo,

        ich bin leider nicht so Fit im JavaSkript. Wo müsste ich die Umrechnung eintragen? In Zeile 231 habe ich zwar die Einheit gefunden, aber nicht wo er den Wert herbekommt.

        Könntest sie mir vielleicht sagen wo ich die Umrechnung eintragen muss.

        Danke

        • Stephan Autor des BeitragsAntworten

          Hallo Thomas,
          Du kannst den Wert in deiner Zielanwendung bsp. VIS direkt in kw/h umrechnen. Hier muss eigentlich im Skript nichts geändert werden.

          Datenpunkt für VIS:
          Du kannst in VIS die Zahl als „number” Widget darstellen und dann unter „erweitert” den Umrechnungsfaktor 0.1 angeben.

          Gruß,
          Stephan

          • DerEde

            Hi Stephan,

            auch ich nutze wie bestimmt sehr viele Leute dein super Skript. Danke dafür.

            Ich verwende ausschließlich Habpanel zur Anzeigen und finde dort keine Möglichkeit die Wh durch /1000 oder *0,001 in kWh um zurechnen. Geht das nur über den Umweg VIS und wenn ja wie, bzw weißt du einen passenden Link?

            Gruß
            Ede

          • Stephan Autor des Beitrags

            Hallo Ede,
            eine Umrechnung klappt mit dem Basic Number Widget. Dort sind Umrechnungen möglich.

            Gruß,
            Stephan

  20. DutchmanNL Antworten

    interessanter artikel, aber nur sub-elemente von dem was der ioBroker adapter SourceAnalytix bereits alles kan 🙂
    [Link entfernt – keine Werbung]

    • Stephan Autor des BeitragsAntworten

      Wenn man eben nur die Shelly tracken möchte, benötigt man keinen Adapter, der 80MB RAM frisst 🙂

      Es steht ja jedem frei, das zu nutzen, was er für richtig hält. Wenn Dein Adapter nützlich für jemanden ist, dann kann dieser ihn doch auch gerne benutzen. Wenn jemand nur ein Skript haben möchte, welches die Verbräuche seiner Shelly ausliest, dann reicht ihm mein Skript, da der JavaScript Adapter eh läuft.

      • Birkner Antworten

        Hallo Stephan,
        vielen Dank erstmal für das Klasse-Skript. Ich habe ein Bedienerproblem. Ich besitze einen Shelly 3EM und möchte den täglichen Stromverbrauch über IOBroker / VIS auf mein Tablet zeigen lassen. In der Shelly-App wird unten der Gesamtverbrauch angezeigt. Dieser Wert erscheint jedoch nicht unter dem Datenpunkt “Verbrauch heute”. Wäre super, wenn Du mir da weiterhelfen kannst. Ich kann dir gerne Screenshots zukommen lassen.

        LG
        Jürgen

        • Stephan Autor des BeitragsAntworten

          Hallo Jürgen,
          Wenn Du den täglichen Stromverbrauch eines 3EM darstellen lassen möchtest, schaust Du in folgenden Datenpunkt:

          javascript.0.ShellyVerbrauch.SHEM-3#xxxxxx#1.Total.heute

          Dort ist in Watt aufsummiert, was der 3EM heute verbraucht hat.

          Gruß,
          Stephan

          • Birkner

            Hi Stephan,
            vielen Dank für die schnelle Antwort. Diesen Datenpunkt habe ich auch eingepflegt. Jetzt glaube ich, weiß ich woher dieser Unterschied kommt. Mein Shelly hängt hat immer zwei Stunden Vorsprung d.h. die Gesamtstunden, welche in der ShellyApp zu sehen sind, werden im Datenpunkt immer erst zwei Stunden später angezeigt. So auch beim Runterladen des Verbrauchsprotokolls in der Shelly App. Hast du vielleicht eine Idee, wie man den Zeitversatz raus bekommt? Schönen Abend noch.

            Gruß
            Jürgen

          • Stephan Autor des Beitrags

            Hallo Jürgen,
            ich gehe hier von einem Fehler der CSV Datei aus.
            Ich habe diese soeben aus der App herntergeladen und geöffnet.
            Hier stehen um 9 Uhr bereits Werte für 10 Uhr drin – dies kann ja nicht sein 🙂

            Gruß,
            Stephan

          • Thomas

            Hallo Stephan, wo finde ich diese Werte ich aufgrund der verschiedenen Anbindungen 2 Adapter von Shelly installiert

          • Stephan Autor des Beitrags

            Hallo Thomas,
            Die Datenpunkte erscheinen alle unter:
            Javascript.0.ShellyVerbrauch

            Gruß,
            Stephan

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert