FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: h002 am 19 November 2019, 13:55:22

Titel: sub-Funktion: Setzen von Readings (setreading) nach DbRep (diffValue)
Beitrag von: h002 am 19 November 2019, 13:55:22
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));
}
}
Titel: Antw:sub-Funktion: Setzen von Readings (setreading) nach DbRep (diffValue)
Beitrag von: DS_Starter am 19 November 2019, 14:11:53
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
Titel: Antw:sub-Funktion: Setzen von Readings (setreading) nach DbRep (diffValue)
Beitrag von: h002 am 19 November 2019, 15:12:11
Prima, damit kann ich was anfangen. Danke dir.
Titel: Antw:sub-Funktion: Setzen von Readings (setreading) nach DbRep (diffValue)
Beitrag von: DS_Starter am 19 November 2019, 15:54:18
Und ich danke dir !!  :D

LG,
Heiko