[­gelöst] notify mit Wertübergabe

Begonnen von Schneewa, 21 August 2021, 07:12:07

Vorheriges Thema - Nächstes Thema

Schneewa

Hi all

ich möchte die Performance meines Fhem verbessern

ich habe ein Reading in dem ich ein Userreading erstellt habe


Internals:
   DEF        05069158
   FUUID      5e990f26-f33f-70d9-52d5-55f5705b871e0495
   IODev      TCM_ESP3_0
   LASTInputDev TCM_ESP3_0
   MSGCNT     391
   NAME       Terrassentuer_open_closed_Enocean
   NR         2031
   NTFY_ORDER 50-Terrassentuer_open_closed_Enocean
   STATE      C: open V: off E: 0 U: 2.98
   TCM_ESP3_0_DestinationID FFFFFFFF
   TCM_ESP3_0_MSGCNT 391
   TCM_ESP3_0_PacketType 1
   TCM_ESP3_0_RSSI -79
   TCM_ESP3_0_ReceivingQuality good
   TCM_ESP3_0_RepeatingCounter 1
   TCM_ESP3_0_SubTelNum 6
   TCM_ESP3_0_TIME 2021-08-21 07:05:26
   TYPE       EnOcean
   OLDREADINGS:
   READINGS:
     2021-08-20 12:18:21   IODev           TCM_ESP3_0
     2021-08-21 07:05:26   alarm_2         off
     2021-08-21 07:05:26   batteryPercent  93.3333333333333
     2021-08-13 15:35:32   batteryState    ok
     2021-08-18 15:04:13   brightness      0
     2021-08-21 05:47:26   contact         open
     2021-08-21 07:05:26   contact_2       off
     2021-08-21 05:47:26   state           C: open V: off E: 0 U: 2.98
     2021-08-13 15:35:32   vibration       off
     2021-08-16 05:32:26   voltage         2.98
   helper:
     timer:
       alarm:
         HASH(0x562861ce2018)
         alarm
         dead_sensor
         1
         5
Attributes:
   IODev      TCM_ESP3_0
   alias      Terrassentuer_open_closed_Enocean
   eep        A5-14-01
   event-on-change-reading voltage,alarm.*,contact.*,batteryPercent:0.01
   manufID    069
   room       Esszimmer
   signOfLifeInterval 900
   subType    multiFuncSensor
   teachMethod 4BS
   userReadings batteryPercent {my $wert=(ReadingsVal("Terrassentuer_open_closed_Enocean","voltage","")-3+0.3)/0.3*100;;$wert > 100?100:($wert < 0?0:$wert)},
contact_2 {my $wert=ReadingsVal("Terrassentuer_open_closed_Enocean","contact","");;$wert eq 'open'?'off':($wert eq 'closed'?'on':$wert)},
alarm_2 {my $wert=ReadingsVal("Terrassentuer_open_closed_Enocean","alarm",""); ($wert eq 'dead_sensor') ? 'on' : 'off';}


übergeben wird er Wert z.B.: batteryPercent an das notify



Internals:
   DEF        Terrassentuer_open_closed_Enocean:batteryPercent:.* {fhem "set Terrassentuer_open_closed_Enocean_batteryPercent_SPS ".ReadingsVal("Terrassentuer_open_closed_Enocean","batteryPercent",0.0);}
   FUUID      5e9bddf8-f33f-70d9-c185-361e568eda7bbe11
   NAME       Terrassentuer_open_closed_Enocean_batteryPercent_notify
   NOTIFYDEV  Terrassentuer_open_closed_Enocean
   NR         2093
   NTFY_ORDER 50-Terrassentuer_open_closed_Enocean_batteryPercent_notify
   REGEXP     Terrassentuer_open_closed_Enocean:batteryPercent:.*
   STATE      active
   TYPE       notify
   READINGS:
     2021-08-20 12:18:10   state           active
Attributes:
   alias      Terrassentuer_open_closed_Enocean_batteryPercent_notify
   room       Esszimmer


dann wird übergeben an die S7


Internals:
   ADDRESS    378
   AREA       db
   DATATYPE   float
   DB         500
   DEF        db 500 378 float
   FUUID      5e9bddf8-f33f-70d9-e54e-7c2a93feb6bc31b0
   IODev      SPS_Enocean
   LASTInputDev SPS_Enocean
   LENGTH     4
   MSGCNT     49212
   NAME       Terrassentuer_open_closed_Enocean_batteryPercent_SPS
   NR         2124
   SPS_Enocean_MSGCNT 49212
   SPS_Enocean_TIME 2021-08-21 07:10:04
   STATE      93.3333358764648
   TYPE       S7_AWrite
   READINGS:
     2021-08-20 12:18:21   IODev           SPS_Enocean
     2021-08-21 07:09:48   state           93.3333358764648
Attributes:
   IODev      SPS_Enocean
   alias      Terrassentuer_open_closed_Enocean_batteryPercent_SPS
   event-min-interval .*:600
   event-on-change-reading state
   room       Esszimmer


das funktioniert auch soweit.  :)

jetzt würde ich aber gerne das userreading löschen und die Umrechnung im notify erledigen - irgendwie scheitere ich aber daran  :-\

kann mir einer von den Experten da vielleicht weiterhelfen

besten dank

rudolfkoenig

Zitatirgendwie scheitere ich aber daran
Um helfen zu koennen muesste man mehr ueber das "irgendwie" wissen, siehe aber https://tty1.net/smart-questions_de.html#code
Ansonsten empfehle ich das Fhem Wiki: https://wiki.fhem.de/wiki/Notify, und die Aufgabe als Funktion in 99_myUtils.pm auszulagern.

MadMax-FHEM

#2
Warum denkst du damit die Performance deines fhem (signifikant) zu verbessern?

Wenn du die Performance verbessern willst, dann erstelle userReadings MIT TRIGGER!
Statt sie wie jetzt auf JEDE ÄNDERUNG am Device reagieren zu lassen...

Bzgl. der Frage, einfach den Code vom userReadings ins notify "stecken" und das notify dann nat. auf "voltage" umstellen (das wäre auch der passende Trigger für das userReadings ;) ):

Bzgl. Strichpunkte: das hier ist für die Eingabe in DEF...


Du kannst auch statt der Abfrage mittels ReadingsVal bzw. besser ReadingsnNum auch $EVENT oder $EVTPART nehmen, kommt drauf an wie der Event aussieht.

Also evtl. zunächst mal:


Terrassentuer_open_closed_Enocean_batteryPercent_notify notify Terrassentuer_open_closed_Enocean:voltage:.* {Log3(undef, 3, "Terrassentuer_open_closed_Enocean_batteryPercent_notify $EVENT");}


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)

Schneewa

Hi all

vielen dank für die schnellen Antworten

@ rudolfkönig - wie MadMax-FHEM geschrieben hat, würde ich gerne das userreading  ins notify stecken

@ MadMax-FHEM

leider funktioniert der Code nicht

ZitatTerrassentuer_open_closed_Enocean_batteryPercent_notify notify Terrassentuer_open_closed_Enocean:voltage:.* {my $wert=(ReadingsNum("Terrassentuer_open_closed_Enocean","voltage",0)-3+0.3)/0.3*100;$wert > 100?100:($wert < 0?0:$wert); fhem ("set Terrassentuer_open_closed_Enocean_batteryPercent_SPS $wert")}

folgender Fehler im log


2021.08.21 13:44:59 1: PERL WARNING: Useless use of private variable in void context at (eval 331205) line 1.
2021.08.21 13:44:59 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART10=   $evalSpecials->{'%EVTPART10'};my $EVTPART11=   $evalSpecials->{'%EVTPART11'};my $EVTPART12=   $evalSpecials->{'%EVTPART12'};my $EVTPART13=   $evalSpecials->{'%EVTPART13'};my $EVTPART14=   $evalSpecials->{'%EVTPART14'};my $EVTPART15=   $evalSpecials->{'%EVTPART15'};my $EVTPART16=   $evalSpecials->{'%EVTPART16'};my $EVTPART17=   $evalSpecials->{'%EVTPART17'};my $EVTPART18=   $evalSpecials->{'%EVTPART18'};my $EVTPART19=   $evalSpecials->{'%EVTPART19'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $EVTPART20=   $evalSpecials->{'%EVTPART20'};my $EVTPART21=   $evalSpecials->{'%EVTPART21'};my $EVTPART22=   $evalSpecials->{'%EVTPART22'};my $EVTPART23=   $evalSpecials->{'%EVTPART23'};my $EVTPART24=   $evalSpecials->{'%EVTPART24'};my $EVTPART25=   $evalSpecials->{'%EVTPART25'};my $EVTPART26=   $evalSpecials->{'%EVTPART26'};my $EVTPART27=   $evalSpecials->{'%EVTPART27'};my $EVTPART28=   $evalSpecials->{'%EVTPART28'};my $EVTPART29=   $evalSpecials->{'%EVTPART29'};my $EVTPART3=   $evalSpecials->{'%EVTPART3'};my $EVTPART4=   $evalSpecials->{'%EVTPART4'};my $EVTPART5=   $evalSpecials->{'%EVTPART5'};my $EVTPART6=   $evalSpecials->{'%EVTPART6'};my $EVTPART7=   $evalSpecials->{'%EVTPART7'};my $EVTPART8=   $evalSpecials->{'%EVTPART8'};my $EVTPART9=   $evalSpecials->{'%EVTPART9'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{return undef; {my $wert=(ReadingsNum("Terrassentuer_open_closed_Enocean","voltage",0)-3+0.3)/0.3*100;$wert > 100?100:($wert < 0?0:$wert); fhem ("set Terrassentuer_open_closed_Enocean_batteryPercent_SPS $wert")}}

MadMax-FHEM

#4
Hast du es in die DEF eingegeben?
Genauso wie gepostet?

Weil ich hab das mit dummy getestet und es hat funktioniert...

Bin grad unterwegs, kann erst später noch mal schauen...

EDIT: schalte mal stacktrace ein...

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)

Schneewa

#5
Hi

ins DEF habe ich nur diesen Wert kopiert, da das notify schon existiert

Terrassentuer_open_closed_Enocean:voltage:.* {my $wert=(ReadingsNum("Terrassentuer_open_closed_Enocean","voltage",0)-3+0.3)/0.3*100;$wert > 100?100:($wert < 0?0:$wert); fhem ("set Terrassentuer_open_closed_Enocean_batteryPercent_SPS $wert")}


stacktrace eingeschalten

nach eingeschalteten stacktrace


2021.08.21 16:08:02 1: PERL WARNING: Useless use of a constant (100) in void context at (eval 353647) line 1.
2021.08.21 16:08:02 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART10=   $evalSpecials->{'%EVTPART10'};my $EVTPART11=   $evalSpecials->{'%EVTPART11'};my $EVTPART12=   $evalSpecials->{'%EVTPART12'};my $EVTPART13=   $evalSpecials->{'%EVTPART13'};my $EVTPART14=   $evalSpecials->{'%EVTPART14'};my $EVTPART15=   $evalSpecials->{'%EVTPART15'};my $EVTPART16=   $evalSpecials->{'%EVTPART16'};my $EVTPART17=   $evalSpecials->{'%EVTPART17'};my $EVTPART18=   $evalSpecials->{'%EVTPART18'};my $EVTPART19=   $evalSpecials->{'%EVTPART19'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $EVTPART20=   $evalSpecials->{'%EVTPART20'};my $EVTPART21=   $evalSpecials->{'%EVTPART21'};my $EVTPART22=   $evalSpecials->{'%EVTPART22'};my $EVTPART23=   $evalSpecials->{'%EVTPART23'};my $EVTPART24=   $evalSpecials->{'%EVTPART24'};my $EVTPART25=   $evalSpecials->{'%EVTPART25'};my $EVTPART26=   $evalSpecials->{'%EVTPART26'};my $EVTPART27=   $evalSpecials->{'%EVTPART27'};my $EVTPART28=   $evalSpecials->{'%EVTPART28'};my $EVTPART29=   $evalSpecials->{'%EVTPART29'};my $EVTPART3=   $evalSpecials->{'%EVTPART3'};my $EVTPART4=   $evalSpecials->{'%EVTPART4'};my $EVTPART5=   $evalSpecials->{'%EVTPART5'};my $EVTPART6=   $evalSpecials->{'%EVTPART6'};my $EVTPART7=   $evalSpecials->{'%EVTPART7'};my $EVTPART8=   $evalSpecials->{'%EVTPART8'};my $EVTPART9=   $evalSpecials->{'%EVTPART9'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{return undef; {my $wert=(ReadingsNum("Terrassentuer_open_closed_Enocean","voltage",0)-3+0.3)/0.3*100;$wert > 100?100:($wert < 0?0:$wert); fhem ("set Terrassentuer_open_closed_Enocean_batteryPercent_SPS $wert")}}
2021.08.21 16:08:02 1: stacktrace:
2021.08.21 16:08:02 1:     main::__ANON__                      called by (eval 353647) (1)
2021.08.21 16:08:02 1:     (eval)                              called by fhem.pl (1160)
2021.08.21 16:08:02 1:     main::AnalyzePerlCommand            called by fhem.pl (5926)
2021.08.21 16:08:02 1:     main::perlSyntaxCheck               called by ./FHEM/91_notify.pm (65)
2021.08.21 16:08:02 1:     main::notify_Define                 called by ./FHEM/98_apptime.pm (178)
2021.08.21 16:08:02 1:     main::apptime_getTiming             called by ./FHEM/98_apptime.pm (138)
2021.08.21 16:08:02 1:     main::CallFn                        called by fhem.pl (2175)
2021.08.21 16:08:02 1:     main::CommandModify                 called by fhem.pl (1265)
2021.08.21 16:08:02 1:     main::AnalyzeCommand                called by ./FHEM/01_FHEMWEB.pm (2777)
2021.08.21 16:08:02 1:     main::FW_fC                         called by ./FHEM/01_FHEMWEB.pm (963)
2021.08.21 16:08:02 1:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (598)
2021.08.21 16:08:02 1:     main::FW_Read                       called by ./FHEM/98_apptime.pm (178)
2021.08.21 16:08:02 1:     main::apptime_getTiming             called by ./FHEM/98_apptime.pm (138)
2021.08.21 16:08:02 1:     main::CallFn                        called by fhem.pl (773)
2021.08.21 16:08:02 1: PERL WARNING: Useless use of private variable in void context at (eval 353647) line 1.
2021.08.21 16:08:02 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART10=   $evalSpecials->{'%EVTPART10'};my $EVTPART11=   $evalSpecials->{'%EVTPART11'};my $EVTPART12=   $evalSpecials->{'%EVTPART12'};my $EVTPART13=   $evalSpecials->{'%EVTPART13'};my $EVTPART14=   $evalSpecials->{'%EVTPART14'};my $EVTPART15=   $evalSpecials->{'%EVTPART15'};my $EVTPART16=   $evalSpecials->{'%EVTPART16'};my $EVTPART17=   $evalSpecials->{'%EVTPART17'};my $EVTPART18=   $evalSpecials->{'%EVTPART18'};my $EVTPART19=   $evalSpecials->{'%EVTPART19'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $EVTPART20=   $evalSpecials->{'%EVTPART20'};my $EVTPART21=   $evalSpecials->{'%EVTPART21'};my $EVTPART22=   $evalSpecials->{'%EVTPART22'};my $EVTPART23=   $evalSpecials->{'%EVTPART23'};my $EVTPART24=   $evalSpecials->{'%EVTPART24'};my $EVTPART25=   $evalSpecials->{'%EVTPART25'};my $EVTPART26=   $evalSpecials->{'%EVTPART26'};my $EVTPART27=   $evalSpecials->{'%EVTPART27'};my $EVTPART28=   $evalSpecials->{'%EVTPART28'};my $EVTPART29=   $evalSpecials->{'%EVTPART29'};my $EVTPART3=   $evalSpecials->{'%EVTPART3'};my $EVTPART4=   $evalSpecials->{'%EVTPART4'};my $EVTPART5=   $evalSpecials->{'%EVTPART5'};my $EVTPART6=   $evalSpecials->{'%EVTPART6'};my $EVTPART7=   $evalSpecials->{'%EVTPART7'};my $EVTPART8=   $evalSpecials->{'%EVTPART8'};my $EVTPART9=   $evalSpecials->{'%EVTPART9'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{return undef; {my $wert=(ReadingsNum("Terrassentuer_open_closed_Enocean","voltage",0)-3+0.3)/0.3*100;$wert > 100?100:($wert < 0?0:$wert); fhem ("set Terrassentuer_open_closed_Enocean_batteryPercent_SPS $wert")}}
2021.08.21 16:08:02 1: stacktrace:
2021.08.21 16:08:02 1:     main::__ANON__                      called by (eval 353647) (1)
2021.08.21 16:08:02 1:     (eval)                              called by fhem.pl (1160)
2021.08.21 16:08:02 1:     main::AnalyzePerlCommand            called by fhem.pl (5926)
2021.08.21 16:08:02 1:     main::perlSyntaxCheck               called by ./FHEM/91_notify.pm (65)
2021.08.21 16:08:02 1:     main::notify_Define                 called by ./FHEM/98_apptime.pm (178)
2021.08.21 16:08:02 1:     main::apptime_getTiming             called by ./FHEM/98_apptime.pm (138)
2021.08.21 16:08:02 1:     main::CallFn                        called by fhem.pl (2175)
2021.08.21 16:08:02 1:     main::CommandModify                 called by fhem.pl (1265)
2021.08.21 16:08:02 1:     main::AnalyzeCommand                called by ./FHEM/01_FHEMWEB.pm (2777)
2021.08.21 16:08:02 1:     main::FW_fC                         called by ./FHEM/01_FHEMWEB.pm (963)
2021.08.21 16:08:02 1:     main::FW_answerCall                 called by ./FHEM/01_FHEMWEB.pm (598)
2021.08.21 16:08:02 1:     main::FW_Read                       called by ./FHEM/98_apptime.pm (178)
2021.08.21 16:08:02 1:     main::apptime_getTiming             called by ./FHEM/98_apptime.pm (138)
2021.08.21 16:08:02 1:     main::CallFn                        called by fhem.pl (773)


ich hoffe das hilft ... ???


MadMax-FHEM

Ja, hab nachgesehen, habe die Meldung bei mir auch, sorry.

Ich lagere "sowas" ja immer nach myUtils aus.
Im DEF muss ich gestehen bin ich immer unsicher bzgl. Strichpunkte etc.

In der myUtils ist es Perl, da ist es einfacher :)

Hattest du bei deinem userReadings keine Einträge?

Ich probier später noch mal ein wenig (weiß aber nicht, ob in mit "sowas" in der DEF weiter kommen :-\  )

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)

MadMax-FHEM

So jetzt denke ich hab ich's :)

Sorry...


{my $wert=(ReadingsNum("Terrassentuer_open_closed_Enocean","voltage",0)-3+0.3)/0.3*100;;$wert = $wert > 100 ? 100 : ($wert < 0 ? 0 : $wert);; fhem ("set Terrassentuer_open_closed_Enocean_batteryPercent_SPS $wert")}


Also: in der DEF doppelte Strichpunkte (denke ich / in RAWDEF dann wohl 4 / in einer myUtils-Sub halt nur einer :)  )

Und: um rauszukriegen ob du über 100 oder unter 0 bist musst du das Ergebnis nat. auch wieder $wert zuweisen 8)

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)

Schneewa

Hi Joachim

Hat super funktioniert - vielen Dank  :)