[gelöst] readingsBulkUpdate löst kein Event aus bei CUL_HM Devs, aber bei MQTT2

Begonnen von bstaeheli, 01 Juli 2022, 10:42:28

Vorheriges Thema - Nächstes Thema

bstaeheli

Hallo zusammen

Ich habe ein Notify definiert, welches auf ein event reagiert, dass das energyCalc-Reading eines Devices auslöst. Damit setze ich Tageszähler um, was funktioniert.

Nun möchte ich die Tageszähler mit dem DB-Log updaten, was mit MQTT2-Devices funktioniert, nicht aber auf CUL_HM Geräten. bei MQTT Geräten wird das Reading im Frontend auch rot bei einer Änderung, bei CUL_HM nicht.

CUL_HM stellen das energyCalc Reading zur Verfügung, beim MQTT2-Device habe ich es als Userreading selber definiert. Es scheint, als würde das CUL_HM Modul nachfolgende Events filtern, die durch sich selber ausgelöst wurden.

Notify:

defmod NN.xx.XX.CalcEnergyConsumption.not notify .*:energyCalc:.* {haboTK_CalcEnergyConsumption($NAME)}


Auszug aus 99_myUtils:

#
# Calculates the energy costs and consumption for a device
#
sub haboTK_CalcEnergyConsumption($) {
my ($device) = @_;

my $hash = $defs{"$device"};
my $rv;

# If the device has the reading "energyCalc" use this
my $newCounterCurrent = ReadingsVal($device,"energyCalc",0);
if ($newCounterCurrent == 0) {
$newCounterCurrent = ReadingsVal($device,"energy",0);
}

# Handle first run
my $counterCurrent = ReadingsVal($device,"energyCounterCurrent",0);
if ($counterCurrent == 0) {
fhem("setreading $device energyCounterCurrent $newCounterCurrent");
return;
}

my $deltaEnergy = $newCounterCurrent - $counterCurrent;
if ($deltaEnergy == 0) {
return;
}

my $pricePerKWh = ReadingsVal("NN.xx.XX.Globals.dum","energyPricePerKWh",0.142);
my $cost = 0.001 * $deltaEnergy * $pricePerKWh;
my $counterDay = ReadingsVal($device,"energyCounterDay",0) + $deltaEnergy;
my $costDay = ReadingsVal($device,"energyCostDay",0) + $cost;

readingsBeginUpdate($hash);
$rv = readingsBulkUpdate($hash, "energyCounterCurrent", $newCounterCurrent, 1);
$rv = readingsBulkUpdate($hash, "energyCounterDay", $counterDay, 1);
$rv = readingsBulkUpdate($hash, "energyCostDay", $costDay, 1);
readingsEndUpdate($hash, 1);

# Triggern für dblog, da ein durch ein notify aufgerufenes readings update kein event aufruft!!??
fhem("trigger $device energyCounterDay: $counterDay");
fhem("trigger $device energyCostDay: $costDay");
}


Beispiel Definition eins Homematic Devices:

defmod OG.br.SW.Arbeitsplaetze_Pwr CUL_HM 2AB44102
attr OG.br.SW.Arbeitsplaetze_Pwr DbLogInclude energyCalc,energyCostDay,energyCounterDay,power
attr OG.br.SW.Arbeitsplaetze_Pwr event-on-change-reading .*
attr OG.br.SW.Arbeitsplaetze_Pwr group Sensoren
attr OG.br.SW.Arbeitsplaetze_Pwr model HM-ES-PMSW1-PL
attr OG.br.SW.Arbeitsplaetze_Pwr room OG Büro

rudolfkoenig

ZitatEs scheint, als würde das CUL_HM Modul nachfolgende Events filtern, die durch sich selber ausgelöst wurden.
Das macht nicht das Modul, sondern fhem.pl, um Endlosschleifen zu vermeiden.
Genauer gesagt, die Liste der fuer ein bestimmtes Geraet zu benachrichtigenden Modul-Instanzen wird nicht nochmal abgearbeitet, wenn diese Liste gerade abgearbeitet wird. Wenn aber eine Instanz neue Events hinzufuegt, dann kriegen das die nachfolgenden Instanzen mit.

Womoeglich reicht es das notify in der Benachrichtigungskette nach vorne zu setzen, indem man den Namen der notify aendert.
Die Reihenfolge wird durch NOTFY_ORDER bestimmt, siehe die Ausgabe von "list .* NTFY_ORDER"

bstaeheli

Hallo Rudolf

Vielen herzlichen Dank für Deinen Hinweis. Habe es nun so gelöst, dass die Statistikwerte mittels internalTimer() erst später in einer neuen(?) Instanz berechnet werden.


sub haboTK_CalcEnergyConsumption($) {
my ($device) = @_;
InternalTimer(1, 'haboTK_CalcEnergyConsumptionAsync', $device);
}

sub haboTK_CalcEnergyConsumptionAsync($) {
...
...
}