Speicher von eigenen Readings in der Datenbank schlägt fehl

Begonnen von cs1711, 28 Oktober 2020, 14:53:43

Vorheriges Thema - Nächstes Thema

cs1711

Hallo zusammen,

folgende für mich nicht nachvollziehbare Situation.

Ich habe ein HTTPMOD-Device, dass eine Webseite ausliest und die Daten in Readings speichert:

define myMod HTTPMOD <meineurl> 3600

Die Readings wiederum werden in der Datenbank abgelegt. Dazu ist beim DB-Loging der Ausdruck

myMod:.*:.*

hinzugekommen. Funktioniert auch alles super, alle Readings landen in der Datenbank.

Dann habe ich ein Notify eingebaut, das eine eigene Funktion aufruft:

define not_myMod_Update notify myMod:.*(_Inf|_Gen):.* { UpdateMyMod($EVENT) }

Funktioniert auch alles soweit. In der Methode lesen ich ein paar Readings von myMod aus, berechnet etwas und setze dann ein neues Reading an myMod. Dazu nutze ich:

fhem("setreading myMod myReading_Cur $cur");

Funktioniert.

Aber: Das neue Reading wird nicht in der Datenbank gespeichert! Für mich nicht nachvollziehbar, warum nicht. Und noch kurioser wird es: Wenn ich in der Eingabezeile von FHEM
setreading myMod myReading_Cur 1
eingebe, also der gleiche Aufruf, wie er aus myUtils durchgeführt wird, dann wird der Wert vom Reading wie zu erwarten gesetzt UND in der Datenbank gespeichert. Der Wert, den ich dabei für das Reading verwende, spielt keine Rolle.

Hat jemand eine Erklärung?

Viele Grüße
Christian

MadMax-FHEM

#1
Zitat von: cs1711 am 28 Oktober 2020, 14:53:43

fhem("setreading myMod myReading_Cur $cur");

Funktioniert.

...

setreading myMod myReading_Cur 1
eingebe, also der gleiche Aufruf, wie er aus myUtils durchgeführt wird, dann wird der Wert vom Reading wie zu erwarten gesetzt UND in der Datenbank gespeichert. Der Wert, den ich dabei für das Reading verwende, spielt keine Rolle.

Das ist jetzt etwas widersprüchlich...

Also: wird das Reading nun aus der myUtils-Sub geschrieben? Ja oder nein?

Und was sein kann (steht nichts im Log?): um eine Rekursion zu verhindern wird evtl. kein Event gefeuert -> (kein Reading gesetzt und) kein Eintrag in der DB...

EDIT: Rekursion: du rufst in einem notify (was ja potentiell auf Events von myMod reagiert) ein setreading bei genau DIESEM Device auf -> da könnte ja das notify sofort wieder triggern und wieder das Reading setzen usw. ;)

EDIT: einfach mal den Eventmonitor öffnen und schauen. Wenn kein Event kommt (was verm. der Fall ist), dann auch kein Eintrag in die DB (das ist auch "nur" ein "Eventhandler" und dazu braucht es eben einen Event ;)  )...

Wogegen "aus Fhem-Web" heraus KEINE Rekursion passieren kann -> Reading wird gesetzt und es landet in der DB...
EDIT: und du wirst den passenden Event im Eventmonitor sehen... :)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

cs1711

Zitat von: MadMax-FHEM am 28 Oktober 2020, 14:59:42
Also: wird das Reading nun aus der myUtils-Sub geschrieben? Ja oder nein?

Ja, der Wert des Readings wird in FHEM aus myUtils-Sub geschrieben, ich sehe den geschrieben Wert in der Oberfläche. NICHT aber in der Datenbank.

Zitat von: MadMax-FHEM am 28 Oktober 2020, 14:59:42
Und was sein kann (steht nichts im Log?): um eine Rekursion zu verhindern wird evtl. kein Event gefeuert -> (kein Reading gesetzt und) kein Eintrag in der DB...
Korrekt, im Log steht nichts.

Zitat von: MadMax-FHEM am 28 Oktober 2020, 14:59:42
EDIT: Rekursion: du rufst in einem notify (was ja potentiell auf Events von myMod reagiert) ein setreading bei genau DIESEM Device auf -> da könnte ja das notify sofort wieder triggern und wieder das Reading setzen usw. ;)
Dadurch, dass ich im Notify auf andere Readings einschränke, kann es zu keiner Rekursion kommen. Aber möglicherweise handhabt FHEM Rekursionsvermeidung "globaler" und die Einschränkung ist nicht relevant.

Zitat von: MadMax-FHEM am 28 Oktober 2020, 14:59:42
EDIT: einfach mal den Eventmonitor öffnen und schauen. Wenn kein Event kommt (was verm. der Fall ist), dann auch kein Eintrag in die DB (das ist auch "nur" ein "Eventhandler" und dazu braucht es eben einen Event ;)  )...
Schon gemacht, DORT taucht es auf.

Zitat von: MadMax-FHEM am 28 Oktober 2020, 14:59:42
Wogegen "aus Fhem-Web" heraus KEINE Rekursion passieren kann -> Reading wird gesetzt und es landet in der DB...
EDIT: und du wirst den passenden Event im Eventmonitor sehen... :)
Ich sehe es wie gesagt in beiden Fällen im Log.

MadMax-FHEM

Zitat
Ich sehe es wie gesagt in beiden Fällen im Log.

In welchen Fällen und in welchem Log?

Zeig doch mal den Eventmonitor, wenn du es über Fhem-Web eingibst (wo es ja in der DB landet) und über das notify und Sub...

Und poste doch mal die gesamte Sub.

Bau doch in die Sub mal eine Logausgabe ein, von dem was du per setreading setzen willst...

Bzgl. Rekursion bin ich nicht sicher, denke aber, dass fhem da nicht so genau prüft...
(vielleicht meldet sich ja jemand der das besser/genauer weiß)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

cs1711

Zitat von: MadMax-FHEM am 28 Oktober 2020, 16:26:32
In welchen Fällen und in welchem Log?

Log war natürlich Quatsch, ich meinte im Event-Monitor.

Event-Monitor bei myUtils-Methode:
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading1_Inf: 14
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading1_Gen: 14
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading2_Inf: 25
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading2_Gen: 17
2020-10-28 17:26:25.163 HTTPMOD myMod EG_Reading3_Inf: 7
2020-10-28 17:26:25.163 HTTPMOD myMod EG_Reading3_Gen: 7
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading4_Inf: 6
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading4_Gen: 5
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading5_Inf: 3
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading5_Gen: 3
2020-10-28 17:26:25.163 HTTPMOD myMod St_Reading6_Inf: 68
2020-10-28 17:26:25.163 HTTPMOD myMod St_Reading6_Gen: 63
2020-10-28 17:26:25.163 HTTPMOD myMod PublishDate: 28.10.2020
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading1_Cur: 0
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading1_Cur: 0
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading2_Cur: 8
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading2_Cur: 8
2020-10-28 17:26:25.163 HTTPMOD myMod EG_Reading3_Cur: 0
2020-10-28 17:26:25.163 HTTPMOD myMod EG_Reading3_Cur: 0
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading4_Cur: 1
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading4_Cur: 1
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading5_Cur: 0
2020-10-28 17:26:25.163 HTTPMOD myMod SG_Reading5_Cur: 0
2020-10-28 17:26:25.163 HTTPMOD myMod St_Reading6_Cur: 5
2020-10-28 17:26:25.163 HTTPMOD myMod St_Reading6_Cur: 5


Bei setreading über fhemweb:

2020-10-28 17:32:55.352 HTTPMOD myMod St_Reading6_Cur: 5

Zitat von: MadMax-FHEM am 28 Oktober 2020, 16:26:32
Und poste doch mal die gesamte Sub.


#
#
#
sub UpdateMyMod($)
{
        my ($Event) = @_;
        my @parts = $Event =~ qr/(.*_.*)_(.*): (\d+)/;
        Log 1, "UpdateMyMod: ReceivedEvent ($Event)";
        Log 1, "UpdateMyMod: Parts: $parts[0] - $parts[1] - $parts[2]";

        my $inf = ReadingsVal("myMod", "$parts[0]_Inf", "0");
        my $gen = ReadingsVal("myMod", "$parts[0]_Gen", "0");
        my $cur = $inf - $gen;
        fhem("setreading myMod $parts[0]_Cur $cur");
}
[code]

[quote author=MadMax-FHEM link=topic=115350.msg1096201#msg1096201 date=1603898792]
Bau doch in die Sub mal eine Logausgabe ein, von dem was du per setreading setzen willst...
[/quote]

Weil? Es wird ja gesetzt.


MadMax-FHEM

Das ist allerdings eigenartig.

Bzw. sehe ich nicht woran es liegen könnte...

Event kommt ja...

Einzig was ich sehe, dass sehr viele Events zur selben Zeit kommen.
Sollte aber ja kein Problem sein...

Evtl. den Thread mal in ein passendes Unterforum schieben, damit der Entwickler vom DB-Modul mal drauf schaut...
Verschieben kannst du selbst...

Sorry, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

betateilchen

Zitat von: cs1711 am 28 Oktober 2020, 15:57:29
Dadurch, dass ich im Notify auf andere Readings einschränke, kann es zu keiner Rekursion kommen. Aber möglicherweise handhabt FHEM Rekursionsvermeidung "globaler" und die Einschränkung ist nicht relevant.

Wie kommst Du darauf? Wenn ich mich recht erinnere, wird die Rekursion durch ein Kennzeichen im device-hash unterbunden, nicht anhand der regexp im notify.

Mach doch mal ein verbose=5 und poste danach die Logausgabe nach dem Durchlauf des notify.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Was passiert, wenn Du in Deiner 99_myUtils die Zeile so abänderst?

fhem("define x_at at +00:00:01 setreading myMod $parts[0]_Cur $cur");
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

cs1711

Zitat von: betateilchen am 28 Oktober 2020, 20:44:17
Was passiert, wenn Du in Deiner 99_myUtils die Zeile so abänderst?

fhem("define x_at at +00:00:01 setreading myMod $parts[0]_Cur $cur");

Die Umgehung über ein at hatte ich schon als Notlösung, sieht etwas anders aus und ich habe dem at etwas mehr Zeit gegeben, weil es nicht zeitkritisch ist:

fhem("define doUpdate".$parts[0]." at +00:01:00 {UpdateMyModReal(\"".$parts[0]."\", $cur)}");

und dann entsprechend eine neue Methode:

sub UpdateMyModReal($$) {
        my ($reading, $value) = @_;
        Log 1, "UpdateMyModReal: Reading: $reading";
        Log 1, "UpdateMyModReal: Value: $value";
        fhem("setreading myMod ".$reading."_Cur ".$value);
}


Das funktioniert und dann wird in der DB gespeichert. Interessieren würde mich aber dennoch, warum der direkte Weg nicht funktioniert.

betateilchen

Zitat von: cs1711 am 29 Oktober 2020, 13:26:31
Interessieren würde mich aber dennoch, warum der direkte Weg nicht funktioniert.

Zitat von: betateilchen am 28 Oktober 2020, 20:33:42
Mach doch mal ein verbose=5 und poste danach die Logausgabe nach dem Durchlauf des notify.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!