Hallo,
Warum sendet er mir nicht den Wert $ddd sondern schreibt in das reaing $ddd.
Sehe den Wald vor lauter Bäumen nicht mehr....
den ersten fhem befehl setreading MQTT2_VictronVenusOS kwhToday $ccc führt er auch nicht aus.
So steht es im DEF
MQTT2_VictronVenusOS:.* {
my $a = ReadingsVal("MQTT2_VictronVenusOS","kwh_eingang","") ;
my $b = ReadingsVal("MQTT2_VictronVenusOS","kwhMerker",0);
my $ccc = $a -$b;
my $ddd = $ccc * 0.379;
fhem ("setreading MQTT2_VictronVenusOS kwhToday $ccc ; setreading MQTT2_VictronVenusOS kostenToday $ddd ;");
}
Zitat von: jostmario am 08 Oktober 2022, 10:59:09
kostenToday $ddd ;");
}
Nur mal ein Versuch: Laß´ mal das letzte Semikolon innerhalb der " weg.
Da es ich bei den Werten vermutlich um Zahlenwerte handelt, solltest Du ReadingsVal durch ReadingsNum ersetzen.
my $a = ReadingsNum("MQTT2_VictronVenusOS","kwh_eingang",0) ;
my $b = ReadingsNum("MQTT2_VictronVenusOS","kwhMerker",0);
Nachdem das notify doch "auf sich selbst hört": MQTT2_VictronVenusOS:.* / setreading MQTT2_VictronVenusOS kwhToday $ccc
wundert es mich, dass es überhaupt funktioniert...
MMn erzeugt das doch eine "Loop"?
Auf was GENAU soll denn das notify "lauschen"? Doch nicht auf ALLES von MQTT2_VictronVenusOS oder?
Wie wäre es übrigens mit einem kompletten list gewesen?
Wenn es schon "in sich selbst" schreibt (also notify auf Device "MQTT2_VictronVenusOS" und setreading auch ins Device "MQTT2_VictronVenusOS"), warum dann nicht einfach ein userReadings?
Gruß, Joachim
Zitat von: MadMax-FHEM am 08 Oktober 2022, 11:24:34
Nachdem das notify doch "auf sich selbst hört": MQTT2_VictronVenusOS:.* / setreading MQTT2_VictronVenusOS kwhToday $ccc
wundert es mich, dass es überhaupt funktioniert...
MMn erzeugt das doch eine "Loop"?
Stimmt auffällig. Ein setreading erzeugt ein Event, auf das das notify dann wieder triggerd. Und das dann gleich doppelt.
Zitat
warum dann nicht einfach ein userReadings?
Das sollte die bessere Alternative sein.
Hallo,
ja stimmt den trigger befehl hatte ich so gemacht um schneller etwas zu sehen konnte so aber nicht gehen.
hab es jetzt so umgebaut:
Internals:
DEF MQTT2_VictronVenusOS:kwh_.* {
my $a = ReadingsNum("MQTT2_VictronVenusOS","kwh_eingang","5") ;
my $b = ReadingsNum("MQTT2_VictronVenusOS","kwhMerker",5);
my $ccc = $a -$b;
my $cc = ReadingsVal("MQTT2_VictronVenusOS","Bilanz","0");
my $d = $cc * 0.379;
my $h = ReadingsVal("MQTT2_VictronVenusOS","kwh_ausgang","0") ;
my $j= ReadingsVal("MQTT2_VictronVenusOS","kwhMerkerOUT","0");
my $k = $h - $j;
fhem "setreading MQTT2_VictronVenusOS kwhToday $ccc";;
fhem "setreading MQTT2_VictronVenusOS kwhTodayOUT $k";;
fhem "setreading MQTT2_VictronVenusOS kostenToday $d";;
}
FUUID 6338a213-f33f-2bfa-8c36-072c4e723b99b142
NAME kwhtodaynotify
NOTIFYDEV MQTT2_VictronVenusOS
NR 1511
NTFY_ORDER 50-kwhtodaynotify
REGEXP MQTT2_VictronVenusOS:kwh_.*
STATE 2022-10-08 23:47:49
TRIGGERTIME 1665265669.97634
TYPE notify
READINGS:
2022-10-08 11:34:16 state active
2022-10-08 23:47:49 triggeredByDev MQTT2_VictronVenusOS
2022-10-08 23:47:49 triggeredByEvent kwh_eingang: 70.8
Attributes:
DbLogExclude .*
event-on-change-reading nichts
Kann ich die Berechnungen auch direkt in einem Userreading durchführen ohne das notify, wäre wohl recourcenschonender?
Gruß Josty
Jetzt triggert das notify zuminest nicht mehr auf die "eigenen" set/setreadings.
Trotzdem könnte ich mir vorstellen, dass da etwas bzw. Rekursion/Loop im Log steht?
Was du hier mit einem notify machst, genau dafür ist doch userReadings da.
Also anhand von Events/Readingänderungen am Device neue Readings "berechnen"...
Was soll das bei einem notify bewirken?
Zitat
event-on-change-reading nichts
(also was es generell macht: kein Event mehr von diesem Device aber bei einem notify?)
Gruß, Joachim
Zitat von: jostmario am 08 Oktober 2022, 23:50:56
Kann ich die Berechnungen auch direkt in einem Userreading durchführen
Ungetestet sollte das so funktionieren:
attr MQTT2_VictronVenusOS userReadings kwhToday:kwh_eingang.* {ReadingsNum($name,"kwh_eingang",5)-ReadingsNum($name,"kwhMerker",5)},
kostenToday:Bilanz.* {ReadingsNum($name,"Bilanz",0)*0.379},
kwhTodayOUT:kwh_ausgang.* {ReadingsNum($name,"kwh_ausgang",0)-ReadingsNum($name,"kwhMerkerOUT",0)}
Zitat von: jostmario am 08 Oktober 2022, 23:50:56
ohne das notify, wäre wohl recourcenschonender?
Möglich, kann ich aber nicht beurteilen.
Edit @TomLee:
Danke für den Hinweis, da habe ich mich vergallopiert. Code geändert
userReadings
Komma getrennte Liste von benutzerdefinierten Readings. Jede Definition hat folgendes Format:
<reading>[:<trigger>] [<modifier>] { <perl code> }
und nicht
userReadings
ZitatKomma getrennte Liste von benutzerdefinierten Readings. Jede Definition hat folgendes Format:
<reading>[:<eigenerdevicename>][:<trigger>] [<modifier>] { <perl code> }
und auf die gezeigten ".*" am Ende der trigger kann man hier mMn. verzichten.
Zitat von: TomLee am 09 Oktober 2022, 08:51:14
userReadings
Komma getrennte Liste von benutzerdefinierten Readings. Jede Definition hat folgendes Format:
<reading>[:<trigger>] [<modifier>] { <perl code> }
Uupps, geändert.
Danke für den Hinweis.
Zitat von: TomLee am 09 Oktober 2022, 08:51:14
und auf die gezeigten ".*" am Ende der trigger kann man hier mMn. verzichten.
Lt. Wiki sind die ".*" aber erforderlich:
ZitatGeändertes Verhalten - bitte beachten
Im April 2016 hat sich die Verarbeitung des Triggers dahingehend geändert, dass die Trigger-Spezifikation jetzt als Regulärer Ausdruck interpretiert wird, damit also z.B. ein avgTemp:temperature geändert werden muss in avgTemp:temperature.*.
Technische Details dazu wurden in diesem Forenthread diskutiert.
Hab jetzt keine Zeit zum auprobieren, mMn. ist das dann in dem Kommentar nicht korrekt dargestellt/erklärt.
Edit:
Natürlich greift der gezeigte Ausdruck mit .* auch.
Zitat von: TomLee am 09 Oktober 2022, 09:42:24
Hab jetzt keine Zeit zum auprobieren,
Also meine userReadings haben im Test jetzt gerade ohne ".*" nicht funktioniert.
Aus der commandRef:
ZitatuserReadings
Komma getrennte Liste von benutzerdefinierten Readings. Jede Definition hat folgendes Format:
<reading>[:<trigger>] [<modifier>] { <perl code> }
Diese benutzerdefinierte Readings werden bei jeder Aktualisierung der Gerätereadings gesetzt, indem das spezifizierte perl code { <perl code> } ausgeführt wird, und dessen Wert dem Reading zugewiesen wird. Falls <trigger> spezifiziert ist, dann findet diese Ausführung nur dann statt, falls einer der aktualisierten Readings dem regexp <trigger> entspricht (matched).
Beispiele:
attr myEnergyMeter userReadings energy { ReadingsVal("myEnergyMeter","counters.A",0)/1250.0;; }
attr myMultiMeter userReadings energy1:counters.A.* {ReadingsVal("myMultiMeter","counters.A",0)/1250.0}, energy2:counters.B.* {ReadingsVal("myMultiMeter","counters.B",0)/1250.0}
Das müsste dann doch bedeuten, dass das userReading geändert werden müsste von
userReadings kwhToday:kwh_eingang.* {ReadingsNum($name,"kwh_eingang",5)-ReadingsNum($name,"kwhMerker",5)}
in
userReadings kwhToday {ReadingsNum($name,"kwh_eingang",5)-ReadingsNum($name,"kwhMerker",5)}
Allerdings habe ich bei mir nur userReadings mit trigger definiert.
Zitat von: MadMax-FHEM am 09 Oktober 2022, 00:18:36
event-on-change-reading nichts
Was soll das bei einem notify bewirken?(also was es generell macht: kein Event mehr von diesem Device aber bei einem notify?)
Gruß, Joachim
Das setze ich standartmäsig automatisiert beim anlegen neuer Device, das sie erst mal keine Events generieren.
Danach entscheide ich was ich Events generieren lassen möchte.
Werd das die Tage mal auf userReadings umbauen aktuell scheint es so zu funktionieren.
Danke euch.
Gruß Josty
Wenn ich mich richtig erinnere, gibt es keinen Loop. FHEM scheint das intern abzufangen.
Als ich das mal bewusst machen wollte, gab es keine Events, die Readings wurden zwar gesetzt, aber ohne Folge.
Das konnte ich nur lösen, indem ich vor dem setreading noch ein sleep 0.1 gesetzt hatte.
Also dürfte das nicht das eigentlich Problem sein.
Ok, Ok, Kaffee hatte noch nicht gewirkt, dafür das ich jetzt aber hier öffentlich Mist geschrieben habe, hat das bei mir bewirkt das ich es ab jetzt ;D verinnerlicht habe.
kwhToday:kwh_eingang.*
könnte man auch als Kurzform bezeichnen.
Aus der langen kann man sich eher ableiten was wie genau zu verstehen ist:
kwhToday:kwh_eingang:.*
Beides triggert auf irgendeinen beliebiegen Wert in dem Reading.