sub-Funktion: Setzen von Readings (setreading) nach DbRep (diffValue)

Begonnen von h002, 19 November 2019, 13:55:22

Vorheriges Thema - Nächstes Thema

h002

Ich nutze ein Funktion, um bestimmte Heizungswerte in die Datenbank über DbRep zu schreiben. Offenbar wird nicht gewartet, bis diese abgeschlossen sind und die Folgezeilen der Funktion werden schon ausgeführt. Dadurch kommt es zu falschen Werten, wenn die "setreading" ausgeführt werden. Wie kann ich sinnvoll erreichen, dass das Setzen der Werte nach DbRep (diffValue) erfolgt? Soll ich zwei verschiedene at-Devices zu unterschiedlichen Zeiten (Schreiben in DB, Lesen aus DB) erstellen oder gibt es einen eleganteren Weg? Vielen Dank:-)


#{calcDimplexValues()}
#Berechnung und Setzen der JAZ auf Basis der am Tag ermittelten Daten
sub calcDimplexValues(){
#Datumswerte setzen
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
#Setzen des Tageswerte
fhem ("set dbReportDimplexDailyElectricEnergy diffValue writeToDB");
fhem ("set dbReportDimplexDailyThermicEnergy diffValue writeToDB");
my $diff_day_actualEnergyUnitValue = fhem ("{DbReadingsVal('dbRepDimplex','GPIO3:diff_day_actualEnergyUnitValue',FmtDateTime(time),'')}");
my $diff_day_actualFullThermicEnergy = fhem ("{DbReadingsVal('dbRepDimplex','GPIO3:diff_day_actualFullThermicEnergy',FmtDateTime(time),'')}");
my $lastDayJAZ = $diff_day_actualFullThermicEnergy / $diff_day_actualEnergyUnitValue;
fhem("setreading GPIO3 lastDiffDayElectricEnergy ".sprintf("%.2f",$diff_day_actualEnergyUnitValue));
fhem("setreading GPIO3 lastDiffDayThermicEnergy ".sprintf("%.2f",$diff_day_actualFullThermicEnergy));
fhem("setreading GPIO3 lastDayJAZ ".sprintf("%.2f",$lastDayJAZ));

#Setzen der Monatswerte
#Wenn erster des Monats, dann Monatswerte setzen
if ($mday == 1 ) {
#Reading für die Differenzen im Monat setzen
fhem("set dbReportDimplexMonthlyElectricEnergy diffValue writeToDB");
fhem("set dbReportDimplexMonthlyThermicEnergy diffValue writeToDB");
my $diff_month_actualEnergyUnitValue = fhem ("{DbReadingsVal('dbRepDimplex','GPIO3:diff_month_actualEnergyUnitValue',FmtDateTime(time),'')}");
my $diff_month_actualFullThermicEnergy = fhem ("{DbReadingsVal('dbRepDimplex','GPIO3:diff_month_actualFullThermicEnergy',FmtDateTime(time),'')}");
my $lastMonthJAZ = $diff_month_actualFullThermicEnergy / $diff_month_actualEnergyUnitValue;
fhem("setreading GPIO3 lastDiffMonthElectricEnergy ".sprintf("%.2f",$diff_month_actualEnergyUnitValue));
fhem("setreading GPIO3 lastDiffMonthThermicEnergy ".sprintf("%.2f",$diff_month_actualFullThermicEnergy));
fhem("setreading GPIO3 lastDayJAZ ".sprintf("%.2f",$lastMonthJAZ));
}
}

DS_Starter

#1
ZitatOffenbar wird nicht gewartet, bis diese abgeschlossen sind und die Folgezeilen der Funktion werden schon ausgeführt. Dadurch kommt es zu falschen Werten, wenn die "setreading" ausgeführt werden.
Ja, das folgt aus der asynchronen, nicht blockierenden Arbeitsweise.

ZitatWie kann ich sinnvoll erreichen, dass das Setzen der Werte nach DbRep (diffValue) erfolgt?
Dazu kann man das Attribut executeAfterProc nutzen. Dort den Namen der Routine einsetzen, die NACH der Befehlsabarbeitung vom DbRep-Device aufgerufen werden soll.
Dann ist sichergestellt, dass DbRep fertig ist. Für etwas ausgefeiltere Routinen bietet sich auch das Attribut userExitFn an.

Im Wiki gibt es Beispiele zur Bildung einer Chain mit dem Attribut userExitFn: https://wiki.fhem.de/wiki/DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#Abarbeitung_einer_sequentiellen_Befehlskette_mittels_non-blocking_sqlCmd-Kommandos

Grüße,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

h002


DS_Starter

Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter