Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. English
  3. Scripting / Logic
  4. JavaScript
  5. [Vorlage] Script: JSON-->Datenpunkte mit sync

NEWS

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    8
    1
    340

  • Verwendung von KI bitte immer deutlich kennzeichnen
    HomoranH
    Homoran
    10
    1
    306

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    931

[Vorlage] Script: JSON-->Datenpunkte mit sync

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascriptmonitoring
9 Beiträge 4 Kommentatoren 1.6k Aufrufe 3 Beobachtet
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • A Online
    A Online
    Ahnungsbefreit
    schrieb am zuletzt editiert von
    #1

    Hallo zusammen,

    ich beschäftige mich seit einiger Zeit damit, Daten aus meiner ENPHASE Photovoltaik Anlage zu extrahieren und damit dann die üblichen "smarten" Sachen zu machen wie Visualisierung, Statistik, Überschussladen etc.

    Nach einigem Experimentieren bin ich als einzig wirklich zielführende Lösung bei einem Plugin für Homebridge gelandet, das aber leider nicht über den HAM Adapter funktioniert (es könnte etwas damit zu tun haben, dass das Plugin eine "Child Bridge" startet, aber das ist eine andere Diskussion) sondern nur über eine eigenständige Homebridge Instanz in einer eigenen VM und diese liefert dann über MQTT richtig viele Daten, verteilt auf 12 Datenpunkte mit JSON Struktur und jeder dieser JSON-Sätze hat zwischen 4 und etwa 50 Attribute. Das ist schön, aber etwas unhandlich für die Weiterverarbeitung. Zudem habe ich keine Doku für die Struktur gefunden und muss öfter mal andere Datenpunkte versuchsweise auswerten, um die Richtigen zu finden.

    Lange Rede, kurzer Sinn: Aus dieser Aufgabe ist ein einfaches JavaScript enstanden, das das Extrahieren solcher Daten und Abbilden auf eigene Datenpunkte vereinfacht, in dem man die zu extrahierenden Daten in eine Array von Objekten einträgt, Quell- und Zielpfad definiert und das Script startet.

    Danach werden die Zieldatenpunkte angelegt, wenn sie nicht schon existieren und über einen "$elektor" ein Trigger erzeugt, der dann dafür sorgt, dass die eigenen Datenpunkte immer aktualisiert werden, wenn neue JSON Daten geliefert worden sind. Da das schnell recht viel Ressourcen ziehen kann bei den Datenmengen habe ich das noch etwas optimiert, um nur dann die ganze Liste der Datenpunkte auf mögliche Aktualisierungen abzuklappern, wenn mindestens einer der relevanten JSON Datenpunkte aktualisiert wurde. Ich prüfe im Script nicht, welcher der Datenpunkte innerhalb des JSON geändert wurde, sondern aktualisiere/ändere immer alle Datenpunkte, die aus diesem JSON "gefüttert" werden.

    Vielleicht kann das ja auch für Andere nützlich sein, ich wollte gerne der Community mal etwas zurück geben auf diesem Weg. Details zu ENPHASE demnächst in einem eigenen Thread.

    'use strict';
    
    const mqttPath = 'mqtt.0.envoy.Envoy-S.';   // Quellpfad mit den JSON Daten, muss nicht aus MQTT kommen
    const userPath = '0_userdata.0.envoy.';     // Zielpfad für die Datenpunkte, die einzelne Attribute der JSON Struktur repräsentieren
    
    /*  Beispiel: Wenn "mqtt.0.envoy.Envoy-S.Production" enthält
    {
      "wattHoursToday": 2765,
      "wattHoursSevenDays": 25747,
      "wattsNow": 1601
    }
    
    und wenn man diese Werte unter 0_userdata.0.envoy.Production.wattHoursSevenDays usw. in eigene Datenpunkte schreiben möchte, dann könnte das Array
    mit den Objekten wie folgt aussehen:
    
    const mapArr = [
        { topic: 'Production', attr: 'wattHoursSevenDays', dpId: 'Production.wattHoursSevenDays', dpType: 'number', dpUnit: 'Wh', dpDef:0, dpFactor:0 },
        { topic: 'Production', attr: 'wattHoursLifetime', dpId: 'Production.wattHoursLifetime', dpType: 'number', dpUnit: 'Wh', dpDef:0, dpFactor:0 },
        { topic: 'Production', attr: 'wattsNow', dpId: 'Production.wattsNow', dpType: 'number', dpUnit: 'W', dpDef:0, dpFactor:0 },
    ];
    
    Dabei haben die Attribute die folgende Bedeutung:
    
    topic:          Der letzte Teil des Namens des Datenpunktes, auf den getriggert werden soll, also der Teil nach dem, was in mqttPath steht.
                    Bitte beachten, dass dies wirklich ein Datenpunkt sein muss, kein Folder/Channel etc.
    attr:           Das JSON Attribut, das gelesen werden soll
    dpID:           Der letzte Teil des Namens des Datenpunktes, in den geschrieben werden soll, also der Teil nach dem, was in userPath steht
    dpType:         Typ des zu schreibenden Datenpunktes, also z.B. 'number', 'string', 'boolean'
    dpUnit:         Einheit des zu schreibenden Datenpunktes, also z.B. 'Wh', 'V'
    dpDef:          Der Default Wert des zu schreibenden Datenpunktes, mit dem der Datenpunkt initialisiert wird
    dpFactor:       Für Datenpunkte vom Typ Number ein Faktor, mit dem Quellwert multipliziert wird. Damit kann man z.B. von Watt in Kilowatt umrechnen
                    oder auch das Vorzeichen umdrehen. ACHTUNG: Für alle anderen Typen von Datenpunkten MUSS hier eine 0 stehen!
    
    */
    
    // Hier die JSON Daten eintragen, die unter "<userPath>.<dpId>" gespeichert werden sollen und die Beispieldaten rauswerfen
    
    const mapArr = [
        { topic: 'Production', attr: 'wattHoursSevenDays', dpId: 'Production.wattHoursSevenDays', dpType: 'number', dpUnit: 'Wh', dpDef:0, dpFactor:0 },
        { topic: 'Production', attr: 'wattHoursLifetime', dpId: 'Production.wattHoursLifetime', dpType: 'number', dpUnit: 'Wh', dpDef:0, dpFactor:0 },
        { topic: 'Production', attr: 'wattsNow', dpId: 'Production.wattsNow', dpType: 'number', dpUnit: 'W', dpDef:0, dpFactor:0 },
    ];
    
    // Ab hier nichts mehr ändern!
    
    
    let uniqueListOfTopics =  new Set();
    
    // Datenpunkte anlegen, wenn noch nicht vorhanden
    for (const [i,e] of mapArr.entries()){
        createState(`${userPath+e.dpId}`, { name: `${e.dpId}`,  type: `${e.dpType}`, unit: `${e.dpUnit}`, def: `${e.dpDef}`});
        uniqueListOfTopics.add(e.topic);
        // log(`${userPath+userPrefix+e.dpId}`);
    }
    
    $(`state[id=${mqttPath}*]`).on(async function (obj) {
      const value = obj.state.val;
      const topic = obj.id.split('.').pop();
      // log(topic);
        if (uniqueListOfTopics.has(topic)) {
            for (const [i,e] of mapArr.entries()){
                if(e.topic === topic){
                    // log(topic);
                    const valToRead= getAttr((function () { 
                            try {return JSON.parse(value);} 
                            catch(e) {return {};}
                    })(), e.attr);
                    // log(valToRead);
                    setState(`${userPath+e.dpId}`, e.dpFactor? valToRead * e.dpFactor : valToRead , false);
                }
            }
        }
    });
    
    
    
    

    Wenn meine Antwort hilfreich war, dürft Ihr das gerne durch einen "Upvote" (der kleine "^" unten rechts) zum Ausdruck bringen.

    OliverIOO C 2 Antworten Letzte Antwort
    2
    • A Ahnungsbefreit

      Hallo zusammen,

      ich beschäftige mich seit einiger Zeit damit, Daten aus meiner ENPHASE Photovoltaik Anlage zu extrahieren und damit dann die üblichen "smarten" Sachen zu machen wie Visualisierung, Statistik, Überschussladen etc.

      Nach einigem Experimentieren bin ich als einzig wirklich zielführende Lösung bei einem Plugin für Homebridge gelandet, das aber leider nicht über den HAM Adapter funktioniert (es könnte etwas damit zu tun haben, dass das Plugin eine "Child Bridge" startet, aber das ist eine andere Diskussion) sondern nur über eine eigenständige Homebridge Instanz in einer eigenen VM und diese liefert dann über MQTT richtig viele Daten, verteilt auf 12 Datenpunkte mit JSON Struktur und jeder dieser JSON-Sätze hat zwischen 4 und etwa 50 Attribute. Das ist schön, aber etwas unhandlich für die Weiterverarbeitung. Zudem habe ich keine Doku für die Struktur gefunden und muss öfter mal andere Datenpunkte versuchsweise auswerten, um die Richtigen zu finden.

      Lange Rede, kurzer Sinn: Aus dieser Aufgabe ist ein einfaches JavaScript enstanden, das das Extrahieren solcher Daten und Abbilden auf eigene Datenpunkte vereinfacht, in dem man die zu extrahierenden Daten in eine Array von Objekten einträgt, Quell- und Zielpfad definiert und das Script startet.

      Danach werden die Zieldatenpunkte angelegt, wenn sie nicht schon existieren und über einen "$elektor" ein Trigger erzeugt, der dann dafür sorgt, dass die eigenen Datenpunkte immer aktualisiert werden, wenn neue JSON Daten geliefert worden sind. Da das schnell recht viel Ressourcen ziehen kann bei den Datenmengen habe ich das noch etwas optimiert, um nur dann die ganze Liste der Datenpunkte auf mögliche Aktualisierungen abzuklappern, wenn mindestens einer der relevanten JSON Datenpunkte aktualisiert wurde. Ich prüfe im Script nicht, welcher der Datenpunkte innerhalb des JSON geändert wurde, sondern aktualisiere/ändere immer alle Datenpunkte, die aus diesem JSON "gefüttert" werden.

      Vielleicht kann das ja auch für Andere nützlich sein, ich wollte gerne der Community mal etwas zurück geben auf diesem Weg. Details zu ENPHASE demnächst in einem eigenen Thread.

      'use strict';
      
      const mqttPath = 'mqtt.0.envoy.Envoy-S.';   // Quellpfad mit den JSON Daten, muss nicht aus MQTT kommen
      const userPath = '0_userdata.0.envoy.';     // Zielpfad für die Datenpunkte, die einzelne Attribute der JSON Struktur repräsentieren
      
      /*  Beispiel: Wenn "mqtt.0.envoy.Envoy-S.Production" enthält
      {
        "wattHoursToday": 2765,
        "wattHoursSevenDays": 25747,
        "wattsNow": 1601
      }
      
      und wenn man diese Werte unter 0_userdata.0.envoy.Production.wattHoursSevenDays usw. in eigene Datenpunkte schreiben möchte, dann könnte das Array
      mit den Objekten wie folgt aussehen:
      
      const mapArr = [
          { topic: 'Production', attr: 'wattHoursSevenDays', dpId: 'Production.wattHoursSevenDays', dpType: 'number', dpUnit: 'Wh', dpDef:0, dpFactor:0 },
          { topic: 'Production', attr: 'wattHoursLifetime', dpId: 'Production.wattHoursLifetime', dpType: 'number', dpUnit: 'Wh', dpDef:0, dpFactor:0 },
          { topic: 'Production', attr: 'wattsNow', dpId: 'Production.wattsNow', dpType: 'number', dpUnit: 'W', dpDef:0, dpFactor:0 },
      ];
      
      Dabei haben die Attribute die folgende Bedeutung:
      
      topic:          Der letzte Teil des Namens des Datenpunktes, auf den getriggert werden soll, also der Teil nach dem, was in mqttPath steht.
                      Bitte beachten, dass dies wirklich ein Datenpunkt sein muss, kein Folder/Channel etc.
      attr:           Das JSON Attribut, das gelesen werden soll
      dpID:           Der letzte Teil des Namens des Datenpunktes, in den geschrieben werden soll, also der Teil nach dem, was in userPath steht
      dpType:         Typ des zu schreibenden Datenpunktes, also z.B. 'number', 'string', 'boolean'
      dpUnit:         Einheit des zu schreibenden Datenpunktes, also z.B. 'Wh', 'V'
      dpDef:          Der Default Wert des zu schreibenden Datenpunktes, mit dem der Datenpunkt initialisiert wird
      dpFactor:       Für Datenpunkte vom Typ Number ein Faktor, mit dem Quellwert multipliziert wird. Damit kann man z.B. von Watt in Kilowatt umrechnen
                      oder auch das Vorzeichen umdrehen. ACHTUNG: Für alle anderen Typen von Datenpunkten MUSS hier eine 0 stehen!
      
      */
      
      // Hier die JSON Daten eintragen, die unter "<userPath>.<dpId>" gespeichert werden sollen und die Beispieldaten rauswerfen
      
      const mapArr = [
          { topic: 'Production', attr: 'wattHoursSevenDays', dpId: 'Production.wattHoursSevenDays', dpType: 'number', dpUnit: 'Wh', dpDef:0, dpFactor:0 },
          { topic: 'Production', attr: 'wattHoursLifetime', dpId: 'Production.wattHoursLifetime', dpType: 'number', dpUnit: 'Wh', dpDef:0, dpFactor:0 },
          { topic: 'Production', attr: 'wattsNow', dpId: 'Production.wattsNow', dpType: 'number', dpUnit: 'W', dpDef:0, dpFactor:0 },
      ];
      
      // Ab hier nichts mehr ändern!
      
      
      let uniqueListOfTopics =  new Set();
      
      // Datenpunkte anlegen, wenn noch nicht vorhanden
      for (const [i,e] of mapArr.entries()){
          createState(`${userPath+e.dpId}`, { name: `${e.dpId}`,  type: `${e.dpType}`, unit: `${e.dpUnit}`, def: `${e.dpDef}`});
          uniqueListOfTopics.add(e.topic);
          // log(`${userPath+userPrefix+e.dpId}`);
      }
      
      $(`state[id=${mqttPath}*]`).on(async function (obj) {
        const value = obj.state.val;
        const topic = obj.id.split('.').pop();
        // log(topic);
          if (uniqueListOfTopics.has(topic)) {
              for (const [i,e] of mapArr.entries()){
                  if(e.topic === topic){
                      // log(topic);
                      const valToRead= getAttr((function () { 
                              try {return JSON.parse(value);} 
                              catch(e) {return {};}
                      })(), e.attr);
                      // log(valToRead);
                      setState(`${userPath+e.dpId}`, e.dpFactor? valToRead * e.dpFactor : valToRead , false);
                  }
              }
          }
      });
      
      
      
      
      OliverIOO Offline
      OliverIOO Offline
      OliverIO
      schrieb am zuletzt editiert von OliverIO
      #2

      @ahnungsbefreit

      um das wirklich multifunktional zu machen, könnten man

      1. den Wert mapArr.attr als JSONata-Ausdruck definieren, so das der Quellwert aus einer beliebig tief verschachtelten JSON-Struktur kommen kann. so kann es nur Werte aus nur einer Ebene des Objektes lesen.

      2. Mit der folgenden Bibliothek die Differenz zwischen dem letzten JSON und dem aktuellen ziehen und nur die Werte überhaupt behandeln, die sich seit dem letzten mal geändert haben.
        https://www.npmjs.com/package/deep-object-diff

      Meine Adapter und Widgets
      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
      Links im Profil

      A 1 Antwort Letzte Antwort
      0
      • OliverIOO OliverIO

        @ahnungsbefreit

        um das wirklich multifunktional zu machen, könnten man

        1. den Wert mapArr.attr als JSONata-Ausdruck definieren, so das der Quellwert aus einer beliebig tief verschachtelten JSON-Struktur kommen kann. so kann es nur Werte aus nur einer Ebene des Objektes lesen.

        2. Mit der folgenden Bibliothek die Differenz zwischen dem letzten JSON und dem aktuellen ziehen und nur die Werte überhaupt behandeln, die sich seit dem letzten mal geändert haben.
          https://www.npmjs.com/package/deep-object-diff

        A Online
        A Online
        Ahnungsbefreit
        schrieb am zuletzt editiert von
        #3

        @oliverio Gute Ideen, das behalte ich mal im Hinterkopf...

        Wenn meine Antwort hilfreich war, dürft Ihr das gerne durch einen "Upvote" (der kleine "^" unten rechts) zum Ausdruck bringen.

        1 Antwort Letzte Antwort
        0
        • A Ahnungsbefreit

          Hallo zusammen,

          ich beschäftige mich seit einiger Zeit damit, Daten aus meiner ENPHASE Photovoltaik Anlage zu extrahieren und damit dann die üblichen "smarten" Sachen zu machen wie Visualisierung, Statistik, Überschussladen etc.

          Nach einigem Experimentieren bin ich als einzig wirklich zielführende Lösung bei einem Plugin für Homebridge gelandet, das aber leider nicht über den HAM Adapter funktioniert (es könnte etwas damit zu tun haben, dass das Plugin eine "Child Bridge" startet, aber das ist eine andere Diskussion) sondern nur über eine eigenständige Homebridge Instanz in einer eigenen VM und diese liefert dann über MQTT richtig viele Daten, verteilt auf 12 Datenpunkte mit JSON Struktur und jeder dieser JSON-Sätze hat zwischen 4 und etwa 50 Attribute. Das ist schön, aber etwas unhandlich für die Weiterverarbeitung. Zudem habe ich keine Doku für die Struktur gefunden und muss öfter mal andere Datenpunkte versuchsweise auswerten, um die Richtigen zu finden.

          Lange Rede, kurzer Sinn: Aus dieser Aufgabe ist ein einfaches JavaScript enstanden, das das Extrahieren solcher Daten und Abbilden auf eigene Datenpunkte vereinfacht, in dem man die zu extrahierenden Daten in eine Array von Objekten einträgt, Quell- und Zielpfad definiert und das Script startet.

          Danach werden die Zieldatenpunkte angelegt, wenn sie nicht schon existieren und über einen "$elektor" ein Trigger erzeugt, der dann dafür sorgt, dass die eigenen Datenpunkte immer aktualisiert werden, wenn neue JSON Daten geliefert worden sind. Da das schnell recht viel Ressourcen ziehen kann bei den Datenmengen habe ich das noch etwas optimiert, um nur dann die ganze Liste der Datenpunkte auf mögliche Aktualisierungen abzuklappern, wenn mindestens einer der relevanten JSON Datenpunkte aktualisiert wurde. Ich prüfe im Script nicht, welcher der Datenpunkte innerhalb des JSON geändert wurde, sondern aktualisiere/ändere immer alle Datenpunkte, die aus diesem JSON "gefüttert" werden.

          Vielleicht kann das ja auch für Andere nützlich sein, ich wollte gerne der Community mal etwas zurück geben auf diesem Weg. Details zu ENPHASE demnächst in einem eigenen Thread.

          'use strict';
          
          const mqttPath = 'mqtt.0.envoy.Envoy-S.';   // Quellpfad mit den JSON Daten, muss nicht aus MQTT kommen
          const userPath = '0_userdata.0.envoy.';     // Zielpfad für die Datenpunkte, die einzelne Attribute der JSON Struktur repräsentieren
          
          /*  Beispiel: Wenn "mqtt.0.envoy.Envoy-S.Production" enthält
          {
            "wattHoursToday": 2765,
            "wattHoursSevenDays": 25747,
            "wattsNow": 1601
          }
          
          und wenn man diese Werte unter 0_userdata.0.envoy.Production.wattHoursSevenDays usw. in eigene Datenpunkte schreiben möchte, dann könnte das Array
          mit den Objekten wie folgt aussehen:
          
          const mapArr = [
              { topic: 'Production', attr: 'wattHoursSevenDays', dpId: 'Production.wattHoursSevenDays', dpType: 'number', dpUnit: 'Wh', dpDef:0, dpFactor:0 },
              { topic: 'Production', attr: 'wattHoursLifetime', dpId: 'Production.wattHoursLifetime', dpType: 'number', dpUnit: 'Wh', dpDef:0, dpFactor:0 },
              { topic: 'Production', attr: 'wattsNow', dpId: 'Production.wattsNow', dpType: 'number', dpUnit: 'W', dpDef:0, dpFactor:0 },
          ];
          
          Dabei haben die Attribute die folgende Bedeutung:
          
          topic:          Der letzte Teil des Namens des Datenpunktes, auf den getriggert werden soll, also der Teil nach dem, was in mqttPath steht.
                          Bitte beachten, dass dies wirklich ein Datenpunkt sein muss, kein Folder/Channel etc.
          attr:           Das JSON Attribut, das gelesen werden soll
          dpID:           Der letzte Teil des Namens des Datenpunktes, in den geschrieben werden soll, also der Teil nach dem, was in userPath steht
          dpType:         Typ des zu schreibenden Datenpunktes, also z.B. 'number', 'string', 'boolean'
          dpUnit:         Einheit des zu schreibenden Datenpunktes, also z.B. 'Wh', 'V'
          dpDef:          Der Default Wert des zu schreibenden Datenpunktes, mit dem der Datenpunkt initialisiert wird
          dpFactor:       Für Datenpunkte vom Typ Number ein Faktor, mit dem Quellwert multipliziert wird. Damit kann man z.B. von Watt in Kilowatt umrechnen
                          oder auch das Vorzeichen umdrehen. ACHTUNG: Für alle anderen Typen von Datenpunkten MUSS hier eine 0 stehen!
          
          */
          
          // Hier die JSON Daten eintragen, die unter "<userPath>.<dpId>" gespeichert werden sollen und die Beispieldaten rauswerfen
          
          const mapArr = [
              { topic: 'Production', attr: 'wattHoursSevenDays', dpId: 'Production.wattHoursSevenDays', dpType: 'number', dpUnit: 'Wh', dpDef:0, dpFactor:0 },
              { topic: 'Production', attr: 'wattHoursLifetime', dpId: 'Production.wattHoursLifetime', dpType: 'number', dpUnit: 'Wh', dpDef:0, dpFactor:0 },
              { topic: 'Production', attr: 'wattsNow', dpId: 'Production.wattsNow', dpType: 'number', dpUnit: 'W', dpDef:0, dpFactor:0 },
          ];
          
          // Ab hier nichts mehr ändern!
          
          
          let uniqueListOfTopics =  new Set();
          
          // Datenpunkte anlegen, wenn noch nicht vorhanden
          for (const [i,e] of mapArr.entries()){
              createState(`${userPath+e.dpId}`, { name: `${e.dpId}`,  type: `${e.dpType}`, unit: `${e.dpUnit}`, def: `${e.dpDef}`});
              uniqueListOfTopics.add(e.topic);
              // log(`${userPath+userPrefix+e.dpId}`);
          }
          
          $(`state[id=${mqttPath}*]`).on(async function (obj) {
            const value = obj.state.val;
            const topic = obj.id.split('.').pop();
            // log(topic);
              if (uniqueListOfTopics.has(topic)) {
                  for (const [i,e] of mapArr.entries()){
                      if(e.topic === topic){
                          // log(topic);
                          const valToRead= getAttr((function () { 
                                  try {return JSON.parse(value);} 
                                  catch(e) {return {};}
                          })(), e.attr);
                          // log(valToRead);
                          setState(`${userPath+e.dpId}`, e.dpFactor? valToRead * e.dpFactor : valToRead , false);
                      }
                  }
              }
          });
          
          
          
          
          C Online
          C Online
          c1olli
          schrieb am zuletzt editiert von
          #4

          @Ahnungsbefreit
          Hi,
          ich habe Dein Script angewendet und bei den meisten json funktioniert es auch, aber ich habe da 2 Topics, da sind die Werte verschachtelt, da weiss ich nicht weiter.

          01d8fee3-b0cd-48d1-ab0b-aa9671956cbc = {"values":{"operationMode":"Heating","powerW":600,"powerConsumptionHeatingWh":5482000,"powerConsumptionDomesticHotWaterWh":894000,"heatGenerationHeatingWh":20412000,"heatGenerationDomesticHotWaterWh":2696000}}
          

          und

          55150a80-5a0f-4043-8c7d-ef6aa78b2ff3 = {"pvPowerW":3800.7000000000003,"activePowerLimitationW":10000,"state":"mppt","voltageL1":234,"voltageL2":236.20000000000002,"voltageL3":235.60000000000002,"strings":[{"index":1,"name":"MPPT 1","current":0.726,"voltage":625.78,"powerW":454.1},{"index":2,"name":"MPPT 2","current":10.908,"voltage":306.81,"powerW":3346.6000000000004}]}
          

          wie komme da an die Werte unter "values" bzw. " strings" ?

          Gruß
          Olli

          A 1 Antwort Letzte Antwort
          0
          • C c1olli

            @Ahnungsbefreit
            Hi,
            ich habe Dein Script angewendet und bei den meisten json funktioniert es auch, aber ich habe da 2 Topics, da sind die Werte verschachtelt, da weiss ich nicht weiter.

            01d8fee3-b0cd-48d1-ab0b-aa9671956cbc = {"values":{"operationMode":"Heating","powerW":600,"powerConsumptionHeatingWh":5482000,"powerConsumptionDomesticHotWaterWh":894000,"heatGenerationHeatingWh":20412000,"heatGenerationDomesticHotWaterWh":2696000}}
            

            und

            55150a80-5a0f-4043-8c7d-ef6aa78b2ff3 = {"pvPowerW":3800.7000000000003,"activePowerLimitationW":10000,"state":"mppt","voltageL1":234,"voltageL2":236.20000000000002,"voltageL3":235.60000000000002,"strings":[{"index":1,"name":"MPPT 1","current":0.726,"voltage":625.78,"powerW":454.1},{"index":2,"name":"MPPT 2","current":10.908,"voltage":306.81,"powerW":3346.6000000000004}]}
            

            wie komme da an die Werte unter "values" bzw. " strings" ?

            A Online
            A Online
            Ahnungsbefreit
            schrieb zuletzt editiert von
            #5

            @c1olli sagte:

            01d8fee3-b0cd-48d1-ab0b-aa9671956cbc = {"values":{"operationMode":"Heating","powerW":600,"powerConsumptionHeatingWh":5482000,"powerConsumptionDomesticHotWaterWh":894000,"heatGenerationHeatingWh":20412000,"heatGenerationDomesticHotWaterWh":2696000}}

            Hi,
            ich kann gerade nicht testen aber probier mal z.B. "values.powerW" bzw "values.powerConsumptionHeatingWh" usw für values.
            Für strings im 2.Beispiel z.B. "strings.0.current" oder "strings.1.voltage" (denn Strings ist ein Array, erkennbar an den eckigen Klammern und der erste Eintrag hat den Index 0).

            Wenn meine Antwort hilfreich war, dürft Ihr das gerne durch einen "Upvote" (der kleine "^" unten rechts) zum Ausdruck bringen.

            1 Antwort Letzte Antwort
            1
            • C Online
              C Online
              c1olli
              schrieb zuletzt editiert von c1olli
              #6

              Hi,
              das mit values.powerW etc. funktioniert, das hatte ich mir gestern noch mit trail and error ausgetüftelt.
              Das mit den Strings hätte ich wohl nicht geschafft, werde ich aber gleich mal testen.
              Ich gebe dann Bescheid.
              Danke

              Edit:
              Das mit string.0 und 1 hat auch geklappt.

              Eine Frage noch - die Werte kommen als unbestätigt, kann man die die auch als Bestätigt deklarieren?

              Gruß
              Olli

              A 1 Antwort Letzte Antwort
              0
              • C c1olli

                Hi,
                das mit values.powerW etc. funktioniert, das hatte ich mir gestern noch mit trail and error ausgetüftelt.
                Das mit den Strings hätte ich wohl nicht geschafft, werde ich aber gleich mal testen.
                Ich gebe dann Bescheid.
                Danke

                Edit:
                Das mit string.0 und 1 hat auch geklappt.

                Eine Frage noch - die Werte kommen als unbestätigt, kann man die die auch als Bestätigt deklarieren?

                A Online
                A Online
                Ahnungsbefreit
                schrieb zuletzt editiert von
                #7

                @c1olli sagte:

                Eine Frage noch - die Werte kommen als unbestätigt, kann man die die auch als Bestätigt deklarieren?

                Da das ja das Ergebnis eines Scripts ist, macht die Bestätigung meiner Meinung keinen Sinn. Warum sollte das wichtig sein?

                Wenn meine Antwort hilfreich war, dürft Ihr das gerne durch einen "Upvote" (der kleine "^" unten rechts) zum Ausdruck bringen.

                1 Antwort Letzte Antwort
                0
                • C Online
                  C Online
                  c1olli
                  schrieb zuletzt editiert von
                  #8

                  Das ist eher nur eine Frage der Optik, die Werte werden jetzt nach dem Grün der Erneuerung in rot statt in schwarz
                  angezeigt, also nichts was wirklich entscheidend wäre.

                  Gruß
                  Olli

                  HomoranH 1 Antwort Letzte Antwort
                  0
                  • C c1olli

                    Das ist eher nur eine Frage der Optik, die Werte werden jetzt nach dem Grün der Erneuerung in rot statt in schwarz
                    angezeigt, also nichts was wirklich entscheidend wäre.

                    HomoranH Nicht stören
                    HomoranH Nicht stören
                    Homoran
                    Global Moderator Administrators
                    schrieb zuletzt editiert von
                    #9

                    @c1olli sagte:

                    also nichts was wirklich entscheidend wäre.

                    Nicht ganz.
                    Ich habe schon Fälle erlebt in denen ein nicht bestätigen Wert nicht weiterverarbeitet wurde.
                    Warum genau, weiss ich nicht.

                    kein Support per PN! - Fragen im Forum stellen -
                    Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                    Das Forum freut sich über eine Spende. Benutzt dazu den Spendenbutton oben rechts. Danke!
                    der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                    1 Antwort Letzte Antwort
                    0

                    Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

                    Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

                    Mit deinem Input könnte dieser Beitrag noch besser werden 💗

                    Registrieren Anmelden
                    Antworten
                    • In einem neuen Thema antworten
                    Anmelden zum Antworten
                    • Älteste zuerst
                    • Neuste zuerst
                    • Meiste Stimmen


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    551

                    Online

                    32.8k

                    Benutzer

                    82.8k

                    Themen

                    1.3m

                    Beiträge
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                    ioBroker Community 2014-2025
                    logo
                    • Anmelden

                    • Du hast noch kein Konto? Registrieren

                    • Anmelden oder registrieren, um zu suchen
                    • Erster Beitrag
                      Letzter Beitrag
                    0
                    • Home
                    • Aktuell
                    • Tags
                    • Ungelesen 0
                    • Kategorien
                    • Unreplied
                    • Beliebt
                    • GitHub
                    • Docu
                    • Hilfe