Ich hab es!!
Hab nun in meinen alten Backups ein Script gefunden, welches ich vor Jahren für das automatische EIN/AUS diverse Geräte in Abhängigkeit von Anwesenheit und Helligkeit draußen geschrieben hab (oder von irgendwo hier im Forum zusammen gebastelt...) und in diesem Script mache ich es "richtig rum"...
Anbei nun das gesamte Script falls es noch wer "studieren" möchte.
// Kleinverbraucher Logging - V1.0 - 07.10.2024
// Kopie vom ersten Scrit dieser Art, IONIQ5 Logging...
// Teil der neuen Logging Scripte - klein, leicht und auf meine Bedürfnisse zugeschnitten
// 2do:::::::::::::::::::::::::::::::::::::::::
// createState in der History automatisieren...
var debug = true;
var root = '0_userdata.0.Logging.Kleinverbraucher.';
var was, neuer_Wert, alter_Wert, diff, helper, tag, monat, jahr, wochentag;
// WAS soll geloggt werden?
const datenpunkt={
'ScooterCharger':{
id_wert : 'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy'/*Energy*/
},
'editPC':{
id_wert : 'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'/*Energy*/
}
};
// Init
fn_init();
// Funktion initialize für die Subscribes
function fn_init() {for (was in datenpunkt) {fn_on_Schleifen(was)}};
// Hauptteil
function fn_on_Schleifen(was){
on({id: datenpunkt[was].id_wert, change:'ne'}, function (obj) {
// abfangen von Änderungen kurz nach Mitternacht - da erfolgen ja die ganzen Transfers
if (compareTime("00:00", "00:01", "between")){
if (debug){log('========== Update ausgelöst von '+ was +' aber es ist Mitternacht, daher Abbruch')}
return;
}
if (debug){log('========== Update ausgelöst von '+ was +'...')}
neuer_Wert = obj.state.val;
alter_Wert = getState(root+was+'.internal_counter').val;
if (debug){log('========== alter Wert: '+ alter_Wert)}
if (debug){log('========== neuer Wert: '+ neuer_Wert)}
diff = neuer_Wert - alter_Wert;
// ist diff gleuch Null, dann Abbruch...
if (diff === 0) {
if (debug){log('========== Objekt Update ohne Änderung ... exit!')}
return;
}
// wenn diff negativ ist, dann hat ein reset des Counter stattgefunden
// ist es positiv, wird der Wert dazu gezählt
if (diff < 0) {
if (debug){log('========== RESET erkannt - Differenz ist negativ: '+ diff)}
// check auf neuer Wert = 0, dann wird 0,00000001 addiert um den INIT abzufangen
if (neuer_Wert === 0){neuer_Wert = 0.0000000001}
setState(root+was+'.internal_counter', neuer_Wert, true);
} else {
// check auf alter Wert genau 0 - dann wird dieser Wert gerade zum ersten Mal gelesen....
if (alter_Wert === 0){
if (debug){log('========== INIT erkannt - alter Wert genau 0, daher wurde noch nie ein Wert gelesen/geschrieben.')}
// nun wird ohne Addition der neue Wert im Counter gespeichert
setState(root+was+'.internal_counter', neuer_Wert, true);
return; // und Abbruch, weil wir sind fertig...denke ich...
}
if (debug){log('========== Differenz '+ diff +' wird addiert...')}
helper = getState(root+was+'.1-DAY').val;
setState(root+was+'.1-DAY', (helper + diff), true);
helper = getState(root+was+'.2-WEEK').val;
setState(root+was+'.2-WEEK', (helper + diff), true);
helper = getState(root+was+'.3-MONTH').val;
setState(root+was+'.3-MONTH', (helper + diff), true);
helper = getState(root+was+'.4-YEAR').val;
setState(root+was+'.4-YEAR', (helper + diff), true);
setState(root+was+'.internal_counter', neuer_Wert, true);
}
}); // Ende on
}; // Ende Hauptteil
// Tages-/Wochen-/Monats-/Jahreswechsel
// läuft jeden Tag um Punkt 00:00:01
clearSchedule(sh_Tageswechel);
var sh_Tageswechel = schedule('1 0 0 * * *', fn_Tageswechsel);
//fn_Tageswechsel();
function fn_Tageswechsel(){
// erst mal das neue Datum holen UND zwar in eizelnen Variablen
tag = formatDate(new Date(), 'TT');
monat = formatDate(new Date(), 'MM');
jahr = parseInt(formatDate(new Date(), 'YYYY'));
wochentag = formatDate(new Date(), 'W');
// Start der Schleife für ALLE Datenpunkte in dieser Kategorie
for (was in datenpunkt) {
log('Schleife START');
// nun check auf die ganzen Wechsel, wobei Jahr vor Monat vor Tag
// Check auf JAHRESWECHSEL
if ((monat == '01') && (tag == '01')){
jahr = jahr - 1;
log('========== JAHRESWECHSEL erkannt: '+datenpunkt[was].id_wert +' ==========');
// 1. Jahresverbrauch in HISTORY schreiben
setState(root+was+'.HISTORY.'+ jahr, getState(root+was+'.4-YEAR').val, true);
// 2. Jahresverbrauch in .BEFORE schreiben
setState(root+was+'.4-YEAR.BEFORE', getState(root+was+'.4-YEAR').val, true);
setState(root+was+'.4-YEAR', 0, true);
} // Ende Jahreswechsel
// Check auf MONATSWECHSEL
if (tag == '01'){
// if (monat == '01'){jahr = jahr - 1}
helper = parseInt(monat);
helper = helper - 1; // wir brauchen ja den Vormonat
if (helper === 0){helper = 12}
if (helper < 10) {monat = '0' + helper.toFixed(0)}
else {monat = helper.toFixed(0)}
log('========== MONATSWECHSEL erkannt: '+datenpunkt[was].id_wert +' ==========');
// 1. Monatsverbrauch in HISTORY schreiben
setState(root+was+'.HISTORY.'+ jahr +'.' + monat, getState(root+was+'.3-MONTH').val, true);
// 2. Monatsverbrauch in .BEFORE schreiben
setState(root+was+'.3-MONTH.BEFORE', getState(root+was+'.3-MONTH').val, true);
setState(root+was+'.3-MONTH', 0, true);
} // Ende Monatswechsel
// Check auf Wochenwechsel
if (wochentag == 'Mo'){
log('========== WOCHENWECHSEL erkannt: '+datenpunkt[was].id_wert +' ==========');
// 1. Wochenverbrauch in .BEFORE schreiben
setState(root+was+'.2-WEEK.BEFORE', getState(root+was+'.2-WEEK').val, true);
setState(root+was+'.2-WEEK', 0, true);
} // Ende Wochenwechsel
// Tageswechsel - der kommt - no na - IMMER dran...
setState(root+was+'.1-DAY.BEFORE', getState(root+was+'.1-DAY').val, true);
setState(root+was+'.1-DAY', 0, true);
} // Ende for-Schleife
} // Ende Tages-/Wochen-/Monats-/Jahreswechsel
// ENDE Script
Im Prinzip das Ersatz Script für den guten alten Betriebsstundenzähler von @looxer01 .
Ich hab das Programm geliebt und bis heute in Betrieb, aber es macht mir Sorge, dass immer mehr Fehler im Prorammcode angezeigt werden (rote Wellenlinien) und es irgendwann nicht mehr geht. Viele der Funktionen hab ich in seinem Script nie verwendet - eigentlich hauptsächlich das aufsummieren von Verbräuchen - und so hab ich mir nun das eigene kleine und schlanke Script geschrieben, bevor das alte "absemmelt"
Liebe Grüße
Tom
PS: @Ro75 : für deine Methode hab ich schon einen Anwendungsfall! Danke für diese Idee...