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.

Kategorien:

268 Kommentare

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

    • 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.

      • 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

        • 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

          • 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

          • 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

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

    • 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.

      • 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

        • 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

          • 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

  2. 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!

    • 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

  3. ..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!

  4. 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”.

          • 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

          • 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

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

            Gruß,
            Stephan

          • @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

          • 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

  5. 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.

    • 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.

      • 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

  6. 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

    • 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

  7. 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 🙂

    • 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

  8. 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

    • 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

  9. 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

    • 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

  10. 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.

  11. 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?

    • 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.

    • 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

      • 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

        • 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

          • 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?

          • 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

          • 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!

          • 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 🙂

          • 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

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

            Welchen DP sollte ich denn leeren, Energy?

          • 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

          • 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

          • 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

      • 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

        • 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?

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

    Gruß Ralf

  13. 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

    • 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

      • 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 … 🙁

  14. 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

    • 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

  15. 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

  16. Hallo Stephan
    hab da nur ein Problem.
    Der aktuelle Wert heute ist ok ,aber der ersten Eintrag nach der Installation war falsch.
    Jetzt stimmen die anderen Wert ja nicht !!!! z,b Jahresverbrauch kann man die Werte vielleicht anpassen??
    Wie oben beschrieben habe Ich es durch geführt.
    ( Ich würde vielleicht einfach mal hingehen und den Shelly Adapter stoppen, dann die Steckdose neustarten und dann wieder den Adapter zu starten.)

    Gruß Ralf

    • Hallo Ralf,
      Du kannst einfach das Skript nochmal stoppen, dann den kompletten Datenpunkt:
      javascript.0.ShellyVerbrauch löschen. So fängst Du einfach nochmal von Vorne an 😉

      Gruß,
      Stephan

      • Hallo Stephan
        habe es so gemacht. Habe wohl das gleiche Problem wie Tim.
        die Werte “Energy” und “aktueller_Wert” sind identisch.
        Aber in der Shelly app stimmt der Wert nicht !!!!

        Gruß Ralf

        • Hallo Ralf,
          Ich kann leider nicht ganz folgen.
          Wenn das Skript läuft, sind die Werte immer identisch, da hier die Prüfung erfolgt, ob der Shelly neugestartet hat.
          Die Werte, die von Bedeutung sind, sind alle außer: alter_wert und aktueller_wert. Diese sind nur für die Berechnung notwendig.

          Gruß,
          Stephan

  17. Hallo Stephan,

    Erst Mal Danke für das coole Skript.
    Wäre es möglich das du auch noch die Quartalswerte errechnen könntest?

    Danke und Grüße
    Andreas

  18. Moin.
    Vilen Dank für das Skript. Genau das habe ich gesucht. Fürs selber schreiben bin ich einfach zu “blöde”.

    Das Skript funktioniert soweit. Allerdings habe ich Fehlermeldungen im Protokoll vom ioBroker. Kann mir die einer “übersetzen” was da falsch läuft? Kommt so ca. alle 10min.

    javascript.0 2021-06-04 14:39:01.705 error Function “extendObject” is not allowed. Use adapter settings to allow it.
    javascript.0 2021-06-04 14:39:01.704 error Function “extendObject” is not allowed. Use adapter settings to allow it.
    javascript.0 2021-06-04 14:39:01.704 error Function “extendObject” is not allowed. Use adapter settings to allow it.
    javascript.0 2021-06-04 14:39:01.704 error Function “extendObject” is not allowed. Use adapter settings to allow it.
    javascript.0 2021-06-04 14:39:01.703 error Function “extendObject” is not allowed. Use adapter settings to allow it.

  19. Hallo,

    danke für das tolle Script!
    Hat es jemand zur Messung der Einspeisung von Solarstrom getestet?

    Ein Kommentar gab es hier, aber leider keine Rückmeldung. Würde gerne die Erzeugung an einem Balkonkraftwerk messen.

    Gruß tobbes

  20. Noch eine Frage:

    Wie kann ich den Verbrauch der letzten Stunde irgendwie bekommen?
    Könntest Du einen DP einfügen?

    Gruß tobbes

    • Hallo Tobbes,
      das Skript stellt die Grundbedürfnisse zur Verfügung.
      Für genauere Ausgaben kann/sollte jeder das Skript an seine Bedürfnisse anpassen.
      Für deinen Einsatzzweck würde sich das protokollieren via influxDB und Ausgabe per Grafana bestens eignen.
      Hier hast du dann die Möglichkeit, alles detailliert anzeigen und ausgeben zu lassen.

      Gruß,
      Stephan

  21. Hallo Stephan

    ich habe das Sript komplett Kopiert und im Io broker unter Skripte common / dann neues Javaskript erstelt ,, dann eingefügt und gestartet.
    nur finde ich bei mir die genanten daten punkte nicht.

    • Hallo Patrick,
      schaust du in das Log? Siehst du irgendwelche Fehler?
      Wenn nicht, dann musst du die Seite neuladen.
      Dann erscheinen die Datenpunkte.

      Gruß,
      Stephan

  22. Hallo bin da Anfänger. Was brauche ich denn genau alles um das Script laufen zu lassen ß Ich habe die Original App von Shelly und die Shelly Cloud, wo ich die Daten von meinem Solarpanel sehen kann.

  23. schließe mich vielen Vorrednern an, großartiges Script.
    Wünsche von meiner Seite, den Namen mit in den DP aufnehmen, so dass man einfacher sieht um welchen es sich handelt.
    Beim 3EM wäre die Summer der 3 Phasen noch out of the box interessant. Habe mir jetzt ein eigenes script gebastelt, dass die Werte addiert.
    Das ganze jetzt in InfluxDB und Grafana zu bringen ist noch viiiiieel fleißarbeit. Ich fange mal mit der Summe des 3EM an sobald ein paar Daten vorhanden sind.

    • Hallo Roma,
      danke für die Rückmeldung. Freut mich sehr 😉

      Die Namen der Datenpunkte werden so genannt, wie Du deine Shelly benennst. Die Namen der Shelly stehen im Datenpunkt:
      shelly.0.Shelly.name
      Shelly Namen
      Die Addition der 3EM habe ich bewusst weggelassen, da ich auch bei einem 2.5, der 2 Kreise steuern kann, nicht addieren lasse.

      Gruß,
      Stephan

      • ich muss leider einen Eintrag aufklappen damit ich ihn sehen kann.
        https://ibb.co/1zpWvWq

        bei den 2.5er macht das auch meiner Meinung nach total Sinn, dass nicht aufaddiert wird. Sind ja meist 2 unterschiedliche Verbraucher die dran hängen.
        Aber am 3EM hängt ja normalerweise das komplette Haus bzw Wohnung, da macht die Summe über alles ja schon Sinn.

        Aber trotzdem super Arbeit.
        Hast du auch mal über eine Option nachgedacht wie man alte Werte, auch gerne manuell, mit einfliessen lassen könnte? bzw kann ich einfach bei Gesamt den Offset zu meinem Stromzähler hinzuaddieren?

        • Hallo Roman,
          ja, da steht der Name auch drin. Aber in der Ordner Struktur vom ioBroker steht der Name des Shelly in der Bezeichnung des Datenpunkts.
          Vielleicht hast du die Spalte “Name” bei ioBroker ausgeblendet?

          Zu deinen Anfragen:
          Ich baue aktuell Skripte, die in etwa 95% der User “Out-of-the-Box” nutzen können. Sollten die restlichen 5% die Skripte noch anderweitig nutzen wollen,
          so steht es Ihnen ja frei, diese zu erweitern. Werte, die von anderen Verbrauchern kommen, machen in einem Skript, welches auf Shelly abzielt wenig Sinn, oder? 😉

          Die Aufteilung der Phasen beim 3EM macht durchaus Sinn, da sie physikalisch getrennt sind. Klar lässt sich hier auch eine Addition vornehmen – die aber, soweit mir bekannt ist, nicht so oft gebraucht wird.
          Auch sind viele User anders unterwegs und möchten die Phasen einzeln noch irgendwo weiter verwenden.

          Du kannst, wenn Du andere Verbräuche protokollieren wollen würdest, den Adapter SourceAnalytic verwenden. Der kann alles protokollieren – ist aber, soweit ich weiss, nicht so genau bzw. nicht so stabil.

          Gruß,
          Stephan

          • mmh seltsam, hab extra nachgeschaut, die Spalte Name ist nicht ausgeblendet, bleibt aber bei mir auf Ordnerlevel leer.

            und zum 3EM, da bietet shelly selbst ja den Datenpunkt “Total” an. Darunter heissen die Werte dann halt nicht total und energy wie bei den 3 Phasen sondern “ConsumedPower” und “InstantPower”. Wenn du die noch in dein Script aufnimmst wäre sicher noch ein paar mehr Leuten geholfen 😉

          • Hi Roman,
            Du könntest folgendes Versuchen:
            – Sicherung der Datenpunkte
            – Skript stoppen
            – Zeile 25 in “true” ändern
            – Skript starten
            – 1 Minute warten
            – Skript stoppen
            – Zeile 25 wieder auf false setzen
            – Skript normal starten

            Danach sollten die Datenpunkte die Namen der Shelly enthalten.

            Gruß,
            Stephan

  24. Danke, das hat geholfen. Und auch ein Offset beim Gesamtverbrauch scheint zu funktionieren. Damit müsste ich dann meinen Zählerstand somit in den Gesamt Wert einfließen lassen können

  25. Hi,

    vielen Dank für das tolle Script!

    Ich habe ein kleines Problem, vielleicht kannst Du es ja lösen.

    Ich habe einen Shelly 3em im Einsatz
    Habe dein Script gestartet, die Datenpunkte usw. werden auf den ersten Blick auch alle angelegt und die Daten scheinen auch richtig zu sein. Allerdings wird meine Log Datei im iobroker ein bisschen voll, denn im Log erscheint immer wenn das Script neu startet bzw. die Funktion ausführt folgendes:

    2021-10-31 20:02:00.011 – warn: javascript.0 (87288) getState “shelly.0.SHEM-3#C45BBE6BD432#1.name” not found (3)
    2021-10-31 20:02:00.012 – warn: javascript.0 (87288) at script.js.common.Shelly-Verbrauchs-Script:256:37
    2021-10-31 20:02:00.012 – warn: javascript.0 (87288) at Object.result.each (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:819:29)
    2021-10-31 20:02:00.012 – warn: javascript.0 (87288) at aktualisiere_namen (script.js.common.Shelly-Verbrauchs-Script:255:15)
    2021-10-31 20:02:00.012 – warn: javascript.0 (87288) at Object.shelly_verbrauch_update (script.js.common.Shelly-Verbrauchs-Script:228:1)
    2021-10-31 20:02:00.012 – warn: javascript.0 (87288) at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1313:34)
    2021-10-31 20:02:00.012 – warn: javascript.0 (87288) at Job.invoke (/opt/iobroker/node_modules/node-schedule/lib/Job.js:168:15)
    2021-10-31 20:02:00.012 – warn: javascript.0 (87288) at /opt/iobroker/node_modules/node-schedule/lib/Invocation.js:268:28
    2021-10-31 20:02:00.012 – warn: javascript.0 (87288) at Timeout._onTimeout (/opt/iobroker/node_modules/node-schedule/lib/Invocation.js:228:7)
    2021-10-31 20:02:00.012 – warn: javascript.0 (87288) at listOnTimeout (internal/timers.js:554:17)
    2021-10-31 20:02:00.012 – warn: javascript.0 (87288) at processTimers (internal/timers.js:497:7)
    2021-10-31 20:02:00.012 – warn: javascript.0 (87288) getState “shelly.0.SHEM-3#C45BBE6BD432#1.name” not found (3)
    2021-10-31 20:02:00.012 – warn: javascript.0 (87288) at script.js.common.Shelly-Verbrauchs-Script:259:14
    2021-10-31 20:02:00.012 – warn: javascript.0 (87288) at Object.result.each (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:819:29)
    2021-10-31 20:02:00.012 – warn: javascript.0 (87288) at aktualisiere_namen (script.js.common.Shelly-Verbrauchs-Script:255:15)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at Object.shelly_verbrauch_update (script.js.common.Shelly-Verbrauchs-Script:228:1)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1313:34)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at Job.invoke (/opt/iobroker/node_modules/node-schedule/lib/Job.js:168:15)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at /opt/iobroker/node_modules/node-schedule/lib/Invocation.js:268:28
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at Timeout._onTimeout (/opt/iobroker/node_modules/node-schedule/lib/Invocation.js:228:7)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at listOnTimeout (internal/timers.js:554:17)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at processTimers (internal/timers.js:497:7)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) getState “shelly.0.SHEM-3#C45BBE6BD432#1.name” not found (3)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at script.js.common.Shelly-Verbrauchs-Script:260:14
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at Object.result.each (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:819:29)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at aktualisiere_namen (script.js.common.Shelly-Verbrauchs-Script:255:15)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at Object.shelly_verbrauch_update (script.js.common.Shelly-Verbrauchs-Script:228:1)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1313:34)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at Job.invoke (/opt/iobroker/node_modules/node-schedule/lib/Job.js:168:15)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at /opt/iobroker/node_modules/node-schedule/lib/Invocation.js:268:28
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at Timeout._onTimeout (/opt/iobroker/node_modules/node-schedule/lib/Invocation.js:228:7)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at listOnTimeout (internal/timers.js:554:17)
    2021-10-31 20:02:00.013 – warn: javascript.0 (87288) at processTimers (internal/timers.js:497:7)
    2021-10-31 20:02:00.013 – info: javascript.0 (87288) script.js.common.Shelly-Verbrauchs-Script: Shelly Verbrauch: Verbrauchswerte aktualisiert: 2 | Reboots korrigiert: 0 | Unveränderte Werte: 2

    Hast Du einen Tipp für mich?

    • Hallo Stephan,,
      vielen Dank für das Script,
      habe es auch am Laufen, die Datenpunkte werden angelegt,
      aber im Protokoll kommt die folgende Fehlermeldung:

      javascript.0
      2021-11-01 22:39:30.011 warn at Object. (script.js.shelly_verbrauch:6:4)

      javascript.0
      2021-11-01 22:39:30.005 warn at Object. (script.js.shelly_verbrauch:5:4)

      Kenne mich mit JS leider nicht aus und kann dies daher nicht deuten.
      Könntest du evtl. helfen?

  26. Hallo Stephan,

    Danke für das super Skript.
    Leider habe ich das Problem, dass in den Feldern
    heute, (auch nach mehreren Tagen) diese Woche, etc. die gleichen Werte sind.

    Bitte um Info

    Besten Dank im voraus

    LG Bernhard

    • Hallo Bernhard,
      tut mir Leid, wenn es mit dem Skript ein Problem gibt.

      Ich würde Dich bitten, mir einmal einen Screenshot der aufgeklappten Objekt-Struktur bei
      javascript.0.ShellyVerbrauch.Dein_Shelly.(lights,Relay0,Relay1,usw)
      von einem Shelly per Email an Stephan@Kreyenborg.koeln zu schicken.

      Dann schauen wir weiter 😉

      Fehler im Log hast Du aber nicht?

      Gruß,
      Stephan

  27. Hallo Stephan,

    danke für das tolle Script. Es läuft soweit, auch die Daten werden soweit ich das überblicken kann ausgelesen. Nur es kommen bei jedem Abruf folgende Fehlermeldungen , die ich nicht zuordnen kann. Ich bin nicht der Programmierer, deshalb die Bitte um Hilfe. 🙂 Die angemeckerten Datenpunkte existieren nicht. Soll ich sie manuell anlegen?

    Schon mal vielen Dank für Deine Hilfe
    Rolf

    shelly.0
    2021-11-26 20:07:33.538 error Error TypeError: Cannot read property ‘val’ of null in function dp.mqtt.mqtt_publish_funct for state SHEM-3#xxxxxx#1.Total.Total_Returned for 192.168.178.30 (shellyem3 / shellyem3-xxxxxx / SHEM-3#xxxxxx#1)
    shelly.0
    2021-11-26 20:07:33.495 warn State “shelly.0.SHEM-3#xxxxxx#1.Emeter2.Voltage” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:33.495 warn State “shelly.0.SHEM-3#xxxxxx#1.Emeter2.Current” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:33.495 warn State “shelly.0.SHEM-3#xxxxxx#1.Emeter2.Power” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:33.495 warn State “shelly.0.SHEM-3#xxxxxx#1.Emeter1.Voltage” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:33.495 warn State “shelly.0.SHEM-3#xxxxxx#1.Emeter1.Current” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:33.495 warn State “shelly.0.SHEM-3#xxxxxx#1.Emeter1.PowerFactor” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:33.495 warn State “shelly.0.SHEM-3#xxxxxx#1.Emeter1.Power” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:33.495 warn State “shelly.0.SHEM-3#xxxxxx#1.Emeter0.Voltage” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:33.494 warn State “shelly.0.SHEM-3#xxxxxx#1.Emeter0.Power” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:29.980 warn State “shelly.0.SHEM-3#xxxxxx#1.rssi” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:29.980 warn State “shelly.0.SHEM-3#xxxxxx#1.uptime” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:24.896 warn State “shelly.0.SHEM-3#xxxxxx#1.uptime” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:19.805 warn State “shelly.0.SHEM-3#xxxxxx#1.rssi” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:19.805 warn State “shelly.0.SHEM-3#xxxxxx#1.uptime” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:19.805 warn State “shelly.0.SHEM-3#xxxxxx#1.Total.Voltage” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:19.504 warn State “shelly.0.SHEM-3#xxxxxx#1.Total.VoltageMean” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:19.504 warn State “shelly.0.SHEM-3#xxxxxx#1.Total.Current” has no existing object, this might lead to an error in future versions
    shelly.0
    2021-11-26 20:07:19.503 warn State “shelly.0.SHEM-3#xxxxxx#1.Total.InstantPower” has no existing object, this might lead to an error in future versions

  28. Hallo Stephan,

    danke für die schnelle Antwort 🙂

    Meinst Du es würde helfen, den Shelly löschen und neu anlegen?

    Viele Grüße und schönes Wochenende
    Rolf

  29. Hallo Stephan,

    Shelly löschen und neu anlegen hat geholfen. Fehlermeldung weg!

    Tschüss
    Rolf

    PS: Das Script für Sonoff/Tasmota läuft auch prima! Danke..

  30. Hallo Stephan,
    auch ich bedanke mich für die Veröffentlichung.
    Wäre es möglich noch die beiden channel-Namen der Shelly 2.5 mit zu übernehmen?
    Vielen Dank und Gruß
    Roland

    • HI Roland,
      freut mich, wenn das Skript bei Dir funktioniert.

      Du kannst derzeit dem 2.5 einen generellen Namen geben und beide Kanäle benennen. Das Skript liest den “generellen” Namen aus.

      So kannst Du z.B. den generellen Namen in “Esszimmer/Wohnzimmer” benennen. Eine Unterscheidung der Kanäle findet aktuell nicht statt.
      Ich schaue mal, ob man das Umsetzen kann.

      Gruß,
      Stephan

  31. Hallo Stephan,
    auch ich möchte mich als erstes für deine tolle Arbeit und dein Engagement bedanken.
    Mein Problem: Bei allen meiner 3 RGW2 Shellys wurde der Ordner lights nicht angelegt.
    Erkannt wurden sie alle. Habe das Skript bereits mehrfach gestoppt, die Ordner gelöscht und dann das Skript erneut gestartet.
    Leider immer ohne Erfolg.
    Bin sehr gespannt, woran es liegt bzw. was ich falsch gemacht habe.

    Besten Dank im Voraus!

    • Hallo Achim,
      tut mir Leid, wenn Du mit einem meiner Skripte Probleme hast.

      Die Shelly RGBW2 zeigen leider nur den aktuellen Verbrauch an – der WattStunden Verbrauch wird aktuell noch nicht protokolliert.
      Hierzu fehlt der Datenpunkt “Energy”.

      Gruß,
      Stephan

      • Hallo Stephan,

        du must dich doch nicht für dein Skript entschuldigen, wenn Shelly nicht die entsprechenden Daten liefert.
        Werde auch weiterhin viel Freude damit haben.

        Vielen Dank für deine schnelle Antwort!

        Achim

  32. Hallo Stephan,
    leider funktioniert das Skript bei mir nicht.
    Im Fehlerprotokoll habe ichfolgende Meldungen:

    javascript.0
    2021-12-23 17:09:41.356 error at processImmediate (internal/timers.js:466:21)

    javascript.0
    2021-12-23 17:09:41.356 error at Immediate._onImmediate (/opt/iobroker/node_modules/iobroker.javascript/main.js:1311:17)

    javascript.0
    2021-12-23 17:09:41.355 error at /opt/iobroker/node_modules/iobroker.javascript/main.js:1832:17

    javascript.0
    2021-12-23 17:09:41.355 error at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1731:37)

    javascript.0
    2021-12-23 17:09:41.354 error at createVM (/opt/iobroker/node_modules/iobroker.javascript/main.js:1482:28)

    javascript.0
    2021-12-23 17:09:41.354 error at Object.createScript (vm.js:262:10)

    javascript.0
    2021-12-23 17:09:41.353 error at new Script (vm.js:102:7)

    javascript.0
    2021-12-23 17:09:41.353 error SyntaxError: Identifier ‘objekt’ has already been declared

    javascript.0
    2021-12-23 17:09:41.343 error ^

    javascript.0
    2021-12-23 17:09:41.338 error const objekt = [“gesamt”, “dieses_jahr”, “letztes_jahr”, “letzter_monat”, “dieser_monat”, “letzte_woche”,

    javascript.0
    2021-12-23 17:09:41.337 error script.js.common.shelly_statistik compile failed:
    at script.js.common.shelly_statistik:31

    Der javascript-Adapter spuckt bei Start folgendes aus:

    17:16:08.399 info javascript.0 (22009) Start javascript script.js.common.shelly_statistik
    17:16:08.403 error javascript.0 (22009) script.js.common.shelly_statistik compile failed: at script.js.common.shelly_statistik:31
    17:16:11.048 info javascript.0 (22009) Stop script script.js.common.shelly_statistik

    Hast Du einen Tip?

    Besten Dank im Voraus.

    • Hallo Josef,
      ich habe gerade gesehen, das beim letzten Update einige Werte im Beitrag nicht richtig übernommen worden sind.

      Bitte kopiere das Skript erneut und teste es einmal.

      Vielen Dank & smarte Weihnachten 😉

      Gruß,
      Stephan

      • Hallo Stephan,
        Fehlerbild ist leider unverändert.

        javascritp.0 2021-12-24 10:11:42.536 error at processImmediate (internal/timers.js:466:21)
        javascript.0 2021-12-24 10:11:42.535 error at Immediate._onImmediate (/opt/iobroker/node_modules/iobroker.javascript/main.js:1311:17)
        javascript.0 2021-12-24 10:11:42.535 error at /opt/iobroker/node_modules/iobroker.javascript/main.js:1832:17
        javascript.0 2021-12-24 10:11:42.535 error at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1731:37)
        javascript.0 2021-12-24 10:11:42.535 error at createVM (/opt/iobroker/node_modules/iobroker.javascript/main.js:1482:28)
        javascript.0 2021-12-24 10:11:42.534 error at Object.createScript (vm.js:262:10)
        javascript.0 2021-12-24 10:11:42.534 error at new Script (vm.js:102:7)
        javascript.0 2021-12-24 10:11:42.534 error SyntaxError: Identifier ‘objekt’ has already been declared
        javascript.0 2021-12-24 10:11:42.534 error ^
        javascript.0 2021-12-24 10:11:42.533 error var objekt = [“gesamt”, “dieses_jahr”, “letztes_jahr”, “letzter_monat”, “dieser_monat”, “letzte_woche”,
        javascript.0 2021-12-24 10:11:42.532 error script.js.common.shelly_statistik compile failed: at script.js.common.shelly_statistik:31

        Frohes Fest,
        Gruß Josef

        • Hallo Josef,
          kann ich mir kaum vorstellen 😉

          Stutzig macht mich: javascript.0 2021-12-24 10:11:42.534 error SyntaxError: Identifier ‘objekt’ has already been declared

          Das hieße, Objekt wird schon verwendet – was aber eigentlich nicht sein kann, wenn es als neues Skript angelegt wurde.

          Fügst Du das Skript als ein neues Javascript ein?
          Bitte mal einen Screenshot von den Log-Einträgen per Mail an Stephan@Kreyenborg.koeln.
          Im Text kann man das hier leider schwer erkennen.

          Dir und Deiner Familie auch schöne Weihnachten!

          Gruß,
          Stephan

  33. Hallo Stephan,
    habe gerade deine Seite gefunden und den Skript bei mir eingefügt.
    Ich bin total begeistert und möchte ein großes Dankeschön ansprechen, dass du deine Arbeit hier zur Verfügung stellst.
    Das Script läuft bei mir einwandfrei. Also nochmals Danke dafür.

    Gruß
    Peter

  34. Hallo Stephan,

    ich bin von Deinem Script begeistert. Nutze schon eine ganze Weile die Version 1.4. Wenn ich jetzt auf die 1.5 umsteigen würde, löscht er mir dann meine alten Daten die die Version 1.4 angelegt hat? Das wäre nicht so schön.

    Danke und Gruß
    Micha

  35. Hallo Stephan,
    erstmal vielen Dank für deine super arbeit.
    Leider schreibt er bei mir keine Werte in die Datenpunkte.
    Ich habe einen Shelly Plug S über MQTT eingebunden. Ich habe alerdinge gesehen das er im DAtenpunkt von dem Shelly Adapter “Energy” bei 0 bleibt egal was er Verbraucht hat.
    Ich habe das Skript jetzt nur grob überflogen. Rechnest du mit dem aktuellen verbrauch (Power) oder mit dem Energy Wert ?

    Gruß Marc

    • Hallo Marc,
      so, wie ich das sehe, scheint hier der Shelly Adapter ein Problem zu haben, oder?

      Das Skript fragt die Werte des Datenpunktes “Energy” bei 1-phasigen Shelly und “Total” bei den 3EM’s ab.

      Zeigt denn das Web-Interface des Shelly Plug einen Verbrauch an?

      Gruß,
      Stephan

      • Hallo Stephan,
        ja im Web-Interface zeigt er den aktuellen Verbrauch an, aber nicht den summierten Verbrauch. Also genau wie der Adapter.
        Aber wie gesagt steht bei Energy leider immer eine 0.

        Gruß Marc

        • Hi Marc,
          entschuldige – ich meinte natürlich die Shelly App. Aber, wenn Du die Shelly per MQTT angbunden hast, wird hier wohl die Cloud deaktiviert sein.
          Ist es zwingend notwendig, das Deine Shelly über MQTT statt über COAP laufen?

          • Hallo Stephan,
            die Shelly App habe ich gar nicht. Ich habe den Plug über die Web Oberfläche eingestellt. Ich weiß nicht was ich gemacht habe, aber jetzt scheint es zu klappen. Dir vielen Dank für das super Skript.
            Bald kommt die neue neue Serie von Shelly raus die PRO Serie für die Hutschiene. Wird man das Skript auch dafür nutzen können ?

          • Hallo Marc,
            freut mich, wenn es läuft 🙂

            Aktuell besitze ich noch keinen der Shelly PRO – somit kann ich zu der Verwendung noch nichts sagen. Ich denke jedoch, das Sie die Software nciht wirklich verändern und somit das Skript auch dort laufen wird.

            Gruß,
            Stephan

  36. Hallo,

    kann es sein, dass das Skript folgende Hinweise im Log verursacht?

    2021-12-23 02:15:00.055 – [33mwarn[39m: javascript.0 (997) getState “shelly.0.SHDW-1#B88FC1#1.name” not found (3) states[id]=null
    2021-12-23 02:15:00.059 – [33mwarn[39m: javascript.0 (997) at script.js.common.System.Shelly_Verbrauch_capturen2:256:45
    2021-12-23 02:15:00.060 – [33mwarn[39m: javascript.0 (997) at Object.result.each (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:819:29)
    2021-12-23 02:15:00.060 – [33mwarn[39m: javascript.0 (997) at aktualisiere_namen (script.js.common.System.Shelly_Verbrauch_capturen2:255:19)
    2021-12-23 02:15:00.061 – [33mwarn[39m: javascript.0 (997) at Object.shelly_verbrauch_update (script.js.common.System.Shelly_Verbrauch_capturen2:228:5)
    2021-12-23 02:15:00.061 – [33mwarn[39m: javascript.0 (997) at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1313:34)
    2021-12-23 02:15:00.061 – [33mwarn[39m: javascript.0 (997) at Job.invoke (/opt/iobroker/node_modules/node-schedule/lib/Job.js:168:15)
    2021-12-23 02:15:00.062 – [33mwarn[39m: javascript.0 (997) at /opt/iobroker/node_modules/node-schedule/lib/Invocation.js:268:28
    2021-12-23 02:15:00.062 – [33mwarn[39m: javascript.0 (997) at Timeout._onTimeout (/opt/iobroker/node_modules/node-schedule/lib/Invocation.js:228:7)
    2021-12-23 02:15:00.062 – [33mwarn[39m: javascript.0 (997) at listOnTimeout (internal/timers.js:555:17)
    2021-12-23 02:15:00.063 – [33mwarn[39m: javascript.0 (997) at processTimers (internal/timers.js:498:7)
    2021-12-23 02:15:00.063 – [33mwarn[39m: javascript.0 (997) getState “shelly.0.SHDW-1#B88FC1#1.name” not found (3) states[id]=null
    2021-12-23 02:15:00.066 – [33mwarn[39m: javascript.0 (997) at script.js.common.System.Shelly_Verbrauch_capturen2:259:30
    2021-12-23 02:15:00.067 – [33mwarn[39m: javascript.0 (997) at Object.result.each (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:819:29)
    2021-12-23 02:15:00.067 – [33mwarn[39m: javascript.0 (997) at aktualisiere_namen (script.js.common.System.Shelly_Verbrauch_capturen2:255:19)
    2021-12-23 02:15:00.067 – [33mwarn[39m: javascript.0 (997) at Object.shelly_verbrauch_update (script.js.common.System.Shelly_Verbrauch_capturen2:228:5)
    2021-12-23 02:15:00.068 – [33mwarn[39m: javascript.0 (997) at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1313:34)
    2021-12-23 02:15:00.068 – [33mwarn[39m: javascript.0 (997) at Job.invoke (/opt/iobroker/node_modules/node-schedule/lib/Job.js:168:15)
    2021-12-23 02:15:00.069 – [33mwarn[39m: javascript.0 (997) at /opt/iobroker/node_modules/node-schedule/lib/Invocation.js:268:28
    2021-12-23 02:15:00.069 – [33mwarn[39m: javascript.0 (997) at Timeout._onTimeout (/opt/iobroker/node_modules/node-schedule/lib/Invocation.js:228:7)
    2021-12-23 02:15:00.069 – [33mwarn[39m: javascript.0 (997) at listOnTimeout (internal/timers.js:555:17)
    2021-12-23 02:15:00.069 – [33mwarn[39m: javascript.0 (997) at processTimers (internal/timers.js:498:7)
    2021-12-23 02:15:00.070 – [33mwarn[39m: javascript.0 (997) getState “shelly.0.SHDW-1#B88FC1#1.name” not found (3) states[id]=null
    2021-12-23 02:15:00.072 – [33mwarn[39m: javascript.0 (997) at script.js.common.System.Shelly_Verbrauch_capturen2:260:30
    2021-12-23 02:15:00.073 – [33mwarn[39m: javascript.0 (997) at Object.result.each (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:819:29)
    2021-12-23 02:15:00.073 – [33mwarn[39m: javascript.0 (997) at aktualisiere_namen (script.js.common.System.Shelly_Verbrauch_capturen2:255:19)
    2021-12-23 02:15:00.073 – [33mwarn[39m: javascript.0 (997) at Object.shelly_verbrauch_update (script.js.common.System.Shelly_Verbrauch_capturen2:228:5)
    2021-12-23 02:15:00.074 – [33mwarn[39m: javascript.0 (997) at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1313:34)
    2021-12-23 02:15:00.074 – [33mwarn[39m: javascript.0 (997) at Job.invoke (/opt/iobroker/node_modules/node-schedule/lib/Job.js:168:15)
    2021-12-23 02:15:00.074 – [33mwarn[39m: javascript.0 (997) at /opt/iobroker/node_modules/node-schedule/lib/Invocation.js:268:28
    2021-12-23 02:15:00.074 – [33mwarn[39m: javascript.0 (997) at Timeout._onTimeout (/opt/iobroker/node_modules/node-schedule/lib/Invocation.js:228:7)
    2021-12-23 02:15:00.075 – [33mwarn[39m: javascript.0 (997) at listOnTimeout (internal/timers.js:555:17)
    2021-12-23 02:15:00.075 – [33mwarn[39m: javascript.0 (997) at processTimers (internal/timers.js:498:7)
    2021-12-23 02:15:00.077 – [32minfo[39m: javascript.0 (997) script.js.common.System.Shelly_Verbrauch_capturen2: Shelly Verbrauch: Verbrauchswerte aktualisiert: 4 | Reboots korrigiert: 0 | Unveränderte Werte: 32

  37. Hallo Stephan,

    nachdem ich nun das Skript einige Tage im Einsatz habe fällt mir auf, dass der Datenpunkt “gestern” nicht aktualisiert wird.
    Ich habe lediglich eine Zeile im Code angepasst:

    // Hauptdatenpunkt unterhalb javascript
    var datenpunkt = “0_userdata.0.ShellyVerbrauch.”; // Abschließender Punkt !!! WICHTIG !!!

    Eine Mail mit Screenshot der DP ist unterwegs zu dir.

    Danke vorab fürs Nachsehen… 🙂

    Jan

  38. Guten Morgen Stephan,

    auch von mir erstmal einen Dank für das tolle Skript.
    Ich hatte vorher mit Tasmota geflashte Gosund Adapter und im Vergleich zu denen fehlt bei den Shellys die von dir gebaute Dokumentation der Verbrauchswerte.
    Ich habe hierzu zwei Fragen.
    1. Ich fand die Anpassung die Jan gemacht hat (Die Verschiebung in =_userdata.0.ShellyVerbrauch) gut habe dabei auch das Problem wie er das der Datenpunkt gestern nicht aktualisiert wird. Bei den anderen lässt sich das noch nicht sagen da der Adapter noch frisch läuft.
    2. Lässt sich der Intervall der Datenübernahme aus dem Shelly Adapter anpassen? Wenn ich das richtig sehe läuft das mit über den cron Job am Ende des Skriptes.
    Wenn ich den Shelly Adapter richtig verstanden habe löscht der nachdem der Schalter ausgeschaltet wird nach einer Minute der Wert Energy auf 0 Wh gesetzt.

    Ich nutze 10 Shelly Plug S die Shelly Adapter Version ist die v5.1.2

  39. Hallo Stephan,

    ich habe seit gestern einen Shelly3EM installiert und bin beim Suchen nach weiteren Infos dazu in einem YT Video auf dwen Link zu deinen Seiten und zu deinem Script gestoßen. Die Installation im IOB, d.h. das Einfügen, Abspeichern und Starten, funktionierte problemlos und ich kann nur sagen, dass das Script absolute Spitze ist! Die Realisierung genau solche Funktionen / Auswertungen hatte ich grob im Kopf, wusste aber mangels Programmierkenntnisse für soche Scripte nicht, wie ich das bewerkstelligen sollte. Daher vielen, vielen Dank für deine Mühe und das Bereitstellen und die Pflege des Scipts!

    Als nächstes werde ich nun versuchen, die ganzen Daten im IOB mit Vis zu visualisieren, was für mich als IOB-Neuling schon eine genügend große Herausforderung ist.. ;-).

    Nochmals besten Dank und Grüße aus Nümbrecht,
    Peter

    p.s.: deine Homepage finde ich insgesamt sehr interessant, informativ und für mich auch lehrreich! Werde ich mir nach und nach mal durchlesen… 🙂

    • Hallo Peter,
      vielen Dank für die tolle Rückmeldung 🙂

      Die Daten in VIS bekommt man “eigentlich” problemlos über das Value Widget dargestellt. Hier den Datenpunkt angeben und schon erscheint der Wert in der Oberfläche.

      Gruß,
      Stephan

  40. Hallo Stephan,
    ich noch mal.. 😉 . Ich habe eine kleines Problem mit dem Skript. Alle Daten werden zwar wie gewünscht ausgegeben, aber im Fehlerprotokoll der IO Brokers taucht regelmäßig folgender Fehler auf :

    “javascript.0 2022-03-22 20:30:00.018 error Function “extendObject” is not allowed. Use adapter settings to allow it.”

    Wenn ich das richtig gefunden habe, taucht dieser Befehl bzw. die Funktion in Zeile 257 des Scripts auf, in dem es um das Abholen von Namen des Shelly geht… Liegt der Fehler im Script und in den Adapter-Einstellungen eines IOBrokers? Leider sagt mir der Fehler wenig und ich weiß mangels Erfahrung mit dem IOB auch nicht, in welchen Adapter Settings ich was erlauben soll.. (welche Settings und welcher Adapter? der Java Adapter oder der Shelly Adapter?).

    Vielleicht kannst du mir dazu was schreiben. Besten Dank!

    Gruß Peter

  41. hi.
    shelly plus 1pm holt keine werte.

    shellyplus1pm / shellyplus1pm-3083980a00a8 / shellyplus1pm#3083980a00a8#1) received pubrel for unknown messageId: 369

  42. Hallo Stephan.
    Dein Script hat mir sehr beim Auslesen der Daten meiner Voltaikanlage geholfen. Habe die Werte auch in iqontrol virtualisiert.
    Leider werden die historischen Daten “Verbrauch gestern” “Verbrauch letzte Woche” nicht aktualisiert.
    Ich habe keine Fehlermeldungen im Protokoll.
    Es ist übrigens der erte Adapter, den ich konfiguriere, habe also Nachsicht!
    Mit freundliche Grüßen.
    Holger

    • Hallo Holger,
      vielen Dank für die Rückmeldung.

      Ich habe eine neue Version bereitgestellt, die diese Probleme beheben sollte.
      Bitte teste diese einmal.

      Gruß,
      Stephan

      • Hallo Stephan.
        Scheint jetzt alles zu funktionieren.
        Habe jetzt einen 2. Shelly EM angeschlossen. Was muss ich am Script ändern, um die Daten das 2. Shellys zu schreiben?
        Mit freundlichen Grüßen,
        Holger

  43. Hallo Stefan!

    Das Skript ist super und funktioniert auch bei mir! Aber was passiert mit den Werten, wenn der Raspberry neu gebootet wird? Bleiben die Werte auch dann erhalten noder nicht?
    Ich möchte das jetzt nicht unbedingt ausprobieren!

    Danke!

    • Hallo Hubert,
      die Werte sind in der ioBroker Datenbank gespeichert. Sollte der Raspi einmal neustarten, so holt er nach dem nächsten Start die Wert wieder vom Shelly und aktualisiert die Werte in der Datenbank des ioBrokers.

      Gruß,
      Stephan

  44. wenn man diese Daten nun per Grafana visualisieren will muss man den Umweg über influxdb gehen? wenn ja, wie oft sollte man die Werte an influxdb schicken, bzw. was wären denn die Einstellungen hier in iobroker? Macht ja kein Sinn jede sekunde “alle beide” datenbanken zu füllen, oder?

    • Hi Sky80,
      Ich habe bei mir die Standardeinstellungen der Optionen für die Objekte gelassen.
      Allerdings lasse ich den Influx Adapter nur schreiben, wenn sich 50 Datenpunkte geändert haben. Auch liegt die influxDB selbst auf einem anderen Host, denn die Speicherkarte des Raspi sollte nicht zuviel beschrieben werden.

      Gruß,
      Stephan

  45. Gibt es auch die Möglichkeit bei den Shelly 3EM auch die “Return” werte darzustellen. dann könnte man relativ einfach den Eigengebrauch berechnen.

        • Hallo Lars,
          welche Return Werte fehlen dir denn?

          Das Skript fragt alles ab, was der Shelly Adapter zur Verfügung stellt.
          Dies hat nichts mit der App auf dem Handy zu tun!

          Gruß,
          Stephan

          • Hi Stephan,

            shelly.0.SHEM-3#8CAAB561EE25#1.Total.Total_Returned

            gibt es in den Objekten des Adapters, aber dies fehlt in den DP des Scripts.

          • bzw. in den einzelnen Phasenpunkten heißt dieser:
            shelly.0.SHEM-3#8CAAB561EE25#1.Emeter0.Total_Returned

          • Hallo Lars,
            das stimmt. Bis heute scheint hier keine Aufsummierung stattzufinden.

            Somit sind diese Werte irgdndwie nicht brauchbar.

            Oder zeigt Dein 3EM richtige Werte an?

            Gruß
            Stephan

          • Ich denke schon, ich sehe in den Objekten zumindest einen validen Wert bei PhaseA (Emeter0), welcher sich auch im Total_Returned befindet.
            Auch in Shelly.Cloud ist dieser Wert sichtbar.
            Was wären dann brauchbare Werte?

          • Hallo Stephan,

            hast du hier eine Lösung zu dem Total_Returned erhalten ?
            Würde dieses gerne auch für meine PV mit loggen.

            Habe zwar keinen 3EM, aber mit dem normalen EM sollte es ja auch klappen.

            Grüße
            Kevin

  46. Hallo, mein Shelly EM wird nicht aktualisiert woran kann es liegen.
    es wird im moment nur der aktuelle wert angezeigt mehr nicht.

  47. Hallo Stephan,

    ich würde das Script auch gerne nutzen, bekomme aber immer die Fehlermeldung:

    error javascript.0 (548544) script.js.common.ShellyVerbrauch compile failed: at script.js.common.ShellyVerbrauch:31

    Das Wort objekt in Zeile 31 ist rot unterstrichen mit folgender Fehlermeldung:

    index1.js1 von 2 Problemen
    Cannot redeclare block-scoped variable ‘objekt’.(2451)

    Kannst Du mir sagen, was ich falsch mache?

    Viele Grüße
    Mattias

    • P.S.

      Im Log gibt es folgende Info:

      javascript.0
      2022-05-31 20:54:25.218 error at processImmediate (internal/timers.js:463:21)
      javascript.0
      2022-05-31 20:54:25.218 error at Immediate._onImmediate (/opt/iobroker/node_modules/iobroker.javascript/main.js:1472:17)
      javascript.0
      2022-05-31 20:54:25.218 error at /opt/iobroker/node_modules/iobroker.javascript/main.js:2001:17
      javascript.0
      2022-05-31 20:54:25.218 error at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1900:37)
      javascript.0
      2022-05-31 20:54:25.218 error at createVM (/opt/iobroker/node_modules/iobroker.javascript/main.js:1647:28)
      javascript.0
      2022-05-31 20:54:25.218 error at Object.createScript (vm.js:261:10)
      javascript.0
      2022-05-31 20:54:25.218 error at new Script (vm.js:88:7)
      javascript.0
      2022-05-31 20:54:25.218 error SyntaxError: Identifier ‘objekt’ has already been declared
      javascript.0
      2022-05-31 20:54:25.218 error ^
      javascript.0
      2022-05-31 20:54:25.217 error var objekt = [“gesamt”, “dieses_jahr”, “letztes_jahr”, “letzter_monat”, “dieser_monat”, “letzte_woche”,
      javascript.0
      2022-05-31 20:54:25.217 error script.js.common.ShellyVerbrauch compile failed: at script.js.common.ShellyVerbrauch:31
      javascript.0
      2022-05-31 20:54:25.201 info Start javascript script.js.common.ShellyVerbrauch
      javascript.0
      2022-05-31 20:54:25.181 info Stop script script.js.common.ShellyVerbrauch

      • Hallo Mattias,
        2022-05-31 20:54:25.218 error SyntaxError: Identifier ‘objekt’ has already been declared

        Hier wird der Fehler beschrieben. Du hast in einem der Skripte schon den Namen “objekt” belegt. Somit muss entweder dieser Name oder der des anderen Skriptes umbenannt werden.

        Gruß,
        Stephan

  48. Ich habe dein Script diese Woche gefunden, gestern installiert.
    Einfach Klasse.

    Ich benutze einen Shelly Plug S um mein Balkonkraftwerk zu monitoren.
    Leider ist die Shelly Cloud seit letzter Zeit total ungenau. D.h. auf der
    Diagrammanzeige wird so Grottenschlecht gerundet, damit kann man nichts mehr anfangen.
    Und immer die CSV runterladen, bearbeiten ect. ist auf Dauer ätzend.

    Dein Script läuft Super. Macht genau was es soll.
    Vielen Dank für deine Arbeit und Mühe.

    Gruß
    Detlef

  49. Hallo Stephan,

    erstmal vielen Dank für deine tollen Skripte und dass du sie uns zur Verfügung stellst.
    Eine Frage hätte ich…Kann man das Skript so anpassen, dass auch nur Datenpunkte der Shellys erstellt werden, die auch den Verbrauch ausgeben? Es gibt ja zum Beispiel den Shelly 1, der hat diese Funktion nicht. Dadurch würden keine unnötigen Datenpunkte erstellt werden.
    Vielen Dank im Voraus für deine Unterstützung.

    Viele Grüße
    Sascha

    • Hallo Sascha,
      das Skript fragt die Datenpunkte vom Shelly Adapter ab – somit kann hier leider nicht differenziert werden, welcher Shelly eine Power-Messung hat oder nicht.

      Gruß,
      Stephan

  50. Hallo Stephan, erstmal danke für Deine Arbeit und dieses tolle Script. Ich habe jetzt die letzten 2 Monate versucht das mit Sourceanalytix hinzubekommen, was mir aber nicht wirklich zufriedenstellend gelungen ist. Ich möchte nun die Datenpunkte meiner 5 Shelly Plug S von Deinem Script mit Influxdb 2 loggen und dann mit Grafana visualisieren.
    Hier habe ich allerdings ein kleines Verständnisproblem, da ich bei ioBroker auch noch nicht so lange dabei bin.
    Um alle Daten zu visualisieren muss ich vn jedem Shell die Datenpunkte von Tag/Monat/Woche usw. per influx loggen und dann für jeden Verbrauhszyklus ein eigenes Dashboard anlegen, oder denke ich hier zu kompliziert?
    Ich wäre Dir für einen kleinen Rat dankbar.

    Gruß
    Andy

  51. Hallo Stephan,

    auch ich bin begeistert von deinem Script und setzte es ein.

    Eine Frage habe ich. Da manche (neueren) Shellys nicht mit COAP funktionieren, sondern mit MQTT, habe ich zwei Shelly Adapter laufen .0 und .1. Bekomme es leider nicht hin, das ich diese mit zwei Scripte den Verbrauch erfasse. Wie kann ich das am besten lösen?

    Danke für deine Zeit im voraus.

    Gruß
    Ede

      • Danke für schnelle Antwort.

        Das mit zwei Skripten habe ich schon probiert. Aber wenn ich das Skript 2x anlege, natürlich mit unterschiedlichen Namen, wird jede Änderung in einem Skript zeitgleich auch im anderem Skript geändert. Wie ein digitaler Zwilling. Ich habe keine Ahnung, was ich da falsch mache.

  52. Hallo Stephan,
    vielen Dank für das tolle Skript. Das läuft super mit meinen Shelly 1PM Plus und Shelly Dimmer 2. Nun habe ich mir auch noch einen Shelly 3EM dazugekauft, aber leider werden dafür keine Datenpunkte erstellt. Im Shelly-Adapter taucht der 3EM auf und liefert Werte. Aber die Datenpunkte werden nicht angelegt. Skript habe ich natürlich schon ein paar Mal gestoppt und neu gestartet. Aber es werden immer nur alle anderen Shellys gefunden.
    Woran könnte das liegen? Ich bin am Ende meiner Weisheit.

    Danke,

    Gruß Markus

    • Hallo Markus,
      danke für die Rückmeldung.

      Das hört sich für mich so an, als wenn die Instanz eine andere wäre.

      Bitte hier einmal prüfen, ob alle Shelly in einer Instanz laufen.

      Gruß,
      Stephan

      • Hallo Stephan,

        das war der entscheidende Tip. Habe jetzt alle in einer Instanz laufen und die Datenpunkte für den 3EM wurden einwandfrei erzeugt.
        Ganz herzlichen Dank für Deine Unterstützung!

        Gruß,
        Markus

      • Hallo Stephan,
        jetzt habe ich trotzdem noch eine Frage:
        und zwar ist mir wieder eingefallen, warum ich zwei Instanzen für die Shellys hatte. Die Shelly 1PM plus funktionieren nur mit MQTT, aber bei dem Shelly 3EM habe ich MQTT nicht eingeschaltet, weil sonst die Cloud nicht mehr funktioniert. Daher die zwei Instanzen (einmal für 1PM mit MQTT und einmal für 3EM mit CoAP). Gibt es da trotzdem eine Möglichkeit, dass Dein Skript mit beiden Instanzen funktioniert?

        Danke und Gruß,
        Markus

  53. Hallo Stephan

    Ein absolut super Skript. Tolle Arbeit, genau das was ich gesucht habe.
    Gibt es eigentlich schon eine Lösung für das 3EM Total_Returned, oder wie kann ich das noch hinzufügen?
    Lars hatte ja schon mal gefragt. Ich bräuchte den nur für Total nicht für Emeter0-2
    Es gibt ja den Datenpunkt:
    48. // Datenpunkte der Shelly 3EM DP – Total
    49. var shelly3EMTotalDps = $(‘state[id=’ + shelly_dp + ‘.*.*.ConsumedPower]’);

    Den bräuchte ich noch mit “Total_Returned”
    Bei mir wird der ganz normal aufgezählt, wenn die Solaranlage einspeist.
    Wäre echt super.
    Danke.
    Gruß Ralf

    • Hallo Ralf,
      danke für die Rückmeldung. Leider kann ich das Skript aktuell aus zeitlichen Gründen nicht erweitern. Diese Änderung, obwohl sie klein ist, erfordert eine komplette Restrukturierung.

      Vielen Dank für dein Verständnis!

      Gruß,
      Stephan

      • Hi Stephan,
        danke für das tolle Skript 🙂

        Ich hoffe es ergibt sich bei dir bald ein Zeitfenster, die Total_Returned-Werte wären wirklich spitze 🤩🤤

        Gruß,
        Thomas

      • Hallo Stephan

        Ich habe das mal angepasst.
        Unter “Total” wird da noch ein Datenpunkt mit “Return” angelegt.
        Habe das Skript einmal angehängt.
        Hoffe das ich das so darf.
        Meine Programmierkünste sind aber leider nicht die besten.
        Ich bekomme bei der Ausführung auch immer Warnungen. Wenn einer eine Lösung hat bitte melden.
        Habe die einmal angefügt:
        23:14:00.137 warn javascript.0 (1521) at Object.shelly_verbrauch_update (script.js.Shelly_Auslesen:232:22)
        23:14:00.139 warn javascript.0 (1521) at aktualisiere_vebrauch_objektRet (script.js.Shelly_Auslesen:305:23)
        23:14:00.139 warn javascript.0 (1521) at script.js.Shelly_Auslesen:271:1
        23:14:00.139 warn javascript.0 (1521) at Object.shelly_verbrauch_update (script.js.Shelly_Auslesen:232:22)
        23:14:00.142 warn javascript.0 (1521) at aktualisiere_vebrauch_objektRet (script.js.Shelly_Auslesen:313:1)
        23:14:00.142 warn javascript.0 (1521) at script.js.Shelly_Auslesen:271:1
        23:14:00.142 warn javascript.0 (1521) at Object.shelly_verbrauch_update (script.js.Shelly_Auslesen:232:22)
        23:14:00.149 warn javascript.0 (1521) at aktualisiere_vebrauch_objektRet (script.js.Shelly_Auslesen:305:23)
        23:14:00.149 warn javascript.0 (1521) at script.js.Shelly_Auslesen:274:1
        23:14:00.150 warn javascript.0 (1521) at Object.shelly_verbrauch_update (script.js.Shelly_Auslesen:232:22)
        23:14:00.152 warn javascript.0 (1521) at aktualisiere_vebrauch_objektRet (script.js.Shelly_Auslesen:313:1)
        23:14:00.152 warn javascript.0 (1521) at script.js.Shelly_Auslesen:274:1
        23:14:00.152 warn javascript.0 (1521) at Object.shelly_verbrauch_update (script.js.Shelly_Auslesen:232:22)
        23:14:00.154 warn javascript.0 (1521) at aktualisiere_vebrauch_objektRet (script.js.Shelly_Auslesen:305:23)
        23:14:00.154 warn javascript.0 (1521) at script.js.Shelly_Auslesen:277:1
        23:14:00.154 warn javascript.0 (1521) at Object.shelly_verbrauch_update (script.js.Shelly_Auslesen:232:22)
        23:14:00.156 warn javascript.0 (1521) at aktualisiere_vebrauch_objektRet (script.js.Shelly_Auslesen:313:1)
        23:14:00.156 warn javascript.0 (1521) at script.js.Shelly_Auslesen:277:1
        23:14:00.157 warn javascript.0 (1521) at Object.shelly_verbrauch_update (script.js.Shelly_Auslesen:232:22)
        23:14:00.158 warn javascript.0 (1521) at script.js.Shelly_Auslesen:239:22
        23:14:00.159 warn javascript.0 (1521) at Object.shelly_verbrauch_update (script.js.Shelly_Auslesen:232:22)
        23:14:00.160 warn javascript.0 (1521) at script.js.Shelly_Auslesen:244:1
        23:14:00.161 warn javascript.0 (1521) at Object.shelly_verbrauch_update (script.js.Shelly_Auslesen:232:22)
        23:14:00.163 warn javascript.0 (1521) at script.js.Shelly_Auslesen:260:1
        23:14:00.163 warn javascript.0 (1521) at Object.shelly_verbrauch_update (script.js.Shelly_Auslesen:232:22)
        23:14:00.165 warn javascript.0 (1521) at aktualisiere_vebrauch_objektRet (script.js.Shelly_Auslesen:305:23)
        23:14:00.165 warn javascript.0 (1521) at script.js.Shelly_Auslesen:265:1
        23:14:00.165 warn javascript.0 (1521) at Object.shelly_verbrauch_update (script.js.Shelly_Auslesen:232:22)
        23:14:00.170 warn javascript.0 (1521) at aktualisiere_vebrauch_objektRet (script.js.Shelly_Auslesen:313:1)
        23:14:00.170 warn javascript.0 (1521) at script.js.Shelly_Auslesen:265:1
        23:14:00.170 warn javascript.0 (1521) at Object.shelly_verbrauch_update (script.js.Shelly_Auslesen:232:22)

        Geändertes Skript:

        /*
        * @copyright 2021 Stephan Kreyenborg
        *
        * @author 2021 Stephan Kreyenborg
        *
        * 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: 21. April 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]’);
        var shelly3EMTotalRetDps = $(‘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(id, “heute”, verbrauch);

        // Wochenverbrauch aktualisieren
        aktualisiere_vebrauch_objekt(id, “diese_woche”, verbrauch);

        // Monatsverbrauch aktualisieren
        aktualisiere_vebrauch_objekt(id, “dieser_monat”, verbrauch);

        // Jahresverbrauch aktualisieren
        aktualisiere_vebrauch_objekt(id, “dieses_jahr”, verbrauch);

        // Gesamten Vebrauch aktualisieren
        aktualisiere_vebrauch_objekt(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(id, “heute”, verbrauch);

        // Wochenverbrauch aktualisieren
        aktualisiere_vebrauch_objekt(id, “diese_woche”, verbrauch);

        // Monatsverbrauch aktualisieren
        aktualisiere_vebrauch_objekt(id, “dieser_monat”, verbrauch);

        // Jahresverbrauch aktualisieren
        aktualisiere_vebrauch_objekt(id, “dieses_jahr”, verbrauch);

        // Gesamten Vebrauch aktualisieren
        aktualisiere_vebrauch_objekt(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(id, “heute”, verbrauch);

        // Wochenverbrauch aktualisieren
        aktualisiere_vebrauch_objekt(id, “diese_woche”, verbrauch);

        // Monatsverbrauch aktualisieren
        aktualisiere_vebrauch_objekt(id, “dieser_monat”, verbrauch);

        // Jahresverbrauch aktualisieren
        aktualisiere_vebrauch_objekt(id, “dieses_jahr”, verbrauch);

        // Gesamten Vebrauch aktualisieren
        aktualisiere_vebrauch_objekt(id, “gesamt”, verbrauch);
        }
        });

        shelly3EMTotalRetDps.each(function (id, i) {
        var shelly_verbrauch = getState(id).val;
        // setState(“javascript.0.ShellyVerbrauch.SHEM-3#40F52001BCB8#1.Total.Return.alter_wert”,shelly_DPRet(id),true);

        // 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_DPRet(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_DPRet(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_DPRet(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_DPRet(id) + “aktueller_wert”, shelly_verbrauch, true);
        // Alter und neuer Wert -> aktuelle Differenz

        var verbrauch = parseFloat(shelly_verbrauch) – alter_wert;
        // Tagesverbrauch aktualisieren
        aktualisiere_vebrauch_objektRet(id, “heute”, verbrauch);

        // Wochenverbrauch aktualisieren
        aktualisiere_vebrauch_objektRet(id, “diese_woche”, verbrauch);

        // Monatsverbrauch aktualisieren
        aktualisiere_vebrauch_objektRet(id, “dieser_monat”, verbrauch);

        // Jahresverbrauch aktualisieren
        aktualisiere_vebrauch_objektRet(id, “dieses_jahr”, verbrauch);

        // Gesamten Vebrauch aktualisieren
        aktualisiere_vebrauch_objektRet(id, “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(shelly_DP(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(shelly_DP(dp) + objekt, parseFloat(verbrauch.toFixed(2)), true);
        }

        // aktualisiert das jeweilige Verbrauchs-Objekt Für 3EMReturn und addiert den Verbrauch dazu
        function aktualisiere_vebrauch_objektRet(dp, objekt, wert) {
        // Hole alten Verbrauch
        let alter_verbrauch = getState(shelly_DPRet(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(shelly_DPRet(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 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 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 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”
        });
        createState(shelly_DPRet(id) + 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));
        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: “”
        });
        });
        }

        function shelly_DP(dp) {
        dp = dp.split(“.”);
        dp = datenpunkt + dp[2] + “.” + dp[3] + “.”;
        return dp;
        }

        function shelly_DPRet(dp) {
        dp = dp.split(“.”);
        dp = datenpunkt + dp[2] + “.” + dp[3] + “.Return.”;
        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);

  54. Vielen Dank für dieses tolle Skript!

    Ich bin darauf gestoßen nachdem ein Shelly einfach wieder bei 0 angefangen hat zu zählen. Den alten Stand habe ich aber noch. Ich habe allerdings keine Möglichkeit gesehen im Skript nun einen anderen Startwert als 0 anzugeben. Wo könnte ich das tun?

    Grüße

    • Hallo Dirk,
      das funktioniert wie folgt.

      Wenn Du das Skript einmal gestartet hast, erstellt dieses die Datenpunkte für die Shelly. Danach stoppst Du das Skript und gehst zum Datenpunkt des Shelly. Dort nullst Du “aktueller_wert” und gibst bei “alter_wert” den alten Wert ein.

      Dann das Skript wieder starten.

      • Hi Stephan, das hat so leider nicht geklappt. Der alte Wert nullt sich nach dem starten vom script wieder und aktueller wert springt wieder auf den Wert bevor ich manuell genullt habe.

        Aber ich habe es hinbekommen indem ich “gesamt” mit dem alten wert addiert habe abzüglich von aktueller wert, das addiert er dann auf. Jetzt passt es zumindest im gesamt Ergebnis.

  55. Hallo Stephan,

    ich nutze den Shelly 3EM um meinen Verbrauch und die Einspeisung meiner PV Anlage zu überwachen.

    Der 3EM hat dazu die Variable “Total_Returned” und kann auch “InstantPower” mit negativem Vorzeichen ausgeben, um Einspeisung anzuzeigen.
    Könnte man das Script einfach um Einspeisung Heute, Gestern, Woche, letzte Woche, Jahr erweitern?

    Vielen Dank
    Grüße Stefan

  56. Hallo,

    ich musste mein Proxmox über ein Paar Tage ausschalten, da das Netzteil kaputt gegangen ist und ausgetauscht werden musste.
    Nach der Wiederinbetriebnahme schreibt das Skript keine neuen Werte mehr in die Datenpunkte.
    Neustarts des Adapters, des Skripts sowie der Shellys hat nicht geholfen.
    Ich verwende die aktuellste Version des Skripts.

    Kann mir jemand helfen, wie ich das Problem näher untersuchen kann?
    Danke!

  57. Hallo Stephan,
    vielen Dank für das tolle Script!
    Ich bin blutiger Anfänger mit IOBroker und nutze dein Script um mein Balkonsolar besser darzustellen.

    Jetzt wollte ich mit InfluxDB täglich 23:30 den Tageswert mitschreiben um eine Grafik damit zu erstellen.
    Doch leider kann InfluxDB das nicht mit einem Zeitplan.
    Ich dachte, dann schreibe ich den Tageswert um 23:30 in einen selbst angelegten Datenpunkt. Aber da scheitere ich an der Umsetzung. Bin halt kein Programierer.
    Hast du eine Idee wie ich das umsetzen könnte?

    Beste Grüße,
    Stefan

    • Hallo Stefan,
      am Besten kannst Du den Wert “heute” über den influx Adapter in die Influx DB schreiben lassen. In Grafana kannst Du dazu dann Auswertungen erstellen.

      Gruß,
      Stephan

  58. Herzlichen Dank!!
    Skript läuft und alle 6 Shelly´s wurden gefunden und aktuell berechnet.
    Hast mir eine menge Zeit erspart!!
    Danke!!

  59. Hallo,

    vielen Dank für das gute Script! Ich suche schon länger nach solch einem Script, mit dem ich über mein Shelly EM3 mein Stromverbrauch und mein Balkonkraftwerk “visualisieren” und “auswerten” kann. Ich habe das Script jetzt ein paar Tage im ioBroker laufen.

    Jetzt habe ich mir die Zahlen mal genauer angeschaut und komme damit bezgl. der Auswertung nicht so ganz klar. Vielleicht ist es aber nur ein Denkfehler… Oder ich bin einer großen Sache auf der Spur. 😉

    Ich logge u.a. den Datenpunkt “Total – Verbrauch heute” in eine Influx-DB. Mit Grafana visualisiere ich dann die Daten. Zum einen in ein “Verbrauchsdiagramm” mit den “positiven” und ein “Einspeisediagramm” mit den “negativen” Werten des Tagesverbrauchs aus Deinem Script. Soweit, sogut.

    Wenn ich aber das Diagramm mit den “Einspeisewerten” mit dem Wert “Total returned – Verbrauch heute” aus dem Script vergleiche, habe ich über 2/3 der erzeugten Solarenergie ins Netz eingespeisst. Kommt mir etwas hoch vor.

    Um einen Wert mal zu überschlagen, habe ich den höchsten Wert aus dem heutigen “Einspeisediagramm” genommen (150 Watt) und das 8 Stunden hochgerechnet. Damit komme ich auf ein Wert von 1,2 kWh (150 Watt Dauerleistung mal 8 Stunden). Meine “Einspeisung” vom Balkonkraftwerk logge ich über ein Fritz!Dect210-Adpater. Heute sind 3,68 kWh erzeugt worden. Der Wert aus dem Script (Total returned – Verbrauch heute) beträgt stolze 2,9 kWh. Bedeutet, ich hätte heute “nur” 0,78 kWh selbst verbraucht,

    Wie kommt diese “große” Abweichung zustande?

    Gruß

    Timo

  60. Hallo.

    Ich benutze dein Skript nun schon längere Zeit und habe nun gesehen das es ein Update gibt.

    Ich hab mir in deinem Script noch die Möglichkeit eingebaut auch die Datenpunkte unter ‘0_userdata.0’ erzeugen zu lassen.
    Vielleicht wäre es dir möglich von vorn herein in deinem Code die Wahlmöglichkeit einzubauen ob
    die Datenpunkte unter ‘javascript.0’ oder ‘0_userdate.0’ angelegt werden.
    Man kann sich das zwar auch schnell selbst zusammenstricken nur wird in Zeile 317 direkt Bezug auf javascipt.0 genommen.

    MfG Ralf

    • Hallo Ralf,
      da meine Skripte zu Javascript gehören, erstellen sie dort auch ihre Ordner.

      Die Struktur Userdata ist nur eine Empfehlung von ioBroker. Aus diesem Grunde bleiben die Skripte auch weiterhin unter JavaScript.
      Wenn ein User dies ändern möchte, so kann dieser den Skript-Pfad für sich anpassen.

      Zeile 317 werde icj diesbezüglich noch anpassen. Danke für den Hinweis.

      Gruß,
      Stephan

      • Hallo und danke für deine Rückmeldung.

        Es geht mir nicht darum das Skript in einen anderen Pfad zu legen, sondern nur die Datenpunkte wenn ich das möchte unter ‘0_userdata.0’ anzulegen.

        Aber gut, dein Skript, deine Linie. 😉

        MfG Ralf

  61. Hallo

    Erst mal danke für dein Script. Läuft bei mir seit einem Jahr perfekt.

    Habe nun gesehen das es ein Update gibt.

    Ich habe mir damals das Script so angepasst das die Datenpunkte unter 0_userdata.0 angelegt werden.
    Könntest du diese Option mit einbauen? Dann würde mir und anderen diese Anpassung bei einem Update erspart bleiben.

    mfg Ralf

  62. Hallo Stefan,

    vielen Dank für dieses tolle Skipt. Läuft bei mir soweit sehr gut.

    Ich habe 2 Fragen (sorry, wenn diese in den vielen Kommentaren schon einmal beantwortet wurden):

    1. Kann man das Skipt auch so ändern, dass man mit Alias der Shellys arbeiten kann? So kann man dann ggf. defekte Shellys austuaschen und die Daten hängen am Alias und nicht an der Shelly-ID. Oder habe ich hier eine Denkfehler?

    2. Ich besitze eine openWB Wallbox, die über MQTT jede Menge Daten in den ioBroker bringt. Könnte man das Skipt auch dementsprechend umschreiben, dass summierte Daten nach Tag/Monat/Jahr usw. auch von dieser Quelle so gesammelt werden in z.B. influxDB?

    Danke und Gruß

    Peter

    • Hallo Peter,
      danke für Deine Rückmeldung. Solltest Du einen defekten Shelly haben, kannst Du das Skript einmal stoppen, den neuen Shelly in Betrieb nehmen, dann das Skript erneut starten, so das seine ID angelegt wird. Dann stoppst Du das Skript erneut und nennst die “alte” ID so wie die neue ID (Umbennenen im Objekt-Browser von ioBroker). Dann das Skript wieder starten.

      Du kannst meine Skripte natürlich nach deinen Bedürfnissen umbauen 🙂

      Gruß,
      Stephan

  63. Moin
    ich habe das Script hier durch Zufall gefunden.
    1000 Dank für die tolle Arbeit.
    Bei mir funktioniert es zu 100%.

    Was mich nur stutzig macht ist, das der gesamte Verbrauch in Wh angezeigt wird.
    Sollte da nicht nur W stehen ??

  64. * Erstell-Datum: 08. Oktober 2021 | Update: 20. Juli 2022

    Hallo, was wurde mit dem Update zum 20.Juli verändert.

    aktuell (vermutlich seit Anfang September) hatte ich gerade eine Änderung des Monatlichen und somit Jährlichen Verbrauches um 1300kwh. ich verwende noch die 1.50Version.
    Shelly 3EM, dort gab es dem jump.

    Jetzt hab ich erst mal den dazu gehörigen Datensatz gelöscht und nun fängt er wieder bei 0 an.

  65. Hi Stephan,
    vielen Dank für das super Skript. Es macht genau das, was es soll! Aber…………:-), ich habe da ein kleines Problem.
    Datenpunkte sollen ja in IoBroker nicht mehr unterhalb des Adapters, sondern unterhalb von 0_userdata im Objektbaum angelegt werden.
    Also habe ich mir Dein Skript angeschaut und Zeile 317 auf “extendObject(“0_userdata.0.” + shelly_DP_Name_Main(id), {” geändert.
    Das funtioniert teilweise auf wunderbar. Esw rid der Ordner ShellyVerbaruch mit den einzelenen Shelly-Objekten angelegt.
    Leider unterhalb der Objekte nicht die Datenpunkte erstellt. Diese (und somit die gesamte Struktur noch einmal) werden weiterhin unter javascript.0 angelegt.
    Ich dachte, dass ich Dein Skript verstanden hätte, aber ich finde nicht die Stelle, an der diese DPs unter Javascript.0 angelegt werden.
    Kannst Du mir helfen bzw. auf die Sprüneg helfen?

    Vielen Dank und Gruß aus Münster!

    Uli

  66. Hi Stephan,

    total geiles Script. Funktioniert auf Anhieb fehlerlos. Größter Respekt von meiner Seite 🙂

    Wie immer werden Entwickler mit nem Wunschkonzert zugeballert. So auch von mir noch ne Frage:

    Könnte man mit dem Teil auch die Sonoff Schiene abklappern und wenigstens die Daten von “Total, Today und Yesterday” mitnehmen?

    Wäre super.
    Danke noch Mal

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.