@Ro75 sagte:
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');