Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Entwicklung
  4. [Neuer Adapter] Senec Home Adapter

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    17
    1
    580

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    5.5k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.4k

[Neuer Adapter] Senec Home Adapter

Scheduled Pinned Locked Moved Entwicklung
photovoltaiksenecadapter
446 Posts 72 Posters 103.8k Views 68 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    Semmy
    wrote on last edited by
    #344

    Hallo

    Gibt es irgendwelche Alternativen, um die Statistiken zu erzeugen? Ein anderer Adapter z.B. und wie wäre das dann zu bewerkstelligen

    Viele Grüße
    Semmy

    O 1 Reply Last reply
    0
    • S Semmy

      Hallo

      Gibt es irgendwelche Alternativen, um die Statistiken zu erzeugen? Ein anderer Adapter z.B. und wie wäre das dann zu bewerkstelligen

      Viele Grüße
      Semmy

      O Offline
      O Offline
      oxident
      wrote on last edited by
      #345

      @semmy Hab jetzt vieles versucht: Home Assistant oder auch Summieren verfügbarer Werte mit SourceAnalytix ... aber es scheint erstmal nichts zu funktionieren.

      Wir können nur hoffen, dass sich nach morgiger Umstellung der UI bei Senec jemand findet, der die Herausforderung annimmt :-)

      D 1 Reply Last reply
      0
      • O oxident

        @semmy Hab jetzt vieles versucht: Home Assistant oder auch Summieren verfügbarer Werte mit SourceAnalytix ... aber es scheint erstmal nichts zu funktionieren.

        Wir können nur hoffen, dass sich nach morgiger Umstellung der UI bei Senec jemand findet, der die Herausforderung annimmt :-)

        D Offline
        D Offline
        dispo112
        wrote on last edited by
        #346

        @oxident
        Ich habe mir überlegt, die PV-Tagesproduktion lokal zu berechnen, indem ich alle 10 Sekunden die Leistung in Watt in Wh umrechne (Leistung × 10s ÷ 3600) und aufsummiere. Zusätzlich berücksichtige ich Speicher-SOC-Änderungen sowie Netzbezug und Einspeisung, um die Energieflüsse besser abzubilden und eine genaue Tagesbilanz zu erhalten. Reset erfolgt um Mitternacht.

        Mal sehen was dabei rauskommt.

        O 1 Reply Last reply
        0
        • D dispo112

          @oxident
          Ich habe mir überlegt, die PV-Tagesproduktion lokal zu berechnen, indem ich alle 10 Sekunden die Leistung in Watt in Wh umrechne (Leistung × 10s ÷ 3600) und aufsummiere. Zusätzlich berücksichtige ich Speicher-SOC-Änderungen sowie Netzbezug und Einspeisung, um die Energieflüsse besser abzubilden und eine genaue Tagesbilanz zu erhalten. Reset erfolgt um Mitternacht.

          Mal sehen was dabei rauskommt.

          O Offline
          O Offline
          oxident
          wrote on last edited by
          #347

          @dispo112 Ja, das wäre auf jeden Fall ein Anfang. Ich meine aber, dass SourceAnalytix das auch kann und dann halt bei jeder Änderung des Datenpunkts berechnet. Dürfte aber so oder so ungenau sein.

          Sieht mir auch leider danach aus, dass es wohl länger dauert, bis wir wieder an die offiziellen Daten kommen.

          D 1 Reply Last reply
          0
          • icebearI Offline
            icebearI Offline
            icebear
            wrote on last edited by
            #348

            @dispo112
            @oxident

            Für diejenigen, die nebenbei auch noch HA nutzen und den Senec auch in HA integriert haben, wäre vielleicht auch noch interessant, das es für HA eine Integration gibt, die die Werte umrechnet .

            Siehe Riemann Integral.

            D 1 Reply Last reply
            0
            • O oxident

              @dispo112 Ja, das wäre auf jeden Fall ein Anfang. Ich meine aber, dass SourceAnalytix das auch kann und dann halt bei jeder Änderung des Datenpunkts berechnet. Dürfte aber so oder so ungenau sein.

              Sieht mir auch leider danach aus, dass es wohl länger dauert, bis wir wieder an die offiziellen Daten kommen.

              D Offline
              D Offline
              dispo112
              wrote on last edited by
              #349

              @oxident
              auf der Github Solectrus Seite ist ja faktisch schon ein Lösungsweg aufgeführt...
              https://github.com/solectrus/senec-collector/issues/639

              Denke das bekommt man auch mittels Iobroker hin, bin jedenfalls dabei mir den gleichen Workaround nachzubauen.

              1 Reply Last reply
              1
              • icebearI icebear

                @dispo112
                @oxident

                Für diejenigen, die nebenbei auch noch HA nutzen und den Senec auch in HA integriert haben, wäre vielleicht auch noch interessant, das es für HA eine Integration gibt, die die Werte umrechnet .

                Siehe Riemann Integral.

                D Offline
                D Offline
                dispo112
                wrote on last edited by
                #350

                @icebear danke für den Hinweis. Aber zunächst versuche ich den Solectrus Workaround im Iobroker nachzubauen.

                icebearI 1 Reply Last reply
                0
                • D dispo112

                  @icebear danke für den Hinweis. Aber zunächst versuche ich den Solectrus Workaround im Iobroker nachzubauen.

                  icebearI Offline
                  icebearI Offline
                  icebear
                  wrote on last edited by icebear
                  #351

                  @dispo112 said in [Neuer Adapter] Senec Home Adapter:

                  Aber zunächst versuche ich den Solectrus Workaround im Iobroker nachzubauen.

                  Ah, ich sehe du liest auch quer wie es da weitergeht, wäre super wenn du uns auf dem laufenden halten könntest wie man das in IOB nachbauen kann. (evtl auch mir Node-Red)

                  Leider fehlt mir hier das programmiertechnische Know-How.

                  D 1 Reply Last reply
                  0
                  • icebearI icebear

                    @dispo112 said in [Neuer Adapter] Senec Home Adapter:

                    Aber zunächst versuche ich den Solectrus Workaround im Iobroker nachzubauen.

                    Ah, ich sehe du liest auch quer wie es da weitergeht, wäre super wenn du uns auf dem laufenden halten könntest wie man das in IOB nachbauen kann. (evtl auch mir Node-Red)

                    Leider fehlt mir hier das programmiertechnische Know-How.

                    D Offline
                    D Offline
                    dispo112
                    wrote on last edited by
                    #352

                    @icebear @oxident
                    Das mache ich auf jeden Fall.
                    Was schon mal sehr erfreulich ist:
                    Mein Skript, das die 10-Sekunden-Erzeugungswerte im ioBroker aufsummiert, läuft ziemlich genau – trotz der teils sehr unregelmäßigen PV Erzeugungskurve.
                    Ich beobachte das jetzt ein paar Tage weiter.
                    Wenn jemand Interesse an dem Skript hat: einfach kurz Bescheid sagen, dann stelle ich es hier gerne zur Verfügung.

                    Screenshot_20250724-222850.png Screenshot_20250724-222828.png

                    O S 2 Replies Last reply
                    1
                    • D dispo112

                      @icebear @oxident
                      Das mache ich auf jeden Fall.
                      Was schon mal sehr erfreulich ist:
                      Mein Skript, das die 10-Sekunden-Erzeugungswerte im ioBroker aufsummiert, läuft ziemlich genau – trotz der teils sehr unregelmäßigen PV Erzeugungskurve.
                      Ich beobachte das jetzt ein paar Tage weiter.
                      Wenn jemand Interesse an dem Skript hat: einfach kurz Bescheid sagen, dann stelle ich es hier gerne zur Verfügung.

                      Screenshot_20250724-222850.png Screenshot_20250724-222828.png

                      O Offline
                      O Offline
                      oxident
                      wrote on last edited by
                      #353

                      @dispo112 Mega! ... und: Bescheid :grin:

                      1 Reply Last reply
                      0
                      • D dispo112

                        @icebear @oxident
                        Das mache ich auf jeden Fall.
                        Was schon mal sehr erfreulich ist:
                        Mein Skript, das die 10-Sekunden-Erzeugungswerte im ioBroker aufsummiert, läuft ziemlich genau – trotz der teils sehr unregelmäßigen PV Erzeugungskurve.
                        Ich beobachte das jetzt ein paar Tage weiter.
                        Wenn jemand Interesse an dem Skript hat: einfach kurz Bescheid sagen, dann stelle ich es hier gerne zur Verfügung.

                        Screenshot_20250724-222850.png Screenshot_20250724-222828.png

                        S Offline
                        S Offline
                        Semmy
                        wrote on last edited by
                        #354

                        @dispo112 Ich auch bitte: Bescheid:blush:

                        1 Reply Last reply
                        0
                        • icebearI Offline
                          icebearI Offline
                          icebear
                          wrote on last edited by icebear
                          #355

                          Ich auch Bescheid, bitte 😊

                          D 1 Reply Last reply
                          0
                          • icebearI icebear

                            Ich auch Bescheid, bitte 😊

                            D Offline
                            D Offline
                            dispo112
                            wrote on last edited by
                            #356

                            @icebear @oxident @Semmy
                            So, bitte schön. Die Ordnerpfade sind alle standard. Theoretisch könnt ihr das Skript importieren und starten, fertig. Alle neuen Datenpunkte werden im Userdata erzeugt und können dann via Lovelace / VIS abgegriffen werden.

                            /**
                            * Skript: PV-Tagesproduktion aus Senec-Datenpunkten
                            * Erstellt und summiert Wh- und kWh-Werte aus Live-Daten.
                            * Berücksichtigt PV-Leistung, Netzbezug/-einspeisung und Batterie-Laden/Entladen.
                            * 
                            * Erstellt nötige Datenpunkte automatisch, um Messwerte persistent zu speichern.
                            * 
                            * Letzte Anpassung: 23.07.2025
                            */
                            
                            // --- Konfiguration ---
                            
                            // Basis-Pfad für eigene Datenpunkte
                            const BASE_DP_PATH = '0_userdata.0.energy';
                            
                            // Datenpunkte vom Senec Adapter
                            const SENEC_PV_POWER = 'senec.0.ENERGY.GUI_INVERTER_POWER';       // Aktuelle PV-Leistung in Watt (alle 10s)
                            const SENEC_BAT_POWER = 'senec.0.ENERGY.GUI_BAT_DATA_POWER';       // Batterie Lade-/Entladeleistung in Watt (alle 10s), positiv = Laden, negativ = Entladen
                            const SENEC_GRID_POWER = 'senec.0.ENERGY.GUI_GRID_POW';            // Netzleistung in Watt (alle 10s), positiv = Netzbezug, negativ = Einspeisung
                            
                            // Datenpunkte zur Speicherung
                            const DP_PV_WH = `${BASE_DP_PATH}.pv_wh`;          // Tages-Wh PV
                            const DP_BAT_WH = `${BASE_DP_PATH}.bat_wh`;        // Tages-Wh Batterie (Netto Laden)
                            const DP_GRID_WH = `${BASE_DP_PATH}.netz_wh`;      // Tages-Wh Netzbezug
                            const DP_EINSPEISUNG_WH = `${BASE_DP_PATH}.einspeisung_wh`;  // Tages-Wh Einspeisung
                            
                            const DP_PV_KWH = `${BASE_DP_PATH}.pv_kwh`;        // Tages-kWh PV
                            const DP_BILANZ_KWH = `${BASE_DP_PATH}.bilanz_kwh`; // Bilanz kWh (PV - Netzbezug)
                            
                            // --- Variablen ---
                            let lastTimestamp = null;   // Timestamp letzte Messung
                            let lastPVPower = 0;        // Letzte gemessene PV-Leistung in Watt
                            let lastBatPower = 0;       // Letzte gemessene Batterieleistung in Watt
                            let lastGridPower = 0;      // Letzte gemessene Netzleistung in Watt
                            
                            // --- Hilfsfunktion: Sicherer State-Lesezugriff ---
                            function getStateSafe(id, defaultValue = 0) {
                               const state = getState(id);
                               if (state && state.val !== null && state.val !== undefined) {
                                   return state.val;
                               }
                               return defaultValue;
                            }
                            
                            // --- Ordner (Channel) anlegen, falls nicht vorhanden ---
                            if (!existsObject(BASE_DP_PATH)) {
                               createChannel(BASE_DP_PATH, 'Ordner für Energie-Datenpunkte', (err) => {
                                   if (err) {
                                       log(`Fehler beim Erstellen des Ordners ${BASE_DP_PATH}: ${err}`, 'error');
                                   } else {
                                       log(`Ordner ${BASE_DP_PATH} erfolgreich erstellt`, 'info');
                                   }
                               });
                            }
                            
                            // --- Datenpunkte anlegen, falls nicht vorhanden ---
                            function createStateIfNotExists(id, common, initialValue = 0) {
                               if (!existsState(id)) {
                                   createState(id, initialValue, common, (err) => {
                                       if (err) {
                                           log(`Fehler beim Erstellen des Datenpunkts ${id}: ${err}`, 'error');
                                       } else {
                                           log(`Datenpunkt ${id} erstellt mit Initialwert ${initialValue}`, 'info');
                                       }
                                   });
                               }
                            }
                            
                            // Definieren der Common-Objekte (Typ, Rolle usw.)
                            const commonWH = { name: 'Tageswert in Wattstunden (Wh)', type: 'number', role: 'value.power', unit: 'Wh', read: true, write: false };
                            const commonKWH = { name: 'Tageswert in Kilowattstunden (kWh)', type: 'number', role: 'value.power', unit: 'kWh', read: true, write: false };
                            
                            // Erstellen aller nötigen Datenpunkte
                            createStateIfNotExists(DP_PV_WH, commonWH);
                            createStateIfNotExists(DP_BAT_WH, commonWH);
                            createStateIfNotExists(DP_GRID_WH, commonWH);
                            createStateIfNotExists(DP_EINSPEISUNG_WH, commonWH);
                            createStateIfNotExists(DP_PV_KWH, commonKWH);
                            createStateIfNotExists(DP_BILANZ_KWH, commonKWH);
                            
                            // --- Hauptlogik: Verarbeitung der Messwerte und Integration in Wh ---
                            
                            // Funktion zum Verarbeiten neuer Messwerte
                            function processNewData(pvPower, batPower, gridPower) {
                               const jetzt = Date.now();
                            
                               if (lastTimestamp !== null) {
                                   const deltaT = (jetzt - lastTimestamp) / 1000; // Zeitdifferenz in Sekunden
                            
                                   // Energie (Wh) = Leistung (W) * Zeit (h)
                                   // deltaWh = W * (s / 3600)
                                   const deltaWhPV = lastPVPower * (deltaT / 3600);
                                   const deltaWhBat = lastBatPower * (deltaT / 3600);
                                   const deltaWhGrid = lastGridPower * (deltaT / 3600);
                            
                                   // Update der Tageswerte
                                   let pvWh = getStateSafe(DP_PV_WH);
                                   let batWh = getStateSafe(DP_BAT_WH);
                                   let gridWh = getStateSafe(DP_GRID_WH);
                                   let einspeisungWh = getStateSafe(DP_EINSPEISUNG_WH);
                            
                                   pvWh += deltaWhPV;
                            
                                   // Batterie: Nur Netto-Ladung (positive Leistung)
                                   if (deltaWhBat > 0) {
                                       batWh += deltaWhBat;
                                   } else {
                                       // Entladen wird nicht addiert, könnte separat behandelt werden
                                   }
                            
                                   // Netzbezug vs Einspeisung trennen:
                                   if (deltaWhGrid > 0) {
                                       gridWh += deltaWhGrid; // Netzbezug
                                   } else {
                                       einspeisungWh += Math.abs(deltaWhGrid); // Einspeisung
                                   }
                            
                                   // Datenpunkte aktualisieren
                                   setState(DP_PV_WH, pvWh, true);
                                   setState(DP_BAT_WH, batWh, true);
                                   setState(DP_GRID_WH, gridWh, true);
                                   setState(DP_EINSPEISUNG_WH, einspeisungWh, true);
                            
                                   // kWh berechnen und speichern
                                   setState(DP_PV_KWH, +(pvWh / 1000).toFixed(3), true);
                            
                                   // Bilanz: PV-Produktion minus Netzbezug (kWh)
                                   const bilanzKWh = (pvWh - gridWh) / 1000;
                                   setState(DP_BILANZ_KWH, +bilanzKWh.toFixed(3), true);
                               }
                            
                               // Update letzte Werte und Timestamp für nächste Berechnung
                               lastPVPower = pvPower;
                               lastBatPower = batPower;
                               lastGridPower = gridPower;
                               lastTimestamp = jetzt;
                            }
                            
                            // --- Event-Listener: Trigger bei Änderung eines relevanten Datenpunkts ---
                            
                            // Abonnieren aller 3 relevanten Datenpunkte, um schnell reagieren zu können
                            on({ id: [SENEC_PV_POWER, SENEC_BAT_POWER, SENEC_GRID_POWER], change: 'ne' }, () => {
                               const pvPower = getStateSafe(SENEC_PV_POWER);
                               const batPower = getStateSafe(SENEC_BAT_POWER);
                               const gridPower = getStateSafe(SENEC_GRID_POWER);
                            
                               processNewData(pvPower, batPower, gridPower);
                            });
                            
                            // --- Täglicher Reset der Tageswerte um Mitternacht ---
                            schedule('0 0 * * *', () => {
                               log('Tagesreset: Tageswerte auf 0 setzen.');
                               setState(DP_PV_WH, 0, true);
                               setState(DP_BAT_WH, 0, true);
                               setState(DP_GRID_WH, 0, true);
                               setState(DP_EINSPEISUNG_WH, 0, true);
                               setState(DP_PV_KWH, 0, true);
                               setState(DP_BILANZ_KWH, 0, true);
                            
                               // Reset lokale Variablen ebenfalls
                               lastTimestamp = null;
                               lastPVPower = 0;
                               lastBatPower = 0;
                               lastGridPower = 0;
                            });
                            
                            // --- Skriptstart ---
                            log('PV-Tagesproduktion mit Senec Datenpunkten gestartet.');
                            
                            

                            icebearI 1 Reply Last reply
                            1
                            • D dispo112

                              @icebear @oxident @Semmy
                              So, bitte schön. Die Ordnerpfade sind alle standard. Theoretisch könnt ihr das Skript importieren und starten, fertig. Alle neuen Datenpunkte werden im Userdata erzeugt und können dann via Lovelace / VIS abgegriffen werden.

                              /**
                              * Skript: PV-Tagesproduktion aus Senec-Datenpunkten
                              * Erstellt und summiert Wh- und kWh-Werte aus Live-Daten.
                              * Berücksichtigt PV-Leistung, Netzbezug/-einspeisung und Batterie-Laden/Entladen.
                              * 
                              * Erstellt nötige Datenpunkte automatisch, um Messwerte persistent zu speichern.
                              * 
                              * Letzte Anpassung: 23.07.2025
                              */
                              
                              // --- Konfiguration ---
                              
                              // Basis-Pfad für eigene Datenpunkte
                              const BASE_DP_PATH = '0_userdata.0.energy';
                              
                              // Datenpunkte vom Senec Adapter
                              const SENEC_PV_POWER = 'senec.0.ENERGY.GUI_INVERTER_POWER';       // Aktuelle PV-Leistung in Watt (alle 10s)
                              const SENEC_BAT_POWER = 'senec.0.ENERGY.GUI_BAT_DATA_POWER';       // Batterie Lade-/Entladeleistung in Watt (alle 10s), positiv = Laden, negativ = Entladen
                              const SENEC_GRID_POWER = 'senec.0.ENERGY.GUI_GRID_POW';            // Netzleistung in Watt (alle 10s), positiv = Netzbezug, negativ = Einspeisung
                              
                              // Datenpunkte zur Speicherung
                              const DP_PV_WH = `${BASE_DP_PATH}.pv_wh`;          // Tages-Wh PV
                              const DP_BAT_WH = `${BASE_DP_PATH}.bat_wh`;        // Tages-Wh Batterie (Netto Laden)
                              const DP_GRID_WH = `${BASE_DP_PATH}.netz_wh`;      // Tages-Wh Netzbezug
                              const DP_EINSPEISUNG_WH = `${BASE_DP_PATH}.einspeisung_wh`;  // Tages-Wh Einspeisung
                              
                              const DP_PV_KWH = `${BASE_DP_PATH}.pv_kwh`;        // Tages-kWh PV
                              const DP_BILANZ_KWH = `${BASE_DP_PATH}.bilanz_kwh`; // Bilanz kWh (PV - Netzbezug)
                              
                              // --- Variablen ---
                              let lastTimestamp = null;   // Timestamp letzte Messung
                              let lastPVPower = 0;        // Letzte gemessene PV-Leistung in Watt
                              let lastBatPower = 0;       // Letzte gemessene Batterieleistung in Watt
                              let lastGridPower = 0;      // Letzte gemessene Netzleistung in Watt
                              
                              // --- Hilfsfunktion: Sicherer State-Lesezugriff ---
                              function getStateSafe(id, defaultValue = 0) {
                                 const state = getState(id);
                                 if (state && state.val !== null && state.val !== undefined) {
                                     return state.val;
                                 }
                                 return defaultValue;
                              }
                              
                              // --- Ordner (Channel) anlegen, falls nicht vorhanden ---
                              if (!existsObject(BASE_DP_PATH)) {
                                 createChannel(BASE_DP_PATH, 'Ordner für Energie-Datenpunkte', (err) => {
                                     if (err) {
                                         log(`Fehler beim Erstellen des Ordners ${BASE_DP_PATH}: ${err}`, 'error');
                                     } else {
                                         log(`Ordner ${BASE_DP_PATH} erfolgreich erstellt`, 'info');
                                     }
                                 });
                              }
                              
                              // --- Datenpunkte anlegen, falls nicht vorhanden ---
                              function createStateIfNotExists(id, common, initialValue = 0) {
                                 if (!existsState(id)) {
                                     createState(id, initialValue, common, (err) => {
                                         if (err) {
                                             log(`Fehler beim Erstellen des Datenpunkts ${id}: ${err}`, 'error');
                                         } else {
                                             log(`Datenpunkt ${id} erstellt mit Initialwert ${initialValue}`, 'info');
                                         }
                                     });
                                 }
                              }
                              
                              // Definieren der Common-Objekte (Typ, Rolle usw.)
                              const commonWH = { name: 'Tageswert in Wattstunden (Wh)', type: 'number', role: 'value.power', unit: 'Wh', read: true, write: false };
                              const commonKWH = { name: 'Tageswert in Kilowattstunden (kWh)', type: 'number', role: 'value.power', unit: 'kWh', read: true, write: false };
                              
                              // Erstellen aller nötigen Datenpunkte
                              createStateIfNotExists(DP_PV_WH, commonWH);
                              createStateIfNotExists(DP_BAT_WH, commonWH);
                              createStateIfNotExists(DP_GRID_WH, commonWH);
                              createStateIfNotExists(DP_EINSPEISUNG_WH, commonWH);
                              createStateIfNotExists(DP_PV_KWH, commonKWH);
                              createStateIfNotExists(DP_BILANZ_KWH, commonKWH);
                              
                              // --- Hauptlogik: Verarbeitung der Messwerte und Integration in Wh ---
                              
                              // Funktion zum Verarbeiten neuer Messwerte
                              function processNewData(pvPower, batPower, gridPower) {
                                 const jetzt = Date.now();
                              
                                 if (lastTimestamp !== null) {
                                     const deltaT = (jetzt - lastTimestamp) / 1000; // Zeitdifferenz in Sekunden
                              
                                     // Energie (Wh) = Leistung (W) * Zeit (h)
                                     // deltaWh = W * (s / 3600)
                                     const deltaWhPV = lastPVPower * (deltaT / 3600);
                                     const deltaWhBat = lastBatPower * (deltaT / 3600);
                                     const deltaWhGrid = lastGridPower * (deltaT / 3600);
                              
                                     // Update der Tageswerte
                                     let pvWh = getStateSafe(DP_PV_WH);
                                     let batWh = getStateSafe(DP_BAT_WH);
                                     let gridWh = getStateSafe(DP_GRID_WH);
                                     let einspeisungWh = getStateSafe(DP_EINSPEISUNG_WH);
                              
                                     pvWh += deltaWhPV;
                              
                                     // Batterie: Nur Netto-Ladung (positive Leistung)
                                     if (deltaWhBat > 0) {
                                         batWh += deltaWhBat;
                                     } else {
                                         // Entladen wird nicht addiert, könnte separat behandelt werden
                                     }
                              
                                     // Netzbezug vs Einspeisung trennen:
                                     if (deltaWhGrid > 0) {
                                         gridWh += deltaWhGrid; // Netzbezug
                                     } else {
                                         einspeisungWh += Math.abs(deltaWhGrid); // Einspeisung
                                     }
                              
                                     // Datenpunkte aktualisieren
                                     setState(DP_PV_WH, pvWh, true);
                                     setState(DP_BAT_WH, batWh, true);
                                     setState(DP_GRID_WH, gridWh, true);
                                     setState(DP_EINSPEISUNG_WH, einspeisungWh, true);
                              
                                     // kWh berechnen und speichern
                                     setState(DP_PV_KWH, +(pvWh / 1000).toFixed(3), true);
                              
                                     // Bilanz: PV-Produktion minus Netzbezug (kWh)
                                     const bilanzKWh = (pvWh - gridWh) / 1000;
                                     setState(DP_BILANZ_KWH, +bilanzKWh.toFixed(3), true);
                                 }
                              
                                 // Update letzte Werte und Timestamp für nächste Berechnung
                                 lastPVPower = pvPower;
                                 lastBatPower = batPower;
                                 lastGridPower = gridPower;
                                 lastTimestamp = jetzt;
                              }
                              
                              // --- Event-Listener: Trigger bei Änderung eines relevanten Datenpunkts ---
                              
                              // Abonnieren aller 3 relevanten Datenpunkte, um schnell reagieren zu können
                              on({ id: [SENEC_PV_POWER, SENEC_BAT_POWER, SENEC_GRID_POWER], change: 'ne' }, () => {
                                 const pvPower = getStateSafe(SENEC_PV_POWER);
                                 const batPower = getStateSafe(SENEC_BAT_POWER);
                                 const gridPower = getStateSafe(SENEC_GRID_POWER);
                              
                                 processNewData(pvPower, batPower, gridPower);
                              });
                              
                              // --- Täglicher Reset der Tageswerte um Mitternacht ---
                              schedule('0 0 * * *', () => {
                                 log('Tagesreset: Tageswerte auf 0 setzen.');
                                 setState(DP_PV_WH, 0, true);
                                 setState(DP_BAT_WH, 0, true);
                                 setState(DP_GRID_WH, 0, true);
                                 setState(DP_EINSPEISUNG_WH, 0, true);
                                 setState(DP_PV_KWH, 0, true);
                                 setState(DP_BILANZ_KWH, 0, true);
                              
                                 // Reset lokale Variablen ebenfalls
                                 lastTimestamp = null;
                                 lastPVPower = 0;
                                 lastBatPower = 0;
                                 lastGridPower = 0;
                              });
                              
                              // --- Skriptstart ---
                              log('PV-Tagesproduktion mit Senec Datenpunkten gestartet.');
                              
                              

                              icebearI Offline
                              icebearI Offline
                              icebear
                              wrote on last edited by
                              #357

                              @dispo112

                              Erst einmal vielen Dank für das Script.

                              Leider bekomme ich einen Fehler beim Starten vom Script.

                              javascript.0	08:39:18.506	info	
                              Start JavaScript script.js.Energie_Strom.Senec.senec_tageswerte (Javascript/js)
                              javascript.0	08:39:18.543	error	
                              ReferenceError: createChannel is not defined
                              javascript.0	08:39:18.543	error	
                                  at script.js.Energie_Strom.Senec.senec_tageswerte:48:4
                              javascript.0	08:39:18.544	error	
                                  at script.js.Energie_Strom.Senec.senec_tageswerte:174:3
                              
                              S 1 Reply Last reply
                              0
                              • icebearI icebear

                                @dispo112

                                Erst einmal vielen Dank für das Script.

                                Leider bekomme ich einen Fehler beim Starten vom Script.

                                javascript.0	08:39:18.506	info	
                                Start JavaScript script.js.Energie_Strom.Senec.senec_tageswerte (Javascript/js)
                                javascript.0	08:39:18.543	error	
                                ReferenceError: createChannel is not defined
                                javascript.0	08:39:18.543	error	
                                    at script.js.Energie_Strom.Senec.senec_tageswerte:48:4
                                javascript.0	08:39:18.544	error	
                                    at script.js.Energie_Strom.Senec.senec_tageswerte:174:3
                                
                                S Offline
                                S Offline
                                Semmy
                                wrote on last edited by
                                #358

                                @icebear Ich bekomme den gleichen Fehler.

                                D 1 Reply Last reply
                                0
                                • S Semmy

                                  @icebear Ich bekomme den gleichen Fehler.

                                  D Offline
                                  D Offline
                                  dispo112
                                  wrote on last edited by
                                  #359

                                  @oxident
                                  Wenn ihr das Skript nochmal startet - taucht der Fehler dann wieder auf? Oder nur beim Initial Start?

                                  icebearI S 2 Replies Last reply
                                  0
                                  • D dispo112

                                    @oxident
                                    Wenn ihr das Skript nochmal startet - taucht der Fehler dann wieder auf? Oder nur beim Initial Start?

                                    icebearI Offline
                                    icebearI Offline
                                    icebear
                                    wrote on last edited by
                                    #360

                                    @dispo112

                                    Der Fehler kommt auch nach einem erneuten Start des Script.

                                    1 Reply Last reply
                                    0
                                    • D dispo112

                                      @oxident
                                      Wenn ihr das Skript nochmal startet - taucht der Fehler dann wieder auf? Oder nur beim Initial Start?

                                      S Offline
                                      S Offline
                                      Semmy
                                      wrote on last edited by
                                      #361

                                      @dispo112 Der Fehler kommt immer wieder.

                                      D 1 Reply Last reply
                                      0
                                      • S Semmy

                                        @dispo112 Der Fehler kommt immer wieder.

                                        D Offline
                                        D Offline
                                        dispo112
                                        wrote on last edited by
                                        #362

                                        @semmy Seltsam, hatte alle Fehler behoben und es jetzt 1:1 bei mir herauskopiert. 🤔

                                        Schaue ich mir nachher an!

                                        icebearI 1 Reply Last reply
                                        0
                                        • D dispo112

                                          @semmy Seltsam, hatte alle Fehler behoben und es jetzt 1:1 bei mir herauskopiert. 🤔

                                          Schaue ich mir nachher an!

                                          icebearI Offline
                                          icebearI Offline
                                          icebear
                                          wrote on last edited by
                                          #363

                                          @dispo112

                                          Ich glaub es reicht wenn du 'createChannel' durch 'createState' ersetzt.

                                          // --- Ordner (Channel) anlegen, falls nicht vorhanden ---
                                          if (!existsObject(BASE_DP_PATH)) {
                                             createState(BASE_DP_PATH, 'Ordner für Energie-Datenpunkte', (err) => {
                                                 if (err) {
                                                     log(`Fehler beim Erstellen des Ordners ${BASE_DP_PATH}: ${err}`, 'error');
                                                 } else {
                                                     log(`Ordner ${BASE_DP_PATH} erfolgreich erstellt`, 'info');
                                                 }
                                             });
                                          }
                                          
                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          431

                                          Online

                                          32.7k

                                          Users

                                          82.6k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Home
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe