FHEM Forum

FHEM => Automatisierung => Perl für FHEM-User => Thema gestartet von: TomLee am 10 Juli 2020, 12:34:40

Titel: Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 10 Juli 2020, 12:34:40
Hallo,

möchte den Befehl {fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein {(('s9014','s20293','s2485','s78261')[int(rand(4))])}")} in abgewandelter Form (ohne Zufall) in dem u. a. notify nutzen, er dient nur als Grundlage zu testen :P

mir gibt in der Befehlszeile ausgeführt {('s9014','s20293','s2485','s78261')[int(rand(4))]} korrekt zufällig irgendein Element zurück, bspw. s2485

{fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein {(('s9014','s20293','s2485','s78261')[int(rand(4))])}")} spielt zufällig korrekt einen Radiosender ab.

Auch ein Test mit einem dummy wird korrekt ausgeführt: {fhem("setreading du_Testy2 x {(('s9014','s20293','s2485','s78261')[int(rand(4))])}")} ohne Meldungen im Log

Warum bekomme ich in einem notify Meldungen im Log ?

defmod MQTT2_Sensorkrake_notify_1 notify MQTT2_Sensorkrake:NEC_32:.* {(ReadingsVal('TV_Wohnzimmer','state','') eq 'on') ? return :\
(($EVTPART1 eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') ne 'Sonos')) ? {fhem"set du_remote Sonos;;saysonos Sonos"} :\
$EVTPART1 eq '0x20DF8679' ? {fhem"set du_remote Jalousie;;saysonos Jalousie"} :\
(($EVTPART1 eq '0x20DF827D') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 close"} :\
(($EVTPART1 eq '0x20DF02FD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 open"} :\
(($EVTPART1 eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 stop"} : \
(($EVTPART1 eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {(ReadingsVal('Sonos_Wohnzimmer','state','') eq 'STOPPED') ? fhem"set Sonos_Wohnzimmer play" : fhem"set Sonos_Wohnzimmer stop"} :\
(($EVTPART1 eq '0x20DFE01F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem"set Sonos_Wohnzimmer VolumeD"} :\
(($EVTPART1 eq '0x20DF609F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem"set Sonos_Wohnzimmer VolumeU"} :\
(($EVTPART1 eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein {(('s9014','s20293','s2485','s78261')[int(rand(4))])}")}:\
return;;\
}\

attr MQTT2_Sensorkrake_notify_1 room Wohnzimmer


Was will mir die Meldung mit dem anonymen Hash sagen ?

Es kommt abwechselnd nach jedem ausführen des Befehls zu folgenden Meldungen im Log, Befehl wird aber ausgeführt

einmal
2020.07.10 12:06:30 1: PERL WARNING: Use of uninitialized value in anonymous hash ({}) at (eval 18425347) line 1.
2020.07.10 12:06:30 3: eval: my $TYPE='MQTT2_DEVICE';my $EVTPART0='NEC_32:';my $NAME='MQTT2_Sensorkrake';my $EVENT='NEC_32: 0x20DF4EB1';my $EVTPART1='0x20DF4EB1';my $SELF='MQTT2_Sensorkrake_notify_1';{(ReadingsVal('TV_Wohnzimmer','state','') eq 'on') ? return :
(($EVTPART1 eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') ne 'Sonos')) ? {fhem"set du_remote Sonos;saysonos Sonos"} :
$EVTPART1 eq '0x20DF8679' ? {fhem"set du_remote Jalousie;saysonos Jalousie"} :
(($EVTPART1 eq '0x20DF827D') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 close"} :
(($EVTPART1 eq '0x20DF02FD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 open"} :
(($EVTPART1 eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 stop"} :
(($EVTPART1 eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {(ReadingsVal('Sonos_Wohnzimmer','state','') eq 'STOPPED') ? fhem"set Sonos_Wohnzimmer play" : fhem"set Sonos_Wohnzimmer stop"} :
(($EVTPART1 eq '0x20DFE01F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem"set Sonos_Wohnzimmer VolumeD"} :
(($EVTPART1 eq '0x20DF609F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem"set Sonos_Wohnzimmer VolumeU"} :
(($EVTPART1 eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein {(('s9014','s20293','s2485','s78261')[int(rand(4))])}")}:
return;
}

2020.07.10 12:06:30 3: MQTT2_Sensorkrake_notify_1 return value: HASH(0x77b90c8)


und anschließend

2020.07.10 12:06:30 3: MQTT2_Sensorkrake_notify_1 return value: HASH(0x77b90c8)
2020.07.10 12:06:39 3: xd_vacuum: connection timeout
2020.07.10 12:06:56 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 18425381) line 1.
2020.07.10 12:06:56 1: PERL WARNING: Use of uninitialized value in anonymous hash ({}) at (eval 18425381) line 1.
2020.07.10 12:06:56 3: MQTT2_Sensorkrake_notify_1 return value: HASH(0x6fbae58)


aber zwischendurch auch mal ein:

2020.07.10 12:06:30 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 18425347) line 1.
2020.07.10 12:06:30 3: eval: my $TYPE='MQTT2_DEVICE';my $EVTPART0='NEC_32:';my $NAME='MQTT2_Sensorkrake';my $EVENT='NEC_32: 0x20DF4EB1';my $EVTPART1='0x20DF4EB1';my $SELF='MQTT2_Sensorkrake_notify_1';{(ReadingsVal('TV_Wohnzimmer','state','') eq 'on') ? return :
(($EVTPART1 eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') ne 'Sonos')) ? {fhem"set du_remote Sonos;saysonos Sonos"} :
$EVTPART1 eq '0x20DF8679' ? {fhem"set du_remote Jalousie;saysonos Jalousie"} :
(($EVTPART1 eq '0x20DF827D') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 close"} :
(($EVTPART1 eq '0x20DF02FD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 open"} :
(($EVTPART1 eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ? {fhem"set Jalousie_Siro1 stop"} :
(($EVTPART1 eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {(ReadingsVal('Sonos_Wohnzimmer','state','') eq 'STOPPED') ? fhem"set Sonos_Wohnzimmer play" : fhem"set Sonos_Wohnzimmer stop"} :
(($EVTPART1 eq '0x20DFE01F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem"set Sonos_Wohnzimmer VolumeD"} :
(($EVTPART1 eq '0x20DF609F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem"set Sonos_Wohnzimmer VolumeU"} :
(($EVTPART1 eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ? {fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein {(('s9014','s20293','s2485','s78261')[int(rand(4))])}")}:
return;
}


Gruß

Thomas
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im notify
Beitrag von: Beta-User am 10 Juli 2020, 13:01:37
Hmm, eine tiefere Erklärung kann ich auch nicht aufbieten, aber vermutlich wäre es hilfreich, wenn du den jeweiligen "Fehler" (bzw. das warning) besser eingrenzen könntest?

Dazu könntest du das ganze einfach in eine myUtils auslagern und dann aus dem notify raus eben dann nur das übergeben, was du auch auswerten willst (das scheint $EVTPART1 zu sein, ich würde aber ggf. auch gleich andere FB-Varianten mit vorsehen...).

Dann bekommst du zumindest mal Zeilennummern, und es ist mMn. einfacher, den eigentlichen Command zusammenzubasteln...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im notify
Beitrag von: TomLee am 10 Juli 2020, 13:36:00
Mit dem auslagern hab ich die Woche angetestet mit dem anderen notify und noch nicht wirklich weitergekommen.

Die myUtils und eine sub anlegen ist kein Problem, aber wie ich die Events genau übergebe bzw. besser gesagt übernehme in der Sub, weiß ich einfach nicht.

Mir ist ehrlich gesagt auch nicht klar ob ich dann weiterhin EVTPARTX nutzen kann, sry mit eigenen Funktionen in einer myUtils hab ich mich bisher einfach noch nicht wirklich beschäftigt und sonst immer nur an anderen Beispielen orientiert, auch wenn du immer und immer wieder darauf hinweist längeren Code auszulagern.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im notify
Beitrag von: MadMax-FHEM am 10 Juli 2020, 14:11:55
Geht alles ganz einfach:


define nTest notify Device:Regex {mySub($NAME,$EVENT,$EVTPART1,$EVTPART2)}


Sub:


sub mySub() # oder mit "Prototyp" sub mySub($$$$)
{
  my ($Device,$Event,$Value,$WhatEver) = @_;

#  $Device -> Name des auslösenden Devices
#  $Event -> Inhalt gesamter Event, kann mittels split etc. selbst "verarbeitet" werden
#  $Value -> EVTPART1 (muss halt vorhanden sein, sonst Fehler ;)
#  $WhatEver -> EVTPART2 (muss halt vorhanden sein, sonst Fehler ;)
}


Gruß, Joachim
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im notify
Beitrag von: Beta-User am 10 Juli 2020, 14:17:01
Vorab: Das ist u.a. auch die Empfehlung von anderen, allen voran Rudi (die Commandref spricht ausdrücklich von "onelinern"...).

(schade, zu spät, aber vielleicht etwas mehr Erläuterung...)

Die Hürde "wie übergebe ich Parameter?" sollte eigentlich recht einfach zu nehmen sein (den Wiki-Artikel kennst du, nehme ich an). Die Kette ist folgende:
- Jede sub stellt einen eigenen "lexical context" dar, was nichts anderes bedeutet, als dass man nicht davon ausgehen sollte, dass irgendein Parameter schon bekannt ist (es gibt wenige Ausnahmen). Ergo: Es gibt weder "automatisch" $EVENT noch $EVTPARTx in einer aufgerufenen sub.
- Daher muß man alles, was man benötigt, entweder "übergeben", oder irgendwie innerhalb der sub ermitteln.
- Ergo müßtest du hier $EVTPART1 übergeben, denn das scheint die einzige wirklich dynamische Info zu sein. Demnach würdest du die sub z.B. sinnvollerweise so aufrufen:
defmod MQTT2_Sensorkrake_notify_1 notify MQTT2_Sensorkrake:NEC_32:.* {myNec32RemoteCodesHandler($EVTPART1)}
- In der Sub brauchst du dann wieder eine Variable, den Inhalt holst du aus dem übergebenen Parameter (das "// return" bewirkt einen direkten Abbruch, falls kein Parameter übergeben wird):
sub myNec32RemoteCodesHandler {
my $rcCode = shift // return;
Und dann kannst du den kompletten Code da reinnehmen, dir die escapes sparen und mußt dabei nur $EVTPART1 durch $rcCode ersetzen.

Dasselbe für beliebige Protokoll/Code-Kombinationen:defmod MQTT2_Sensorkrake_notify_1 notify MQTT2_Sensorkrake:.* {myNec32RemoteCodesHandler($EVTPART0,$EVTPART1)}sub myNec32RemoteCodesHandler {
  my $rcProtocol = shift;
  my $rcCode = shift // return;
Der "Spaß" bei dieser Variante ist nur, dass $EVTPART0/$rcProtocol vermutlich noch den Doppelpunkt enthält. Da sollte ein "chop($rcProtocol);" helfen...

Falls du ein Beispiel suchst, wie ich das mit meiner MiLight-remote mache (da wird aber einfach $EVENT komplett übergeben): gibt irgendwo einen Thread dazu, und u.a. hier (https://github.com/rejoe2/FHEM/blob/master/99_myUtils_MiLight.pm) ist auch eine kleine commandref dazu drin. Die Übergabe von $EVENT finde ich auch deswegen besser, weil nicht immer $EVTPARTx existiert, und das kann dann "unschön" ausgehen (im Mindesten Fall ein log-Eintrag)...
Und zwischenzeitlich bevorzuge ich bei wenigen Parametern shift gg. der @_-Variante (Details dazu sind in der Perl-Ecke zu finden).

(EDIT: Formatierung war leicht verrutscht)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im notify
Beitrag von: MadMax-FHEM am 10 Juli 2020, 15:10:21
Zitat von: Beta-User am 10 Juli 2020, 14:17:01
Und zwischenzeitlich bevorzuge ich bei wenigen Parametern shift gg. der @_-Variante (Details dazu sind in der Perl-Ecke zu finden).

Ja habe ich mitbekommen ;)

Vielleicht stelle ich auch irgendwann mal um...
...aber erstens ist es (bis auf "Kleinstposts" hier) MEIN Code (den norm. nur ich sehe, außer jemand will ihn explizit "haben", dann soll er sich nicht so "anstellen" ;)  )...
...ich nun mal aus einer Welt MIT Prototypen komme :)

UND (v.a.): es (für mich) viel wichtigere Dinge gibt als das jetzt komplett bei mir umzustellen (weil: entweder baue ich komplett um ODER ich mache weiter wie bisher / Mischen finde ich naja...)

Aber danke für den erneuten "Stubbs"! ;)

Gruß, Joachim
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im notify
Beitrag von: Beta-User am 10 Juli 2020, 16:12:00
 ;D alles gut, wir sind ja (fast) alle noch am lernen...
(Ich habe die prototypes zwischenzeitlich wohl vollständig eliminiert und würde empfehlen, neuen Code auch nur noch ohne zu schreiben (v.a. auch im Hinblick auf Perl 7...), aber jetzt in lokalem Code größere Klimmzüge unternehmen? Oder statt @_ alles auf shift umzustellen? So nebenbei: klar, aber nicht als Selbstzweck. Das ist was anderes, wenn es um gemeinsamen Code oder - wie hier - "best practice" geht...)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im notify
Beitrag von: rudolfkoenig am 10 Juli 2020, 16:42:12
- bei den FHEM Kommandos set und setreading gibt es die Moeglichkeit Perl-Schnipsel zu verwenden, wenn man es in {(...)} einschliesst (Stichwort Set-Magic). Wenn man aber schon in Perl ist, dann ist das sowohl ueberfluessig, wie auch ineffizient. Den ersten Ausdruck wuerde ich als fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein ".('s9014','s20293','s2485','s78261')[int(rand(4))])
schreiben.

- {} in perl ist zweideutig: es kann einen Code-Block bedeuten, aber auch eine Referenz auf ein Hash:
fhem> { my $x = { Log 1,1 };; ref $x }
HASH

Mir sind die Regel nicht klar, woran perl das Eine oder das Andere erkennt, vermutlich, wenn es zugewiesen wird, dann ist es eine Referenz.
In deinem Beispiel mit den kaskadierten ?: sind alle {} ueberfluessig, vermutlich sogar kontraproduktiv.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im notify
Beitrag von: TomLee am 10 Juli 2020, 17:02:15
Sehr cool, DANKE allen.

Für die die das nachvollziehen wollen:
sub myNec32RemoteCodesHandler {
  my $rcProtocol = shift;
  my $rcCode = shift // return;
  chop($rcProtocol);
  Log3(undef, 3, "Das ist $rcProtocol $rcCode");

  (ReadingsVal('TV_Wohnzimmer','state','') eq 'on') ? return :
  (($rcCode eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') ne 'Sonos')) ?
  fhem"set du_remote Sonos;saysonos Sonos" :

  $rcCode eq '0x20DF8679' ? fhem"set du_remote Jalousie;saysonos Jalousie" :
  (($rcCode eq '0x20DF827D') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ?
  fhem"set Jalousie_Siro1 close" :
  (($rcCode eq '0x20DF02FD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ?
  fhem"set Jalousie_Siro1 open" :
  (($rcCode eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Jalousie')) ?
  fhem"set Jalousie_Siro1 stop" :

  (($rcCode eq '0x20DF22DD') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ?
  (ReadingsVal('Sonos_Wohnzimmer','state','') eq 'STOPPED') ? fhem"set Sonos_Wohnzimmer play" :
  fhem"set Sonos_Wohnzimmer stop" :
  (($rcCode eq '0x20DFE01F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ?
  fhem"set Sonos_Wohnzimmer VolumeD" :
  (($rcCode eq '0x20DF609F') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ?
  fhem"set Sonos_Wohnzimmer VolumeU" :
  (($rcCode eq '0x20DF4EB1') && (ReadingsVal('du_remote','state','') eq 'Sonos')) ?
  fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein ".('s9014','s20293','s2485','s78261')[int(rand(4))]):
  return;
}



Für die Helfer noch eine Frage/Aufgabe:

2020.07.10 16:54:30 3: Das ist NEC_32 0x20DF8679
2020.07.10 16:54:30 1: ERROR evaluating my $EVENT='NEC_32: 0x20DF8679';my $TYPE='MQTT2_DEVICE';my $EVTPART0='NEC_32:';my $NAME='MQTT2_Sensorkrake';my $SELF='MQTT2_Sensorkrake_notify_1';my $EVTPART1='0x20DF8679';{myNec32RemoteCodesHandler($EVTPART0,$EVTPART1)}
: Can't use string ("0x20DF8679") as a SCALAR ref while "strict refs" in use at ./FHEM/99_Cube_myUtils.pm line 26.

2020.07.10 16:54:30 3: MQTT2_Sensorkrake_notify_1 return value: Can't use string ("0x20DF8679") as a SCALAR ref while "strict refs" in use at ./FHEM/99_Cube_myUtils.pm line 26.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: rudolfkoenig am 10 Juli 2020, 17:12:23
Liegt vermutlich an dem $$ in
  $$rcCode eq '0x20DF8679' ? fhem"set du_remote Jalousie;saysonos Jalousie" :
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 10 Juli 2020, 17:17:31
Da warst du aber schnell nachdem ich den Code postete hatte ich die $$ auch sofort gesehen und gleich entfernt aber nicht nochmal getestet, erst jetzt wo du schreibst. ::)

funzt

DANKE
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 10 Juli 2020, 17:40:27
 :) Schön, dass das soweit geklappt hat.

Würde aber empfehlen, den Code nochmal aufzuräumen und die if - else -Unterscheidungen irgendwie anders zu strukturieren (und statt else dann eben einige return reinzubasteln). Außerdem sollte man sich sicherheitshalber auf Perl mit Schwierigkeiten bei Einbau von prototypes vorbereiten und daher fhem-Anweisungen mit Klammern verwenden (oder "für Fortgeschrittene" direkt CommandSet/CommandSetreading & Co).

Also gleich was in der Art:
return if ReadingsVal('TV_Wohnzimmer','state','') eq 'on';
  return fhem("set du_remote Sonos;saysonos Sonos") if $rcCode eq '0x20DF4EB1' && ReadingsVal('du_remote','state','') ne 'Sonos';
[...]
if (ReadingsVal('du_remote','state','') eq 'Jalousie') {

[hier dann alle betreffenden Code-Fälle, ggf. direkt via hash-Zuordnung]
}


Zu dem terniären Operator: Ich nehme das gerne, wenn es darum geht, die Codes in den onelinern zu verkürzen, aber sobald es um längere Dinge in myUtils geht, schreibe ich lieber eine Zeile mehr und finde auch entsprechende Strukturierungen als hilfreich... Das ist u.A. ein Grund, warum ich immer mehr die Empfehlung ausspreche, Code in myUtils auszulagern. Ist einfach übersichtlicher und man kann es einfacher dokumentieren (da sind ja Kommentare in näherungsweise beliebiger Länge erlaubt, und es lohnt sich auch, darauf Aufwand zu verwenden, da man sich so dann ggf. auch in generalisiertem Code besser zurechtfindet.

(@Rudi: Wie immer, falls was verbesserungswürdig ist: her damit...)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: rudolfkoenig am 10 Juli 2020, 18:53:56
Kann nicht viel hinzufuegen.
Zu beachten: beim direkten Aufruf von CommandSet & co ist cmdalias wirkungslos.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 11 Juli 2020, 13:57:37
Wie mach ich jetzt bei der if-Variante ein else ?

So mal nicht:

return fhem("set Sonos_Wohnzimmer play") if $rcCode eq '0x20DF22DD' && ReadingsVal('du_remote','state','') eq 'Sonos' && ReadingsVal('Sonos_Wohnzimmer','state','') ne 'PLAYING' else fhem("set Sonos_Wohnzimmer pause");

Oder geht das nicht und ich muss für pause den Status extra abrufen ?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: MadMax-FHEM am 11 Juli 2020, 14:07:19
Geht schon ;)


if($rcCode eq '0x20DF22DD' && ReadingsVal('du_remote','state','') eq 'Sonos' && ReadingsVal('Sonos_Wohnzimmer','state','') ne 'PLAYING')
{
  fhem("set Sonos_Wohnzimmer play");
}
else
{
  fhem("set Sonos_Wohnzimmer pause");
}


Jaja, die geschweiften Klammern sind unnötig...
...ich habe mir das aber angewöhnt, weil: wenn dann eine Ausführung dazu kommt (bei gleicher Bedingung) brauche ich sie (eh)...
...werden sie dann "vergessen", so passiert nicht was man wollte ;)

Gruß, Joachim
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 11 Juli 2020, 14:27:02
Danke. Kann ich mittlerweile auch nachvollziehen, mein Bauchgefühl sagt mir aber das es auch ohne gehen muss.

Alleine schon wg der Aussagen:

Zitat- {} in perl ist zweideutig: es kann einen Code-Block bedeuten, aber auch eine Referenz auf ein Hash:

Mir sind die Regel nicht klar, woran perl das Eine oder das Andere erkennt, vermutlich, wenn es zugewiesen wird, dann ist es eine Referenz.

edit:

habs erstmal mit 2 Zeilen gelöst, gefällt mir am besten.

   return fhem("set Sonos_Wohnzimmer play") if $rcCode eq '0x20DF22DD' && ReadingsVal('Sonos_Wohnzimmer','state','') eq 'STOPPED' && ReadingsVal('du_remote','state','') eq 'Sonos';
return fhem("set Sonos_Wohnzimmer pause") if $rcCode eq '0x20DF22DD' && ReadingsVal('Sonos_Wohnzimmer','state','') eq 'PLAYING' && ReadingsVal('du_remote','state','') eq 'Sonos';
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: MadMax-FHEM am 11 Juli 2020, 14:41:43
Wie geschrieben: wenn nur "Einzwas" bei der Bedingung ausgeführt werden soll (wie bei deinem [aktuellen] Beispiel), dann geht auch ohne...

ABER: wenn mehr als "Einzwas" bei SELBER BEDINGUNG ausgeführt werden soll, dann MÜSSEN die sein...

Und (in diesem Fall) sie schaden nicht und ich denke das erwähnte "Problem" schlägt (in diesem Fall) auch eher nicht/nie zu... ;)

Gruß, Joachim
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 11 Juli 2020, 18:00:20
Zitatreturn if ReadingsVal('TV_Wohnzimmer','state','') eq 'on';
return fhem("set du_remote Sonos;saysonos Sonos") if $rcCode eq '0x20DF4EB1' && ReadingsVal('du_remote','state','') ne 'Sonos';

Das ist ein Denkfehler.
Mit dem oneliner-if bin ich im else-Zweig und es wird nichts ausgeführt wenn der TV an ist, ich brauch eine else-Variante, bin aber jetzt verunsichert wegen der {}, das_ist_doch_die TV-FB.

Trotz
ZitatUnd (in diesem Fall) sie schaden nicht und ich denke das erwähnte "Problem" schlägt (in diesem Fall) auch eher nicht/nie zu...

Und du machst es in myUtils_MiLight.pm ja auch nicht anders und verwendest else wie Joachim schrieb.


sub myNec32RemoteCodesHandler {
my $rcProtocol = shift;
my $rcCode = shift // return;
chop($rcProtocol);
Log3(undef, 3, "Das ist $rcProtocol $rcCode");

return if ReadingsVal('TV_Wohnzimmer','state','') eq 'on';
return fhem("saysonos ".ReadingsVal('du_remote','state','')) if $rcCode eq '0x20DF3EC1';

return fhem("set du_remote Sonos;saysonos Sonos") if $rcCode eq '0x20DF4EB1' && ReadingsVal('du_remote','state','') ne 'Sonos';
return fhem("set du_remote Licht;saysonos Licht") if $rcCode eq '0x20DF8E71' && ReadingsVal('du_remote','state','') ne 'Licht';
return fhem("set du_remote Jupiter;saysonos Jupiter") if $rcCode eq '0x20DFC639' && ReadingsVal('du_remote','state','') ne 'Jupiter';
return fhem("set du_remote Jalousie;saysonos Jalousie") if $rcCode eq '0x20DF8679' && ReadingsVal('du_remote','state','') ne 'Jalousie';

return fhem("set Sonos_Wohnzimmer play") if $rcCode eq '0x20DF22DD' && ReadingsVal('Sonos_Wohnzimmer','state','') eq 'STOPPED' && ReadingsVal('du_remote','state','') eq 'Sonos';
return fhem("set Sonos_Wohnzimmer pause") if $rcCode eq '0x20DF22DD' && ReadingsVal('Sonos_Wohnzimmer','state','') eq 'PLAYING' && ReadingsVal('du_remote','state','') eq 'Sonos';
return fhem("set Sonos_Wohnzimmer VolumeD") if $rcCode eq '0x20DFE01F' && ReadingsVal('du_remote','state','') eq 'Sonos';
return fhem("set Sonos_Wohnzimmer VolumeU") if $rcCode eq '0x20DF609F' && ReadingsVal('du_remote','state','') eq 'Sonos';
return fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein ".('s9014','s20293','s2485','s78261')[int(rand(4))]) if $rcCode eq '0x20DF4EB1' && ReadingsVal('du_remote','state','') eq 'Sonos';

return fhem("set str_MQTT2_zigbee_gu10 on") if $rcCode eq '0x20DF22DD' && ReadingsVal('str_MQTT2_zigbee_gu10','state','') eq 'OFF' && ReadingsVal('du_remote','state','') eq 'Licht';
return fhem("set str_MQTT2_zigbee_gu10 off") if $rcCode eq '0x20DF22DD' && ReadingsVal('str_MQTT2_zigbee_gu10','state','') eq 'ON' && ReadingsVal('du_remote','state','') eq 'Licht';
return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')-50)) if $rcCode eq '0x20DFE01F' && ReadingsVal('du_remote','state','') eq 'Licht';
return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')+50)) if $rcCode eq '0x20DF609F' && ReadingsVal('du_remote','state','') eq 'Licht';

return fhem("set Jalousie_Siro1 close") if $rcCode eq '0x20DF827D' && ReadingsVal('du_remote','state','') eq 'Jalousie';
return fhem("set Jalousie_Siro1 open") if $rcCode eq '0x20DF02FD' && ReadingsVal('du_remote','state','') eq 'Jalousie';
return fhem("set Jalousie_Siro1 stop") if $rcCode eq '0x20DF22DD' && ReadingsVal('du_remote','state','') eq 'Jalousie';
return fhem("set Jalousie_Siro1 position 3") if $rcCode eq '0x20DFE01F' && ReadingsVal('du_remote','state','') eq 'Jalousie';
return fhem("set Jalousie_Siro1 position 30") if $rcCode eq '0x20DF609F' && ReadingsVal('du_remote','state','') eq 'Jalousie';
}
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 12 Juli 2020, 08:47:45
Zitat von: TomLee am 11 Juli 2020, 18:00:20
Und du machst es in myUtils_MiLight.pm ja auch nicht anders und verwendest else wie Joachim schrieb.
Nochmal: Ich mache auch nicht alles richtig, und je älter der Code jeweils ist, desto weniger in diese Richtung optimiert ist er ggf.. Das ist also nur ein funktionierendes Beispiel, aber nichts, was in allen Punkten "mustergültig" wäre...

Ungetestet mal eine etwas anders strukturierte Variante und exemplarisch das mit dem hash (letzter Block):
sub myNec32RemoteCodesHandler {
    my $rcProtocol = shift;
    my $rcCode = shift // return;
    chop($rcProtocol);
    Log3(undef, 3, "Das ist $rcProtocol $rcCode");
   
    return if ReadingsVal('TV_Wohnzimmer','state','') eq 'on';
    return fhem("saysonos ".ReadingsVal('du_remote','state','')) if $rcCode eq '0x20DF3EC1';
   
    return fhem("set du_remote Sonos;saysonos Sonos") if $rcCode eq '0x20DF4EB1' && ReadingsVal('du_remote','state','') ne 'Sonos';
    return fhem("set du_remote Licht;saysonos Licht") if $rcCode eq '0x20DF8E71' && ReadingsVal('du_remote','state','') ne 'Licht';
    return fhem("set du_remote Jupiter;saysonos Jupiter") if $rcCode eq '0x20DFC639' && ReadingsVal('du_remote','state','') ne 'Jupiter';
    return fhem("set du_remote Jalousie;saysonos Jalousie") if $rcCode eq '0x20DF8679' && ReadingsVal('du_remote','state','') ne 'Jalousie';
   
     if (ReadingsVal('du_remote','state','') eq 'Sonos') {
    return fhem("set Sonos_Wohnzimmer play") if $rcCode eq '0x20DF22DD' && ReadingsVal('Sonos_Wohnzimmer','state','') eq 'STOPPED';
    return fhem("set Sonos_Wohnzimmer pause") if $rcCode eq '0x20DF22DD' && ReadingsVal('Sonos_Wohnzimmer','state','') eq 'PLAYING';
    return fhem("set Sonos_Wohnzimmer VolumeD") if $rcCode eq '0x20DFE01F';
    return fhem("set Sonos_Wohnzimmer VolumeU") if $rcCode eq '0x20DF609F';
    return fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein ".('s9014','s20293','s2485','s78261')[int(rand(4))]) if $rcCode eq '0x20DF4EB1';
     }
   
     if (ReadingsVal('du_remote','state','') eq 'Licht') {
    return fhem("set str_MQTT2_zigbee_gu10 on") if $rcCode eq '0x20DF22DD' && ReadingsVal('str_MQTT2_zigbee_gu10','state','') eq 'OFF';
    return fhem("set str_MQTT2_zigbee_gu10 off") if $rcCode eq '0x20DF22DD' && ReadingsVal('str_MQTT2_zigbee_gu10','state','') eq 'ON';
    return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')-50)) if $rcCode eq '0x20DFE01F';
    return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')+50)) if $rcCode eq '0x20DF609F';
     }

     if (ReadingsVal('du_remote','state','') eq 'Jalousie') {
    my %code2command = ( '0x20DF827D' => 'close", '0x20DFE01F' => 'position 3', '0x20DF609F' => 'position 30', '0x20DF02FD' => 'open', '0x20DF22DD' => 'stop');
        my $command = $code2command{$rcCode};
    return fhem("set Jalousie_Siro1 $command");
     }
}

Vermutlich könnte man das noch weiter verfeinern, indem man auch noch hashes ineinander verschachtelt. Hier wäre aber mMn. zu prüfen, ob es nicht Sinn machen würde, gleich noch im "one-liner" zu prüfen, welchen Status dieser "Umschalt-dummy" hat und dann gleich jeweils andere subs aufzurufen - die kann man dann nämlich einfacher dahingehend generalisieren, dass z.B. das Zielgerät nicht hartvercodet im Code steht, sondern im Funktionsaufruf.

(Das ist aber Jammern auf hohem Niveau; zu wissen, wie man was löst, erfordert etwas Erfahrung, und jeder hat da seine eigenen Schwerpunkte. Ich finde es übersichtlich, wenn der Code an sich "nichts" bzw. möglichst wenig über die Geräte weiß, und man am Aufruf/der cfg zumindest grob erkennen kann, was passieren soll. Dementsprechend enthält nur die etwas spezielle Geschichte mit den Deckenlichtern in meinem Code überhaupt irgendeinen Device-Namen; der kommt in der Regel aus dem Aufruf im notify...)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 12 Juli 2020, 12:29:30
eher lehrreich wie hilfreich, Danke.




Sicher Geschmackssache aber was bevorzugt der Erfahrenere.
Zwar mehr Zeilen aber doch übersichtlicher und besser zu lesen wie in einer Zeile:

if (ReadingsVal('du_remote','state','') eq 'Jalousie') {
my %code2command = (
'0x20DF827D' => 'close',
'0x20DFE01F' => 'position 3',
'0x20DF609F' => 'position 30',
'0x20DF02FD' => 'open',
'0x20DF22DD' => 'stop');
my $command = $code2command{$rcCode};
return fhem("set Jalousie_Siro1 $command");
}
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 12 Juli 2020, 13:46:18
 :) Klar, kann und sollte man auf mehrere Zeilen verteilen (und dann ggf. noch entsprechend einrücken ::) ); genau für sowas ist es ja "geschickt", wenn es in myUtils steht... (war erst mal nur auch die Schnelle, um das Prinzip zu zeigen).

In dem Zusammenhang: Will man diese Art Hash an mehreren Stellen nutzen, kann man ihn auch auf der "höheren Ebene" definieren (also in der myUtils auf der Ebene, die auch die subs haben) oder z.B. im "data"-Hash allg. verfügbar machen (über "Initalize"). Dann wäre er für mehrere myUtils (oder direkt aus notify&Co. heraus) zu nutzen.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 12 Juli 2020, 17:17:27
Wo is mir sinnvoll erscheint bin ich am umstellen auf die "nächst höhere Ebene", klappt auch schon aber erst mal wieder deaktiviert (wenn s2m aufs Hauptsystem umzieht definiere ich mir einen toggle-setter  :P). Weil:

An dem Vorschlag
if (ReadingsVal('du_remote','state','') eq 'Jalousie')
{
my %code2command = (
'0x20DF827D' => 'close',
'0x20DFE01F' => 'position 3',
'0x20DF609F' => 'position 30',
'0x20DF02FD' => 'open',
'0x20DF22DD' => 'stop');
my $command = $code2command{$rcCode};
return fhem("set Jalousie_Siro1 $command");
}


ist ein Haken, hab ich jetzt festgestellt.

Mit
return fhem("set du_remote Jalousie;saysonos Jalousie") if $rcCode eq '0x20DF8679' && ReadingsVal('du_remote','state','') ne 'Jalousie';
hab ich bisher verhindert das bei nochmaliger Ausführung nichts passiert.

Weiß nicht wie ich es beschreiben soll, denke es ist so das in dem Hash 0x20DF8679 nicht definiert ist / keinem Kommando zugewiesen, aber ja übergeben wird, das führt dazu das iVm if (ReadingsVal('du_remote','state','') eq 'Jalousie') bei nochmaliger Betätigung ein set Jalousie_Siro1 $command ausgeführt wird, $command ist leer und es kommt logischerweise zu:

2020.07.12 16:29:54 3: set Jalousie_Siro1  : Unknown argument , choose one of ...

Man müsste zuvor prüfen ob ein Kommando auch zugewiesen ist, sonst nichts machen.
Verstehst du mich und hast eine Idee das zu umgehen?

Zitatsub myNec32RemoteCodesHandler {
    my $rcProtocol = shift;
    my $rcCode = shift // return;
    chop($rcProtocol);
   #my %gcode2cmnd = (
   #'0x20DF22DD' => 'toggle',
   #'0x20DF4EB1' => 'Sonos',
   #'0x20DF8E71' => 'Licht',
   #'0x20DFC639' => 'Jupiter',
   #'0x20DF8679' => 'Jalousie',
   #);
   #my $gcmnd = $gcode2cmnd{$rcCode};
   Log3(undef, 3, "Das ist $rcProtocol $rcCode");
   
   return if ReadingsVal('TV_Wohnzimmer','state','') eq 'on';
   return fhem("saysonos ".ReadingsVal('du_remote','state','')) if $rcCode eq '0x20DF3EC1';
   
   return fhem("set du_remote Sonos;saysonos Sonos") if $rcCode eq '0x20DF4EB1' && ReadingsVal('du_remote','state','') ne 'Sonos';
    return fhem("set du_remote Licht;saysonos Licht") if $rcCode eq '0x20DF8E71' && ReadingsVal('du_remote','state','') ne 'Licht';
    return fhem("set du_remote Jupiter;saysonos Jupiter") if $rcCode eq '0x20DFC639' && ReadingsVal('du_remote','state','') ne 'Jupiter';
    return fhem("set du_remote Jalousie;saysonos Jalousie") if $rcCode eq '0x20DF8679' && ReadingsVal('du_remote','state','') ne 'Jalousie';
   #return fhem("set du_remote $gcmnd;saysonos $gcmnd") if ReadingsVal('du_remote','state','') ne $gcmnd;
   
   
   if (ReadingsVal('du_remote','state','') eq 'Sonos') {
    return fhem("set Sonos_Wohnzimmer play") if $rcCode eq '0x20DF22DD' && ReadingsVal('Sonos_Wohnzimmer','state','') eq 'STOPPED';
    return fhem("set Sonos_Wohnzimmer pause") if $rcCode eq '0x20DF22DD' && ReadingsVal('Sonos_Wohnzimmer','state','') eq 'PLAYING';
    return fhem("set Sonos_Wohnzimmer VolumeD") if $rcCode eq '0x20DFE01F';
    return fhem("set Sonos_Wohnzimmer VolumeU") if $rcCode eq '0x20DF609F';
    return fhem("set OG_Echo_Wohnzimmer:FILTER=playStatus!=playing tunein ".('s9014','s20293','s2485','s78261')[int(rand(4))]) if $rcCode eq '0x20DF4EB1';
    }
   
   if (ReadingsVal('du_remote','state','') eq 'Licht') {
   return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')-50)) if $rcCode eq '0x20DFE01F';
   return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')+50)) if $rcCode eq '0x20DF609F';
   #return fhem("set str_MQTT2_zigbee_gu10 ".$gcmnd) if ReadingsVal('str_MQTT2_zigbee_gu10','state','') =~ '(OFF|ON)';
   }
   
   if (ReadingsVal('du_remote','state','') eq 'Jupiter') {
   return fhem("set MQTT2_Mi_Wecklicht brightness ".(ReadingsVal('MQTT2_Mi_Wecklicht','brightness','')-15)) if $rcCode eq '0x20DFE01F';
   return fhem("set MQTT2_Mi_Wecklicht brightness ".(ReadingsVal('MQTT2_Mi_Wecklicht','brightness','')+15)) if $rcCode eq '0x20DF609F';
   #return fhem("set MQTT2_Mi_Wecklicht ".$gcmnd) if ReadingsVal('MQTT2_Mi_Wecklicht','state','') =~ '(OFF|ON)';
   }
   
   if (ReadingsVal('du_remote','state','') eq 'Jalousie')
   {
   my %code2command = (
   '0x20DF827D' => 'close',
   '0x20DFE01F' => 'position 3',
   '0x20DF609F' => 'position 30',
   '0x20DF02FD' => 'open',
   '0x20DF22DD' => 'stop');
   my $command = $code2command{$rcCode};
   return fhem("set Jalousie_Siro1 $command");
   }
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 12 Juli 2020, 17:35:51
Ja, sowas hatte ich auch schon... Sollte gehen, wenn man vorab prüft, ob es den Wert gibt. Müßte ich aber auch nachlesen bzw. nachsehen, könnte das Stichwort "ref" sein. (Grad ist wenig Zeit)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 26 Oktober 2020, 14:09:32
Zitat von: betateilchen am 26 Oktober 2020, 13:54:07
Nein, bitte nicht so. Das Konstrukt mit "if" hinter einer Anweisung sollte man nicht verwenden, wenn man mehrere Unterscheidungen treffen möchte.

Hey Beta-User,

mir gefällt es das so aufzubauen, die Aussage verwirrt mich jetzt aber etwas.
Der ganze obige Code ist doch so aufgebaut oder versteh ich was gerade nicht.

Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 26 Oktober 2020, 14:39:18
Jetzt bin ich verwirrt...

Ich kann diese Aussage von betateilchen zwar nachvollziehen, aber zum einen macht es einen Unterschied, ob der Code an der Stelle "endet" (return) oder eben mit weiteren Abfragen "weitergeht" (das scheint in dem anderen Thread der Fall zu sein), und zum anderen war ich hier auch der Meinung, dass man das ganze eigentlich besser über eine Hash-Zuordnung lösen sollte.

Ggf. zur Vermeidung des Problems (vor der fhem-Anweisung):
return if !$command

Im Ergebnis geht es m.E. immer um klare Strukturen im Code, und wenn betateilchen was schreibt, ist das m.E. die qualitativ deutlich bessere Quelle als das, was ich so zusammenreime ::) ...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 26 Oktober 2020, 14:50:58
Hatte es so gelöst:

if $command ne ""


return if !$command
probier ich später mal aus, kann jetzt nicht.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 27 Oktober 2020, 13:11:58
So war das gemeint falls das undeutlich ausgedrückt war wie ich es gelöst hatte:
return fhem("set Jalousie_Siro1 $command") if $command ne ""


Mit return if !$command klappts auch, du Fuchs du (das du das auch gleich wieder in Erinnerung hattest ::)), Danke




Zitatdass man das ganze eigentlich besser über eine Hash-Zuordnung lösen sollte.

Ja, bin aber nicht so (genau) wie du, mich verlässt die Lust auch schnell mal wieder oder hab irgendwas anderes dann im Kopf.

Ich spiel da aber wenns mich wieder mal packt weiter dran rum und setze das mit dem Hash an den Stellen wo es möglich ist noch um.

Etwas hatte ich mich noch mit beschäftigt (u.a. einen  ;D  Devicenamen übergeben) aber nicht viel und brauchen wir auch nicht weiter ausführen, keine Lust dazu zur Zeit.

So siehts aktuell jetzt aus:

sub myNec32RemoteCodesHandler {
my $sondev = shift;
my $dudev = shift;
    my $rcProtocol = shift;
    my $rcCode = shift // return;
my $name = shift;
    chop($rcProtocol);
my $dudevstate = ReadingsVal($dudev,'state','Sonos');
my $sondevstate = ReadingsVal($sondev,'state','');
my $sondevcs = ReadingsVal($sondev,'currentSender','unbekannt');
my %gcode2cmnd = (
'0x20DF4EB1' => 'Sonos',
'0x20DF8E71' => 'Licht',
'0x20DFC639' => 'Jupiter',
'0x20DF8679' => 'Jalousie',
);
my $gcmnd = $gcode2cmnd{$rcCode};

#Log3(undef, 3, "Das ist $rcProtocol $rcCode $dudevstate $dudev");

return if ReadingsVal('TV_Wohnzimmer','state','') eq 'on';
return fhem("set $dudev $gcmnd;saysonos $gcmnd") if $dudevstate ne $gcmnd && $gcmnd ne "";
return fhem("saysonos $dudevstate") if $rcCode eq '0x20DF55AA';


if ($dudevstate eq 'Sonos') {
    if ($rcCode eq '0x20DF7887') {
    my $l = ReadingsVal("$sondev","RadiosList","unknown");
         $l =~ s/\|/,/g;
         my $lvwodot  = Each($sondev, $l);
         my $lv = $lvwodot."/";
         $lvwodot =~ s/[.]/ /g;
         fhem ("saysonos es wird $lvwodot abgespielt");
         return fhem("sleep $sondev:currentAlbum:.;set $sondev StartRadio /$lv");
   
}
    if ($rcCode eq '0x20DF22DD') {
return fhem("set $sondev PlayT");
    #return fhem("set $sondev Play")  if $sondevstate eq 'STOPPED';
    #return fhem("set $sondev Pause") if $sondevstate eq 'PLAYING';
}
if ($rcCode eq '0x20DF906F') {
my $sondevmute = ReadingsVal("$sondev","Mute","0");
    return fhem("set $sondev Mute 1") if $sondevmute eq '0';
    return fhem("set $sondev Mute 0") if $sondevmute eq '1';
}

return fhem("saysonos $sondevcs") if $rcCode eq '0x20DF4EB1';
return fhem("set $sondev VolumeD") if $rcCode eq '0x20DFC03F';
return fhem("set $sondev VolumeU") if $rcCode eq '0x20DF40BF';
}

if ($dudevstate eq 'Licht') {
return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')-50)) if $rcCode eq '0x20DFE01F';
return fhem("set str_MQTT2_zigbee_gu10 brightness ".(ReadingsVal('MQTT2_zigbee_gu10_1','brightness','')+50)) if $rcCode eq '0x20DF609F';
return fhem("set str_MQTT2_zigbee_gu10 toggle") if $rcCode eq '0x20DF22DD' && ReadingsVal('str_MQTT2_zigbee_gu10','state','') =~ '(OFF|ON)';
}

if ($dudevstate eq 'Jupiter') {
return fhem("set MQTT2_Mi_Wecklicht brightness ".(ReadingsVal('MQTT2_Mi_Wecklicht','brightness','')-15)) if $rcCode eq '0x20DFE01F';
return fhem("set MQTT2_Mi_Wecklicht brightness ".(ReadingsVal('MQTT2_Mi_Wecklicht','brightness','')+15)) if $rcCode eq '0x20DF609F';
return fhem("set MQTT2_Mi_Wecklicht toggle") if $rcCode eq '0x20DF22DD' && ReadingsVal('MQTT2_Mi_Wecklicht','state','') =~ '(OFF|ON)';
}

if ($dudevstate eq 'Jalousie')
{
my %code2command = (
'0x20DF827D' => 'close',
'0x20DFE01F' => 'position 3',
'0x20DF609F' => 'position 30',
'0x20DF02FD' => 'open',
'0x20DF22DD' => 'stop',
'0x20DF40BF' => 'up_for_timer 1',
'0x20DFC03F' => 'down_for_timer 1');
my $command = $code2command{$rcCode};
return if !$command;
return fhem("set Jalousie_Siro1 $command") ;
}
}
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 27 Oktober 2020, 13:20:07
Na ja, Rom wurde nicht an einem Tag erbaut, und mit "leeren" Verweisen und deren Folgen habe ich mich jüngst erst wieder solange rumgeschlagen, dass das grade "parat" war...

Vielleicht noch eine Anmerkung zu dem hier:
return fhem("set $dudev $gcmnd;saysonos $gcmnd") if $dudevstate ne $gcmnd && $gcmnd ne "";Da sollte die Reihenfolge m.E. anders herum sein, denn entweder die erste Bedingung trifft zu oder du hast die Prüfung bereits erfolglos gemacht und den Eintrag im Log, den du eigentlich mit Teil 2 vermeiden wolltest. Also besser andersrum und kürzer:
return fhem("set $dudev $gcmnd;saysonos $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;

Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 27 Oktober 2020, 13:55:31
Zitatreturn fhem("set $dudev $gcmnd;saysonos $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;

Ja, Danke, funzt.



Zitat
ob der Code an der Stelle "endet" (return) oder eben mit weiteren Abfragen "weitergeht" (das scheint in dem anderen Thread der Fall zu sein)

komm da noch nicht ganz mit, nicht wichtig, aber ich habs noch nicht ganz verstanden.
Wenn mit der Angabe return der Code endet und an dem Konstrukt dann weniger auszusetzen wäre, dann könnte man die return doch einfach in dem Beispiel im andern Thread erweitern:

defmod UnautorisierteTueroeffnung.Alert notify  (SN.EG.HomeMatic.HausTuer|SN.EG.HomeMatic.TerrassenTuer):open.* {
return fhem ('set mySIP call +49[deleted_by_admin] 30 !Alarm Alarm Alarm') if (ReadingsVal("Smartphone_Anwesenheit","state","") eq "present");
return fhem ('dein Befehl für den Anruf') if (ReadingsVal("Smartphone_Anwesenheit","state","") eq "absent")
}
attr UnautorisierteTueroeffnung.Alert disabledForIntervals 09:30-09:45 06:00-08:00



Ändert die Angabe von return jetzt was an der Empfehlung "if" hinter einer Anweisung nicht zu verwenden, wenn man mehrere Unterscheidungen treffen möchte oder nicht ?



Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 27 Oktober 2020, 14:03:20
Zitat von: TomLee am 27 Oktober 2020, 13:55:31
Ändert die Angabe von return jetzt was an der Empfehlung "if" hinter einer Anweisung nicht zu verwenden, wenn man mehrere Unterscheidungen treffen möchte oder nicht ?
Wie gesagt: es geht um Lesbarkeit, und ein "return" ist jedenfalls mAn. immer ein klares statement zu Beginn einer Zeile, denn alles, was danach kommt, ist nicht mehr relevant (wenn die dahinterstehende Bedingung zutrifft). Von daher wird man so eine Zeile genauer lesen als andere...

Der Rest ist - wie schon geschrieben - auch eine Geschmacksfrage, bei der uU. auch noch andere Aspekte mit reinspielen, wie:
- ist die Zeile davor und danach frei; (das ist nur eine optische Frage!)
- ist die Zeile selbst eher kurz oder - wie in deinem Beispiel - eher lang...

Kurz: Code soll (halbwegs) lesbar sein, und ein hinten stehendes if ist in der Tat stets in der Gefahr, Code unlesbar zu machen.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 14 Dezember 2020, 19:44:57
Jemand einen Tipp welchen Syntax der Wert des Hash haben muss das nicht

set MQTT2_Mi_Wecklicht brightness (ReadingsNum("MQTT2_Mi_Wecklicht","brightness","0")+15)


ausgeführt wird ?

Habs mit doppelten Apostrophen Innen, einfachen Aussen auch probiert, gleiches Ergebnis.

Die auskommentierten Zeilen sind die die bisher funktionierten.


Zitatif ($dudevstate eq 'Jupiter') {
      return fhem("set MQTT2_Mi_Wecklicht toggle") if $rcCode eq '0x20DF22DD' && ReadingsVal('MQTT2_Mi_Wecklicht','state','') =~ '(OFF|ON)';
   
      my %code2command = (
      '0x20DFE01F' => "(ReadingsNum('MQTT2_Mi_Wecklicht','brightness'','0')-15)",
      '0x20DF609F' => "(ReadingsNum('MQTT2_Mi_Wecklicht','brightness'','0')+15)");
      my $command = $code2command{$rcCode};
      return if !$command;
      return fhem("set MQTT2_Mi_Wecklicht brightness ".$command);
   
   #return fhem("set MQTT2_Mi_Wecklicht brightness ".(ReadingsVal('MQTT2_Mi_Wecklicht','brightness','')-15)) if $rcCode eq '0x20DFE01F';   
   #return fhem("set MQTT2_Mi_Wecklicht brightness ".(ReadingsVal('MQTT2_Mi_Wecklicht','brightness','')+15)) if $rcCode eq '0x20DF609F';
   #return fhem("set MQTT2_Mi_Wecklicht toggle") if $rcCode eq '0x20DF22DD' && ReadingsVal('MQTT2_Mi_Wecklicht','state','') =~ '(OFF|ON)';
   }

Ja, ich weiß den Namen von MQTT2_Mi_Wecklicht kann man auch noch übergeben
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 14 Dezember 2020, 23:44:20
Zusätzlich in geschweiften Klammern siehts gut aus:

my %code2command = (
'0x20DFE01F' => "{(ReadingsNum('MQTT2_Mi_Wecklicht','brightness','0')-15)}",
'0x20DF609F' => "{(ReadingsNum('MQTT2_Mi_Wecklicht','brightness','0')+15)}");
my $command = $code2command{$rcCode};
return if !$command;
return fhem("set MQTT2_Mi_Wecklicht brightness ".$command);


Wer den obigen Leichtsinnsfehler gesehen hat darf ihn behalten.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 15 Dezember 2020, 00:32:08
Zitat von: betateilchen am 26 Juli 2020, 10:19:50
genauso unnötig wie die Anführungszeichen um $var in Each();

perl Grundlagen...


Hier kann ich sie nicht weglassen:

Zitatif ($dudevstate eq 'Jupiter') {
   return fhem("set $miweck toggle") if $rcCode eq '0x20DF22DD' && ReadingsVal($miweck,'state','') =~ '(OFF|ON)';
   my %code2command = (
   '0x20DFE01F' => "{(ReadingsNum('$miweck','brightness','0')-15)}",
   '0x20DF609F' => "{(ReadingsNum('$miweck','brightness','0')+15)}");
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $miweck brightness ".$command);
   }

sonst gibts die Meldung:

2020.12.15 00:20:26 1: ERROR evaluating my $DEV=   $evalSpecials->{'%DEV'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};ReadingsNum(MQTT2_Mi_Wecklicht,'brightness','0')-15: Bareword "MQTT2_Mi_Wecklicht" not allowed while "strict subs" in use at (eval 56763) line 1.

2020.12.15 00:20:26 3: MQTT2_DEVICE set MQTT2_Mi_Wecklicht brightness Bareword "MQTT2_Mi_Wecklicht" not allowed while "strict subs" in use at (eval 56763) line 1.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 15 Dezember 2020, 20:30:40
Zitatund zum anderen war ich hier auch der Meinung, dass man das ganze eigentlich besser über eine Hash-Zuordnung lösen sollte.

Habs ja anfangs nicht für möglich gehalten, es ist mir aber wirklich gelungen.

cmdAlias zu verwenden gefällt mir mittlerweile nicht mehr so, glaub das stell ich noch um.

Zwei Custom-setter (togglePlay und mute) hab ich mir gebastelt (jetzt mit s2m) damit wurde es noch etwas kürzer.

Einen Custom-setter für mute, toggle gabs ja schon  ::)

Für einen Tipp wie man das auf Prozentwerte setzen sinnvoll umsetzt wär ich dankbar.
$strzigu ist eine structure darum hol ich mir bisher Brightness aus einem Gerät, da gibts evtl auch eine bessere Lösung ?

Zitatsub myNec32RemoteCodesHandler {
   my $sija = shift;
   my $tv = shift;
   my $strzigu = shift;
   my $miweck = shift;
   my $sondev = shift;
   my $dudev = shift;
   my $rcProtocol = shift;
   my $rcCode = shift // return;
   my $name = shift;
   chop($rcProtocol);
   my $dudevstate = ReadingsVal($dudev,'state','Sonos');
   my $sondevstate = ReadingsVal($sondev,'state','');
   my $sondevcs = ReadingsVal($sondev,'enqueuedMetadata_Title','unbekannt');
   my $sondevmute = ReadingsVal("$sondev","mute","0");
   my %rcode2cmnd = (
   '0x20DF4EB1' => 'Sonos',
   '0x20DF8E71' => 'Licht',
   '0x20DFC639' => 'Jupiter',
   '0x20DF8679' => 'Jalousie');
   my $gcmnd = $rcode2cmnd{$rcCode};
   #return if !$gcmnd;
   #Log3(undef, 3, "Das ist $rcProtocol $rcCode $dudevstate $dudev");
   
   return if ReadingsVal($tv,'state','') eq 'on';
   return fhem("set $dudev $gcmnd;saysonos $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;
   
   if ($dudevstate eq 'Sonos') {
   my %rcode2cmnd = (
   '0x20DF906F' => 'mute',
   '0x20DF4EB1' => "$sondevcs",
   '0x20DF22DD' => 'toggle',
   '0x20DF7887' => 'toggleRadio',   
   '0x20DFC03F' => "volume {([$sondev:volume]-5)}",
   '0x20DF40BF' => "volume {([$sondev:volume]+5)}",
   '0x20DF4EB1' => "speak 20 Es läuft gerade $sondevcs");
   my $command = $rcode2cmnd{$rcCode};
   return if !$command;
   return fhem("set $sondev $command");
   }
   
   if ($dudevstate eq 'Licht') {
   my %code2command = (
   '0x20DF22DD' => 'toggle',
   '0x20DFE01F' => "brightness {(ReadingsNum('MQTT2_zigbee_gu10_1','brightness','')-20)}",
   '0x20DF609F' => "brightness {(ReadingsNum('MQTT2_zigbee_gu10_1','brightness','')+20)}");
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $strzigu $command");
   }
   
   if ($dudevstate eq 'Jupiter') {
   my %code2command = (
   '0x20DF22DD' => 'toggle',
   '0x20DFE01F' => "brightness {(ReadingsNum('$miweck','brightness','0')-15)}",
   '0x20DF609F' => "brightness {(ReadingsNum('$miweck','brightness','0')+15)}");
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $miweck $command");
   }
   
   if ($dudevstate eq 'Jalousie')
   {
   my %code2command = (
   '0x20DF827D' => 'close',
   '0x20DFE01F' => 'position 3',
   '0x20DF609F' => 'position 30',
   '0x20DF02FD' => 'open',
   '0x20DF22DD' => 'stop',
   '0x20DF40BF' => 'up_for_timer 1',
   '0x20DFC03F' => 'down_for_timer 1');
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $sija $command") ;
   }
   
   }



Was mir einfach nicht gelingen mag ist die/eine Statusabfrage, wenn der Wert für die "Statusabfrage" aus dem Hash kommt.

So klappt alles:

my %rcode2cmnd = (
'0x20DF4EB1' => 'Sonos',
'0x20DF8E71' => 'Licht',
'0x20DFC639' => 'Jupiter',
'0x20DF8679' => 'Jalousie');
my $gcmnd = $rcode2cmnd{$rcCode};

#Log3(undef, 3, "Das ist $rcProtocol $rcCode $dudevstate $dudev");

return if ReadingsVal($tv,'state','') eq 'on';
return fhem("set $dudev $gcmnd;saysonos $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;

return fhem("saysonos $dudevstate") if $rcCode eq '0x20DF55AA';


So werden die if (Sonos,Licht,Jupiter,Jalousie) nicht mehr ausgeführt egal ob mit oder ohne return if !$gcmnd;:

   my %rcode2cmnd = (
'0x20DF4EB1' => 'Sonos',
'0x20DF8E71' => 'Licht',
'0x20DFC639' => 'Jupiter',
'0x20DF8679' => 'Jalousie',
'0x20DF55AA' => "$dudevstate"
);
my $gcmnd = $rcode2cmnd{$rcCode};
#return if !$gcmnd;
#Log3(undef, 3, "Das ist $rcProtocol $rcCode $dudevstate $dudev");

return if ReadingsVal($tv,'state','') eq 'on';
return fhem("set $dudev $gcmnd;saysonos $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;
return fhem("saysonos $gcmnd");
#return fhem("saysonos $dudevstate") if $rcCode eq '0x20DF55AA';


Wenn ich den Befehl ganz ans Ende stelle klappt alles nur die "Statusabfrage" geht nicht, es wird nichts ausgeführt (bei einem 0x20DF55AA), nix steht im Log:

 
   my %rcode2cmnd = (
   '0x20DF4EB1' => 'Sonos',
   '0x20DF8E71' => 'Licht',
   '0x20DFC639' => 'Jupiter',
   '0x20DF8679' => 'Jalousie',
   '0x20DF55AA' => "$dudevstate");
   my $gcmnd = $rcode2cmnd{$rcCode};
   ...

   ...
   '0x20DF40BF' => 'up_for_timer 1',
   '0x20DFC03F' => 'down_for_timer 1');
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $sija $command") ;
   }
   return fhem("saysonos $gcmnd");
   }


Lösung für die "Statusabfrage":
Zitat
sub myNec32RemoteCodesHandler {
   my $sija = shift;
   my $tv = shift;
   my $strzigu = shift;
   my $miweck = shift;
   my $sondev = shift;
   my $dudev = shift;
   my $rcCode = shift // return;
   my $dudevstate = ReadingsVal($dudev,'state','Sonos');
   my $sondevstate = ReadingsVal($sondev,'state','Sonos');
   my $sondevcs = ReadingsVal($sondev,'enqueuedMetadata_Title','unbekannt');
   my $sondevmute = ReadingsVal("$sondev","mute","false");
   my %rcode2cmnd = (
   '0x20DF4EB1' => 'Sonos',
   '0x20DF8E71' => 'Licht',
   '0x20DFC639' => 'Jupiter',
   '0x20DF8679' => 'Jalousie',
   '0x20DF55AA' => "$dudevstate");
   my $gcmnd = $rcode2cmnd{$rcCode};
   
   Log3(undef, 3, "Das ist $rcCode $dudevstate $dudev");
   
   return if ReadingsVal($tv,'state','') eq 'on';
   return fhem("set $dudev $gcmnd;saysonos $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;
   return fhem("saysonos $gcmnd") if $gcmnd eq $dudevstate;
   #return fhem("saysonos $dudevstate") if $rcCode eq '0x20DF55AA';
   if ($dudevstate eq 'Sonos') {
   my %rcode2cmnd = (
   '0x20DF906F' => 'mute',
   '0x20DF4EB1' => "$sondevcs",
   '0x20DF22DD' => 'togglePlay',
   '0x20DF7887' => 'toggleRadio',   
   '0x20DFC03F' => "volume {([$sondev:volume]-5)}",
   '0x20DF40BF' => "volume {([$sondev:volume]+5)}",
   '0x20DF4EB1' => "speak 20 Es läuft gerade $sondevcs");
   my $command = $rcode2cmnd{$rcCode};
   return if !$command;
   return fhem("set $sondev $command");
   }
   
   if ($dudevstate eq 'Licht') {
   my %code2command = (
   '0x20DF22DD' => 'toggle',
   '0x20DFC03F' => "brightness {(ReadingsNum('MQTT2_zigbee_gu10_1','brightness','')-20)}",
   '0x20DF40BF' => "brightness {(ReadingsNum('MQTT2_zigbee_gu10_1','brightness','')+20)}");
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $strzigu $command");
   }
   
   if ($dudevstate eq 'Jupiter') {
   my %code2command = (
   '0x20DF22DD' => 'toggle',
   '0x20DFC03F' => "brightness {(ReadingsNum('$miweck','brightness','0')-15)}",
   '0x20DF40BF' => "brightness {(ReadingsNum('$miweck','brightness','0')+15)}");
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $miweck $command");
   }
   
   if ($dudevstate eq 'Jalousie')
   {
   my %code2command = (
   '0x20DF827D' => 'close',
   '0x20DFE01F' => 'position 3',
   '0x20DF609F' => 'position 30',
   '0x20DF02FD' => 'open',
   '0x20DF22DD' => 'stop',
   '0x20DF40BF' => 'up_for_timer 1',
   '0x20DFC03F' => 'down_for_timer 1');
   my $command = $code2command{$rcCode};
   return if !$command;
   return fhem("set $sija $command") ;
   }
   
   }
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 16 Dezember 2020, 13:14:30
ZitatFür einen Tipp wie man das auf Prozentwerte setzen sinnvoll umsetzt wär ich dankbar.

OK, statt zuvor mal nachzuschauen hab ich es jetzt erst, die sub milight_dimm bringt mich da wohl weiter, muss ich mich mit beschäftigen.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 21 Dezember 2020, 19:06:28
Ein kleiner Hinweis auf die Funktionen maxNum() und minNum() wäre nett gewesen.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 23 Dezember 2020, 17:35:06
Hab jetzt alles soweit umgesetzt wie es mein bisheriges Verständnis zu lässt.

Ich erhoffe mir mit diesem Post Kritik, wenn es welche gibt und/oder weitere Optimierungsvorschläge.

Bei Licht kam ein ein zusätzlicher Befehl dazu, soll ich wegen dem einen $rcCode auch auf Hash umstellen, das es einheitlich ist ?

sub
myUtils_Remotes_Initialize($$)
{
  my ($hash) = @_;
 
}

# Enter you functions below _this_ line.

sub myNec32RemoteCodesHandler {
my $wzdl = shift;
my $sija = shift;
my $tv = shift;
my $strzigu = shift;
my $miwl = shift;
my $sdev = shift;
my $dudev = shift;
my $rcCode = shift // return;
my $dudevstate = ReadingsVal($dudev,'state','Sonos');
my $sdevcs = ReadingsVal($sdev,'enqueuedMetadata_Title','unbekannt');
my $sdevs = "speak 20";
my $sdevsc = "$sdevs Es läuft gerade $sdevcs";
my $cmdb = "brightness";
my $brzu = "$cmdb {(minNum(ReadingsNum('MQTT2_zigbee_gu10_1','brightness','0')+20,255))}",
my $brzd = "$cmdb {(maxNum(ReadingsNum('MQTT2_zigbee_gu10_1','brightness','0')-20,0))}",
my $brmiwlu = "$cmdb {(minNum(ReadingsNum('$miwl','brightness','0')+15,255))}",
my $brmiwld = "$cmdb {(maxNum(ReadingsNum('$miwl','brightness','0')-15,0))}",
my $hrmiwlu = "hue {(minNum(ReadingsNum('$miwl','hue','0')+15,360))}",
my $hrmiwld = "hue {(maxNum(ReadingsNum('$miwl','hue','0')-15,0))}",
my $vrsdevu = "volume {(minNum(ReadingsNum('$sdev','volume','0')+5,40))}",
my $vrsdevd = "volume {(maxNum(ReadingsNum('$sdev','volume','0')-5,0))}",
my %rcode2cmnd = (
'0x20DF4EB1' => 'Sonos',
'0x20DF8E71' => 'Licht',
'0x20DFC639' => 'Jupiter',
'0x20DF8679' => 'Jalousie',
'0x20DF55AA' => "$dudevstate");
my $gcmnd = $rcode2cmnd{$rcCode};

#Log3(undef, 3, "Das ist $rcCode $dudevstate $dudev");

return if ReadingsVal($tv,'state','') eq 'on';
return fhem("set $dudev $gcmnd;set $sdev $sdevs $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;
return fhem("set $sdev $sdevs $gcmnd") if $gcmnd && $dudevstate eq $gcmnd;

if ($dudevstate eq 'Sonos') {
my %rcode2cmnd = (
'0x20DF906F' => 'mute',
'0x20DF22DD' => 'toggle',
'0x20DF7887' => 'toggleRadio',
'0x20DF40BF' => "$vrsdevu",
'0x20DFC03F' => "$vrsdevd",
'0x20DF4EB1' => "$sdevsc");
my $command = $rcode2cmnd{$rcCode};
return if !$command;
return fhem("set $sdev $command");
}

if ($dudevstate eq 'Licht') {
my $l = ReadingsVal("$wzdl","sceneList","unknown");
my $cmd = "scene ";
$cmd .= Each($wzdl, $l);
return fhem("set $wzdl $cmd") if $rcCode eq '0x20DF7887';
my %code2command = (
'0x20DF22DD' => 'toggle',
'0x20DF40BF' => "$brzu",
'0x20DFC03F' => "$brzd");
my $command = $code2command{$rcCode};
return if !$command;
return fhem("set $strzigu $command");
}

if ($dudevstate eq 'Jupiter') {
my %code2command = (
'0x20DF22DD' => 'toggle',
'0x20DF00FF' => "$hrmiwlu",
'0x20DF807F' => "$hrmiwld",
'0x20DF40BF' => "$brmiwlu",
'0x20DFC03F' => "$brmiwld");
my $command = $code2command{$rcCode};
return if !$command;
return fhem("set $miwl $command");
}

if ($dudevstate eq 'Jalousie')
{
my %code2command = (
'0x20DF827D' => 'close',
'0x20DFE01F' => 'position 3',
'0x20DF609F' => 'position 30',
'0x20DF02FD' => 'open',
'0x20DF22DD' => 'stop',
'0x20DF40BF' => 'up_for_timer 1',
'0x20DFC03F' => 'down_for_timer 1');
my $command = $code2command{$rcCode};
return if !$command;
return fhem("set $sija $command") ;
}
}
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 23 Dezember 2020, 17:57:56
Na ja, ist immer etwas schwierig mit Kritik, wenn man die Devices nicht hat...

Sieht aber "eigentlich" für meine Augen ziemlich ok aus.

Anmerkungen:
- Initialize ist zwar nach "Lehrbuch", aber das ist m.E. outdated...
sub myUtils_Remotes_Initialize {
  my $hash = shift//return;
  return;
}

- Es werden ziemlich viele Argumente übergeben; ist unübersichtlich. Evtl. würde es Sinn machen, den JSON weiterzureichen und den dann erst in der Funktion auseinanderzunehmen?
- MQTT2_zigbee_gu10_1 ist noch hart vercoded. Absicht?
- weitere Ein- und Ausrückungen würden ggf. noch zur Übersichtlichkeit beitragen ;) .
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 23 Dezember 2020, 18:34:11
Danke für das mit dem Initialize.

Verstehe (oder doch nicht) erstmal nur das du jetzt den Ausführungsteil in geschweiften Klammern eines notify hier als JSON bezeichnest/siehst, was er ja ist, mit dem auseinandernehmen muss ich noch etwas grübeln wie das umzusetzen ginge, ich komm denk ich drauf, brauch bloss etwas.

MQTT2_zigbee_gu10_1 ist noch drin weil ich irgendwie noch am zweifeln bin ob es richtig ist den Wert aus dieser einen (von sechs) zu holen um dann der structure (alle sechs) einen brightness-Wert zu übergeben, geht doch aber nicht anders ?

Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 23 Dezember 2020, 18:39:20
Nein, ich dachte, das könnte ggf. direkt aus der readingList des IR-Tasmota aufgerufen werden? Dann würde man $EVENT übergeben, was DORT (noch) ein JSON wäre, mit der Perl-Funktion oder dem notify hätte das nichts mehr zu tun.

Das mit der gu10 scheint mir dann so ok zu sein, falls die structure keinen geeigneten Wert hat...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 23 Dezember 2020, 18:54:04
Jetzt dämmerts, aber nur ganz leicht, muss ich drüber schlafen (mehrmals  ;D)

Danke.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 23 Dezember 2020, 19:51:24
Na dann gute Nacht!  ;D

Falls du Anschauungsmaterial suchst: die "neue" Version der MiLight-Geschichte macht genau das: den JSON intern auspacken und dann die gewünschten Aktionen auslösen. Da da der Topic unterscheidlich ist, ist es einfacher festzustellen, welche Funktion aufgerufen werden soll, aber für die Tasmota-Sache könnte man einfach eine Regex auf den $EVENT vorneweg prüfen lassen, ob das was für die Funktion ist, oder eben für eine andere...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 26 Februar 2021, 13:50:54
Kann mich bitte jemand von meinem Unverständnis befreien.

Gegeben:
defmod MQTT2_Cube MQTT2_DEVICE zigbee_0x00158d00028aedf7
attr MQTT2_Cube IODev MQTT2_Server
attr MQTT2_Cube devicetopic zigbee2mqtt/0x00158d00028aedf7
attr MQTT2_Cube group Wohnzimmer
attr MQTT2_Cube imageLink /fhem/deviceimages/mqtt2/MFKZQ01LM.jpg
attr MQTT2_Cube jsonMap battery:batteryPercent voltage:batterymV
attr MQTT2_Cube model zigbee2mqtt_aqara_cube
attr MQTT2_Cube readingList $DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }\
zigbee2mqtt/0x00158d00028aedf7:.* { json2nameValue($EVENT) }
attr MQTT2_Cube room MQTT2_DEVICE
attr MQTT2_Cube stateFormat Action: action
attr MQTT2_Cube userReadings batteryVoltage:batterymV.* {ReadingsNum($name,'batterymV',0)/1000}

setstate MQTT2_Cube Action: wakeup
setstate MQTT2_Cube 2021-02-26 13:15:36 action wakeup
setstate MQTT2_Cube 2021-02-26 13:15:36 angle 111.12
setstate MQTT2_Cube 2021-02-25 22:14:27 associatedWith MQTT2_zigbee_Bridge
setstate MQTT2_Cube 2021-02-25 17:39:15 attrTemplateVersion 20200904
setstate MQTT2_Cube 2021-02-26 13:15:36 battery 45
setstate MQTT2_Cube 2021-02-26 13:15:36 batteryPercent 45
setstate MQTT2_Cube 2021-02-26 13:15:36 batteryVoltage 2.905
setstate MQTT2_Cube 2021-02-26 13:15:36 batterymV 2905
setstate MQTT2_Cube 2021-02-25 22:41:14 from_side 1
setstate MQTT2_Cube 2021-02-26 13:15:36 linkquality 2
setstate MQTT2_Cube 2021-02-26 13:15:36 side 5
setstate MQTT2_Cube 2021-02-25 22:41:14 to_side 2
setstate MQTT2_Cube 2021-02-26 13:15:36 voltage 2905


Events bei action tap:
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube angle: 111.12
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube side: 5
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube voltage: 2905
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube battery: 45
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube linkquality: 2
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube action: tap
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube batterymV: 2905
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube batteryPercent: 45
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube linkquality: 2
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube action: tap
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube side: 5
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube angle: 111.12
2021-02-26 13:19:09 MQTT2_DEVICE MQTT2_Cube batteryVoltage: 2.905


notify:
defmod not_MQTT2_Cube notify MQTT2_Cube:(action|side):.* {cube($NAME,$EVENT,$EVTPART0,$EVTPART1,'OG_Echo_Wohnzimmer')}

setstate not_MQTT2_Cube 2021-02-26 13:19:09
setstate not_MQTT2_Cube 2021-02-26 12:55:03 state active


sub:
sub cube {
my $NAME = shift;
my $EVENT = shift;
my $EVTPART0 = shift;
my $EVTPART1 = shift;
my $echo = shift;
chop($EVTPART0);
my $sr = ReadingsNum($NAME,'side',0);

Log3(undef, 3, "Das ist $NAME, $EVENT, $EVTPART0, $EVTPART1");

if ($EVTPART1 eq "tap") {

my %sr2cmnd = (
'0' => "Gastzugang",
'1' => 'Gastzugang eins',
'2' => 'Gastzugang 7 Tage',
'3' => 'Gast eins 21 Tage',
'4' => "Rollo",
'5' => "TV");
my $cmnd = $sr2cmnd{$sr};

return if !$cmnd;
return fhem("set $echo speak $cmnd");

}
}


Es klappt alles wie vorgesehen. Die Sprachausgabe erfolgt nur einmal.

Im Log steht aber zweimal:
2021.02.26 13:39:34 3: Das ist MQTT2_Cube, action: tap, action, tap
2021.02.26 13:39:34 3: Das ist MQTT2_Cube, action: tap, action, tap


edit: kann das echodevice-Modul die Befehle nur nicht so schnell ausführen und es erfolgt nur eine Sprachausgabe ?




Warum wird hier wenn ich den Text/Befehl übergebe return fhem("$cmnd"); immer zweimal ausgeführt ?
edit: kann das echodevice Modul den sounds Befehl vlt- schneller verarbeiten und darum wird jetzt zweimal ausgeführt ?

Mit dem obigen notify:
2021.02.26 13:32:59 3: Das ist MQTT2_Cube, action: tap, action, tap
2021.02.26 13:32:59 3: Das ist MQTT2_Cube, side: 0, side, 0
2021.02.26 13:32:59 3: Das ist MQTT2_Cube, side: 0, side, 0
2021.02.26 13:32:59 3: Das ist MQTT2_Cube, action: tap, action, tap


Und wenn ich das notify ändere:
defmod not_MQTT2_Cube notify MQTT2_Cube:action:.* {cube($NAME,$EVENT,$EVTPART0,$EVTPART1,'OG_Echo_Wohnzimmer')}

setstate not_MQTT2_Cube 2021-02-26 13:36:07
setstate not_MQTT2_Cube 2021-02-26 13:34:10 state active


ebenfalls zweimal:

2021.02.26 13:34:27 3: Das ist MQTT2_Cube, action: tap, action, tap
2021.02.26 13:34:27 3: Das ist MQTT2_Cube, action: tap, action, tap


es geht nur um den ersten Hash (die anderen ignorieren)

sub cube {
my $NAME = shift;
my $EVENT = shift;
my $EVTPART0 = shift;
my $EVTPART1 = shift;
my $echo = shift;
chop($EVTPART0);
my $sr = ReadingsNum($NAME,'side',0);

my $sound = "set $echo sounds Glocken";
#$sound .= ";(system ('/opt/fhem/vouchergzg.sh &'))";

Log3(undef, 3, "Das ist $NAME, $EVENT, $EVTPART0, $EVTPART1");

if ($EVTPART1 eq "tap") {

my %sr2cmnd = (
'0' => "$sound",
'1' => 'Gastzugang eins',
'2' => 'Gastzugang 7 Tage',
'3' => 'Gast eins 21 Tage',
'4' => 'Rollo',
'5' => 'TV');
my $cmnd = $sr2cmnd{$sr};

return if !$cmnd;
return fhem("$cmnd");

}
}


Was mach ich beim Trigger mglw. falsch ?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 26 Februar 2021, 13:58:00
Warum hast du (indirekt) 2x dasselbe "abo" in der readingList?
(Oder lese ich das falsch?)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 26 Februar 2021, 14:09:28
War mir gar nicht aufgefallen, die Readinglist wurde offensichtlich so ergänzt nachdem ich das erweiterte Template (aus dem andern Thread) angewendet hatte, die Readings hatte ich nicht zuvor gelöscht.

Nur ein ReadinList-Eintrag ändert aber nix an dem Verhalten oben.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 26 Februar 2021, 14:17:35
Nur um sicher zu gehen: starte mal neu oder lösche übergangsweise das M2D (dann wieder RAW erstellen sollte ok sein).

Sind die doppelten Events (dann noch) auch im Event-Monitor zu sehen?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 26 Februar 2021, 14:40:01
Ich mag auch so eine Glaskugel wo kann man die bestellen ?



ZitatSind die doppelten Events (dann noch) auch im Event-Monitor zu sehen?

Aber hier lagst du falsch es gab/gibt (hab jetzt nachträglich (zum nachvollziehen) zwei Einträge in RL vorgenommen) keine doppelten Events im Eventmonitor mit zwei Einträgen.

2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube angle: 53.18
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube linkquality: 0
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube side: 0
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube action: tap
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube battery: 37
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube voltage: 2865
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube batterymV: 2865
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube action: tap
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube batteryPercent: 37
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube angle: 53.18
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube linkquality: 0
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube side: 0
2021-02-26 14:36:45 MQTT2_DEVICE MQTT2_Cube batteryVoltage: 2.865
2021-02-26 14:36:52 echodevice OG_Echo_Wohnzimmer alarm_count: 0
2021-02-26 14:36:54 OWTHERM KG_Innensensor_RlaufHinterhaus temperature: 28.25
2021-02-26 14:36:54 OWTHERM KG_Innensensor_RlaufHinterhaus T: 28.25 °C ↓
2021-02-26 14:36:54 OWTHERM KG_Innensensor_RlaufHinterhaus old_temperature: 28.3125
2021-02-26 14:37:00 at at_wordclock wclocktime: Es ist 14 Uhr 37


DANKE
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 27 Februar 2021, 12:38:58
Ich war der Meinung das es so einfach ist das ich es auch ohne zu fragen hinbekomme ::)

Sitz da jetzt schon Stunden dran mit allen mir erdenklichen Variationen von qq,Hochkommata und Verkettungen

defmod not_MQTT2_Cube notify MQTT2_Cube:action:.tap {cube($NAME,$EVENT,$EVTPART0,$EVTPART1,"EG_Echo_Kueche")}

setstate not_MQTT2_Cube 2021-02-27 11:56:04
setstate not_MQTT2_Cube 2021-02-26 19:26:05 state active


sub cube {
my $NAME = shift;
my $EVENT = shift;
my $EVTPART0 = shift;
my $EVTPART1 = shift;
my $echo = shift;
chop($EVTPART0);
my $sr = ReadingsNum($NAME,'side',0);
my $sound = fhem("set $echo sounds Glocken");
my $gzg = (system ('/opt/fhem/vouchergzg.sh &'));$sound;
#my $gzg1 = (system ('/opt/fhem/vouchergzg1.sh &'));$sound;

Log3(undef, 3, "Das ist $NAME, $EVENT, $EVTPART0, $EVTPART1");


my %sr2cmnd = (
'0' => "$gzg"
);
my $cmnd = $sr2cmnd{$sr};

return if !$cmnd;
return $cmnd;

}


Wie lautet die richtige Definition der Variablen $gzg/$gzg1 ?

Ist $gzg1 auskommentiert wird einmal beim Event tap vouchergzg.sh und $sound ausgeführt allerdings unabhängig vom Key (Reading side), es reicht also einfach nur der Aufruf der sub.

Nehm ich die Variablendefinition $gzg1 mit rein wird beim Event tap (und auch unabhängig vom Key) zweimal vouchergzg1.sh und einmal $sound ausgeführt ? ? ?

Was hab ich noch nicht verstanden, hat es was mit der Definition eines Systemaufruf in einer Variablen zu tun ?

edit:

mit if und einer IT-Fernbedienung klappt mein Vorhaben bisher problemlos so:

if ($NAME eq "FB_433_2_TasteC" && $EVENT eq "on")
{(system ('/opt/fhem/vouchergzg.sh &'));fhem("set EG_Echo_Kueche sounds Glocken")}

if ($NAME eq "FB_433_2_TasteC" && $EVENT eq "off")
{(system ('/opt/fhem/vouchergzg1.sh &'));fhem("set EG_Echo_Kueche sounds Glocken")}


Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 27 Februar 2021, 13:03:49
Hmm, also für mich sieht das so aus, als könnte man das gar nicht auf diese Weise lösen...

Entweder du generierst
a) Text (qq) oder
b)  du weist einer Variablen
aa) den Wert eines auszuführenden Befehls
zu oder
bb) die Referenz auf Code

Was du hier versuchst, ist eine ziemlich seltsame Mischung von all dem mit Schwerpunkt auf b) aa) => der Code wird zum falschen Zeitpunkt ausgeführt...
Auf die Schnelle habe ich aber auch keine Lösung anzubieten, aber vielleicht hilft dir das erst mal weiter. Ansonsten ggf. mal die Code-Hash-Lookup-Tabelle im jüngsten RHASSPY-Code ansehen und mit der elsif-Kaskade vergleichen, die da vorher stand.

Edit: evtl als anonyme sub () in der Variablen....
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 27 Februar 2021, 13:29:19
Ich frage mal nach und formuliere es anders als Jörg:
Willst Du wirklich das
my $gzg = (system ('/opt/fhem/vouchergzg.sh &'));$sound;
oder wolltest Du eher das?
my $sound = "fhem(\"set $echo sounds Glocken\")";
my $gzg = "(system ('/opt/fhem/vouchergzg.sh &'));".$sound;


Dein funktionierender Code sieht eher so aus ;) als wolltest Du nur Strings kombinieren - aber in deinem Versuch schreibst Du Ergebnisse in die Variable.

Gruß Otto
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 27 Februar 2021, 14:19:59
my $sound = 'fhem("set $echo sounds Glocken")';

Wenn schon mit doppelten Hochkommata, mit einfachen wird die Variable $echo nicht aufgelöst.

my $gzg = '(system ('/opt/fhem/vouchergzg.sh &'));'.$sound;

Sobald Hochkommata um (system ('/opt/fhem/vouchergzg.sh &')) ins Spiel kommen klappt das nicht mehr.

Mit einfachen kommt die Meldung: Search pattern not terminated at ./FHEM/99_Remotes_myUtils.pm line 217.

Wenn man aussen einfache innen doppelte nimmt, kommt die Meldung nicht mehr. Der Systemaufruf aber auch nicht ausgeführt nur $sound

my $gzg = '(system ("/opt/fhem/vouchergzg.sh &"))'.$sound;

Mit doppelten aussen wird der Systemaufruf auch nicht ausgeführt, er klappt bloss ohne Hochkommata wird aber immer bei Aufruf der sub ausgeführt.

Sobald es zwei Variablen gibt (mit Systembefehl) wird immer die zweite Variable beim Aufruf der sub zweimal ausgeführt $sound nur einmal.

Ich brauche erstmal eine Pause.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 27 Februar 2021, 14:37:54
Mobiles Stichwort für anonyme sub: trim30()
;)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 27 Februar 2021, 15:37:06
Zitat von: TomLee am 27 Februar 2021, 14:19:59

Wenn schon mit doppelten Hochkommata, mit einfachen wird die Variable $echo nicht aufgelöst.

Ich brauche erstmal eine Pause.
sorry hatte nicht an alles gedacht. Habe #49 editiert, sollte so klappen. Du hast meine Frage nicht beantwortet, die war durchaus ernst gemeint. Ich habe wirklich nicht auf Anhieb verstanden,was das genaue Ziel. :-[
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 27 Februar 2021, 15:48:00


Zitat von: Beta-User am 27 Februar 2021, 14:37:54
Mobiles Stichwort für anonyme sub: trim30()
;)

Das sieht gut aus  :-*  ;D, aber noch nicht final getestet am Drucker (die .sh druckt eine .ps aus), sehe erstmal nur einen Druckauftrag in CUPS, sonst waren es immer zwei.

Bevor ich wieder runterlaufe  ;D mag ich zuvor noch wissen was es mit der Meldung auf sich hat und wie man sie vermeidet/was ich falsch definiert habe bei einem
{my $sound = fhem("set OG_Echo_Wohnzimmer sounds Glocken");;my $v = sub {return $_[0].';;'.$sound};;my $gzg = v((system ('/opt/fhem/vouchergzg.sh &')));;my $gzg1 = v((system ('/opt/fhem/vouchergzg1.sh &')));;$gzg1}

aus der Kommandozeile

Undefined subroutine &main::v called at (eval 118414) line 1.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 27 Februar 2021, 15:53:06
Du bist durch den Wind :)

my $v = sub {return $_[0].';;'.$sound} -> sub v {return $_[0].';;'.$sound}

Seit wann definiert man eine Sub mit my ?

Gruß Otto
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 27 Februar 2021, 16:01:47
...geht, "anonyme sub"...
Aber die Sytax ist anders, die Variable wird normal definiert, aber die eigentliche sub muss dann in brackets, nix mit concat (auf die Art)...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 27 Februar 2021, 16:06:06
Otto, mit der Ausgabe bzw. der Definition der Variablen $sound gibts kein Problem, nur mit der des System-Befehl, der darf einfach nicht in Hochkommata sein, egal ob einfache oder doppelte, sonst wird er nicht ausgeführt.




Sowas
{my $sound = fhem("set EG_Echo_Kueche sounds Glocken");;my $gzg = (system ("/opt/fhem/vouchergzg.sh &"));;$gzg .= qq(;;$sound);;my $gzg1 = (system ('/opt/fhem/vouchergzg1.sh &'));;$gzg1 .= qq(;;$sound);;$gzg}


aus der Kommandozeile hat mir nochmal diese Aussage bestätigt:

ZitatSobald es zwei Variablen gibt (mit Systembefehl) wird immer die zweite Variable beim Aufruf der sub zweimal ausgeführt $sound nur einmal.

Obwohl $gzg als Rückgabewert dasteht wird $gzg1 zweimal ausgeführt und $sound einmal.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 27 Februar 2021, 16:10:39
Zitat von: Otto123 am 27 Februar 2021, 15:53:06

Seit wann definiert man eine Sub mit my ?


War hier (https://forum.fhem.de/index.php/topic,111711.msg1062906.html#msg1062906) in devstateIcon kurzzeitig auch so.

Zitat von: Beta-User am 27 Februar 2021, 16:01:47
...geht, "anonyme sub"...
Aber die Sytax ist anders, die Variable wird normal definiert, aber die eigentliche sub muss dann in brackets, nix mit concat (auf die Art)...


Dann muss ich nochmal weiterlesen.

Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 27 Februar 2021, 16:29:42
Zitat von: Beta-User am 27 Februar 2021, 16:01:47
...geht, "anonyme sub"...
Aber die Sytax ist anders, die Variable wird normal definiert, aber die eigentliche sub muss dann in brackets, nix mit concat (auf die Art)...
ich mache ja mit um zu lernen :)

Du meinst den Ausdruck?
"(system ('/opt/fhem/vouchergzg.sh &'));"
Eventuell ist final der größte Fehler, dass außen ein Klammer ist.
"system ('/opt/fhem/vouchergzg.sh &');"
Der String in der system() Klammer muss sein.

Du willst doch zwei Strings verknüpfen? Also:
$String1='willi'
$String1.' ist lustig'

Oder liege ich falsch?

Dieser Ausdruck schreibt das Ergebnis des fhem() in die Variable und nicht den Befehl an sich.
my $sound = fhem("set EG_Echo_Kueche sounds Glocken");

Der Set Befehl liefert sicher nichts zurück, die Variable enthält anschließend nichts?

Welcher der beiden Ausdrücke in der Kommandozeile liefert das zurück, was Du erwartest?
{my $sound = fhem("set EG_Echo_Kueche sounds Glocken");;return $sound}
{my $sound = "fhem(\"set EG_Echo_Kueche sounds Glocken\")";;return $sound}
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 27 Februar 2021, 17:49:40
ZitatDu willst doch zwei Strings verknüpfen? Also:
$String1='willi'
$String1.' ist lustig'

Oder liege ich falsch?

Ich meine ja, so hab ich es ursprünglich auch verstanden.

Nur hat die Praxis gezeigt das es scheinbar nicht so ist. siehe unten.

Zitat von: Otto123 am 27 Februar 2021, 16:29:42
Welcher der beiden Ausdrücke in der Kommandozeile liefert das zurück, was Du erwartest?
{my $sound = fhem("set EG_Echo_Kueche sounds Glocken");;return $sound}
{my $sound = "fhem(\"set EG_Echo_Kueche sounds Glocken\")";;return $sound}

Ich würde sagen um die Variablen aneinander zu ketten bräuchte ich die zweite Variante.
Warum aber escapen und nicht einfach qq nehmen ?

Um zu verdeutlichen das es nicht so ist wie du mAn. vermutest nochmal ein Beispiel erstmal nur mit einer Variablen und deinen Vorschlägen:

sub cube {
my $NAME = shift;
my $EVENT = shift;
my $EVTPART0 = shift;
my $EVTPART1 = shift;
my $echo = shift;
chop($EVTPART0);
my $sr = ReadingsNum($NAME,'side',0);
my $sound = "fhem(\"set $echo sounds Glocken\")";
my $gzg = "system ('/opt/fhem/vouchergzg.sh &');".$sound;

Log3(undef, 3, "Das ist $NAME, $EVENT, $EVTPART0, $EVTPART1");

my %sr2cmnd = (
'0' => "$gzg"
);
my $cmnd = $sr2cmnd{$sr};

return if !$cmnd;
return $cmnd;

}


Im Log steht dann :

2021.02.27 17:28:27 3: Das ist MQTT2_Cube, action: tap, action, tap
2021.02.27 17:28:27 3: not_MQTT2_Cube return value: system ('/opt/fhem/vouchergzg.sh &');fhem("set OG_Echo_Wohnzimmer sounds Glocken")


Die beiden Befehle werden also "ausgeschrieben" und nicht ausgeführt.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 27 Februar 2021, 17:56:47
Fakt ist aber auch das es ohne Hochkommata nicht richtig sein kann weil dann bei jedem Aufruf der sub die Befehle in den Variablen ausgeführt werden.




(Und nein ich brauch/mag kein Popcorn) Hilfe !!!
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 27 Februar 2021, 18:19:30
Das ist korrekt, ich mache immer Schritt für Schritt :)
{my $var="3+4";;return $var}
{my $var="3+4";;eval $var}

Also anstatt return $cmnd machst Du eval $cmnd und er führt es aus?

ZitatWarum aber escapen und nicht einfach qq nehmen ?
Das ist doch am Ende Geschmacksache ;)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 27 Februar 2021, 18:37:26
Oh, ein Fuchsbau  :P

Unabhängig jetzt mal davon wie ich aneinanderkette klappts so:


sub cube {
my $NAME = shift;
my $EVENT = shift;
my $EVTPART0 = shift;
my $EVTPART1 = shift;
my $echo = shift;
chop($EVTPART0);
my $sr = ReadingsNum($NAME,'side',0);
my $sound = qq(;fhem("set $echo sounds Glocken"));
my $gzg = qq(system ('/opt/fhem/vouchergzg.sh &'));
$gzg .= $sound;
my $gzg1 = qq(system ('/opt/fhem/vouchergzg1.sh &'));
$gzg1 .= $sound;

#my $var = sub {return $_[0].';'.$sound};
#my $gzg = var((system ("/opt/fhem/vouchergzg.sh &")));
#my $gzg1 = (system ('/opt/fhem/vouchergzg1.sh &'));


Log3(undef, 3, "Das ist $NAME, $EVENT, $EVTPART0, $EVTPART1");


my %sr2cmnd = (
'0' => "$gzg",
'1' => "$gzg1"
);
my $cmnd = $sr2cmnd{$sr};

return if !$cmnd;
eval $cmnd;

}



Spricht auch wirklich nix dagegen mit eval statt return den Wert zurückzugeben ?

Danke Otto

Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 27 Februar 2021, 19:32:00
Du kannst auch erst return und dann im Aufruf das eval machen?
return gibt den String zurück  eval evaluiert und führt ihn aus.

also im Aufruf eval {cube ...}
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 27 Februar 2021, 19:44:41
Zitat von: Otto123 am 27 Februar 2021, 19:32:00
Du kannst auch erst return und dann im Aufruf das eval machen?
return gibt den String zurück  eval evaluiert und führt ihn aus.

Bis dahin dacht ich erst kann ich folgen.

Nach

Zitatalso im Aufruf eval {cube ...}

bin ich am zweifeln. Wo meinst du jetzt ? direkt im notify? oder am Ende der sub wo der Wert zurückgegeben wird ?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 27 Februar 2021, 19:49:11
Zitat von: TomLee am 27 Februar 2021, 19:44:41
Bis dahin dacht ich erst kann ich folgen.

Nach

bin ich am zweifeln. Wo meinst du jetzt ? direkt im notify? oder am Ende der sub wo der Wert zurückgegeben wird ?
Ich bin spät eingestiegen.  ;D
Entweder machts Du {cube()} und lässt die Ausführung (eval) in der Sub machen, oder Du machst {eval cube()} beim Aufruf und die Sub gibt den String zurück?
Die geschweiften in meinem Einwand waren wahrscheinlich falsch ...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 27 Februar 2021, 20:04:22
Ich nehm erstmal (für die gestellte Frage hier, ich erweitere das noch) die Variante im notify.

Wenn das irgendwann irgendwem mal weiterhilft (und in Zukunft für mich), so klappts jetzt (ohne die zusätzliche anonyme sub, zu der ich mich noch beschäftigen muss):

defmod not_MQTT2_Cube notify MQTT2_Cube:action:.tap {eval cube($NAME,"EG_Echo_Kueche")}

sub cube {
my $NAME = shift;
my $echo = shift;
my $sr = ReadingsNum($NAME,'side',0);
my $sound = qq(;fhem("set $echo sounds Glocken"));
my $gzg = qq(system ('/opt/fhem/vouchergzg.sh &')).$sound;
my $gzg1 = qq(system ('/opt/fhem/vouchergzg1.sh &')).$sound;
my $g17d = qq(system ('/opt/fhem/voucher.sh &')).$sound;
my $g121d = qq(system ('/opt/fhem/voucher21.sh &')).$sound;

my %sr2cmnd = (
'0' => "$gzg",
'1' => "$gzg1",
'2' => "$g17d",
'4' => "$g121d"
);

return $sr2cmnd{$sr};

}


DANKE

Irgendwelche Einwände ?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 27 Februar 2021, 20:37:00
Den Abschluss versteh ich nicht ganz:
      my $cmnd = $sr2cmnd{$sr};
      
         return if !$cmnd;
         return $cmnd;
würde ich final ersetzen durch return $sr2cmnd{$sr}
Weil: was bringt die Umwidmung in eine neue Variable?
Was bringt das return if !$cmnd; ?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 27 Februar 2021, 21:07:19
ZitatWas bringt das return if !$cmnd; ?

Das war meine Frage hier (https://forum.fhem.de/index.php/topic,112785.msg1071678.html#msg1071678).

Die kann ich auch direkt beantworten, mein ich, dadurch würde eine Meldung verhindert werden wenn es keinen Key geben sollte, hier aber gar nicht nötig weil in $sr ein default-Wert angegeben ist und damit das return if !$cmnd; überflüssig ist, weil es halt immer einen Key gibt.

Zitatwürde ich final ersetzen durch return $sr2cmnd{$sr}

muss ich ausprobieren später, eigentlich ja, du verunsicherst mich jetzt aber ob ich was übersehe.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 27 Februar 2021, 21:58:19
Zitat von: Otto123 am 27 Februar 2021, 20:37:00
würde ich final ersetzen durch return $sr2cmnd{$sr}
Weil: was bringt die Umwidmung in eine neue Variable?

Korrekt erkannt, hab oben nochmal editiert.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 28 Februar 2021, 10:20:25
Zitat von: TomLee am 27 Februar 2021, 20:04:22
Irgendwelche Einwände ?
Wenn ich irgendwo "eval" lese, habe ich den "kann das weg?!?"-Reflex.

Und ein qq+concat ist "komisch"...

Nicht fertig, aber evtl. als "Steinbruch" brauchbar:
sub myUptime {
  my $param = shift;
  my $uptime = q{fheminfo};
  my $sound1 = qq(;" FHEM: ".fhem($uptime));
  my $sound2 = sub  { qx($uptime) . q{ } . fhem($uptime);  };
  $uptime = q{uptime};
  my $a1 = qq(system ('uptime &')$sound1);
  my $a2 = sub  { qx($uptime).$sound1 };
  my $a3 = sub  { my $r = qx($uptime &); $r .= " FHEM: ".fhem($uptime); return $r};
  my $sr2cmnd = {
    0 => $sound1,
    1 => \&$sound2,
    2 => $a1,
    4 => \&$a2,
    8 => \&$a3
  };
  my $ret;
  if (ref $sr2cmnd->{$param} eq 'CODE') {
     $ret = $sr2cmnd->{$param}->();
  } elsif (ref $sr2cmnd->{$param} eq 'SCALAR')  {
     $ret = 'via eval: ' . eval {$sr2cmnd->{$param}};
  }
  return $ret;
}

Die (teilweise enthaltenen) Referenzierungen vermeiden auch, das Dinge kopiert werden, ist effizienter...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 28 Februar 2021, 14:52:11
Das du aber auch immer wieder noch einen draufsetzen musst. ;D

Oben war nur die Rede von einer anonymem sub.

Jetzt sind plötzlich noch anonyme Verweise im Spiel.

Verstehe nur Bahnhof und das wird mein ich auch noch eine ganze Weile so bleiben.

Ganz so schwer scheint es teilweise aber gar nicht zu sein, mir fehlt aber einfach dazu Basiswissen.

Selbst wenn ich mich dazu einlesen würde/werde hab ich große Zweifel ob da wirklich in meiner Birne was hängen bleibt/auf Dauer was verfestigt.

Hab mir das jetzt zusammengereimt, das kein Steinbruch, das ein einfach nur ein Riesenloch vergleichbar mit dem Krater den der Meteorit der die Dinosaurier aussterben ließ beim Einschlag verursachte, weil die Zusammenhänge nicht begriffen und bedingt "einfach mal irgendwas gemacht" :

sub cube {
my $NAME = shift;
my $echo = shift;
my $sr = ReadingsNum($NAME,'side',0);
my $sound = qq(;fhem("set $echo sounds Glocken"));
my $gzg = sub {qq(system ('/opt/fhem/vouchergzg.sh &')$sound)};
my $gzg1 = sub {qq(system ('/opt/fhem/vouchergzg1.sh &')$sound)};
my $g17d = sub {qq(system ('/opt/fhem/voucher.sh &')$sound)};
my $g121d = sub {qq(system ('/opt/fhem/voucher21.sh &')$sound)};

my $sr2cmnd = {
'0' => "$gzg",
'1' => "$gzg1",
'2' => "$g17d",
'4' => "$g121d"
};


my $ret;
if (ref $sr2cmnd->{$sr} eq 'CODE') {
$ret = $sr2cmnd->{$sr}->();
}
elsif (ref $sr2cmnd->{$sr} eq 'SCALAR')
{$ret = eval {$sr2cmnd->{$sr}};
}
return $ret;

}



ZitatWenn ich irgendwo "eval" lese, habe ich den "kann das weg?!?"-Reflex.

Du benutzt doch in deinem Steinbruch in dem elsif-Zweig auch eval ?
Aber wie gesagt Null verstanden wann da CODE(...) und wann SCALAR(...) zurückkommt.

Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Wzut am 28 Februar 2021, 17:59:49
Zitat von: Beta-User am 28 Februar 2021, 10:20:25
Wenn ich irgendwo "eval" lese, habe ich den "kann das weg?!?"-Reflex.
und ich habe den Reflex inzwischen wenn ich elsif in Verbindung mit return lese :)
Warum machst du den unteren Teil ab my $ref nicht auch noch schlank ?
return $sr2cmnd->{$param}->()                   if (ref $sr2cmnd->{$param} eq 'CODE');
return 'via eval: ' . eval {$sr2cmnd->{$param}} if (ref $sr2cmnd->{$param} eq 'SCALAR');
return; # Gürtel zum Hosenträger ?

oder habe ich jetzt etwas übersehen ?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 28 Februar 2021, 18:12:06
Ok, irgendwo muss ich ja anfangen zu verstehen, zu ref bin ich wieder mal  ::)  hier (https://www.cis.uni-muenchen.de/~micha/kurse/perlII-WS0809/literatur/perl_skript.pdf) gelandet.

Anhand dem Code:

my $ret;
if (ref $sr2cmnd->{$sr} eq 'CODE') {
$ret = $sr2cmnd->{$sr}->();
}
elsif (ref $sr2cmnd->{$sr} eq 'SCALAR')
{$ret = eval {$sr2cmnd->{$sr}};
}
return $ret;


müsste was in $a1 stehen das SCALAR zurückgeliefert werden soll ?

Egal was ich reinschreibe, es ist immer CODE ?

    use strict;
    use warnings;
    use 5.010;
   
my $param = "8";
my $uptime = q{fheminfo};
#my $a1 = "Das,ist,ein,Testtext";
my $a1 = "Das ist ein Testtext";
#my $a1 = "5";
#my $a1 = sub  { my $r = qx($uptime &); $r .= " FHEM: ".fhem($uptime); return $r};
    my $sr2cmnd = {
    8 => \&$a1
  };

print  ref $sr2cmnd->{$param}, "\n";
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 01 März 2021, 10:36:15
OK, vielleicht mal der Reihe nach...

Zitat von: Wzut am 28 Februar 2021, 17:59:49
und ich habe den Reflex inzwischen wenn ich elsif in Verbindung mit return lese :)
Absolut berechtigt...

"Eigentlich" wollte ich nur auf "quotes in Perl" (siehe z.B. https://www.perlmonks.org/?node_id=401006) ein wenig zur Irreführung rumreiten, nebenbei den Hinweis einflechten, dass es auch noch "qx" gibt und unter den ganzen Schotter dann noch die m.E. korrekte Lösung für das angefragte Problem verstecken...

Und sorry, dass ich da überhaupt ein "eval" reingemauschelt hatte, das war selbstredend weitgehend überflüssig bzw. nur deswegen (vielleicht) erforderlich, weil der (unnötige) Teil der Textoperationen sonst eben kein "Funktions"-Ergebnis geliefert hätte :P . (Macht auch keinen Sinn, diesen Teil zu vertiefen, denn das so zu machen ist m.E. nicht die beste Variante, das "Problem" zu lösen.

(Bevor einer mosert: ja, das ist hier wirklich nichts mehr, was bei den Anfängerfragen gut aufgehoben ist...)

Da wären wir als erstes bei der Frage von Otto:
Zitat von: Otto123 am 27 Februar 2021, 15:37:06
was das genaue Ziel
denn eigentlich war:

Es ging darum, einen funktionierenden Ausgangscode "eleganter" zu schreiben und so zu dynamisieren, dass man ihn "variabel" nutzen kann, so jedenfalls meine Interpretation von dem hier:
Zitat von: TomLee am 27 Februar 2021, 12:38:58
Ich war der Meinung das es so einfach ist das ich es auch ohne zu fragen hinbekomme ::)

Sitz da jetzt schon Stunden dran mit allen mir erdenklichen Variationen von qq,Hochkommata und Verkettungen

defmod not_MQTT2_Cube notify MQTT2_Cube:action:.tap {cube($NAME,$EVENT,$EVTPART0,$EVTPART1,"EG_Echo_Kueche")}

setstate not_MQTT2_Cube 2021-02-27 11:56:04
setstate not_MQTT2_Cube 2021-02-26 19:26:05 state active


sub cube {
   my $NAME = shift;
   my $EVENT = shift;
   my $EVTPART0 = shift;
   my $EVTPART1 = shift;
   my $echo = shift;
   chop($EVTPART0);
   my $sr = ReadingsNum($NAME,'side',0);
   my $sound = fhem("set $echo sounds Glocken");
   my $gzg = (system ('/opt/fhem/vouchergzg.sh &'));$sound;   
   #my $gzg1 = (system ('/opt/fhem/vouchergzg1.sh &'));$sound;
   
   Log3(undef, 3, "Das ist $NAME, $EVENT, $EVTPART0, $EVTPART1");
   
     
      my %sr2cmnd = (
      '0' => "$gzg"
      );
      my $cmnd = $sr2cmnd{$sr};
     
         return if !$cmnd;
         return $cmnd;

   }


Wie lautet die richtige Definition der Variablen $gzg/$gzg1 ?

Ist $gzg1 auskommentiert wird einmal beim Event tap vouchergzg.sh und $sound ausgeführt allerdings unabhängig vom Key (Reading side), es reicht also einfach nur der Aufruf der sub.

Nehm ich die Variablendefinition $gzg1 mit rein wird beim Event tap (und auch unabhängig vom Key) zweimal vouchergzg1.sh und einmal $sound ausgeführt ? ? ?

Was hab ich noch nicht verstanden, hat es was mit der Definition eines Systemaufruf in einer Variablen zu tun ?

edit:

mit if und einer IT-Fernbedienung klappt mein Vorhaben bisher problemlos so:

   if ($NAME eq "FB_433_2_TasteC" && $EVENT eq "on")
   {(system ('/opt/fhem/vouchergzg.sh &'));fhem("set EG_Echo_Kueche sounds Glocken")}
   
   if ($NAME eq "FB_433_2_TasteC" && $EVENT eq "off")
   {(system ('/opt/fhem/vouchergzg1.sh &'));fhem("set EG_Echo_Kueche sounds Glocken")}

Insbesondere der letzte Code-Block gibt also das Ziel vor: Es soll abhängig von einem bestimmten Event ein bestimmter Code ausgeführt werden.

Ergo verpacken wir den Code in eine anonyme sub, das war der Vorschlag.

Läßt man aus meine Code jetzt das ganze "Blendwerk" weg, bleibt für {myUptime( 8 )} noch folgender Code übrig:
sub myUptime {
  my $param = shift;
  my $uptime = q{uptime};
  my $a3 = sub  { my $r = qx($uptime &); $r .= " FHEM: ".fhem($uptime); return $r};
  my $sr2cmnd = {
    8 => \&$a3
  };
  my $ret;
  return $ret = $sr2cmnd->{$param}->() if ref $sr2cmnd->{$param} eq 'CODE';
  return "Da ist was schief gegangen";
}

Wir haben
- eine Parameter-Übergabe (als Beispiel);
- einen intern ermittelten Parameter (das Wörtchen "uptime", das man hier selbstredend auch "hart" hätte in den Code schreiben können, oder bei längerem Code auch aufwändig ermitteln kann - wie gesagt, geht nur um die Prinzipdarstellung...);
- unsere "anonyme sub". Da steht alles drin, was sonst auch eine sub ausmacht, nur eben mit der Besonderheit, dass sie etwas speziell aufgerufen wird und Parameter dann bei der Ausführung aus demselben lexical scope gefüllt werden...  (an diese "Kleinigkeit" hatte ich erst nicht gedacht, und daher erst mal geschrieben, das ginge so nicht). Nach diesem Muster wären dann eben für obige Aufgabe zwei subs zu bilden;
- unseren Beispiel-Hash, jetzt hat nur noch mit einem lookup, bei mehr subs dann halt mit mehr Inhalt...
- die Absicherung, dass wir wirklich nur Code ausführen...

Das war's dann auch schon.

PS: Interessantes script, aber auf welcher Seite soll die Lösung stehen ;) ?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 01 März 2021, 16:08:16
Zitat
ja, das ist hier wirklich nichts mehr, was bei den Anfängerfragen gut aufgehoben ist...)
PS: Interessantes script, aber auf welcher Seite soll die Lösung stehen ;) ?

Um im richtigen Forumbereich zu posten versuche ich mich mit 'Tester' anzufreunden, warm werde ich aber nicht wirklich damit.




Hast du den Code getestet oder ist der aus dem Kopf ?

Zum nachzuvollziehen weshalb es noch nicht klappt möcht ich wissen ob ref $sr2cmnd->{$sr} wirklich CODE zurückgibt.

In Eclipse bekomme ich da zurück:

Can't return outside a subroutine at /home/tom/eclipse-workspace/First_Project/bla.pl line 15.

mit:

use strict;
    use warnings;
    use 5.010;
   
my $NAME = qq(bla);
my $echo = qq(bla1);
my $sr = qq(8);
my $sound = qq(set $echo sounds Glocken);
my $a3 = sub { my $r = qx(system ('/opt/fhem/vouchergzg.sh &)); $r .= ";".fhem($sound); return $r};

my $sr2cmnd = {
8 => \&$a3
};
my $ret;
return ref $sr2cmnd->{$sr};
#return $a3; <- damit auch





Bist dir sicher das das so klappen sollte ?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 01 März 2021, 16:34:52
Zumindest auf meinem Testsystem (Win32@strawberryperl 5.32.1) kommt mit genau meinem Code was sinnvolles zurück, allerdings sieht das etwas anders aus als das, was ich gestern von meinen Linux-basierten 5.28-System her kannte ;) .

Versuch's mal damit:

my $NAME = qq(bla);
my $echo = qq(bla1);
my $sr = qq(8);
my $sound = q(set $echo sounds Glocken);
my $a3 = sub { qx(system ('/opt/fhem/vouchergzg.sh &')); fhem($sound);};

my $sr2cmnd = {
    8 => \&$a3
};
return $sr2cmnd->{$sr} if ref $sr2cmnd->{$sr} eq 'CODE';
return;
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 01 März 2021, 16:45:49
Gleiches Ergebnis:

    use strict;
    use warnings;
    use 5.010;
   
my $NAME = qq(bla);
my $echo = qq(bla1);
my $sr = qq(8);
my $sound = qq(set $echo sounds Glocken);
my $a3 = sub { qx(system ('/opt/fhem/vouchergzg.sh &')); fhem($sound);};

my $sr2cmnd = {
    8 => \&$a3
};
return $sr2cmnd->{$sr} if ref $sr2cmnd->{$sr} eq 'CODE';
return;

Can't return outside a subroutine at /home/tom/eclipse-workspace/First_Project/bla.pl line 14.



Warum hast das jetzt geändert ?
my $sound = q(set $echo sounds Glocken);

Dann wird doch $echo nicht mehr aufgelöst ?


Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 01 März 2021, 16:56:37
Doch, sollte schon aufgelöst werden.

Nur eben erst bei der Ausführung ;) .

Aber du hast mich drausgebracht, qx(system... ist natürlich Quark, und wo das genau eigebunden ist, wird aus dem Schnipsel leider auch nicht so klar...
Und der echte Name des Echo sollte schon dastehen.
Alle 3 ref-Codes sollten im Ergebnis dasselbe tun, testen kann ich nur leider nicht.

my $NAME = qq(bla);
my $echo = qq(bla1);
my $sr = qq(;
my $sound = q(fhem("set $echo sounds Glocken"));
my $sound2 = q(set $echo sounds Glocken);
my $a3 = sub { qx('/opt/fhem/vouchergzg.sh &'); $sound;};
my $a3a = sub { qx('/opt/fhem/vouchergzg.sh &'); fhem($sound2);};
my $a4 = sub { qx('/opt/fhem/vouchergzg.sh &'); fhem("set $echo sounds Glocken");};
my $sr2cmnd = {
   2 => \&$a4,
   4 => \&$a3a,
   8 => \&$a3
};
return $sr2cmnd->{$sr} if ref $sr2cmnd->{$sr} eq 'CODE';
return;
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 01 März 2021, 17:45:34
Nee, kann jetzt auch 2-3 Stunden nicht danach schauen.

sub cube {
my $NAME = shift;
my $echo = shift;
my $sr = ReadingsNum($NAME,'side',0);
my $sound = q(fhem("set $echo sounds Glocken"));
my $sound2 = q(set $echo sounds Glocken);
my $a3 = sub { qx('/opt/fhem/vouchergzg.sh &'); $sound;};
my $a3a = sub { qx('/opt/fhem/vouchergzg.sh &'); fhem($sound2);};
my $a4 = sub { qx('/opt/fhem/vouchergzg.sh &'); fhem("set $echo sounds Glocken");};
my $sr2cmnd = {
0 => \&$a4,
1 => \&$a3a,
2 => \&$a3
};
return $sr2cmnd->{$sr} if ref $sr2cmnd->{$sr} eq 'CODE';
return;
}


Im Log steht bei den 3 verschiedenen Codes (Keys):

2021.03.01 17:27:34 3: not_MQTT2_Cube return value: CODE(0x8541608)
2021.03.01 17:29:06 3: not_MQTT2_Cube return value: CODE(0x85980d0)
2021.03.01 17:29:34 3: not_MQTT2_Cube return value: CODE(0x7b83208)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 01 März 2021, 17:50:34
versuch's mal so:
return $sr2cmnd->{$sr}->() if ref $sr2cmnd->{$sr} eq 'CODE';
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 02 März 2021, 16:29:02
Der Aufruf des Shellscript klappt mit qx nicht, auch nicht aus der Kommandozeile.

Mit system schon :

sub cube {
my $NAME = shift;
my $echo = shift;
my $sr = ReadingsNum($NAME,'side',0);
my $sound2 = qq(set $echo sounds Glocken);
my $a1 = sub { system('/opt/fhem/vouchergzg.sh &');fhem("$sound2");};
my $a2 = sub { system('/opt/fhem/vouchergzg1.sh &');fhem("$sound2");};
my $a3 = sub { system('/opt/fhem/voucher.sh &');fhem("$sound2");};
my $a4 = sub { system('/opt/fhem/voucher21.sh &');fhem("$sound2")};;

my $sr2cmnd = {
0 => \&$a1,
1 => \&$a2,
2 => \&$a3,
4 => \&$a4
};
return $sr2cmnd->{$sr}->() if ref $sr2cmnd->{$sr} eq 'CODE';
return;
}


Die Variante klappt auch:

sub { system('/opt/fhem/vouchergzg1.sh &');fhem("set $echo sounds Glocken")}

Was nicht klappen will ist $sound einfach anzuhängen


my $sound = q(fhem('set OG_Echo_Wohnzimmer sounds Glocken'));
sub { system('/opt/fhem/vouchergzg1.sh &');$sound}


Ob in qq,q,mit $echo Variable,einfachen oder doppelten Hochkommata im fhem-Befehl, es klappt nicht.

Meine favorisierte Lösung wär jetzt den fhem-Befehl in den subs wegzulassen und dafür im return anzuhängen, bspw:

sub cube {
my $NAME = shift;
my $echo = shift;
my $sr = ReadingsNum($NAME,'side',0);
my $sound2 = qq(set $echo sounds Glocken);
my $a1 = sub { system('/opt/fhem/vouchergzg.sh &');};
my $a2 = sub { system('/opt/fhem/vouchergzg1.sh &');};
my $a3 = sub { system('/opt/fhem/voucher.sh &');};
my $a4 = sub { system('/opt/fhem/voucher21.sh &');};;

my $sr2cmnd = {
0 => \&$a1,
1 => \&$a2,
2 => \&$a3,
4 => \&$a4
};
return $sr2cmnd->{$sr}->().fhem("$sound2") if ref $sr2cmnd->{$sr} eq 'CODE';
return;
}


Klappt aber nicht, dann wird bei jedem Key immer $a1 ausgeführt.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 02 März 2021, 16:42:23
Zitat von: TomLee am 02 März 2021, 16:29:02

Was nicht klappen will ist $sound einfach anzuhängen


my $sound = q(fhem('set OG_Echo_Wohnzimmer sounds Glocken'));
sub { system('/opt/fhem/vouchergzg1.sh &');$sound}

Ich weiß ihr fandet meinen Einwand mit eval irgendwie eklig. Aber das Konstrukt oben kann mMn nicht funktionieren! Da wir der Inhalt der Variablen ausgegeben als Text!

my $sound = q(fhem('set OG_Echo_Wohnzimmer sounds Glocken'));
sub { system('/opt/fhem/vouchergzg1.sh &');eval $sound}
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 02 März 2021, 16:47:02
Wenn immer der lookup nach "0" gemacht wird: Sicher, dass ReadingsNum das erwartete Ergebnis bringt?

eval ist eklig; aber auch $sound sollte eine anonyme sub werden können... Ungetestet:
my $sound = sub {fhem('set OG_Echo_Wohnzimmer sounds Glocken')};
sub { system('/opt/fhem/vouchergzg1.sh &'); $sound->()}
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 02 März 2021, 17:19:08
Zitataber auch $sound sollte eine anonyme sub werden können...

Korrekt.

Ich hoffe hab nix übersehen, ich mein alles klappt, für die Zukunft:

sub cube {
my $NAME = shift;
my $echo = shift;
my $sr = ReadingsNum($NAME,'side',0);
my $sound = sub {fhem("set $echo sounds Glocken")};
my $a1 = sub { system('/opt/fhem/vouchergzg.sh &')};
my $a2 = sub { system('/opt/fhem/vouchergzg1.sh &')};
my $a3 = sub { system('/opt/fhem/voucher.sh &')};
my $a4 = sub { system('/opt/fhem/voucher21.sh &');};

my $sr2cmnd = {
0 => \&$a1,
1 => \&$a2,
2 => \&$a3,
4 => \&$a4
};
return $sr2cmnd->{$sr}->().$sound->() if ref $sr2cmnd->{$sr} eq 'CODE';
return;
}


DANKE (auch für die Geduld)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 02 März 2021, 17:29:21
Zitat von: Beta-User am 02 März 2021, 16:47:02
eval ist eklig; aber auch $sound sollte eine anonyme sub werden können... Ungetestet:
my $sound = sub {fhem('set OG_Echo_Wohnzimmer sounds Glocken')};
sub { system('/opt/fhem/vouchergzg1.sh &'); $sound->()}

Ich würde ja gerne noch wissen warum? Kürzer ist es ja auch nicht? Schöner - ist relativ? ;)
Was ist das Problem von eval und Vorteil dieser anonymen sub?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 02 März 2021, 20:41:05
Das "Problem" von eval ist, dass es dazu gedacht ist rauszufinden, ob Code funktioniert oder Fehler wirft.

Diese Art "Hosenträger" macht bei Code eigentlich keinen Sinn, von dem man weiß, dass er "immer" funktioniert (z.B., weil "fhem" seinerseits einen "Hosenträger" dranmacht...)

Meine Interpretation des perlcritic-Rückmeldung ist die: eval nur dann, wenn einen interessiert, ob Fehler aufgetreten sind. Und prinzipell: weg damit, wenn möglich...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 02 März 2021, 21:35:38
ok danke - verstanden ;)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 04 März 2021, 20:05:03
Bevor ich auch einen Thread im Anfängerbereich bzgl. Perlcritic aufmache, hänge ich mich mal hier rein. Ich hoffe das passt.

Meine myUtils habe ich mal getestet, witzigerweise waren die größeren Codes alle ok, bis auf die prototypes 'sub', die aber schon in der Vorlage sind.

Bemängelt wurde hier 2x das open:
Zitatpackage main;

use strict;
use warnings;

sub
myUtils_Logdatei_Initialize($$)
{
  my ($hash) = @_;
}

# Logdatei zum debuggen
#
# $file = name.log;
# debuglog("blabla",$file);

sub debuglog($$) {

  my ($myState, $file) = @_;
  my $fileName = "/opt/fhem/log/$file";
   
   if($file eq "") {$file = "unnamed.log"};
   if(open (DATEI, ">> $fileName")) {
   print (DATEI Zeitstempel().$myState."\n");
   close (DATEI);
       }
      else
      {
       return "Can't open $fileName: $!";
      }
}
1;

Ich habe das dann so gelöst:
my $Datei = DATEI;  # Filehandler zuweisung in Variable
.
.
.
if(open ($Datei, '>>',  $fileName)) {


Perlcritic war zufrieden, nun mosert aber Fhem:
ZitatERROR:
Bareword "DATEI" not allowed while "strict subs" in use at ./FHEM/99_myUtils_Logdatei.pm line 26

Wenn ich das richtig verstehe, dann darf ich den Filehandler in der sub keiner Variablen zuweisen und nun?

Gruß und Danke
Bernd
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 04 März 2021, 20:23:33
Hallo Bernd,

aus meiner Sicht sitzt Du auf dem falschen Pferd
https://metacpan.org/pod/Perl::Critic::Policy::InputOutput::ProhibitTwoArgOpen

Tipp Wenn Du das Buch nicht hast führt dieser String zum Ziel : "perlcritic Two-argument "open" used"

Wenn ich das richtig verstehe, dann darf ich den Filehandler in der sub keiner Variablen zuweisen und nun?
Nein Du darfst nicht einfach DATEI zuweisen, ein String ginge 'DATEI' aber wie gesagt, dass ist es sicher nicht was perlcritic bemängelt. Der will

(DATEI, ">>","$fileName")

Gruß Otto
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 04 März 2021, 20:34:38
Zitat von: Otto123 am 04 März 2021, 20:23:33
Hallo Bernd,

aus meiner Sicht sitzt Du auf dem falschen Pferd
https://metacpan.org/pod/Perl::Critic::Policy::InputOutput::ProhibitTwoArgOpen

Tipp Wenn Du das Buch nicht hast führt dieser String zum Ziel : "perlcritic Two-argument "open" used"

Gruß Otto

Hallo Otto,

Ich habe die Webseite benutzt, die Beta-User hier verlinkt hat. Da sieht man im Popup der Fehlermeldung good and bad.

http://perlcritic.com/
(http://perlcritic.com/)

Grüße Bernd
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 04 März 2021, 20:48:59
Jo, und wenn man den Empfehlungen dann folgt, kommt in etwa das hier raus:

package main;

use strict;
use warnings;

sub
myUtils_Logdatei_Initialize {
  my $hash = shift;
  return;
}

# Logdatei zum debuggen
#
# $file = name.log;
# debuglog("blabla",$file);

sub debuglog {
  my $myState = shift // return; #Beta-User: Perl defined-or
  my $file    = shift //  q{unnamed.log};
  my $fileName = "/opt/fhem/log/$file";
  if(open my $DATEI, q{>>}, $fileName) {
    print ($DATEI Zeitstempel()."$myState\n");
    return close ($DATEI);
  } else {
    return "Can't open $fileName: $!";
  }
  return;
}
1;

EDIT: Korrektur, danke an Otto!
EDIT2: %L muss man erst auflösen, daher doch hart vercodet
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 04 März 2021, 20:55:21
my DATEI dürfte nichts werden :)

Der link ist auch schön ;)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 04 März 2021, 21:00:53
Zitat von: Otto123 am 04 März 2021, 20:55:21
my DATEI dürfte nichts werden :)
:o :o :o
so isses, wenn man sich zu sehr auf tools verläßt; ein $ davor und es sollte funktionieren ::) ...

(Ich teste es dann mal ;D )
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 04 März 2021, 21:13:45
Nun verstehe ich nichts mehr. :( :o

@Beta-User du hattest die Seite verlinkt.
Ist das wirklich alles Quatsch, alles so lassen wie es war?

Ich habe ja nicht eins zu eins angeschrieben, gut die Anführungszeichen habe ich vergessen.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 04 März 2021, 21:18:55
Deine beiden Fehler:
(open my $DATEI, q{>>}, $fileName)

1. Barewood DATEI 2. Two-argument ">> $fileName"

@Beta-User sollte man die myUtilsTemplate ändern?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 04 März 2021, 21:30:59
Ähm, es ist schon "etwas" anders, oder?

Habe den code oben nochmal geändert und die $ reingeflickt, dann meckert die Seite den Punkt auch nicht mehr an, so funkionierte das grade in meinem Test.

Mußte zum Testen jetzt nur etwas suche, um die Zeitstempelfunktion aus fhem.pl zu suchen:
sub debuglog {
  my $myState = shift // return; #Beta-User: Perl defined-or
  my $file    = shift //  q{unnamed.log};
  my $fileName = "/opt/fhem/log/$file";
  if(open my $DATEI, q{>>}, $fileName) {
    print ($DATEI ( FmtDateTime(time)." $myState\n"));
    return close ($DATEI);
  } else {
    return "Can't open $fileName: $!";
  }
  return;
}

Meistens sind die Veränderungen auch nicht riesig, die perlcritic vorschlägt, oder man stößt eben auf irgendwas "deeply nested", das man selbst noch nie verstanden hat...

Zitat von: Otto123 am 04 März 2021, 21:18:55
@Beta-User sollte man die myUtilsTemplate ändern?
Das muss letztlich Rudi entscheiden, ich würde nach jetzigem Kenntnisstand (weiter) dazu neigen, ein alternatives Template anzubieten. (Die Art Diskussion hatte ich vor einiger Zeit schon mal mit CoolTux).

Man muss nämlich ohne Prototypen schon an der einen oder anderen Stelle aufpassen: ein mit shift aus der Parameter-Liste geholter Parameter sollte immer in" my $parambla = shift;".
Es kann aber Fälle geben, in denen dann $parambla trotz des $-Siegels kein scalar ist, sondern sich ein array oder hash (oder eine Referenz darauf) verbirgt... Erkläre das mal einen noob, der bekommt bei "for (@{$parambla}) {" oder "for ( keys %{$parambla}) {" große Augen....
(Wer aber intensiver in das Thema einsteigt, sollte sich damit beschäftigen!)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 04 März 2021, 21:47:39
Danke, jetzt bin ich wieder beruhigt. ;)

Die Zeitstempelfunktion aus fhem.pl ist die, die fürs Log benutzt wird, denke ich. Dann kann ich meine ja 'entsorgen'.

Was ich noch nicht verstehe, wo kommt der Inhalt von my $DATEI her? Das ist doch der Dateihandler!? Falls dies in der fhem.pl schon deklariert ist, wo bekomme ich solche Infos, Developer API?

@Beta-User deine edits hatte ich erst später gesehen.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 04 März 2021, 22:03:01
Die Funktion wird vermutlich nicht nur für's loggen verwendet, sondern z.B. auch für die Darstellung der Zeitstempel in FHEMWEB, denke ich. Müßte via grep rauszufinden sein...

Eine Variable "entsteht" (mit undef-Inhalt) in dem Moment, in dem du sie deklarierst. (Und zur Klarstellung: undef ist was anderes wie 'undef', auch wenn das unlängst ein User unbedingt ignorieren wollte). Dabei mußt du nur sicherstellen, dass es nichts gleiches im selben lexikalen Kontext gibt (daher package ich zwischenzeitlich mehr oder weniger alles, was auch Teil von myUtils-template für Fortgeschrittene wäre...).
Ist der lexikale Kontext beendet, hört die Variable (in der Regel) auch wieder auf zu existieren, von daher ist die Frage nach $DATEI aus Perl-Sicht m.E. etwas falsch gestellt. (Die Vorgehensweise per C (&Co), die man von MySensors her vielleicht kennt, scheint etwas anders zu sein, da stellt man in der Regel vorneweg klar, was für Variablen man haben will und auch, welchen Typs die sein sollen. Würde man das "Perl-like" irgendwo verstreuen, wäre Chaos vorprogrammiert...)
Falls du mal was doppelt deklarieren solltest, findet sich das im Log (masks earlier...)

Was in der DevelopmentAPI (und der Intro dazu im Wiki) dokumentiert ist, sollte "änderungfest" sein, aber auch "normale" Funktionen aus fhem.pl dürfte Rudi kaum (vom Namen her) ändern. Was es gibt, ist meistens "sprechend" benannt und in der Liste am Anfang der .pl zu finden...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 05 März 2021, 07:05:40
OK, danke. Ich hatte die falsche Annahme, dass mit ursprünglich DATEI der Dateihandler ( als Programm) aufgerufen wird. Das ist quasi
nur ein "Platzhalter".
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 06 März 2021, 17:09:22
Frage, weil ich mich dabei ziemlich doof anstelle und mir keine Lösung kommt.
Wie bekomme ich denn in meine sub Cube (https://forum.fhem.de/index.php/topic,112785.msg1136734.html#msg1136734) die 2 Events einer sequence-Definition (mit gesetztem triggerPartial Attribut) die mir das unterscheiden zw. Einfach.- und Doppel-tap des Cube ermöglichen soll ?

Ich meine eine Lösung könnte sein über ein weiteres notify welches $EVENT global übergibt (les ich aus den Bemerkungen hier (https://forum.fhem.de/index.php/topic,112785.msg1071648.html#msg1071648)), mir ist aber nicht klar wo/wie das dann genau in der myUtils erfolgen soll.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 06 März 2021, 18:45:07
Habs denk ich, so wär die Variable global verfügbar :

Zitatsub notifysequence {
   my $EV1 = shift;

sub irgendwas {bla}

sub irgendwas {bla}

sub irgendwas {bla}

}

Korrekt ?

Es gibt keinen anderen Weg auf die Events von sequence zu reagieren ?

Die 2 zusätzlichen Device-Definitionen notify und sequence sind wirklich nötig um einen Doppel-tap zu realisieren oder hat jemand noch einen anderen Vorschlag ?

Ich wollte es wieder mit Each (https://forum.fhem.de/index.php/topic,113198.msg1080761.html#msg1080761) umsetzen das wäre eine Definition weniger, kommt mir aber nicht richtig vor dazu in der myUtils in einen fhem()-Befehl zu wechseln um das sleep und anschliessend den Perl-Code auszuführen.


Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 16 März 2021, 18:24:21
Jetzt frag ich mich wie man denn eine Variable wirklich global (über mehrere|alle myUtils) verfügbar machen kann.

Würde sich ja anbieten bspw. bei einem Presence-Device.

Wär jemand so nett ein Beispiel zu zeigen oder zu verlinken ?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 17 März 2021, 12:02:57
Zitat von: TomLee am 16 März 2021, 18:24:21
Jetzt frag ich mich wie man denn eine Variable wirklich global (über mehrere|alle myUtils) verfügbar machen kann.
https://wiki.fhem.de/wiki/99_myUtils_anlegen#Globale_Ablage_von_Daten
=> Eine Möglichkeit: %data nutzen.
Ein Beispiel ist im Wiki verlinkt.

ZitatWürde sich ja anbieten bspw. bei einem Presence-Device.
M.E. "beißt" sich das: Entweder die Daten sollen zu einem Device gehören, dann sollten sie m.E. auch im Device-Hash "verortet" sein (Abruf via ReadingsVal/AttrVal&Co), oder es ist eben was, was man unabhängig von einem Device halten will/muss, (nur) das wäre dann %data.

Aber auch hier: TIMTOWTDI (https://de.wikibooks.org/wiki/Perl-Programmierung:_Larry_und_die_Perl-Kultur)....
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 17 März 2021, 12:19:31
Hier (https://wiki.fhem.de/wiki/E-Mail_per_notify_nach_Zeitablauf_erneut_senden), so mein ich es zu verstehen, wird ein Beispiel gezeigt.

Die Variable, so versteh ich es bisher kann in irgendeiner myUtils in Initialize deklariert werden, also der Teil:

sub
myUtils_Initialize($$)
{
my ($hash) = @_;
my $NewMailtime = time;
}


In FHEM, in dem Beispiel also im notify, ist dann ein Zugriff auf die Variable mit $main::NewMailtime möglich.

Hab ich versucht nachzuvollziehen:
sub
Abfall_myUtils_Initialize($$)
{
  my ($hash) = @_;
  my $bla = 'irgendwas';
}


Und
{return $main::bla}
und klappt nicht.

Auch ist mir nicht klar wie der Zugriff erfolgen könnte/sollte wenn Initialize, wie schonmal vorgeschlagen, so definiert ist:

sub Remotes_myUtils_Initialize {
  my $hash = shift//return;
  my $bla = "irgendwas";
  return;
}


edit: den letzten genannten Link muß ich mir noch anschauen da ich gerade am schreiben war

Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 17 März 2021, 12:29:25
Das mit der Definition des Hash %data hab ich gestern abend schon gelesen, aber nicht verstanden wo der genau definiert werden soll, in Initialize ?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 17 März 2021, 12:35:09
Na ja, ich würde behaupten, dass die Wiki-Seite schlicht nicht funktioniert, weil die Variable (nur) im lexikalischen Initialize-Kontext existiert. Sie müßte nach meinem möglicherweise begrenzten Verständnis "eine Ebene höher" deklariert sein - was aber m.E. Mist ist, weil man damit direkt im main-Namespace rumschreibt.

Kannst dasselbe ja mal mit
$data->{NewMailtime} = time;
versuchen zu coden (und gleich das Wiki verbessern, wenn es läuft wie gewünscht).

Nach meinem Verständnis ist der Hash %data etwas, das fhem.pl direkt zur Verfügung stellt, und du kannst darin dann eben beliebige eigene Keys ablegen (s.o.). Wie immer, muss man dann halt nur aufpassen, dass man keine (unbewußten) Überschneidungen mit was anderem hat.
EDIT: siehe https://svn.fhem.de/trac/browser/trunk/fhem/fhem.pl#L254:
use vars qw(%data);             # Hash for user data

Wobei mir für sowas immer Benni's globale Fenster-Offen-Lösung einfällt (ist auch dort verlinkt)...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 26 März 2021, 15:04:43
Zitat von: TomLee am 06 März 2021, 18:45:07
Habs denk ich, so wär die Variable global verfügbar :

Korrekt ?

Es hat keiner was dazu gesagt, schätze dann spricht nichts dagegen es so umzusetzen in der ersten sub alle weiteren zu deklarieren das die Variablen in jeder sub verfügbar sind,es bleibt aber irgendwie ein ungutes Gefühl.

Ich hab heute unverhofft die Abfall-userreadings meines Abfallkalender nach dem hier erworbenen Wissen ausgelagert.

Es klappt alles, es gibt keine Probleme, keine Meldungen im Log, aber wie gesagt ist da noch das ungute Gefühl, kann sich das wer bitte anschauen und bestätigen das es so auch wirklich korrekt umgesetzt ist ?

vorher:

attr cal_Abfallkalender userReadings nextWastedays:lastUpdate:.* {\
my $var1 = fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1);;\
my $var2 =int(($var1 + 86399 - time) / 86400);;\
return $var2},\
nextWaste:lastUpdate:.* {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);;\
my $var2 =int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);;\
my @tonne = split (/ /,$var1);;\
my $nwd = "$tonne[1]"."_"."$var2";;\
return $nwd},\
nextWast:lastUpdate:.* {my $var1 =fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1);;\
my @tonne = split (/ /,$var1);;\
return $tonne[1]},\
nextWastedate:lastUpdate:.* { \
my $date = fhem('get '.$name.' events format:custom="$T1" limit:from=0,count=1');;\
my @dat = split (/ /,$date);;\
return $dat[0];;\
},\
ftui-hide:lastUpdate:.* {my $var = ReadingsVal($name,"nextWast","0") =~ "Restabfall/Wertstoffe|Bioabfall"?"1":"0";;return $var}


nachher:

attr cal_Abfallkalender userReadings nextWastedays:lastUpdate:.* {nwd($NAME)},\
nextWaste_ftui:lastUpdate:.* {nwf($NAME)},\
nextWaste:lastUpdate:.* {nw($NAME)},\
nextWastedate:lastUpdate:.* {nwda($NAME)},\
ftui-hide:lastUpdate:.* {fh($NAME)}


nachher:

package main;

use strict;
use warnings;
use POSIX;

sub Abfall_myUtils_Initialize {
  my $hash = shift//return;
  return;
}

# Enter you functions below _this_ line.
sub nwd {
my $NAME = shift;
my $var1 = int((fhem('get '.$NAME.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my $var2 = fhem('get '.$NAME.' events format:custom="$S" limit:from=0,count=1',1);
my $var3 = ReadingsVal($NAME,"nextWaste","0") =~ "Restabfall/Wertstoffe|Bioabfall"?"1":"0";
my $var4 = fhem('get '.$NAME.' events format:custom="$T1" limit:from=0,count=1',1);
my @tonne = split (/ /,$var2);
my $nwd = "$tonne[1]"."_"."$var1";
my @dat = split (/ /,$var4);

return $var1;

sub nwf {return $nwd;}
sub nw {return $tonne[1];}
sub nwda {return $dat[0];}
sub fh {return $var3;}
}
1;
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 26 März 2021, 16:12:02
Zitat von: TomLee am 26 März 2021, 15:04:43
Es hat keiner was dazu gesagt, schätze dann spricht nichts dagegen es so umzusetzen in der ersten sub alle weiteren zu deklarieren das die Variablen in jeder sub verfügbar sind,es bleibt aber irgendwie ein ungutes Gefühl.
M.E. ist es so nicht richtig. Grundsätzlich leben alle Variablen nur im selben lexikalischen Kontext, in dem sie stehen, die große Ausnahme sind diese Subs...

Aber das ist "dreckiger Code" und wird direkt von Perlcritic (zurecht!) verrissen.

Kurze "anonyme" Funktionsnamen in $main sind m.E. auch was, was man vermeiden sollte; wenn es da kracht, wirst du die nie mehr wiederfinden (ausgenommen, stacktrace hilft). Das darfst du gerne machen, wenn du das in ein package packst, aber eben (m.E.) nicht in main.

Und "use POSIX;" ist immer noch ein nogo! (Weg damit an der Stelle. Es ist völlig "ausreichend", dass das (um Rudi zu zitieren: leider so pauschal) in fhem.pl steht, aber (falls es je in fhem.pl mal rausfliegen sollte:) man importiert sich damit (nochmal) "alles mögliche", ohne näher nachgedacht zu haben, ob man es braucht.

Und was die subs überhaupt machen sollen, habe ich auch nicht verstanden (aber auch nicht im Detail versucht zu verstehen).
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 26 März 2021, 17:30:22
ZitatM.E. ist es so nicht richtig. Grundsätzlich leben alle Variablen nur im selben lexikalischen Kontext, in dem sie stehen,

Naja, darum ja auch die Frage aus 101 ob das so korrekt sei, weil durch ausprobieren hatte ich festgestellt das die Variablen nicht nur im lexikalischen Kontext leben, deshalb hab ich es wie jetzt gezeigt umgesetzt, meine beabsichtigten Readings werden schließlich erstellt, wie gesagt ohne Meldungen im Log.

Zitatdie große Ausnahme sind diese Subs...

Komm nicht mit wie das gemeint ist.

ZitatAber das ist "dreckiger Code" und wird direkt von Perlcritic (zurecht!) verrissen.

Wie schon erwähnt hab ich das mit %hash noch nicht begriffen, ich wüsste nicht wie ich es umsetzen kann ohne das ich bspw. die Variable mit dem Inhalt
int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400)
zweimal definieren muss, nämlich in jeder sub (hier in zweien dann) einmal in der ich den Inhalt benötige und auf das war ich aus mir zu sparen, zweimal die gleiche Definition einer Variablen in einer myUtils.

ZitatKurze "anonyme" Funktionsnamen in $main sind m.E. auch was, was man vermeiden sollte; wenn es da kracht, wirst du die nie mehr wiederfinden (ausgenommen, stacktrace hilft). Das darfst du gerne machen, wenn du das in ein package packst, aber eben (m.E.) nicht in main.

Steh ich auf dem Schlauch wie das gemeint ist, hab wohl noch viel zu lernen.

ZitatUnd "use POSIX;" ist immer noch ein nogo! (Weg damit an der Stelle. Es ist völlig "ausreichend", dass das (um Rudi zu zitieren: leider so pauschal) in fhem.pl steht, aber (falls es je in fhem.pl mal rausfliegen sollte:) man importiert sich damit (nochmal) "alles mögliche", ohne näher nachgedacht zu haben, ob man es braucht.

Das use POSIX;, seh ich jetzt, ist gestern erst aus der Beispiel-Datei entfernt worden, an was soll ich mich orientieren, mit wenig Programmierkenntnissen, wenn nicht an der, hab ich jetzt rausgenommen.

ZitatUnd was die subs überhaupt machen sollen, habe ich auch nicht verstanden (aber auch nicht im Detail versucht zu verstehen).

Naja, was soll ich dazu jetzt sagen, wenn sie genau das machen was ich will, sie erstellen mir meine userReadings wie ich es vorhatte.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 26 März 2021, 17:43:38
Zitat von: TomLee am 26 März 2021, 17:30:22
Naja, darum ja auch die Frage aus 101 ob das so korrekt sei, weil durch ausprobieren hatte ich festgestellt das die Variablen nicht nur im lexikalischen Kontext leben, deshalb hab ich es wie jetzt gezeigt umgesetzt, meine beabsichtigten Readings werden schließlich erstellt, wie gesagt ohne Meldungen im Log.

Komm nicht mit wie das gemeint ist.
Will sagen: Normalerweise geht das nicht, aber eben mit subs ausnamsweise schon. Aber das ist kein "guter" Code, jedenfalls nach der Auffassung der in "Perlcritic (http://perlcritic.com)" enthaltenen formalisierten Analyse. Wenn man also nicht genau weiß, was man tut, sollte man solche Konstruktionen nicht bauen, selbst, wenn sie funktionieren.

Zitat
Wie schon erwähnt hab ich das mit %hash noch nicht begriffen, ich wüsste nicht wie ich es umsetzen kann ohne das ich bspw. die Variable mit dem Inhalt
int((fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400)
Für Code ist %data mAn. nicht der passende Ort.
Dafür gibt es myUtils und die generelle Leitlinie, dass man eigenen Code so kennzeichnen (benennen) sollte, dass man auch im Fehlerfall schnell findet, woran es gehapert hat (empfehle, myUtils tendenziell auch mit "my..." zu belabeln.)

DENN: Funktionsnamen müssen eindeutig sein, die neuere Definition überschreibt die ältere, deswegen findet man auch entsprechende Meldungen im Log, wenn man z.B. eine myUtils-Datei editiert hat. Das kann aber auch Datei- und Modulübergreifend passieren, weswegen es in nicht gepackagten Modulen Usus ist, den Modulnamen vor die Funktion zu schreiben.
Falls nicht klar ist, wie das gemeint ist, schau dir die devStateIcon an, die Color benutzen. Da steht der package-Name davor...

ZitatDas use POSIX;, seh ich jetzt, ist gestern [...]
Das war evtl. gestern vor einem Jahr :P ...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 26 März 2021, 19:48:30
Also keine Spirenzien machen, $Name in jeder sub übergeben und die eine Variable die ich erwähnt habe halt zweimal in der myUtils definieren ?

use strict;
use warnings;

sub Abfall_Utils_Initialize {
  my $hash = shift//return;
  return;
}

# Enter you functions below _this_ line.

sub au_nwd {
my $NAME = shift;
my $var1 = int((fhem('get '.$NAME.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
return $var1;
}

sub au_nwf {
my $NAME = shift;
my $var1 = fhem('get '.$NAME.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 = int((fhem('get '.$NAME.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my @tonne = split (/ /,$var1);
my $nwd = "$tonne[1]"."_"."$var2";
return $nwd;
}

sub au_nw {
my $NAME = shift;
my $var1 = fhem('get '.$NAME.' events format:custom="$S" limit:from=0,count=1',1);
my @tonne = split (/ /,$var1);
return $tonne[1];
}

sub au_nwda {
my $NAME = shift;
my $var1 = fhem('get '.$NAME.' events format:custom="$T1" limit:from=0,count=1',1);
my @dat = split (/ /,$var1);
return $dat[0];
}

sub au_fh {
my $NAME = shift;
my $var1 = ReadingsVal($NAME,"nextWaste","0") =~ "Restabfall/Wertstoffe|Bioabfall"?"1":"0";
return $var1;
}

1;
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 26 März 2021, 20:09:44
Da ich gerade mitlesen, wäre es verkehrt/ungünstig die sub einmal aufzurufen und mit setReading die Werte zu setzen?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 26 März 2021, 20:17:52
setreading wollte ich vermeiden, aber wenns "richtiger" ist, lass ich mich auch davon überzeugen.
Zu setreading auf das selbe Device in userReadings gibts diesen Thread (https://forum.fhem.de/index.php/topic,110375.msg1044323.html#msg1044323).
Gerade die Tage gelesen aber gestern Abend nicht dran gedacht.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 26 März 2021, 20:37:07
Zitat von: TomLee am 26 März 2021, 20:17:52
setreading wollte ich vermeiden, aber wenns "richtiger" ist, lass ich mich auch davon überzeugen.
Das müssen andere beantworten.

Du springst 5x von Fhem nach Perl und wieder zurück. Ich habe schon mehrfach gelesen, wo so etwas bemängelt wurde.
Ich lerne aber auch noch...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: hydrotec am 26 März 2021, 21:22:43
Da kommen Erinnerungen auf  ;)
99_myUtils_calendar - Perl Code (https://forum.fhem.de/index.php/topic,114901.0.html)

Schöne Grüße an alle, und Danke noch einmal.
Der Code läuft bis heute noch  :D

Gruß, Karsten
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 28 März 2021, 13:39:07
Zitat von: TomLee am 26 März 2021, 19:48:30
Also keine Spirenzien machen, $Name in jeder sub übergeben und die eine Variable die ich erwähnt habe halt zweimal in der myUtils definieren ?
Klingt für mich besser.

Das setreading-nogo in userReadings habt ihr ja gefunden.

Vielleicht nochmal eine Anmerkung zu eine sub vs. viele: Grundsätzlich ist es m.E. effizienter, als Reaktion auf ein Event eine sub aufzurufen und darin dann alles zu erledigen, was man z.B. aus einem notify raus erledigen will, und das nicht auf mehrere notify zu verteilen. Die Krux hier ist allerdings, dass der Kontext eben userReadings ist, und da sind das  eigentlich eben schon subs innerhalb dieses "globalen" userReadings-Aufrufs => hier klappt das nicht in der Form, weil eine bestimmte Rückgabe erwartet wird, und "normale" Funktionen unterbunden werden.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 29 März 2021, 15:03:35
Zitat von: Beta-User am 28 März 2021, 13:39:07
Das setreading-nogo in userReadings habt ihr ja gefunden.

Vielleicht nochmal eine Anmerkung zu eine sub vs. viele: Grundsätzlich ist es m.E. effizienter, als Reaktion auf ein Event eine sub aufzurufen und darin dann alles zu erledigen, was man z.B. aus einem notify raus erledigen will, und das nicht auf mehrere notify zu verteilen. Die Krux hier ist allerdings, dass der Kontext eben userReadings ist, und da sind das  eigentlich eben schon subs innerhalb dieses "globalen" userReadings-Aufrufs => hier klappt das nicht in der Form, weil eine bestimmte Rückgabe erwartet wird, und "normale" Funktionen unterbunden werden.

Ich muss nochmal nachfragen:

Da hier 5 mal der gleiche Trigger benutzt wird, könnte man doch 4 mal die Werte mit setreading setzen und den 5. per return ans userReading liefern.
Oder spricht dagegen auch noch etwas?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 29 März 2021, 15:38:30
Da spricht m.E. dagegen, dass wir es hier
a) nicht mit einem notify-trigger zu tun haben (da funktioniert es ggf. etwas anders), und
b) setreading generell für userReadings tabu ist (solange das bulkUpdate läuft).

Im Detail: Die Auswertung von userReadings erfolgt in readingsEndUpdate() (aktuelle svn-Zeile): https://svn.fhem.de/trac/browser/trunk/fhem/fhem.pl#L4761

a) Da werden für ein readingsEndUpdate() alle userReadings durchgesehen, der "trigger" ist also kein echter Auslöser, sondern tatsächlich eine Begrenzung der Häufigkeit der Ausführung des eigentlichen weiteren Codes, indem "irrelevante Updates" ignoriert werden.

b) siehe dazu https://svn.fhem.de/trac/browser/trunk/fhem/fhem.pl#L4707 + https://svn.fhem.de/trac/browser/trunk/fhem/fhem.pl#L2469. readingsBeginUpdate setzt einen Marker, der die direkte Ausführung von setreading verhindert => das klappt nur, wenn man wissentlich ausbricht (was man aber lassen sollte! Es hat seinen Grund, warum das nicht erwünscht ist...).
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 29 März 2021, 17:36:21
Zitat von: Beta-User am 29 März 2021, 15:38:30
Da spricht m.E. dagegen, dass wir es hier
a) nicht mit einem notify-trigger zu tun haben (da funktioniert es ggf. etwas anders), und
b) setreading generell für userReadings tabu ist (solange das bulkUpdate läuft).

Im Detail: Die Auswertung von userReadings erfolgt in readingsEndUpdate() (aktuelle svn-Zeile): https://svn.fhem.de/trac/browser/trunk/fhem/fhem.pl#L4761

a) Da werden für ein readingsEndUpdate() alle userReadings durchgesehen, der "trigger" ist also kein echter Auslöser, sondern tatsächlich eine Begrenzung der Häufigkeit der Ausführung des eigentlichen weiteren Codes, indem "irrelevante Updates" ignoriert werden.

b) siehe dazu https://svn.fhem.de/trac/browser/trunk/fhem/fhem.pl#L4707 + https://svn.fhem.de/trac/browser/trunk/fhem/fhem.pl#L2469. readingsBeginUpdate setzt einen Marker, der die direkte Ausführung von setreading verhindert => das klappt nur, wenn man wissentlich ausbricht (was man aber lassen sollte! Es hat seinen Grund, warum das nicht erwünscht ist...).

Danke, für die ausführliche Erklärung. Ich werde es mir in Ruhe anschauen.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 23 Juni 2021, 19:10:02
@Jörg

Was das ein/verbauen von Hardware angeht bin ich sehr eigen, eher verzicht ich darauf wie das man sie sieht/sehen könnte oder annehmbar aussieht.

Mit dem WLED-Controller (ja WLAN, aber dazu hab ich mich ja schon länger entschieden und ja jetzt zwei Geräte zu einem vereint) als "IR-Gateway" hab ich die Lösung "gefunden" (die man nicht sehen wird (noch nicht umgesetzt, das wird noch etwas Arbeit)), die ich mir schon länger wünsche.

Beim umstellen von meiner "Sensorkrake" (die ich bisher immer nur zum testen rausholte, den ungefähren Code hier (https://forum.fhem.de/index.php/topic,112785.msg1111015.html#msg1111015) also nie wirklich nutzen konnte und ja zigbee wäre auch eine Lösung, mich stört aber die zusätzliche FB, obwohl mir zigbee angenehmer wäre) auf das WLED-Gateway fällt mir eins auf:

Das ich dir sehr sehr dankbar bin diesen Code mit Hilfe deiner Geduld (und ohne spitze Bemerkungen) zu lernen und zu verstehen, im Prinzip sind es nur zwei Anpassungen in dem notify (Gerätename und auslösendes Ereignis) um all die Geräte weiterhin zu steuern.

Zusätzliche Arbeit war nur das anpassen der IR-Codes von Groß.- auf Kleinschreibung (die kommen bei WLED klein rein).




Ein großes, dickes, wiederholtes Danke dafür.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 23 Juli 2021, 14:08:35
Kann mir wer hier nochmal behilflich sein bitte.

Bisher hatte ich mit folgendem DOIF die Möglichkeit per Sprache die Einkaufsliste auszudrucken, direkt im Anschluß wurde die Liste gelöscht (das war keine praxistaugliche Lösung mit dem direkt löschen, kein Papier im Drucker, Drucker aus oder Papierstau und die Liste war weg)
DOIF damals deshalb weil es die dummy/notify Lösung erspart hatte.

defmod doif_Echo_Einkaufsliste DOIF ($SELF eq "on")( {system("lpr -P HL-2035 -o media=Custom.95x138mm /opt/fhem/einkaufsliste.txt")},{my @array = split(",",ReadingsVal("Echo","list_SHOPPING_ITEM",""));; foreach my $sk (@array) {fhem ("set Echo item_shopping_delete $sk")}})
attr doif_Echo_Einkaufsliste alexaName einkaufsliste
attr doif_Echo_Einkaufsliste cmdState on|off
attr doif_Echo_Einkaufsliste devStateIcon on:general_an:off off|initialize.*:general_aus:on
attr doif_Echo_Einkaufsliste do always
attr doif_Echo_Einkaufsliste genericDeviceType switch
attr doif_Echo_Einkaufsliste group Einkaufsliste
attr doif_Echo_Einkaufsliste room Sprachsteuerung
attr doif_Echo_Einkaufsliste setList on off


Per Sprache gefällt mir nicht mehr darum jetzt mal der Versuch es mit IR zu versuchen und das direkte löschen anders zu lösen (wenn man selbst löscht), wenn jemand aber einen besseren Vorschlag die Liste automatisiert zu löschen, schlag ich den natürlich nicht aus.

Mein bisheriger Gedanke ist die Liste erst zu löschen wenn man einen bestimmten Button drückt.

Dazu hab ich mir überlegt die Schleife erst nach diesem Event auszuführen, mit sleep in dem FHEM-Befehl der Variablen $sound:

if ($dudevstate eq 'Einkaufsliste') {

# blue button 1x

#my $sound = sub {fhem("set $kecho sounds Glocken");};
my @array = split(",",ReadingsVal('Echo','list_SHOPPING_ITEM',''));
my $sound = sub {fhem("set $kecho sounds Glocken;sleep MQTT2_WLED_FR:ircode:0x20df827d;{foreach my $sk (@array) {fhem ("set Echo item_shopping_delete $sk")}}");};


my $a1 = sub { system('lpr -P HL-2035 -o media=Custom.95x138mm /opt/fhem/einkaufsliste.txt &');};

my $sr2cmnd = {
'0x20df22dd' => \&$a1};

return fhem("set $kecho speak $dudevstate") if $rcCode eq "0x20df55aa";
return $sr2cmnd->{$rcCode}->().$sound->() if ref $sr2cmnd->{$rcCode} eq 'CODE';
return;
}


Wenn ich die my Utils aber speichern möchte kommt diese Meldung:
Global symbol "$sk" requires explicit package name (did you forget to declare "my $sk"?) at ./FHEM/99_Remotes_myUtils.pm line 295. syntax error at ./FHEM/99_Remotes_myUtils.pm line 295, near ""set $kecho sounds Glocken;sleep MQTT2_WLED_FR:ircode:0x20df827d;{foreach my $sk (@array) {fhem ("set Echo " Global symbol "$sk" requires explicit package name (did you forget to declare "my $sk"?) at ./FHEM/99_Remotes_myUtils.pm line 295.

Ich habs auch schon auf anderen Wegen versucht es hängt immer an my $sk.

Wie macht mans richtig ?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 23 Juli 2021, 15:57:44
Bin etwas weiter.

Das my @array = split(",",ReadingsVal("Echo","list_SHOPPING_ITEM",""));
foreach my $sk (@array) {fhem ("set Echo item_shopping_delete $sk")}

hab ich in so eine anonyme sub gesteckt und die in eine Variable, diese wiederum einfach an das sleep angehängt.

if ($dudevstate eq 'Einkaufsliste') {

# blue button 1x -> Einkaufsliste

my $fee = sub {my @array = split(",",ReadingsVal("Echo","list_SHOPPING_ITEM",""));
foreach my $sk (@array) {fhem ("set Echo item_shopping_delete $sk")}};

my $sound = sub {fhem("set $kecho sounds Glocken;sleep MQTT2_WLED_FR:ircode:.0x20dfda25;$fee");};

my $a1 = sub { system('lpr -P HL-2035 -o media=Custom.95x138mm /opt/fhem/einkaufsliste.txt &');};

my $sr2cmnd = {
'0x20df22dd' => \&$a1};

return fhem("set $kecho speak $dudevstate") if $rcCode eq "0x20df55aa";
return $sr2cmnd->{$rcCode}->().$sound->() if ref $sr2cmnd->{$rcCode} eq 'CODE';
return;
}


Jetzt wird korrekt die Datei ausgedruckt (auch schon zuvor), es wird das eventbasierte sleep/at (wie auch immer) angelegt, welches mit cancel angezeigt wird .sleep_2919198 MQTT2_WLED_FR:ircode:.0x20dfda25 CODE(0x843f920) und wenn ich die 0x20dfda25 drücke wird es wieder gelöscht.
Aber die Liste wird nicht gelöscht, merkwürdig kommt mir das CODE(0x843f920) in dem .sleep_2919198 vor .

edit:

auch wenn ich $fee->() verwende:

my $sound = sub {fhem("set $kecho sounds Glocken;sleep MQTT2_WLED_FR:ircode:.0x20dfda25;$fee->()");};

.sleep_4818  MQTT2_WLED_FR:ircode:.0x20dfda25 CODE(0x22d8500)->()

Im Log steht:

After sleep: Unknown command CODE(0x22d8500)->(), try help.

edit2:
Mit
{my $fee = sub {my @array = split(",",ReadingsVal("Echo","list_SHOPPING_ITEM",""));;foreach my $sk (@array) {fhem ("set Echo item_shopping_delete $sk")}};;return $fee->()}
aus der Kommandozeile wird die Liste gelöscht.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 23 Juli 2021, 18:11:38
OK, OK, es muss gar nicht von hinten durch die Brust sein, der Grund wird wohl sein das ich mich erst wieder eindenken musste und vor der Frage zu wenig mit beschäftigt habe.

So klappts wie ich mir das vorgestellt habe, mit Bestätigungston, der war bei meinem vorherigen Gedanken gar nicht vorgesehen/beachtet gewesen:

if ($dudevstate eq 'Einkaufsliste') {

# blue button 1x -> Einkaufsliste

my $sound = sub {fhem("set $kecho sounds Glocken");};
my $a1 = sub { system('lpr -P HL-2035 -o media=Custom.95x138mm /opt/fhem/einkaufsliste.txt &');};
my $a2 = sub {my @array = split(",",ReadingsVal("Echo","list_SHOPPING_ITEM",""));
foreach my $sk (@array) {fhem ("set Echo item_shopping_delete $sk")}};

my $sr2cmnd = {
'0x20df22dd' => \&$a1,
'0x20dfda25' => \&$a2};

return fhem("set $kecho speak $dudevstate") if $rcCode eq "0x20df55aa";
return $sr2cmnd->{$rcCode}->().$sound->() if ref $sr2cmnd->{$rcCode} eq 'CODE';
return;
}





Was jetzt hier bei dem Thema Einkaufsliste drucken immer noch nicht passt ist die Meldung:

ERROR evaluating my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{FileWrite({ FileName=>"/opt/fhem/einkaufsliste.txt", ForceType=>"file", NoNL => 0},split(/\,/,$EVTPART1))}: Global symbol "$EVTPART1" requires explicit package name (did you forget to declare "my $EVTPART1"?) at (eval 10719) line 1.

die beim löschen der Liste von diesem notify kommt:

defmod not_Echo_Einkaufsliste notify Echo:list_SHOPPING_ITEM:.* {FileWrite({ FileName=>"/opt/fhem/einkaufsliste.txt", ForceType=>"file", NoNL => 0},split(/\,/,$EVTPART1))}

Damals hatte keiner eine Idee wie man das verhindern könnte, mein Gedanke ist jetzt nix_machen wenn Echo:list_SHOPPING_ITEM:.* leer/nix ist ?

Damit beschäftige ich mich als nächstes, aber auch hier schlag ich einen Vorschlag nicht aus, der mir zuvorkommt.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Otto123 am 24 Juli 2021, 11:04:38
Hallo Tom,

Eigentlich in solchen Fällen besser nicht mit evtpart arbeiten sondern den $EVENT selbst splitten?

Gruß Otto
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 24 Juli 2021, 11:10:49
Dazu schreib ich gleich was in einem anderen Thread.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 24 Juli 2021, 18:40:35
Also aus den Infos aus dem anderen Thread ziehe ich das !defined auf $EVTPART1 die richtige Variante ist (mir auch gefällt) und wenn das mit der Meldung des notify nur mit no strict zu umgehen ist dann ist das halt so.

Mit split hatte ich mich gestern Abend schon beschäftigt (mein erster Gedanke war es mit defined anzugehen), wenn man sich dazu im Forum einliest hat Betateilchen auch mal selbst diesen Lösungsweg vorgeschlagen gehabt, heute halt unless auf $EVTPART1.

Ich fass nur mal der Vollständigkeit und zum nachvollziehen (in erster Linie für mich in Zukunft) zusammen, hab das jetzt mehrfach getestet und bin zufrieden damit:


if ($dudevstate eq 'Einkaufsliste') {

# blue button 1x -> Einkaufsliste

my $sound = sub {fhem("set $kecho sounds Glocken");};
my $a1 = sub { system('lpr -P HL-2035 -o media=Custom.95x138mm /opt/fhem/einkaufsliste.txt &');};
my $a2 = sub {my @array = split(',',ReadingsVal($echod,'list_SHOPPING_ITEM',''));
foreach my $sk (@array) {fhem ("set $echod item_shopping_delete $sk")}};

my $sr2cmnd = {
'0x20df22dd' => \&$a1,
'0x20dfda25' => \&$a2};

return fhem("set $kecho speak $dudevstate") if $rcCode eq '0x20df55aa';
return $sr2cmnd->{$rcCode}->().$sound->() if ref $sr2cmnd->{$rcCode} eq 'CODE';
return;
}


defmod not_Echo_Einkaufsliste notify Echo:list_SHOPPING_ITEM:.* {no strict;;\
return if !defined $EVTPART1;;\
return FileWrite({ FileName=>"/opt/fhem/einkaufsliste.txt", ForceType=>"file", NoNL => 0},split(/\,/,$EVTPART1));;}
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 24 Juli 2021, 19:09:32
Hi,
es ist toll, das du das alles dokumentierst.
Allerdings macht es den Thread langsam unübersichtlich und ich meine, dass es in Anfängerfragen nicht richtig aufgehoben ist.

Mich interessiert das alles, und ich habe mittlerweile auch alle größeren Funktionen in myUtils. Daher wäre es super, wenn wir dafür  ein Unterforum bekommen könnten.

Nur weiß ich momentan nicht wen wir dazu überzeugen müssen...

Ich denke, dass ein entsprechendes Unterforum, vielleicht auch ein Zwischenschritt zum Dev. wäre!?

Grüße
Bernd
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 24 Juli 2021, 19:29:34
ZitatIch denke, dass ein entsprechendes Unterforum, vielleicht auch ein Zwischenschritt zum Dev. wäre!?

Ein entsprechendes Unterforum fänd ich auch toll.
Das mit dem Zwischenschritt sehe ich nicht so, ich bin weder Tester und niemals Developer, einfach nur ich, bin auf dem Acker groß geworden, hab mit Programmierung nie was am Hut gehabt, mir macht das (Heute/mittlerweile) zwischendurch einfach nur Spaß und mit meiner Ausübung meiner Tätigkeit hat das auch null am Hut.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 24 Juli 2021, 19:33:48
Zitat von: TomLee am 24 Juli 2021, 19:29:34
Ein entsprechendes Unterforum fänd ich auch toll.
Das mit dem Zwischenschritt sehe ich nicht so, ich bin weder Tester und niemals Developer, einfach nur ich, bin auf dem Acker groß geworden, hab mit Programmierung nie was am Hut gehabt, mir macht das (Heute/mittlerweile) zwischendurch einfach nur Spaß und mit meiner Ausübung meiner Tätigkeit hat das auch null am Hut.

Mir geht es ähnlich, das war nur Mal als Argument in den Raum geworfen. . 8)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 24 Juli 2021, 20:00:07
Ich habe einfach Mal angefragt:
https://forum.fhem.de/index.php?topic=122201.new#new
(https://forum.fhem.de/index.php?topic=122201.new#new)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 28 Juli 2021, 07:44:27
Zitat von: TomLee am 24 Juli 2021, 18:40:35
Also aus den Infos aus dem anderen Thread ziehe ich das !defined auf $EVTPART1 die richtige Variante ist (mir auch gefällt) und wenn das mit der Meldung des notify nur mit no strict zu umgehen ist dann ist das halt so.

Vermutlich ist der Hinweis untergegangen, aber (ungetestet) sollte sich das Warning auch verhindern lassen, indem man die regexp so wählt, dass sichergestellt ist, dass $EVTPART1 exisitiert:
defmod not_Echo_Einkaufsliste notify Echo:list_SHOPPING_ITEM:..* {return FileWrite({ FileName=>"/opt/fhem/einkaufsliste.txt", ForceType=>"file", NoNL => 0},split(/\,/,$EVTPART1));;}
Der weitere Punkt ("..*", kann man hier vermutlich auch als ".+" notieren) sollte sicherstellen, dass das Reading tatsächlich einen neuen Wert gesetzt erhält.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 28 Juli 2021, 09:25:44
Zitat von: Beta-User am 28 Juli 2021, 07:44:27
Vermutlich ist der Hinweis untergegangen, aber (ungetestet) sollte sich das Warning auch verhindern lassen, indem man die regexp so wählt, dass sichergestellt ist, dass $EVTPART1 exisitiert:
defmod not_Echo_Einkaufsliste notify Echo:list_SHOPPING_ITEM:..* {return FileWrite({ FileName=>"/opt/fhem/einkaufsliste.txt", ForceType=>"file", NoNL => 0},split(/\,/,$EVTPART1));;}
Der weitere Punkt ("..*", kann man hier vermutlich auch als ".+" notieren) sollte sicherstellen, dass das Reading tatsächlich einen neuen Wert gesetzt erhält.

Kannst du mir das näher erläutern?

Wieso "..*"?  MWn bedeutet "." jedes x-beliebige Zeichen und "*" kann unendlich mal vorkommen, somit sollte ".*" doch reichen !?
Das '+' muss ich erst nachlesen...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 28 Juli 2021, 10:24:45
ZitatVermutlich ist der Hinweis untergegangen, aber (ungetestet)

Nee untergegangen nicht, erst nicht verstanden wo der Punkt gemeint gewesen wäre und später, als ich verstanden hatte wo ging mir dann das gleiche durch den Kopf wie Frober, mich aber ehrlich gesagt dann nicht weiter beschäftigt habe.

Du schreibst ja ungetestet, hätte jetzt aber erwartet nachdem du das extra nochmal hochholst du hast es getestet und bist dir sicher.

Es kommt mit beiden Varianten weiterhin zu der Meldung, die erste mit ..* die zweite mit .+:

2021.07.28 10:09:25 1: PERL WARNING: Use of uninitialized value $EVTPART1 in split at (eval 756491) line 4.
2021.07.28 10:09:25 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{no strict;
#return if !defined $EVTPART1;
#return unless $EVTPART1;
return FileWrite({ FileName=>"/opt/fhem/einkaufsliste.txt", ForceType=>"file", NoNL => 0},split(/\,/,$EVTPART1));}
2021.07.28 10:12:57 1: PERL WARNING: Use of uninitialized value $EVTPART1 in split at (eval 756852) line 4.
2021.07.28 10:12:57 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{no strict;
#return if !defined $EVTPART1;
#return unless $EVTPART1;
return FileWrite({ FileName=>"/opt/fhem/einkaufsliste.txt", ForceType=>"file", NoNL => 0},split(/\,/,$EVTPART1));}


Hier nochmal die notify-Definition, aber nur mit .+ (die zweite Meldung):

defmod not_Echo_Einkaufsliste notify Echo:list_SHOPPING_ITEM:.+ {no strict;;\
#return if !defined $EVTPART1;;\
#return unless $EVTPART1;;\
return FileWrite({ FileName=>"/opt/fhem/einkaufsliste.txt", ForceType=>"file", NoNL => 0},split(/\,/,$EVTPART1));;}
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 28 Juli 2021, 10:27:59
".*" ist "beliebige Zeichenfolge, kann auch 'nichts' sein". 'nichts' verursacht hier grade das Problem, weil das "split" für $EVTPARTn eben nur ein Element (=> $EVTPART0) findet.

"..*" ist "beliebige Zeichenfolge, aber mindestens ein Zeichen" (nämlich den expliziten "Punkt"). Hab's grade getestet, das funktioniert, aber man braucht einen dritten Punkt:
defmod not_Echo_Einkaufsliste notify Echo:list_SHOPPING_ITEM:...* {return FileWrite({ FileName=>"/opt/fhem/einkaufsliste.txt", ForceType=>"file", NoNL => 0},split(/\,/,$EVTPART1));;}Die Ursache dürfte im Zusammenbau des Auswertestrings in 91_notify.pm (dort notify_Exec()) liegen.

Zum "+" und weiteren Fragen würde ich auf regex101.com verweisen, da findet  man z.B. auch Infos, wie man die Zahl der Wiederholungen einstellen kann usw.. Was z.B. auch geht, ist "mind. 2 Zeichen" so zu schreiben:
defmod not_Echo_Einkaufsliste notify Echo:list_SHOPPING_ITEM:.{2,} {return FileWrite({ FileName=>"/opt/fhem/einkaufsliste.txt", ForceType=>"file", NoNL => 0},split(/\,/,$EVTPART1));;}

Man sollte bei solchen Optimierungen nur darauf achten, dass NOTIFYDEV weiter gesetzt bleibt (zu finden unter den Internals beim notify). (Das ist aber eine andere Diskussion, ich müßte ggf. die Links suchen, auch auch zur Hilfsfunktion zur Analyse, woran es hakt (notifyRegexpCheck()).
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 28 Juli 2021, 10:46:40
Super, jetzt muss ich mich zu einer Variante von dreien entscheiden, ...* , .{2,} oder !defined ?

Wenn keiner mehr was sagt entscheide ich mich wie meist für die kürzeste.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 28 Juli 2021, 11:00:57
...die kürzeste dürfte Variante 4 sein: "..+"... ;)

Vielleicht eine generelle Anmerkung: Es ist hilfreich, wenn man auch nach Monaten (...) noch grob erkennen kann, ob etwas absichtlich so gemacht wurde, oder ob es ein potentieller Fehler war. Unter diesem Gesichtspunkt würde ich tendenziell was anderes der "...*"-Variante vorziehen.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 28 Juli 2021, 11:29:25
Danke, für die Erläuterung.

So ähnlich {3.1} habe ich es schon benutzt, um einen Pumpenlauf über die Leistung zu detektieren ~200.0W oder ~0.3W...da der Aktor immer "on" ist.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 28 Juli 2021, 16:50:06
ZitatVielleicht eine generelle Anmerkung: Es ist hilfreich, wenn man auch nach Monaten (...) noch grob erkennen kann, ob etwas absichtlich so gemacht wurde, oder ob es ein potentieller Fehler war. Unter diesem Gesichtspunkt würde ich tendenziell was anderes der "...*"-Variante vorziehen.

Ich hatte mir einen Link schon zu dem anderen Thread in comment notiert und jetzt einen auf #134 hinzugenommen.

<a href="https://forum.fhem.de/index.php/topic,122196.msg1167670.html#msg1167670></a>
<a https://forum.fhem.de/index.php/topic,112785.msg1168108.html#msg1168108>bla</a>


Links mit HTML in comment darzustellen geht nicht, hab ich mal mitgenommen/mich mit beschäftigt, oder doch irgendwie ?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 28 Juli 2021, 19:35:36
Zitat von: TomLee am 28 Juli 2021, 16:50:06
Ich hatte mir einen Link schon zu dem anderen Thread in comment notiert und jetzt einen auf #134 hinzugenommen.

<a href="https://forum.fhem.de/index.php/topic,122196.msg1167670.html#msg1167670></a>
<a https://forum.fhem.de/index.php/topic,112785.msg1168108.html#msg1168108>bla</a>


Links mit HTML in comment darzustellen geht nicht, hab ich mal mitgenommen/mich mit beschäftigt, oder doch irgendwie ?

Ich hätte das direkt in der Perl- Funktion kommentiert, da hast du doch einen besseren Bezug. Kannst ja den Weblink mit einfügen.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 21 Februar 2022, 16:23:34
Hey Beta-User,

kannst du bitte mal schauen, nur wegen dir hab ich schließlich den Code  :P ?

Warum kommt es zu der Meldung, von der Erklärung dazu versteh ich nur Bahnhof:

Subroutine "Nec32RemoteCodesHandlerFR" with high complexity score (21) at line 13, column 1. Consider refactoring.

package main;

use strict;
use warnings;

sub Remotes_Utils_Initialize {
  my $hash = shift//return;
  return;
}



sub Nec32RemoteCodesHandlerFR {
my $rcCode = shift // return;
my $frwl = shift;
my $kurl = shift;
my $kecho = shift;
my $dudev = shift;
my $echod = shift;
my $dudevstate = ReadingsVal($dudev,'state','Sonos');
my $kechocmd = qq(set $kecho sounds summer);
my $kechos = qq(set $kecho speak);

my %rcode2cmnd = (
'0x20df4eb1' => 'Gastzugang',
'0x20df8e71' => 'Wandlampen',
'0x20dfc639' => 'Rollo',
'0x20df8679' => 'Einkaufsliste');
my $gcmnd = $rcode2cmnd{$rcCode};

return fhem("set $dudev $gcmnd;set $kecho speak $gcmnd") if $gcmnd && $dudevstate ne $gcmnd;

if ($dudevstate eq 'Gastzugang') {

my $sound = sub {fhem("set $kecho sounds Glocken");};
my $a1 = sub { system('/opt/fhem/www/scripts/vouchergzg.sh vouchergzg &');};
my $a2 = sub { system('/opt/fhem/www/scripts/vouchergzg.sh vouchergzg1 &');};
my $a3 = sub { system('/opt/fhem/voucher4.sh &');};
my $a4 = sub { system('/opt/fhem/www/scripts/voucher.sh voucher_7d1x &');};
my $a5 = sub { system('/opt/fhem/www/scripts/voucher.sh voucher_21d1x &');};

my $sr2cmnd = {
'0x20df22dd' => \&$a1,
'0x20dfe01f' => \&$a2,
'0x20df02fd' => \&$a3,
'0x20df609f' => \&$a4,
'0x20df827d' => \&$a5
};
return if !$sr2cmnd->{$rcCode};
return fhem("set $kecho speak $dudevstate") if $rcCode eq "0x20df55aa";
return $sr2cmnd->{$rcCode}->().$sound->() if ref $sr2cmnd->{$rcCode} eq 'CODE';
return;
}

if ($dudevstate eq 'Wandlampen') {

# green button 1x -> Wandlampen

my $pctzu = "pct {(minNum(ReadingsNum('$frwl','pct','0')+10,100))}";
my $pctzd = "pct {(maxNum(ReadingsNum('$frwl','pct','0')-10,0))}";

my %code2command = (
'0x20df22dd' => 'toggle',
'0x20df40bf' => "$pctzu",
'0x20dfc03f' => "$pctzd",
'0x20df8e71' => "Deko",
'0x20df55aa' => "$dudevstate");
my $command = $code2command{$rcCode};

return if !$command;
return fhem("$kechos $command") if $rcCode eq "0x20df55aa";
return fhem("$kechos $command;set $dudev $command") if $rcCode eq "0x20df8e71";
return fhem("set $frwl $command");

}


if ($dudevstate eq 'Deko') {
my %code2command = (
'0x20df22dd' => 'toggle',
'0x20df55aa' => "$dudevstate");
my $command = $code2command{$rcCode};

return fhem("$kechos $command") if $rcCode eq "0x20df55aa";
return fhem("set it_Steckdose4 $command") if $rcCode eq "0x20df22dd";
}


if ($dudevstate eq 'Rollo') {

# yellow button 1x -> Rollo

my %code2command = (
'0x20df827d' => 'off',
'0x20dfe01f' => 'pct 38',
'0x20df609f' => 'pct 20',
'0x20df02fd' => 'on',
'0x20df22dd' => 'stop',
'0x20df40bf' => 'up',
'0x20dfc03f' => 'down',
'0x20df55aa' => "$dudevstate");
    my $command = $code2command{$rcCode};

return if !$command;
return fhem("$kechos $command") if $rcCode eq '0x20df55aa';
return fhem("set $kurl $command");
}
if ($dudevstate eq 'Einkaufsliste') {

# blue button 1x -> Einkaufsliste

my $sound = sub {fhem("set $kecho sounds Glocken");};
my $a1 = sub { system('lpr -P HL-2035 -o media=Custom.95x138mm /opt/fhem/einkaufsliste.txt &');};
my $a2 = sub {my @array = split(',',ReadingsVal($echod,'list_SHOPPING_ITEM',''));
foreach my $sk (@array) {fhem ("set $echod item_shopping_delete $sk")}};

my $sr2cmnd = {
'0x20df22dd' => \&$a1,
'0x20dfda25' => \&$a2};

return fhem("set $kecho speak $dudevstate") if $rcCode eq '0x20df55aa';
return $sr2cmnd->{$rcCode}->().$sound->() if ref $sr2cmnd->{$rcCode} eq 'CODE';
return;
}
}

1;


Ich hab bis jetzt nur festgestellt das wenn ich irgendeinen beliebigen if Zweig rausnehme die Meldung danach weg ist ?

Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 21 Februar 2022, 16:48:07
Zitat von: TomLee am 21 Februar 2022, 16:23:34
Warum kommt es zu der Meldung, von der Erklärung dazu versteh ich nur Bahnhof:

Subroutine "Nec32RemoteCodesHandlerFR" with high complexity score (21) at line 13, column 1. Consider refactoring.
Aha, Perlcritic auf Stufe 3! Cool!!!

Mein persönlicher (unrühmlicher) Spitzenreiter:
ZitatSubroutine "handleIntentSetNumeric" with high complexity score (68) at line 4087, column 1. Consider refactoring.
(Fast) Unwartbar, das Ding, aber ich habe leider keine Idee, wie man es einfacher machen kann...

Dieser "complexity score" gibt einfach nur an, wie viele "Ausgänge" ein Code haben kann. Wie du gesehen hast: ein "if"-Zweig mit eigenem Ausgang (return) weniger, und das Ding sieht "sauber" aus, Perlcritic sieht "20" als "noch ok" an. Ob es wirklich "komplex" ist, ist damit noch lange nicht definitiv entschieden, dein Code hat ja eine trotz allem noch relativ überschaubare Strukutur.

"Refactoring" könnte bedeuten, einzelne if-Zweige in eigene Subs auszulagern, hier z.B. für jeden der "dudevstate" je eine Sub. Das "blöde" im Main-Kontext ist halt, dass einem dann irgendwann die "prägnanten Namen" für subs ausgehen, weswegen viele FHEM-Module intern auch eher selten solche Strukturierungen vornehmen (oder gar auf externe Hilfsmittelchen wie List::unique zurückgreifen), sondern manche "Schnipsel" an vielen Stellen "recycled" werden.

Klarer jetzt?

Wegen "21" würde ich mir jetzt noch nicht allzusehr den Kopf zerbrechen, das ist für solche "dispatch"-ähnlichen Strukturen relativ normal...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 21 Februar 2022, 17:22:14
ZitatKlarer jetzt?

zögerliches ja, ab
Zitat... weswegen viele FHEM-Module intern auch eher selten ..
nicht wirklich und was unter "dispatch"-ähnlichen Strukturen, zu verstehen ist ehrlich gesagt auch nicht aber eine Ahnung, mach ich mich aber nicht verrückt wegen irgendwann kommt der Aha-Effekt schon.


Eine hab ich noch:

Darf man nicht beliebig viele Parameter übergeben ?

package main;

use strict;
use warnings;

sub Remotes_Utils_Initialize {
  my $hash = shift//return;
  return;
}

sub Nec32RemoteCodesHandler {
my $wzwl = shift;
my $wzdl = shift;
my $sija = shift;
my $tv = shift;
my $strzigu = shift;
my $miwl = shift;
my $sdev = shift;
my $dudev = shift;
my $rcCode = shift // return;
return;
}
1;

Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 21 Februar 2022, 17:37:51
Zitat von: TomLee am 21 Februar 2022, 17:22:14
zögerliches ja, ab  [...] nicht wirklich
..ok, das versteht man vermutlich wirklich nur, wenn man mal "gewachsene Module" auseinandergenommen und wieder zusammengepuzzelt hat. Oder sich einzelne Module mindestens mal näher angeschaut.

Zitat
und was unter "dispatch"-ähnlichen Strukturen, zu verstehen ist ehrlich gesagt auch nicht
Das sind Funktionen, die so aufgebaut sind, dass abhängig von einem gewissen input irgendeine Funktion ausgeführt wird. In der Regel ist die jeweils komplett unterschiedlich, je nachdem, welche Vorbedingung erfüllt ist. Typisches Beispiel: set-Funktionen in FHEM. Für on/off ist es recht einheitlich, aber z.B. ein "mach farbig" oder "mach heller" ist dann doch was grundverschiedenes, was man eigentlich jeweils in eine eigene Unterfunktion auslagern könnte. In der Regel findet sich sowas aber halt irgendwo in einem if-Zweig der 4. Ebene...

ZitatDarf man nicht beliebig viele Parameter übergeben ?
Dürfen (im Sinne: es wird funktionieren) kann man schon, aber es ist unübersichtlich und fehleranfällig, zumal, wenn keine Kommentare im Code zu finden sind. Tendenziell wäre die Frage, ob man die Teil-Argumente in deinem Beispiel nicht besser in einen Hash verpackt, v.a., wenn nicht alle Argumente zwingend sind. (Es ist aber eher eine Art "Konvention" in FHEM, dass die Argumente in der Regel komma-separiert übergeben werden, soweit sie vom User bereitgestellt werden).
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 21 Februar 2022, 17:59:10
Danke für das erläutern.

ZitatTendenziell wäre die Frage, ob man die Teil-Argumente in deinem Beispiel nicht besser in einen Hash verpackt, ...

Einen Hash zu übergeben kam mir beim schreiben der Frage in den Sinn und fragte mich insgeheim ob man es vlt. besser dann so macht  :)
Gut das du diesen Gedanken gleich mit der nächsten Antwort bestätigt hast  ;D
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 21 Februar 2022, 18:03:50
Zitat von: TomLee am 21 Februar 2022, 17:59:10
Danke für das erläutern.
Gerne. Vielleicht noch ein (kleines) Beispiel, wie das mit dispatch statt "elsif-Bandwurm" gemeint ist:
Wenn du https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/00_MYSENSORS.pm?rev=25007#L620 vergleichst mit der alten Fassung aus https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/00_MYSENSORS.pm?rev=21300#L298, wird es vielleicht an diesem Schnippsel klarer. Wobei es an der Stelle eben schon relativ "straight forward" war, weil nur "kurz" nach der passenden Funktion gesucht wurde und die dann aufgerufen. Das ist eher die Ausnahme...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 20 Januar 2023, 18:38:10
Mir stellt sich gerade wegen dem Wochentag-Thread die Frage ob man bei der Übergabe von Parametern mit shift auch einen Default/Ersatzwert angeben kann statt die Funktion einfach mit return zu verlassen wenn shift leer ist ?

Wenn ich Code einfach an das return anhänge wird die Funktion ja danach beendet, mit einfach nur der Angabe des Codes bekommt man ein Can't modify defined or (//) in scalar assignment at ./FHEM/99_Calendar_Utils.pm line 14, near "];"

Wie macht man sowas mit shift, sry ist das erste mal das mir sowas bewusst auffällt und ich keinen Ansatz für eine Lösung habe (was das shift angeht).
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: frober am 20 Januar 2023, 18:46:42
Bsp

$a = shift // return;
$b = shift // q{Blabla};
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: betateilchen am 20 Januar 2023, 18:48:44
Lese doch mal ein gutes perl Buch :)


sub test{
  my $wert = shift // "default";
  return $wert;
}

Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: Beta-User am 20 Januar 2023, 18:58:32
Ergänzend - für weiter hinten in einer Funktion:
$var //= 'kein Wert bis hier';
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 20 Januar 2023, 19:10:46
Danke.

Ich komm denk ich auch noch alleine drauf was schief läuft, aber erst später, jetzt geht nicht mehr.

Braucht auch keiner was zu sagen, halt aber auch keinen davon ab:

sub wochentag{
my $v = shift // "my ($day, $month, $year) = (localtime)[3,4,5]; sprintf('%02d.%02d.%s',$month+1,$day,$year+1900)";
my ($d,$m,$y) = split(/\./,$v)};
$m-=1;
my @weekdays = qw(So Mo Di Mi Do Fr Sa);
return $weekdays[((localtime(timelocal('0','0','0',$d,$m,$y)))[6])];
}


Global symbol "$day" requires explicit package name (did you forget to declare "my $day"?) at ./FHEM/99_Calendar_Utils.pm line 14. Global symbol "$month" requires explicit package name (did you forget to declare "my $month"?) at ./FHEM/99_Calendar_Utils.pm line 14. Global symbol "$year" requires explicit package name (did you forget to declare "my $year"?) at ./FHEM/99_Calendar_Utils.pm line 14. Global symbol "$month" requires explicit package name (did you forget to declare "my $month"?) at ./FHEM/99_Calendar_Utils.pm line 14. Global symbol "$day" requires explicit package name (did you forget to declare "my $day"?) at ./FHEM/99_Calendar_Utils.pm line 14. Global symbol "$year" requires explicit package name (did you forget to declare "my $year"?) at ./FHEM/99_Calendar_Utils.pm line 14. Global symbol "$m" requires explicit package name (did you forget to declare "my $m"?) at ./FHEM/99_Calendar_Utils.pm line 16. Global symbol "$d" requires explicit package name (did you forget to declare "my $d"?) at ./FHEM/99_Calendar_Utils.pm line 18. Global symbol "$m" requires explicit package name (did you forget to declare "my $m"?) at ./FHEM/99_Calendar_Utils.pm line 18. Global symbol "$y" requires explicit package name (did you forget to declare "my $y"?) at ./FHEM/99_Calendar_Utils.pm line 18. Unmatched right curly bracket at ./FHEM/99_Calendar_Utils.pm line 19, at end of line ./FHEM/99_Calendar_Utils.pm has too many errors.

In der Kommandozeile macht das my ($day, $month, $year) = (localtime)[3,4,5]; sprintf('%02d.%02d.%s',$month+1,$day,$year+1900) was ich will.

Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: betateilchen am 20 Januar 2023, 19:28:16
Hinter // solltest Du einfach keinen perl code zur Ausführung schreiben, das macht die Nachvollziehbarkeit extrem unübersichtlich.

Und schon gar nicht perl Code in Anführungszeichen - was soll das sein?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: JoWiemann am 20 Januar 2023, 19:35:25
Zitat von: betateilchen am 20 Januar 2023, 19:28:16
Hinter // solltest Du einfach keinen perl code zur Ausführung schreiben, das macht die Nachvollziehbarkeit extrem unübersichtlich.

Und schon gar nicht perl Code in Anführungszeichen - was soll das sein?

Und hier:

my ($d,$m,$y) = split(/\./,$v)}; ist definitiv die } zu viel.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: betateilchen am 20 Januar 2023, 19:37:17
Kommt davon, wenn man sich überall Code-Stücke zusammenklaut, um sie später dann irgendwo als seinen eigenen Code zu präsentieren...
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: JoWiemann am 20 Januar 2023, 19:55:21
Hallo,

warum vertauscht Du hier sprintf('%02d.%02d.%s',$month+1,$day,$year+1900) Monat und Tag?

und so funktioniert es:


sub wochentag{
   my $v = shift // sprintf('%02d.%02d.%s',(localtime)[3],(localtime)[4]+1,(localtime)[5]+1900);
   my ($d,$m,$y) = split(/\./,$v);
   $m -= 1;
   my @weekdays = qw(So Mo Di Mi Do Fr Sa);
   return $weekdays[((localtime(timelocal('0','0','0',$d,$m,$y)))[6])];
}



Grüße Jörg
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 20 Januar 2023, 20:44:02
ZitatKommt davon, wenn man sich überall Code-Stücke zusammenklaut, um sie später dann irgendwo als seinen eigenen Code zu präsentieren...

Heute schon das zweite mal, wo du zeigst das dein Wahrnehmungsvermögen was mich betrifft, völlig daneben liegt.

Zitat
warum vertauscht Du hier sprintf('%02d.%02d.%s',$month+1,$day,$year+1900) Monat und Tag?

Kennst du Diodon ? Hab mich eingedacht, war voll drin in dem Thema, hier und da meine eigenen Beispiele kopiert und das falsche Beispiel am Ende aus der Zwischenablage eingefügt/ausgewählt und nicht mehr bemerkt als ich hier das dann postete. Das mit der schliessenden Klammer hab ich danach auf festgestellt, das da ein Kopierfehler stattfand.
Ja so klappts jetzt wie ich mir das vorgestellt hatte.




Ich muss mich immer wieder eindenken wenn es um Zeiten geht, mich würds jetzt interessieren wie Isegrim bzw. Ihr euch das aktuelle Datum "ziehen" würden ?
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: JoWiemann am 20 Januar 2023, 20:46:18
Zitat von: TomLee am 20 Januar 2023, 20:44:02
Heute schon das zweite mal, wo du zeigst das dein Wahrnehmungsvermögen was mich betrifft, völlig daneben liegt.

Bitte an betateilchen adressieren-
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 20 Januar 2023, 20:53:07
Zitat von: JoWiemann am 20 Januar 2023, 20:46:18
Bitte an betateilchen adressieren-

Spatz, du warst gemeint.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: JoWiemann am 20 Januar 2023, 21:21:01
Zitat von: TomLee am 20 Januar 2023, 20:53:07
Spatz, du warst gemeint.

Verstehe ich nicht. Habe ich nicht gepostet:

Zitat
Kommt davon, wenn man sich überall Code-Stücke zusammenklaut, um sie später dann irgendwo als seinen eigenen Code zu präsentieren...


Und Spatz schon lange nicht. Lese ich als nicht positiv.
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: betateilchen am 20 Januar 2023, 21:24:32
Zitat von: JoWiemann am 20 Januar 2023, 21:21:01
Verstehe ich nicht.

Wahrscheinlich bist Du jetzt der Nächste, dem der Oberkasper "falsches Wahrnehmungsvermögen" vorwerden wird.

Popcorn?  8)
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: JoWiemann am 20 Januar 2023, 21:25:48
Zitat von: betateilchen am 20 Januar 2023, 21:24:32
Popcorn?  8)

Microwelle läuft
Titel: Antw:Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern
Beitrag von: TomLee am 21 Januar 2023, 18:05:25
Zitat von: JoWiemann am 20 Januar 2023, 21:21:01
Verstehe ich nicht. Habe ich nicht gepostet:

Zitat
Kommt davon, wenn man sich überall Code-Stücke zusammenklaut, um sie später dann irgendwo als seinen eigenen Code zu präsentieren...


Und Spatz schon lange nicht. Lese ich als nicht positiv.


Du warst definitiv nicht gemeint.




Oberkasper, find ich, ist genau das treffende Wort für das was ich die letzten Jahre hier im Forum oft gemacht habe. Sag ich mir auch oft bevor ich hier schreibe -> Wenn du nicht den Kasper machst und doof frägst wird sich in absehbarer Zeit mit hoher Wahrscheinlichkeit auch kein anderer finden/trauen.




Mich hat das mit dem aktuellen Datum weiter beschäftigt und das mit dem vermeiden von Perlcode nach den // der Nachvollziehbarkeit wegen.
Es bleibt ja nix anderes dann übrig wie den Perlcode in einer Variable vor der shift-Zeile zu deklarieren, um dann nur den Variablennamen nach den // anzugeben.
Vermutlich war das aber nicht so gemeint und ich bin noch auf eine andere Variante gekommen:
sub wochentag {
   my $v = shift;
   $v //= localtime->dmy('.');
   my ($d,$m,$y) = split(/\./,$v);
   my @weekdays = qw(So Mo Di Mi Do Fr Sa);
   return $weekdays[((localtime(timelocal('0','0','0',$d,$m-1,$y)))[6])];
}



edit: wie in #149 bereits vorgeschlagen  8)

edit2:
und jetzt noch die return-Zeile angepasst auf die Time::Piece Variante:
(die genauen Hintergründe warum mein System das use ... nicht braucht sind mir noch nicht ganz klar)


sub wochentag {
   my $v = shift;
   $v //= localtime->dmy('.');
   my ($d,$m,$y) = split(/\./,$v);
   my @weekdays = qw(So Mo Di Mi Do Fr Sa);
   return localtime(timelocal('0','0','0',$d,$m-1,$y))->day(@weekdays);
}


edit3: nach weiteren Gedanken noch eine Variante:
sub wochentag {
   my $v = shift;
   my @weekdays = qw(So Mo Di Mi Do Fr Sa);
   $v //= return localtime->day(@weekdays);
   return localtime(time_str2num(join '-', reverse split '\D', $v))->day(@weekdays);
   }


edit4:
vorausgesetzt das ich nicht irgendwas gravierendes übersehe, hier noch eine Variante für die hartnäckigen:

sub wochentag {
   my $v = shift;
   my @weekdays = qw(So Mo Di Mi Do Fr Sa);
   $v //= return localtime->day(@weekdays);
   return localtime(time_str2num(join q(-), reverse split m/[\D]/xms, $v))->day(@weekdays);
};


edit5:

sub wochentag {
   my $v = shift;
   my @weekdays = qw(So Mo Di Mi Do Fr Sa);
   #Time::Piece->use_locale(); # if set german locale, delete line above and (@weekdays) next lines
   $v //= return localtime->day(@weekdays);
   return Time::Piece->strptime($v, '%d.%m.%Y')->day(@weekdays);
}