NEWS
Wie lege ich den Datenpunkt an?
-
Langsam komme ich dahinter. Laut Docu hat "await createStateAsync(name, initialValue, forceCreation, common, native);" diese Signatur. Ich habe alle Werte beim Aufruf mitgegeben. Bei allen anderen Typen funktioniert das mit initialValue und forceCreation. Nur eben bei object nicht. Nun habe ich die beiden Parameter weggelassen und jetzt gehts. Kann das nochmal jemand nachvollziehen - bevor ich hier einen Bug melden müsste. Zur Info: ich habe mir vorgeschaltet einen "commonBuider" gebaut der mir für das common das hier aufbereitet : "common = {"name":"Object3","type":"object","role":"state","read":true,"write":true,"def":{}}"
-
Langsam komme ich dahinter. Laut Docu hat "await createStateAsync(name, initialValue, forceCreation, common, native);" diese Signatur. Ich habe alle Werte beim Aufruf mitgegeben. Bei allen anderen Typen funktioniert das mit initialValue und forceCreation. Nur eben bei object nicht. Nun habe ich die beiden Parameter weggelassen und jetzt gehts. Kann das nochmal jemand nachvollziehen - bevor ich hier einen Bug melden müsste. Zur Info: ich habe mir vorgeschaltet einen "commonBuider" gebaut der mir für das common das hier aufbereitet : "common = {"name":"Object3","type":"object","role":"state","read":true,"write":true,"def":{}}"
@Rene55 [sagte]: einen Bug melden müsste.
Da initialValue und forceCreation optional sind, ist es nicht möglich, initialValue als Objekt von einem common-Objekt zu unterscheiden. Will man einen DP vom Typ "object" erzeugen, muss man auf initialValue verzichten und statt dessen mit common.def initialisieren.
-
ja. Allerdings wirst du auf Dauer keinen Spaß haben, denn da wird ja jeden Tag mindestens ein weiterer Datenpunkt angelegt. Wenn du daraus eine Historie ableiten willst, völlig ungeeignet - wurde aber schon weiter oben angesprochen.
Ro75.
ja. Allerdings wirst du auf Dauer keinen Spaß haben, denn da wird ja jeden Tag mindestens ein weiterer Datenpunkt angelegt. Wenn du daraus eine Historie ableiten willst, völlig ungeeignet - wurde aber schon weiter oben angesprochen.
Ro75.
Hi Ro75,
ich habe es jetzt so gelöst:
// ═══════════════════════════════════════════════════════════════ // Einspeisung – Tageswert (wird täglich überschrieben) // ═══════════════════════════════════════════════════════════════ // ── Quell-Datenpunkte ────────────────────────────────────────── const DP_HEUTE_KWH = 'javascript.0.Einspeisung.heute_kWh'; const DP_HEUTE_EURO = 'javascript.0.Einspeisung.heute_euro'; // ── Ziel-Datenpunkte (fest, werden täglich überschrieben) ────── const DP_TAG_KWH = '0_userdata.0.Einspeisung.letzter_tag_kWh'; const DP_TAG_EURO = '0_userdata.0.Einspeisung.letzter_tag_euro'; const DP_TAG_DATUM = '0_userdata.0.Einspeisung.letzter_tag_datum'; // ── Jahressummen ─────────────────────────────────────────────── const DP_JAHR_KWH = '0_userdata.0.Einspeisung.jahr_kWh'; const DP_JAHR_EURO = '0_userdata.0.Einspeisung.jahr_euro'; // ── Archiv-Präfix ────────────────────────────────────────────── const DP_ARCHIV = '0_userdata.0.Einspeisung.Archiv.'; // ── Schutz vor Doppeladdierung ───────────────────────────────── const DP_LETZTER_RUN = '0_userdata.0.Einspeisung.letzter_run_datum'; // ═══════════════════════════════════════════════════════════════ // Datenpunkte anlegen // ═══════════════════════════════════════════════════════════════ createState(DP_TAG_KWH, 0, { name: 'Einspeisung letzter Tag', unit: 'kWh', type: 'number', role: 'value.energy', read: true, write: true }); createState(DP_TAG_EURO, 0, { name: 'Einspeisevergütung letzter Tag', unit: '€', type: 'number', role: 'value.money', read: true, write: true }); createState(DP_TAG_DATUM, '', { name: 'Datum letzter gespeicherter Tag', type: 'string', role: 'text', read: true, write: true }); createState(DP_JAHR_KWH, 0, { name: 'Einspeisung Jahr gesamt', unit: 'kWh', type: 'number', role: 'value.energy', read: true, write: true }); createState(DP_JAHR_EURO, 0, { name: 'Einspeisevergütung Jahr gesamt', unit: '€', type: 'number', role: 'value.money', read: true, write: true }); createState(DP_LETZTER_RUN, '', { name: 'Letztes Ausführungsdatum', type: 'string', role: 'text', read: true, write: true }); // ═══════════════════════════════════════════════════════════════ // Hauptfunktion // ═══════════════════════════════════════════════════════════════ function tageswertSpeichern() { const d = new Date(); const datum = `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`; // ── Schutz vor Doppeladdierung ───────────────────────────── const letzterRun = getState(DP_LETZTER_RUN).val; if (letzterRun === datum) { log(`⚠️ Tageswert für ${datum} wurde bereits gespeichert – Abbruch.`, 'warn'); return; } // ── Werte lesen ──────────────────────────────────────────── const tagesKwh = parseFloat(getState(DP_HEUTE_KWH).val) || 0; const tagesEuro = parseFloat(getState(DP_HEUTE_EURO).val) || 0; // ── Fehlerbehandlung: ungültige Werte ────────────────────── if (tagesKwh < 0 || tagesEuro < 0) { log(`❌ Ungültige Werte: ${tagesKwh} kWh / ${tagesEuro} € – Abbruch.`, 'error'); return; } if (tagesKwh === 0 && tagesEuro === 0) { log(`⚠️ Beide Werte sind 0 – kein Einspeisungstag oder Sensor-Fehler.`, 'warn'); } // ── Letzten Run-Datum speichern ──────────────────────────── setState(DP_LETZTER_RUN, datum, true); // ── Tagesdatenpunkte überschreiben ───────────────────────── setState(DP_TAG_KWH, tagesKwh, true); setState(DP_TAG_EURO, tagesEuro, true); setState(DP_TAG_DATUM, datum, true); // ── Jahressummen aufaddieren ─────────────────────────────── const neueKwh = Math.round(((parseFloat(getState(DP_JAHR_KWH).val) || 0) + tagesKwh) * 100) / 100; const neueEuro = Math.round(((parseFloat(getState(DP_JAHR_EURO).val) || 0) + tagesEuro) * 100) / 100; setState(DP_JAHR_KWH, neueKwh, true); setState(DP_JAHR_EURO, neueEuro, true); log(`✅ ${datum}: ${tagesKwh} kWh / ${tagesEuro} € gespeichert`, 'info'); log(`📊 Jahressumme: ${neueKwh} kWh / ${neueEuro} €`, 'info'); // ── Silvester: Jahresabschluss ins Archiv schreiben ──────── if (d.getMonth() === 11 && d.getDate() === 31) { jahresabschlussArchivieren(d.getFullYear(), neueKwh, neueEuro); } } // ═══════════════════════════════════════════════════════════════ // Jahresabschluss archivieren // ═══════════════════════════════════════════════════════════════ function jahresabschlussArchivieren(jahr, gesamtKwh, gesamtEuro) { const dpArchivKwh = DP_ARCHIV + jahr + '_kWh'; const dpArchivEuro = DP_ARCHIV + jahr + '_euro'; createState(dpArchivKwh, gesamtKwh, { name: 'Einspeisung Jahr ' + jahr, unit: 'kWh', type: 'number', role: 'value.energy', read: true, write: false }, () => { setState(dpArchivKwh, gesamtKwh, true); }); createState(dpArchivEuro, gesamtEuro, { name: 'Einspeisevergütung Jahr ' + jahr, unit: '€', type: 'number', role: 'value.money', read: true, write: false }, () => { setState(dpArchivEuro, gesamtEuro, true); }); log(`🗄️ Jahresabschluss ${jahr} archiviert: ${gesamtKwh} kWh / ${gesamtEuro} €`, 'info'); // ── Jahressummen zurücksetzen für neues Jahr ─────────────── setTimeout(() => { setState(DP_JAHR_KWH, 0, true); setState(DP_JAHR_EURO, 0, true); log('🔄 Jahressummen für neues Jahr zurückgesetzt.', 'info'); }, 3000); } // ═══════════════════════════════════════════════════════════════ // Täglich um 23:55 Uhr ausführen // ═══════════════════════════════════════════════════════════════ schedule('55 23 * * *', () => { tageswertSpeichern(); }); log('📋 Script "Einspeisung Jahressumme" gestartet – läuft täglich um 23:55 Uhr.', 'info');
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