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
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.
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
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")}}
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
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 ... ???
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
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
Hi Joachim
Hat super funktioniert - vielen Dank :)