[erledigt] Wieder mal notify !

Begonnen von PNinBB, 20 Mai 2023, 17:59:10

Vorheriges Thema - Nächstes Thema

PNinBB

Mein Problem betrifft den FHEM-Befehl 'notify'.
Basis: FHEM: aktuell; Raspi4 mit Linux 10 (buster).

Mein Anliegen: ich möchte beim Eintragen einer Zahl als 'state' in einen Dummy eine Perl-Routine starten. Ich habe viele ähnlich gelagerte Beispiele in meinem System, die schon lange funktionieren.
Konkret geht es um jeweils einen von zwei Dummies (du_Abwesend_Stunden, du_Ausflug_Stunden), die das Ziel eines solchen Eintrags sein können.

Dummy 'du_Abwesend_Stunden':
Internals:
  .FhemMetaInternals 1
  FUUID      5cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx25
  FVERSION  98_dummy.pm:0.256060/2022-02-01
  NAME      du_Abwesend_Stunden
  NR        502
  STATE      0
  TYPE      dummy
  eventCount 43
  .attraggr:
  .attreocr:
    state
  .attrminint:
  READINGS:
    2023-05-20 17:29:48  state          0
Attributes:
  alias      Abwesend Stunden:
  event-on-change-reading state
  group      AllgemeineEinstellungen
  icon      status_away_1.svg
  room      Einstellungen
  setList    state:slider,0,1,23
  sortby    02
  verbose    0
  webCmd    state

notify 'StundenWeg':
Internals:
  .COMMAND  { myPraesenzUtils_StundenEintrag ('-0',$EVENT) }
  .FhemMetaInternals 1
  DEF        (du_Abwesend_Stunden:.*|du_Ausflug_Stunden:.*) { myPraesenzUtils_StundenEintrag ($NAME,$EVENT) }
  FUUID      5cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxca
  FVERSION  91_notify.pm:0.258880/2022-03-27
  NAME      no_du_StundenWeg
  NOTIFYDEV  du_Abwesend_Stunden,du_Ausflug_Stunden
  NR        790
  NTFY_ORDER 50-no_du_StundenWeg
  REGEXP    (du_Abwesend_Stunden:.*|du_Ausflug_Stunden:.*)
  STATE      2023-05-20 17:24:25
  TRIGGERTIME 1684596265.66381
  TYPE      notify
  eventCount 13
  .attraggr:
  .attrminint:
  READINGS:
    2023-05-20 17:24:14  state          active
    2023-05-20 17:24:25  triggeredByDev  du_Abwesend_Stunden
    2023-05-20 17:24:25  triggeredByEvent 11
Attributes:
  group      notify
  icon      edit_paste.svg
  room      Timer
  verbose    0
Nun muss ich natürlich in der Perl-Ruotine je nach auslösendem Dummy spezifisch reagieren können; und damit bin ich beim Problem.
Mein Ansatz war: mit '$NAME' bekomme ich den Namen des 'Gerätes' (hier des Dummy) und mit '$EVENT' die Zahl der Stunden.
Verwende ich nur '$EVENT' beim Aufruf, dann geht es und ich habe die Stunden, verwende ich '$NAME', dann geht es nicht, genauer es ist zwar im Eventmonitor ein Ereignis zu sehen, aber das 'notify' triggert nicht ! Auch mit beiden Parametern geht es nicht.
Ich habe mir auch über den Eventmonitor ein 'notify' "bauen lassen"; aber das Ergebnis ist wie oben beschrieben.
Meine Vermutung: '$NAME' gilt nur für Geräte und nicht für Dummies. Bezogen auf den Kontext, kann ich es zwar nicht verstehen, aber sicherlich weiss ich zu wenig!!
Oder, mache ich einen ganz anderen Fehler !?
Für einen Tipp herzlichen Dank im Voraus.
Peter
P.S.: "Hilfslösungen" habe ich natürlich parat !
Raspi 4B + RaZberry2 (Deb 10), FritzBox 7490;
AEOTec: KeyFobGen5: 1x;
Danfoss: Living Connect 2.51: 3x;
Fibaro: FGK: 10x: 3x; FGBS: 001: 8x, 222: 1x; FGMS001: 2x; FGR: 222: 3x, 223: 2x; FGRGBWM-441: 1x; FGBS: 222: 2x, 223: 2x,224: 1x;
Philio: PAN06-1A: 3x;

MadMax-FHEM

$NAME geht auch bei dummy...

Steht etwas im fhem Log?

Wie sieht denn die Sub myPraesenzUtils_StundenEintrag aus?

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

PNinBB

Besten Dank für die schnelle Reaktion !!
Die erste Zeile ist schon einmal beruhigend !

ZitatSteht etwas im fhem Log?
Falls ich nur mit '$EVENT' rufe, kommt die Startmeldung aus der Routine und alles ist so, wie ich es erwarte (weiteres habe ich noch nicht programmiert).
Falls ich mit '$NAME' und '$EVENT' rufe, erscheint nichts im Log.
Wenn ich kurz auf 'verbose = 5' schalte, gibt es nur ein paar Zeile von Relevanz:
2023.05.20 19:46:07.457 4: WEBSSL_79.196.159.180_52374 POST /fhem?cmd=set%20du_Abwesend_Stunden%206&XHR=1&fwcsrf=1&fw_id=1684604765.09218; BUFLEN:0
2023.05.20 19:46:07.458 5: Cmd: >set du_Abwesend_Stunden 6<
2023.05.20 19:46:07.459 5: Starting notify loop for du_Abwesend_Stunden, 1 event(s), first is 6
2023.05.20 19:46:07.460 5: createNotifyHash
[b]2023.05.20 19:46:07.491 5: Cmd: >{ myPraesenzUtils_StundenEintrag ($NAME,$EVENT) }<[/b]
2023.05.20 19:46:07.496 5: End notify loop for du_Abwesend_Stunden
2023.05.20 19:46:07.496 4: WEBSSL: /fhem?cmd=set%20du_Abwesend_Stunden%206&XHR=1&fwcsrf=1&fw_id=1684604765.09218 / RL:20 / text/plain; charset=UTF-8 / Content-Encoding: gzip
 / Cache-Control: no-cache, no-store, must-revalidate
Bezüglich der Subroutine habe ich nur die ersten Zeilen:
sub myPraesenzUtils_StundenEintrag ($$)
 {
  my ($hash) = @_;
  my $modulName = 'myPraesenzUtils_StundenEintrag';
  Log3 $hash, 3, "$modulName started mit: |$_[0]|, |$_[1]|";
  . . . .
Also, nichts aufregendes, oder ?
Wenn es also gehen müsste, werde ich weiter suchen, aber nicht mehr heute !
Schönen Abend !
Peter
Raspi 4B + RaZberry2 (Deb 10), FritzBox 7490;
AEOTec: KeyFobGen5: 1x;
Danfoss: Living Connect 2.51: 3x;
Fibaro: FGK: 10x: 3x; FGBS: 001: 8x, 222: 1x; FGMS001: 2x; FGR: 222: 3x, 223: 2x; FGRGBWM-441: 1x; FGBS: 222: 2x, 223: 2x,224: 1x;
Philio: PAN06-1A: 3x;

MadMax-FHEM

my ($hash) = @_; -> my ($name, $event) = @_;
(2 Parameter übergeben -> 2 Parameter "abfragen" / alternativ: shift ohne einen "Prototypen", also ohne ($$) )

Damit sollte dann in $name der $NAME stehen und in $event $EVENT

Wenn du mit ($$) einen Aufruf mit nur einem Parameter machst, also myPraesenzUtils_StundenEintrag($EVENT) müsste was im Log stehen, bzw. bei Eingabe über FhemWeb/Codemirror sogar eine Fehlermeldung kommen.

Sub benötigt laut Prototyp 2 Parameter, ein Aufruf wie myPraesenzUtils_StundenEintrag($EVENT) ist aber nur ein Parameter...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

PNinBB

#4
Guten Morgen und besten Dank !
ZitatWenn du mit ($$) einen Aufruf mit nur einem Parameter machst, also myPraesenzUtils_StundenEintrag($EVENT) müsste was im Log stehen, bzw. bei Eingabe über FhemWeb/Codemirror sogar eine Fehlermeldung kommen.

Sub benötigt laut Prototyp 2 Parameter, ein Aufruf wie myPraesenzUtils_StundenEintrag($EVENT) ist aber nur ein Parameter...
Ich habe mit mehreren Varianten experimentiert; natürlich muss die Zahl und Reihenfolge der Parameter übereinstimmen und bei Fehlern kommt auch - wie von Dir bemerkt - die Fehlermeldung im Log.
In meinem ersten 'list ..' steht auch ein Beispiel mit einer Konstanten, eben nur zu Testzwecken.
Das verrückte ist nun, das es geht !!
Aber nur mit einem Aufruf wie folgt:
(du_Abwesend_Stunden:.*|du_Ausflug_Stunden:.*) { myPraesenzUtils_StundenEintrag ($EVENT,$NAME) }und nicht mit:
(du_Abwesend_Stunden:.*|du_Ausflug_Stunden:.*) { myPraesenzUtils_StundenEintrag ($NAME,$EVENT) }und das reproduzierbar !
Vorher habe ich anderes probiert und auch den Raspi neu gestartet. In mehreren, ganz anderen Beispielen habe ich immer die Reihenfolge '$NAME,$EVENT' genutzt, aber eigentlich mehr aus Gewohnheit.
Bisher habe ich immer die These vertreten, dass die "Welt erkennbar" ist, aber langsam kommen mir Zweifel !
Nachtrag: das gleiche Verhalten zeigt sich, wenn ich mit 'trigger' auslöse.
Vielen Dank und schönen Sonntag !
Peter
Raspi 4B + RaZberry2 (Deb 10), FritzBox 7490;
AEOTec: KeyFobGen5: 1x;
Danfoss: Living Connect 2.51: 3x;
Fibaro: FGK: 10x: 3x; FGBS: 001: 8x, 222: 1x; FGMS001: 2x; FGR: 222: 3x, 223: 2x; FGRGBWM-441: 1x; FGBS: 222: 2x, 223: 2x,224: 1x;
Philio: PAN06-1A: 3x;

MadMax-FHEM

#5
Hast du den Code in der Sub geändert?

EDIT: (nur weil eine Variable hash heißt ist es noch keiner, falls das dein Ansatz war ;) Und du "stopfst" ja keinen hash rein, sondern 2 Variablen! $NAME und $EVENT [beides Zeichenketten])

Also bei mir geht auch sub($NAME, $EVENT) und auch mit dummy...
EDIT: korrigiere, kein dummy als auslösendes Device, zumindest nicht bei meiner "Schnellsuche". Hmmm. Evtl. probiere ich das mal. Trotzdem bleibt die Frage: hast du angepasst? Alternativ kann man ja auch zunächst mal per Log ausgeben was in $NAME und $EVENT steht. Würde mich allerdings wundern, wenn da $NAME nicht gesetzt wäre... Und der Name hash einer Variablen macht sie nicht automatisch zu einem ;)

EDIT: also eben mit deinem dummy (gut erst mal nur einem, habe ja nur die DEF von einem ;)  ) (den 2ten einfach "identisch") nachgebaut und mit meiner "Variablenauswertung" in der Sub geht es einwandfrei!
Hier der dummy1:
Internals:
   CFGFN     
   FUUID      6469d8ac-f33f-ff8d-a2b5-96bfddeada9752cf
   NAME       du_Abwesend_Stunden
   NR         31052
   STATE      state 0
   TYPE       dummy
   eventCount 1
   READINGS:
     2023-05-21 10:44:21   state           state 0
Attributes:
   room       Test
   setList    state:slider,0,1,23
   webCmd     state

Hier dummy2:
Internals:
   CFGFN     
   FUUID      6469daf8-f33f-ff8d-607e-de89f81910b2033d
   NAME       du_Ausflug_Stunden
   NR         31210
   STATE      state 1
   TYPE       dummy
   eventCount 2
   READINGS:
     2023-05-21 10:50:26   state           state 1
Attributes:
   room       Test
   setList    state:slider,0,1,23
   webCmd     state

Hier das notify:
Internals:
   CFGFN     
   DEF        du_Abwesend_Stunden:.*|du_Ausflug_Stunden:.* {myTest($NAME, $EVENT)}
   FUUID      6469d9d1-f33f-ff8d-120f-eeae6885a56271e6
   NAME       nTest2
   NOTIFYDEV  du_Abwesend_Stunden
   NR         31135
   NTFY_ORDER 50-nTest2
   REGEXP     du_Abwesend_Stunden:.*
   STATE      2023-05-21 10:44:21
   TRIGGERTIME 1684658662.00524
   TYPE       notify
   eventCount 1
   READINGS:
     2023-05-21 10:44:01   state           active
     2023-05-21 10:44:21   triggeredByDev  du_Abwesend_Stunden
     2023-05-21 10:44:21   triggeredByEvent state 0
Attributes:
   room       Test
(ich habe sogar deine Variante mit Klammern "(du_Abwesend_Stunden:.*|du_Ausflug_Stunden:.*)" verwendet um sicher zu gehen, geht aber genauso / sind unnötig)

Hier die Sub:
sub myTest($$)
{
  my ($Device,$Event) = @_;
 
  Log3(undef, 1, "myTest Device: $Device, Event: $Event");
}
Und das steht im Log:
Zitat2023.05.21 10:44:22 1: myTest Device: du_Abwesend_Stunden, Event: state 0
2023.05.21 10:50:20 1: myTest Device: du_Ausflug_Stunden, Event: state 0
2023.05.21 10:50:26 1: myTest Device: du_Ausflug_Stunden, Event: state 1
2023.05.21 10:50:35 1: myTest Device: du_Abwesend_Stunden, Event: state 3

Allerdings dann eben mit meiner Variante der "Parameterauslesung"...

Eine Anmerkung noch: das state-Reading ist bzgl. Events "speziell"...

Weitere Anmerkung: warum 2 dummy? Und nicht einen (oder gar keinen) und dann mittels setList Readings setzen oder gleich mittels setreading. Dann sind die Events "eindeutiger" und das notify "schärfer" und verm. in $EVTPART1 das drin was du brauchst...
EDIT: Gut was du hier wohl willst ist damit (evtl.) nicht ganz so einfach. Und es geht (wie oben zu sehen) ja auch mit 2 dummy und $NAME, $EVENT in der Sub.

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

PNinBB

ZitatHast du den Code in der Sub geändert?
Nein !!
Ich habe zwei andere Probleme, da geht es in der Reihenfolge ($NAME, $EVENT) schon seit langer Zeit problemlos.
Was die Anzahl der Dummies betrifft, hängt es mit der Komplexität des Problems zusammen; könnte man sicher auch so machen.
Was mich noch beunruhigt (und das macht dden Unterschied zu den anderen Problemen aus) ist, dass ich in dem Ablauf zweimal aus bestimmten Gründen 'Web_Refresh' einsetze. Ich habe es zwar auch schon rausgenommen; das Ergebnis war genauso negativ.
Ich überlege eben, was ist bei mir in diesem Fall anders! Ich werde erst einmal ein Glas badischen Wein trinken, vielleicht bekomme ich da eine 'Inspiration' !
Schönen Sonntag und Danke
Peter
Raspi 4B + RaZberry2 (Deb 10), FritzBox 7490;
AEOTec: KeyFobGen5: 1x;
Danfoss: Living Connect 2.51: 3x;
Fibaro: FGK: 10x: 3x; FGBS: 001: 8x, 222: 1x; FGMS001: 2x; FGR: 222: 3x, 223: 2x; FGRGBWM-441: 1x; FGBS: 222: 2x, 223: 2x,224: 1x;
Philio: PAN06-1A: 3x;

MadMax-FHEM

#7
Leider hast du nicht die ganze Sub gepostet...

Wie siehst du, dass es geht und nicht geht?

Ich denke ja trotzdem, dass deine Variablenauswertung/Übergabe "fehlerhaft" ist...

Weil ich schätze in $hash steht halt mal der Event und mal der Devicename, je nachdem wie du aufrufst...

Wenn du bei deinem Code bleiben willst, dann bin ich raus...
...bzw. geht meine Variante immer und überall -> reproduzierbar zuverlässig...

EDIT: alternativ wird eh propagiert ohne "Prototyp" zu arbeiten und Parameter mittels shift zu übernehmen (widerstrebt mir allerdings ;) )

EDIT: ich hab noch ein wenig gesucht und du greifst ja irgendwie per $_[0] bzw. $_[1] / habe hier https://de.wikibooks.org/wiki/Perl-Programmierung:_Einfache_Beispiele und hier mal gelesen https://stackoverflow.com/questions/1757918/should-i-use-0-or-copy-the-argument-list-in-perl und einmal wird tatsächlich ein hash auch übergeben in dem ersten Link Scalare (?) und nie ein Prototyp (mag unwichtig sein). Wenn ich umbaue auf "ohne Prototyp" und ohne my ($hash) = @_ oder irgendwelche Abfrage, dann erreiche ich mit folgender Sub:
sub myTest
{
#  my ($Device,$Event) = @_;
 
  Log3(undef, 1, "myTest Device: $_[0], Event: $_[1]");
}
dieselben Logausgaben, also Device-Name und Event-Inhalt...
Aber selbst wenn ich das my ($hash) = @_ drin habe geht es...
Hmmm, irgendwas ist bei dir "anders"/"komisch". Egal was ich probiere bei mir geht es... :)
Aber wie geschrieben: ohne zu wissen was deine Sub sonst noch macht und woran du festmachst, dass es geht/nicht geht wird es schwierig... 8)

Achja: Die FUUID zu "entstellen" ist nicht notwendig ;) Damit kann keiner was anfangen, das ist eine lokal bei dir von fhem generierte UUID, damit fhem das Device eindeutig erkennen kann, selbst, wenn du es umbenennst (manche Module brauchen das: z.B. Alexa)...

EDIT: es gibt auch ein Perl-Code-Unterforum, evtl. wenn du dahin verschiebst, vielleicht fällt jemandem was auf? Weil an notify und dummy liegt es eher nicht (weil egal wie ich es mache: es geht)...

Viel Erfolg, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

PNinBB

Danke erneut für die Geduld und den Wunsch für Erfolg !
Der Erfolg ist da, aber ich weiss nicht warum !!??
Was habe ich gemacht:
1. alle damit zusammenhängenden 'dummy' und 'notify' gelöscht und FHEM neu gestartet.
2. diese Elemente neu definiert und entsprechende Werte und Attribute gesetzt.
Von da ab ging alles wie erwartet.
Ich habe dann die vorherige fhem.cfg und die 'neue' verglichen, Ergebnis: nur ein Unterschied, bei den beteiligten Dummies hatte ich vorher 'event-on-change-reading' gesetzt.
Da ich die 'state'-Werte der Dummies mit 'setreading ...' einstelle, entstehen dann (eventuell) zwei Events !? Im Eventmonitor habe ich aber nichts dergleichen gefunden. Wenn die These stimmt, könnte es zu Problemen kommen, wenn die beteiligten Module nicht 'wiedereintrittsfähig' sind. Aber das ist nur eine Spekulation.
Denn ich habe auch in der nun lauffähigen Version entsprechende 'event-on-change-reading' gesetzt und es geht trotzdem!!??
Ich habe sie wieder rausgenommen, da ja lt. Commandref setreading ein Event erzeugt.
Noch ein paar Antworten auf deine Fragen:
ZitatLeider hast du nicht die ganze Sub gepostet...
Was ich unterdrückt hatte, waren nur Leerzeilen und das abschliessende 'return'.
ZitatWie siehst du, dass es geht und nicht geht?
Einfach, erscheint der Logeintrag mit den richtigen Übergabeparametern oder eben nicht, d.h. in diesem Fall gab es gar keine Logeinträge.
Deinen Hinweisen bin ich nachgegangen und einiges gelesen; ich habe auch verschiedenes mit der Parameterübergabe probiert: alles wie bei Dir: es geht !!
Ich bin zwar nur bedingt zufrieden, da ich es nicht erklären kann.
Auf jeden Fall nochmals besten Dank für deine Geduld.
Peter
Raspi 4B + RaZberry2 (Deb 10), FritzBox 7490;
AEOTec: KeyFobGen5: 1x;
Danfoss: Living Connect 2.51: 3x;
Fibaro: FGK: 10x: 3x; FGBS: 001: 8x, 222: 1x; FGMS001: 2x; FGR: 222: 3x, 223: 2x; FGRGBWM-441: 1x; FGBS: 222: 2x, 223: 2x,224: 1x;
Philio: PAN06-1A: 3x;

MadMax-FHEM

Hmm, ja eigenartig...

Aber wenn's geht -> [gelöst] oder [erledigt] vorne an den ersten Post, danke :)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)