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

Lesedauer: 9 Minuten

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

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

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

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

Übersicht der Funktionen

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

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

Screenshot der verfügbaren Variablen

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

Installation des Shelly Adapter

Installation des Shelly Adapter
Installation des Shelly Adapter

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

Skript

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

// Datenpunkte neu erstellen
var ueberschreiben = false;

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

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

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

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

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

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

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

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

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

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

    // Datumsvariable
    var heute = new Date();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Erster Start und Initialisierung
shelly_verbrauch_erster_start();

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

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

Datenpunkte

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

Fehlersuche

Fehlermeldung im Log

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

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

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

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

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

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

  1. Erwin Schmidtlein Antworten

    Hallo Stephan,
    der DP ‘Verbrauch gestern’ zeigt ‘0’, obwohl am Tag vorher unter ‘Verbrauch heute’ ein Verbrauch vorhanden war. Dieser Verbrauch ist auch um 23:59 Uhr in einen User-DP geschrieben worden. Dieser Wert ist bei Tageswechsel nicht in den ‘Verbrauch gestern’ übertragen worden. Der ‘Verbrauch heute’ ist auf ‘0’ gesetzt.
    Gruß
    Erwin

  2. Erwin Schmidtlein Antworten

    Hallo Stephan,
    für Auswertungen der Verbrauchsverläufe hole ich mir aus der Cloud die einzelnen Werte (Zählerstände) eines Monats, verdichte diese auf Stunden und erzewuge daraus die ‘Monats-‘ bzw ‘Tages-‘Auswertungen.
    Für eine stündliche Aufzeichnung der Zählerstände in der History wären entsprechende Datenpunkte sehr hilfreich.
    Ist der Ansatz realisierbar?

    • Stephan Autor des BeitragsAntworten

      Hallo Erwin,
      dieses Skript arbeitet ohne Cloud und zieht sich die Werte vom Shelly Adapter.

      Es gibt im Netz Erweiterungen von diesem Skript, die auch die letzte(n) Stunden abbilden können.

      Gruß,
      Stephan

  3. Peter Antworten

    Guten Abend,

    bin durch Zufall auf das Script gestoßen. Tolle Sache – läuft, Shellys (1PM und Plug S) werden sofort gefunden und Datensammelei beginnt. Soweit – so gut.

    Nur:
    Nach einem reboot waren eben auch wieder alle aufgelaufenen Verbrauchswerte auf Null gesetzt. Muss das Script erste eine Weile – sprich über Mitternacht – laufen, damit Werte dauerhaft abgelegt werden? Welche Werte müssten nach einem reboot erhalten geblieben sein?

    BTW: Die Function “extendObject” gibt es im JS-Adapter nicht. Nur “setObject erlauben”…

    Hat Jemand einen Tipp, was ich falsch mache? – Danke und schönes WE.

    • Stephan Autor des BeitragsAntworten

      Hallo Peter,
      Das Skript erfasst die Daten der Shelly aller 15 Minuten.
      Wenn ein Shelly neustartet (Update, Reboot) erkannt das Skript dies und zählt die Daten weiter hoch.
      Sollte in den Objekten dies nicht erscheinen, kann mit F5 oder Strg + F5 die Seite neu geladen werden, damit die Werte sichtbar sind . Hier ist natürlich nicht der Neustart des ioBroker gemeint.

      In meinem Text steht doch “setObject” – die Fehlermeldung kommt von Javascript Adapter als Beispiel.

      Gruß,
      Stephan

      • Peter Antworten

        Hallo Stephan,
        danke für die schnelle Rückmeldung. Ich habe die Abfrage zu Testzwecken auf 1 Min. gesetzt.
        Beispiel für Datenpunkt:
        – “Verbrauch heute” befüllt sich, Werte gehen hoch
        – ditto “Gesamtverbrauch des Shelly”
        – Reboot
        – alle Werte wieder Null (auch nach reload der Seite)
        – Werte füllen sich erneut von Null beginnend.

        Wenn ich es richtig verstehe, müssten ja wenigstens die Werte einiger DP den Werten entsprechen, die vor dem reboot aufgelaufen waren.
        Und das geschieht eben nicht. Auch in der history fallen die Werte durch reboot wieder auf Null.

        Ich nehme an, dass es meinerseits ein Verständnisproblem gibt oder ich etwas Grundsätzliches übersehe – nur was 🙂

        BTW: Das Script legt keine DP an, wenn der *Adapter Shelly* nicht installiert ist. Ich nehme an, dass dies so richtig ist.

        lg Peter

        • Stephan Autor des BeitragsAntworten

          Hallo Peter,
          Interessante Funktion – jedoch nicht die gewünschte.
          Was sagt denn das Log dazu?
          Erscheint z.B. etwas, das Reboots korrigiert wurden? Oder so und soviele Werte neu gespeichert wurden?

          • Peter

            Moin Stephan,

            zunächst einmal Entwarnung. Ich habe das Ganze mal über Nacht laufen lassen und erst heute morgen den shelly rebooted. Alter und neuer Wert dann Null, alle anderen Werte sind noch da. Also prinzipiell funktioniert das nun.

            Ich habe nun nur noch ein Verständnisproblem bezüglich der Zahlenwerte, bin da ber auf einem guten Weg das zu verstehen:

            Summe Verbrauch (alt) vor reboot+ aktueller Verbrauch (neuer Messwert) nach reboot = aktuelle Summe Verbrauch Shelly

            Verbrauch heute vor reboot (nicht mehr sichtbar) + aktueller Messwert nach reboot = aktueller Gesamtverbrauch heute

            Werte zurückliegender Zeiträume (gestern/Woche(Monat/Jahr) haben damit nur statistische und informative Bedeutung.

            So müsste das passen…

            Dein Script bedient sich also der Werte des Shelly.-Adapters, war mir anfangs auch nicht ganz klar.

            Danke für dieses wirklich sinnvolle und nützliche Script.

            lg Peter

  4. HG Antworten

    Kann ich in den einzelnen Datenpunkten das Script so abändern das ich kWh erhalte also /1000.
    Ich muss zwei Wechselrichter die Summe zusammen zählen jedoch ist die eine Summe bereits Kwh ..

    Vielen Dank

  5. Christof Antworten

    Hallo, danke für das Script. Mir ist aufgefallen, dass es auch die Namen für Shellys anlegt, die keine Energiemessfunktion haben, z. B. Shelly 1. Ich habe daher folgende Zeile eingebaut, um dies vor Anlegen des Namens zu prüfen. Wäre schön, wenn Du das ins Script einbauen könntest:

    Nach der Zeile:
    shellyDpsName.each(function (id, i) {
    bitte folgende Zeile einfügen (und natürlich die schließende } an der entsprechenden Stelle):
    if (JSON.stringify(shellyDps).search(id.replace(“.name”,””)) > 0) {

    Danke!

    Außerdem habe ich für meine Zwecke noch die Felder diese_stunde und letzte_stunde eingebaut. Falls Du Interesse an dieser Änderung hast, kann ich das hier auch noch posten.

  6. Stoneii Antworten

    Hy Stephan,
    Kein Thema!

    Wenn ich mal einen übrig hab oder liegen bleibt stell ich dir einen zur Verfügung.

    Leider gibts für die neuen Produkte von Shelly auch keine Grafana Integration. Leider fehlt mir dazu auch das programmier wissen. Das is richtig verhext als ob die neuen Sachen keiner mag….

    Was hat sich der Hersteller nur dabei gedacht.

    Lg
    Stoneii

  7. Stoneii Antworten

    Morgen,
    Alle neuen Shelly Produkte ZB: Pro 3EM laufen nicht mit den Scripts wie die Vorgänger Versionen.
    Da bringt auch ein abändern der Datenpunkt nichts.

    Lg

    • Stephan Autor des BeitragsAntworten

      Hallo Stoneii,
      ich habe leider keinen der neuen Shelly.

      Somit kann ich nur mit den Produkten arbeiten, die ich aktuell habe 🙂

      Gruß,
      Stephan

  8. Andre Antworten

    Kenn mich leider mit ioBroker noch praktisch gar nicht aus. Wie kann ich denn dieses Skript hinzufügen?
    Gibt es dazu evtl. irgendwo eine hilfreiche Anleitung?

    • Stephan Autor des BeitragsAntworten

      Hallo Andre,
      dann solltest Du Dich erst einmal in ioBroker einlesen.
      Das Skript ansich benötigt den “JavaScript”_Adapter, welcher zu installieren ist.

      Gruß,
      Stephan

  9. Christian Antworten

    Hallo,
    erstmal, echt super das Tool. Hut ab, für das Programmieren und danke.

    hat jemand schon den Shelly Pro 3EM zum laufen bekommen.
    Bei mir wird nichts angezeigt, außer der Name.
    Bei den anderen Shellys die ich habe, hat alles super funktioniert.
    Shelly 1PM, Plus 1PM, 3EM nur der Pro 3EM möchte nicht so wirklich.

    Sehe auf jeden Fall das der 3EM folgende Ordner hat:
    Cloud
    Emeter0
    Emeter1
    Emeter2
    Mqtt
    Relay0
    Sys
    Total
    dann noch einzelne Dateien

    Der Pro 3EM hat folgende:
    Cloud
    EMO
    Mqtt
    Sys
    Wifi
    dann noch einzelne Dateien

    Jetzt weiß ich nicht ob es eventuell am IoBroker Shelly Adapter liegt, da die 6.4 Version bei mir als Update noch nicht angezeigt worden ist. Habe es als Beta Datei geladen und installiert ( da vorher der Pro 3EM garnicht angezeigt worden ist).

    Bin im Programmieren leider noch nicht wirklich firm, fange gerade erst an mit dem Thema. Daher die Frage ob jemand das machen könnte, oder mir erklären kann was ich da ändern müsste.

    Schon mal vielen Dank.
    Grüße
    Christian

    • Stephan Autor des BeitragsAntworten

      Hallo Christian,
      leider haben die neuen Shelly Produkte wohl neue Strukturen bekommen. Da ich diese aber leider nicht mein Eigen nennen kann, kann ich das Skript aktuell nur für die vorherige Generation anbieten.

      Gruß,
      Stephan

  10. Markus Antworten

    Hi, habe das Script zufällig gefunden, aber genau das brauche ich.

    Danke für das tolle Script.

    Gruß
    Markus

  11. Andy Antworten

    Hallo,
    ich habe eine Shelly 3em und Messe damit den Kompletten Verbrauch vom Haus.
    Jetzt suche ich eine möglichkeit die Daten vernünftig in einer History zu speichern.
    Ich denke das skript erfüllt das.?
    Kann mir jemand eine Anleitung geben wie ich das Skript verwende bzw. wie damit kenne ich mich leider nicht so aus.

    Liebe Grüße
    Andy

    • Stephan Autor des BeitragsAntworten

      Hallo Andy,
      damit das Skript Daten in einer History speichern kann, benötigst Du weitere Dinge.

      Z.B. eine influxDB mit influxAdapter. Zum Visualisieren nimmst Du dann Grafana.

      Gruß,
      Stephan

  12. Frank Antworten

    Hallo Stephan,

    als erstes möchte ich mich recht herzlich für das tolle Skript bedanken.
    Gestern habe ich gesehen, dass es den Shelly 3EM auch in der Pro Version gibt.
    Da ich mir einen 3EM zulegen möchte, würde ich gern zum Pro greifen.
    Voraussetzung ist allerdings, dass das Skript auch beim Pro funktioniert.
    Kann das Skript auch mit dem Pro 3EM arbeiten? Muss etwas im Skript geändert werden?

    Vielen Dank im Voraus.

    Gruß Frank

  13. Henning Antworten

    Hallo Zusammen!

    Habe heute einen Shelly Pro 3EM installiert. Shelly Adapter 6.4.0 im Iobroker installiert. Auf dem Shelly MQTT aktiviert.
    Daten kommen im Iobroker an.
    Jetzt habe ich hier das Script gefunden und installiert.
    Leider sagt das Log das beim Erstanlauf keine Datenpunkte des ShellPro3EM gefunden wurden.
    “javascript.0 (1050) script.js.common.10A_Shelly_Pro3EM: Shelly Verbrauch: Datenpunkte erstellt! Erster Verbrauch steht nach 30 Sekunden zur Verfügung! Anzahl gefundener Shelly Datenpunkte: 0”
    Kann das sein das der Shelly zu neu ist und die Datenpunkte nicht funktionieren?
    Gruß
    Henning

  14. Dirk Antworten

    Super Script, hatte mir deshalb schon mehr graue Haare, als schon vorhanden, wachsen lassen.
    Jetzt lüppt es….

    Vielen Dank.

  15. Wolfgang Antworten

    Hallo Stephan,
    habe mal dein Script installiert, da es genau die Auswertungen macht, die mir wichtig wären. 🙂
    Ich habe 2 Instanzen des Scripts installiert.
    1. Shelly 3EM und Shelly PlugS
    2. Shelly Plus1PM
    bei alle funktionieren jedoch die Ausgaben: Verbrauch gestern, Verbrauch letzte Woche, Verbrauch letzten Monat nicht
    Als Wert wir überall 0 ausgegeben
    Die Werte: Verbrauch diese Woche, Verbrauch aktueller Monat, Verbrauch aktuelles Jahr scheinen zu funktionieren.
    Es tauchen auch keine Meldungen im Protokoll auf.
    Hast du eine Idee an was das liegen könnte??

    LG aus Heilbronn
    Wolfgang

    • Stephan Autor des BeitragsAntworten

      Hallo Wolfgang,
      wieso nimmst Du denn 2 Instanzen? Da kann es sein, dass sie sich überschreiben.

      Gruß,
      Stephan

  16. Thomas Antworten

    Super Skript !!!!! Vielen Dank !!!!

    Kurze Frage noch — wie kann ich einen Start Wert eingeben ?

    Gruß

    Thomas

    • Stephan Autor des BeitragsAntworten

      Hi Thomas,
      Skript stoppen und dann bei “heute”, “monat” oder “jahr” den Startwert eintragen. Dann das Skript wieder starten.

      Gruß,
      Stephan

  17. Werner Blöchlinger Antworten

    Hallo Stephan

    Vielen Dank für das Super Script. Dies ermöglicht es auch mir den Iobroker besser nutzen zu können, da ich nicht fähig bin so etwas zu programmieren. Super Arbeit.

    Danke und Gruss
    Werni

  18. Søren Antworten

    Hallo,

    kann ich den Tagesverbrauch auch zum Beispiel alle 5 Minuten aktualisieren lassen?

    VG Søren

    • Stephan Autor des BeitragsAntworten

      Hallo Soren,
      klar kannst Du. In Zeile 465 die Zeit von 15 auf 5 Minuten abändern und dann das Skript neu starten.

      Gruß,
      Stephan

  19. Timo Antworten

    Hallo Zusammen,

    danke für das tolle Skript. Ich habe dazu eine Frage. Kann man (für die Übersichtlichkeit) auch den Wert “Name” aus den bestehenden Shellys übertragen und nicht nur die _ID?

    Das geht sicher….wie müsste man das im Skript ergänzen?

    Danke!
    Timo

    • Stephan Autor des BeitragsAntworten

      Hallo Timo,
      der Datenpunkt Name ist doch vorhanden und wird von dem aktuellen Namen des Shelly befüllt.

      Guß,
      Stephan

Schreibe einen Kommentar

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