Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Auslesen von Wert eines Objektes

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Auslesen von Wert eines Objektes

    This topic has been deleted. Only users with topic management privileges can see it.
    • snakepitnetwork
      snakepitnetwork last edited by

      Hallo zusammen, leider muss ich jetzt hier eine Frage stellen, ich komme nicht weiter, weder mit Google Suche oder anderem.

      Ich habe eine Luxtronix WP und möchte hier den Fehlerspeicher auslesen und bei einem Problem mir eine WhatsApp schicken lassen.

      Die Datenpunkte sind sichtbar und werden auch erkannt. Leider bekomme ich nicht die Werte aus dem Objekt. Die Native Werte, die man im Objekt anziegen kann, konnte das Programm auslesen, aber ein GetState(ID) liefert bei dem Objekt keine Werte.

      /**********************************************
       * Zweck: Wärmepumpe Alarm bei Fehler und Abschaltungen
       * Abhängigkeiten: luxtronik2.0.Informationen.Fehlerspeicher, luxtronik2.0.Informationen.Abschaltungen
       **********************************************/
      const STATE_ID_Fehlerspeicher = "luxtronik2.0.Informationen.Fehlerspeicher";
      const STATE_ID_Abschaltungen = "luxtronik2.0.Informationen.Abschaltungen";
      
      if (existsObject(STATE_ID_Fehlerspeicher)==true){
          console.log("STATE_ID_Fehlerspeicher: Exisitert");
          }
      else
          {console.log("STATE_ID_Fehlerspeicher: Exisitert nicht");}
      
      if (existsObject(STATE_ID_Abschaltungen)==true){
          console.log("STATE_ID_Abschaltungen: Exisitert");
          }
      else
          {console.log("STATE_ID_Abschaltungen: Exisitert nicht");}
      
          let fehlerspeicherState = getObject(STATE_ID_Fehlerspeicher);
          let abschaltungenState = getObject(STATE_ID_Abschaltungen);
          console.log("fehlerspeicherObj:", fehlerspeicherState);
          console.log("abschaltungenObj:", abschaltungenState);
      
          fehlerspeicherState = getObject(STATE_ID_Fehlerspeicher).val;
          abschaltungenState = getObject(STATE_ID_Abschaltungen).val;
          console.log("fehlerspeicherObj:", fehlerspeicherState);
          console.log("abschaltungenObj:", abschaltungenState);
      
          fehlerspeicherState = getState(STATE_ID_Fehlerspeicher);
          abschaltungenState = getState(STATE_ID_Abschaltungen);
          console.log("fehlerspeicherState:", fehlerspeicherState);
          console.log("abschaltungenState:", abschaltungenState);
      
          fehlerspeicherState = getState(STATE_ID_Fehlerspeicher).val;
          abschaltungenState = getState(STATE_ID_Abschaltungen).val;
          console.log("fehlerspeicherState:", fehlerspeicherState);
          console.log("abschaltungenState:", abschaltungenState);
      
          console.log(STATE_ID_Fehlerspeicher.val); 
      
      
      {
        "type": "state",
        "common": {
          "name": "Abschaltungen",
          "type": "object",
          "role": "json",
          "read": true,
          "write": false,
          "custom": {
            "influxdb.0": {
              "enabled": true,
              "storageType": "",
              "aliasId": "",
              "debounceTime": 0,
              "blockTime": 0,
              "changesOnly": true,
              "changesRelogInterval": 0,
              "changesMinDelta": 0,
              "ignoreBelowNumber": "",
              "disableSkippedValueLogging": false,
              "enableDebugLogs": true,
              "debounce": 0
            }
          }
        },
        "native": {
          "$": {
            "id": "0x0x510a90"
          },
          "name": [
            "Abschaltungen"
          ],
          "item": [
            {
              "$": {
                "id": "0x0x545d30"
              },
              "name": [
                "09.05.25 10:26:10"
              ],
              "value": [
                "keine Anf."
              ]
            },
            {
              "$": {
                "id": "0x0x50d548"
              },
              "name": [
                "09.05.25 07:02:00"
              ],
              "value": [
                "keine Anf."
              ]
            },
            {
              "$": {
                "id": "0x0x531038"
              },
              "name": [
                "09.05.25 04:53:05"
              ],
              "value": [
                "keine Anf."
              ]
            },
            {
              "$": {
                "id": "0x0x52d470"
              },
              "name": [
                "09.05.25 02:49:08"
              ],
              "value": [
                "keine Anf."
              ]
            },
            {
              "$": {
                "id": "0x0x510768"
              },
              "name": [
                "08.05.25 23:59:16"
              ],
              "value": [
                "keine Anf."
              ]
            }
          ]
        },
        "_id": "luxtronik2.0.Informationen.Abschaltungen",
        "acl": {
          "object": 1636,
          "state": 1636,
          "owner": "system.user.admin",
          "ownerGroup": "system.group.administrator"
        },
        "from": "system.adapter.admin.0",
        "user": "system.user.admin",
        "ts": 1749716042909
      }
      
      Wert:
      {"12.06.25 07:01:49":"keine Anf.","12.06.25 06:17:52":"keine Anf.","11.06.25 11:33:49":"keine Anf.","11.06.25 05:37:50":"keine Anf.","11.06.25 03:04:55":"keine Anf."}
      

      Ich habe jetzt mal nur das Test Skript angehängt ob man da schon einen groben Fehler sehen kann.

      Danke für Eure Hilfe!

      Hier noch das Vollständige:

      /**********************************************
       * Zweck: Wärmepumpe Alarm bei Fehler und Abschaltungen
       * Abhängigkeiten: luxtronik2.0.Informationen.Fehlerspeicher, luxtronik2.0.Informationen.Abschaltungen
       **********************************************/
      const STATE_ID_Fehlerspeicher = "luxtronik2.0.Informationen.Fehlerspeicher";
      const STATE_ID_Abschaltungen = "luxtronik2.0.Informationen.Abschaltungen";
      console.log("STATE_ID_Fehlerspeicher:", STATE_ID_Fehlerspeicher);
      console.log("STATE_ID_Abschaltungen:", STATE_ID_Abschaltungen);
      
      // Funktion, um das aktuelle Datum im Format "DD.MM.YY" zu erhalten
      function getCurrentDate() {
          const now = new Date();
          return now.toLocaleDateString('de-DE'); // Format: DD.MM.YY
      }
      
      // Variablen, um die letzten bekannten Einträge zu speichern
      let lastFehlerspeicher = {};
      let lastAbschaltungen = {};
      
      // Variable, um den Fehlerfall zu simulieren
      let simulateError = false;
      
      schedule('* * * * *', function () {
          // Objekte auslesen
          const fehlerspeicherObj = getState(STATE_ID_Fehlerspeicher);
          const abschaltungenObj = getState(STATE_ID_Abschaltungen);
      
          if (!fehlerspeicherObj || !abschaltungenObj) {
              console.warn("Fehlerspeicher oder Abschaltungen-Objekt nicht vorhanden.");
              return;
          }
      
          console.log("fehlerspeicherObj.val:", fehlerspeicherObj.val);
          console.log("abschaltungenObj.val:", abschaltungenObj.val);
          console.log("typeof fehlerspeicherObj.val:", typeof fehlerspeicherObj.val, "Inhalt:", fehlerspeicherObj.val);
          console.log("typeof abschaltungenObj.val:", typeof abschaltungenObj.val, "Inhalt:", abschaltungenObj.val);
      
          if (typeof fehlerspeicherObj.val !== "string" || fehlerspeicherObj.val.trim() === "") {
              console.warn("Fehlerspeicher-Objekt ist leer!");
          }
          if (typeof abschaltungenObj.val !== "string" || abschaltungenObj.val.trim() === "") {
              console.warn("Abschaltungen-Objekt ist leer!");
          }
      
          // JSON parsen, falls value ein JSON-String ist
          let fehlerspeicherData, abschaltungenData;
          try {
              if (fehlerspeicherObj.val) {
                  fehlerspeicherData = JSON.parse(fehlerspeicherObj.val);
              } else {
                  throw new Error("fehlerspeicherObj.val ist leer");
              }
          } catch (e) {
              console.warn("Fehlerspeicher-Objekt konnte nicht geparst werden:", e);
              fehlerspeicherData = {};
          }
          let abschaltungenItems = [];
          try {
              if (abschaltungenObj.val) {
                  const parsed = JSON.parse(abschaltungenObj.val);
                  // parsed ist ein Objekt mit Datum als Key und Grund als Value
                  abschaltungenItems = Object.entries(parsed).map(([date, value]) => ({
                      date,
                      value
                  }));
              }
          } catch (e) {
              console.warn("Abschaltungen-Objekt konnte nicht geparst werden:", e);
          }
      
          let fehlerspeicherItems = [];
          try {
              if (fehlerspeicherObj.val) {
                  const parsed = JSON.parse(fehlerspeicherObj.val);
                  // parsed ist ein Objekt mit Datum als Key und Fehlertext als Value
                  fehlerspeicherItems = Object.entries(parsed).map(([date, value]) => ({
                      date,
                      value
                  }));
              }
          } catch (e) {
              console.warn("Fehlerspeicher-Objekt konnte nicht geparst werden:", e);
          }
      
          const currentDate = getCurrentDate();
      
          let newFehler = [];
          fehlerspeicherItems.forEach((entry) => {
              // entry.date ist das Datum, entry.value der Fehlertext
              if (entry.date.startsWith(currentDate)) {
                  if (!lastFehlerspeicher[entry.date]) {
                      newFehler.push(entry);
                  } else {
                      console.log(`Eintrag ignoriert (bereits bekannt): Datum=${entry.date}`);
                  }
              }
          });
      
          let newAbschaltungen = [];
          abschaltungenItems.forEach((entry) => {
              // entry.date ist das Datum, entry.value der Grund
              // Prüfe auf aktuelles Datum (nur Tag, nicht Uhrzeit!)
              if (entry.date.startsWith(currentDate)) {
                  if (!lastAbschaltungen[entry.date]) {
                      newAbschaltungen.push(entry);
                  } else {
                      console.log(`Eintrag ignoriert (bereits bekannt): Datum=${entry.date}`);
                  }
              }
          });
      
          if (newFehler.length > 0 || newAbschaltungen.length > 0) {
              const fehlerDetails = newFehler
                  .map((entry) => `Datum: ${entry.date}, Fehler: ${entry.value}`)
                  .join("\n");
              const abschaltungenDetails = newAbschaltungen
                  .map((entry) => `Datum: ${entry.name[0]}, Grund: ${entry.value[0]}`)
                  .join("\n");
      
              const message = `Wärmepumpen-Alarm:\n\nNeue Fehlerspeicher-Einträge:\n${fehlerDetails}\n\nNeue Abschaltungen:\n${abschaltungenDetails}`;
              console.log("Nachricht für WhatsApp:", message);
      
              sendTo('whatsapp-cmb.0', 'send', {
                  text: message,
                  phone: ''
              });
      
              newFehler.forEach((entry) => {
                  lastFehlerspeicher[entry.date] = true;
              });
              newAbschaltungen.forEach((entry) => {
                  lastAbschaltungen[entry.date] = true;
              });
          } else {
              console.log("Keine neuen Einträge vom heutigen Datum gefunden.");
          }
      });
      
      // Reset lastFehlerspeicher and lastAbschaltungen at midnight
      schedule('0 0 * * *', function () {
          lastFehlerspeicher = {};
          lastAbschaltungen = {};
          console.log("Reset lastFehlerspeicher and lastAbschaltungen.");
      });
      
      
      Codierknecht paul53 2 Replies Last reply Reply Quote 0
      • Codierknecht
        Codierknecht Developer Most Active @snakepitnetwork last edited by

        @snakepitnetwork sagte in Auslesen von Wert eines Objektes:

        aber ein GetState(ID) liefert bei dem Objekt keine Werte

        Dann zeig doch mal, wie das im Objektbaum aussieht.

        1 Reply Last reply Reply Quote 0
        • paul53
          paul53 @snakepitnetwork last edited by paul53

          @snakepitnetwork sagte: GetState(ID) liefert bei dem Objekt keine Werte.

          Ob ein Zustand (state) vorhanden ist, prüft man mit existsState(id).

          if(!existsState(idFehlerspeicher)) log('Fehlerspeicher-Zustand nicht vorhanden', 'warn');
          else if(!existsState(idAbschaltungen)) log('Abschaltungen-Zustand nicht vorhanden', 'warn');
          else {
              // Werte einlesen und auswerten
          }
          

          Weshalb triggerst du nicht auf die beiden Datenpunkte? Dann muss die Existenz des Zustandes nicht geprüft werden, denn ein Datenpunkt ohne Zustand triggert nicht.

          const idFehlerspeicher = "luxtronik2.0.Informationen.Fehlerspeicher";
          const idAbschaltungen = "luxtronik2.0.Informationen.Abschaltungen";
          
          on(idFehlerspeicher, function(dp) { // triggert bei Wertänderung
              const Fehlerspeicher = dp.state.val;
              const zeit = Object.keys(Fehlerspeicher)[0];
              const fehler = Fehlerspeicher[zeit];
              // Nachricht
          });
          on(idAbschaltungen, function(dp) {
              const Abschaltungen = dp.state.val; // liefert ein Objekt
              const zeit = Object.keys(Abschaltungen)[0];
              const grund = Abschaltungen[zeit];
              // Nachricht
          });
          

          Beim Datenpunkt-Typ "object" darf nicht geparst werden, denn das erledigt der Javascript-Adapter. Offenbar enthält das erste Objekt-Element den neuesten Eintrag.

          1 Reply Last reply Reply Quote 0
          • snakepitnetwork
            snakepitnetwork last edited by

            Ich danke Euch schon mal für die Aufklärung, ich probiere es gleich mal aus und gebe Rückmeldung!

            1 Reply Last reply Reply Quote 0
            • First post
              Last post

            Support us

            ioBroker
            Community Adapters
            Donate

            788
            Online

            31.9k
            Users

            80.1k
            Topics

            1.3m
            Posts

            3
            4
            109
            Loading More Posts
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes
            Reply
            • Reply as topic
            Log in to reply
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
            The ioBroker Community 2014-2023
            logo