NEWS
Auslesen von Wert eines Objektes
-
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."); });
-
@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.
-
@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.
-
Ich danke Euch schon mal für die Aufklärung, ich probiere es gleich mal aus und gebe Rückmeldung!