Variable aus Notify senden

Begonnen von jostmario, 08 Oktober 2022, 10:59:09

Vorheriges Thema - Nächstes Thema

jostmario

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 ;");
}
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

Nobbynews

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);

MadMax-FHEM

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
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)

Nobbynews

#3
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.

jostmario

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
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

MadMax-FHEM

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
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)

Nobbynews

#6
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

TomLee

#7
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.

Nobbynews

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.

Nobbynews

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.

TomLee

#10
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.

Nobbynews

#11
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.

jostmario

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
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

jhohmann

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.
Raspberry Pi 4 - bookworm / EnOcean - Rollo+Licht, deCONZ - Licht+Sensoren, ZWave - CO Messung, HMCCU mit piVCCU - Heizung+Rollo
plus dovecot, minidlna

TomLee

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.