Autor Thema: EVTPART im notify mit Liste übersetzen  (Gelesen 1705 mal)

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 19715
  • schon mal restore trainiert?
    • Otto's Technik Blog
EVTPART im notify mit Liste übersetzen
« am: 08 Dezember 2020, 23:37:17 »
Hi,

ich habe immer mal das Problem auf zwei Events genau mit zwei Aktionen zu reagieren. Beispiel:
start -> on
end -> off
Oder konkret: Es gibt die Events event: enter und event: leave
leave -> 4Move
enter -> 3Significant
Ist diese "Übersetzung" mit einer Liste bzw. einem Hash mit Key=>Value guter Perl Code? Oder ist das Mist und es gibt was Besseres? Oder hab ich es falsch verstanden?
defmod n_OwnMode notify MQTT2_owntracks_user_dev:event:.enter|MQTT2_owntracks_user_dev:event:.leave {my %h =('leave','4Move','enter','3Significant');;fhem("set $NAME mode $h{$EVTPART1}")}

Grüße Otto
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266

Offline amenomade

  • Developer
  • Hero Member
  • ****
  • Beiträge: 7449
Antw:EVTPART im notify mit Liste übersetzen
« Antwort #1 am: 09 Dezember 2020, 00:17:37 »
Eher hash. Aber für zwei Werte kann man auch if nutzen ;)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16340
Antw:EVTPART im notify mit Liste übersetzen
« Antwort #2 am: 09 Dezember 2020, 08:03:33 »
Tendenziell scheint mir das eher in einem userReadings-Eintrag besser aufgehoben zu sein, und bei nur zwei Optionen müßte das auch mit einem ternären Operator kürzer/verständlicher zu scheiben gehen.
Falls dasselbe Reading geändert werden soll (=> userReadings klappt nicht), gibt es noch readingsChange, wie ich jüngst gelernt habe (ohne es allerdings erfolgreich angewendet zu haben).
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 19715
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:EVTPART im notify mit Liste übersetzen
« Antwort #3 am: 09 Dezember 2020, 10:54:14 »
Moin,

wegen der Optik nochmal der Ausgangspunkt
{my %h =('leave','4Move','enter','3Significant');;fhem("set $NAME mode $h{$EVTPART1}")}In der Tat wäre set magic am kürzesten und im Fall "2 Werte" auch übersichtlich - wenn man auf die extra Prüfung der Alternative verzichtet.
Bei set magic rollen alle (außer rudi ;) ) immer mit den Augen :)
set $NAME mode {($EVTPART1 eq 'leave'?'4Move':'3Significant')}Wenn man die Alternative noch eindeutig prüft wird es schon etwas holprig und nicht kürzer, wenn jetzt noch was dazu kommt. ::)
set $NAME mode {($EVTPART1 eq 'leave'?'4Move':($EVTPART1 eq 'enter'?'3Significant':''))}Der if else Wurm ... muss man den Befehl zweimal schreiben
{if ($EVTPART1 eq 'leave'){set $NAME mode '4Move'} else {set $NAME mode '3Significant'}}Ist mit Prüfung der Alternative schon länger
{if ($EVTPART1 eq 'leave'){set $NAME mode '4Move'} elsif ($EVTPART1 eq 'enter') {set $NAME mode '3Significant'}}Mit zusätzlicher Variable hätte man den Kram am Anfang des Codes geprüft, braucht den Befehl bloß einmal und der Code muss langsam in die 99_myUtils :)
{my $c;;if ($EVTPART1 eq 'leave'){$c='4Move'} elsif ($EVTPART1 eq 'enter'){$c='3Significant'};;set $NAME mode $c}Da gibt es sicher noch viele Möglichkeiten. Ich finde jetzt erstmal meinen Ansatz gar nicht schlecht. Man muss ja auch was haben was man quasi aus der Schublade zieht und was gut wartbar ist :)

Gruß Otto
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266

Offline amenomade

  • Developer
  • Hero Member
  • ****
  • Beiträge: 7449
Antw:EVTPART im notify mit Liste übersetzen
« Antwort #4 am: 09 Dezember 2020, 18:05:23 »
Moin,

wegen der Optik nochmal der Ausgangspunkt
{my %h =('leave','4Move','enter','3Significant');;fhem("set $NAME mode $h{$EVTPART1}")}

Ich finde hash lesbarer, insb wenn man eine längere Liste hat. Mit hash sind die Eingabe-/Ausgangswerte klärer und deutlich zu erkennen

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 24714
Antw:EVTPART im notify mit Liste übersetzen
« Antwort #5 am: 09 Dezember 2020, 18:31:43 »
Besonders wenn man statt 'leave','4Move' die leave=>'4Move' Notation verwendet. :)

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 19715
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:EVTPART im notify mit Liste übersetzen
« Antwort #6 am: 09 Dezember 2020, 20:28:47 »
ich finde den Hash auch viel besser lesbar!
Was da "intern" entsteht ist aber von der Notation unabhängig? Also 'leave','4Move' und leave=>'4Move' ist am Ende das Gleiche?
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266

Offline amenomade

  • Developer
  • Hero Member
  • ****
  • Beiträge: 7449
Antw:EVTPART im notify mit Liste übersetzen
« Antwort #7 am: 09 Dezember 2020, 20:51:53 »
ich finde den Hash auch viel besser lesbar!
Was da "intern" entsteht ist aber von der Notation unabhängig? Also 'leave','4Move' und leave=>'4Move' ist am Ende das Gleiche?

Ok Rudi, hast mich erwischt ;)
Genau das meinte ich !
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

 

decade-submarginal