Notify reagiert nicht

Begonnen von DetlefR, 23 Februar 2022, 21:47:44

Vorheriges Thema - Nächstes Thema

DetlefR

Hallo,

ich habe ein Notify das reagiert einfach nicht mehr. Dabei hat es aber schon einmal funktioniert.
Der Reihe nach.
ein MQTT_DEVICE bekommt Meldungen von Homematic Schaltern.

Internals:
   FUUID      5ecf98ea-f33f-6f56-edbb-f0a18087bd4cfa8c
   IODev      rabbit
   NAME       mqtt_d_hmswitch
   NR         59
   STATE      HM_58872E_Btn_02 Short
   TYPE       MQTT_DEVICE
   OLDREADINGS:
   READINGS:
     2022-02-23 21:24:45   58872E01        LongRelease 0
     2022-02-23 21:24:53   58872E02        Short 2
     2022-02-23 21:24:53   button          HM_58872E_Btn_02 Short
     2022-02-23 21:24:53   transmission-state incoming publish received
   helper:
     bm:
       MQTT::DEVICE::Attr:
         cnt        1
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        23.02. 21:14:13
         max        0.0162479877471924
         tot        0.0162479877471924
         mAr:
           del
           mqtt_d_hmswitch
           subscribeReading_battery_58872E
       MQTT::DEVICE::Set:
         cnt        200
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        23.02. 20:24:05
         max        0.000176906585693359
         tot        0.012718677520752
         mAr:
           HASH(0x2dc3df8)
           mqtt_d_hmswitch
           ?
   message_ids:
   sets:
   subscribe:
     stat/hmswitch/state
   subscribeExpr:
     ^stat\/hmswitch\/state$
   subscribeQos:
     stat/hmswitch/state 0
   subscribeReadings:
     stat/hmswitch/state:
       cmd       
       name       button
Attributes:
   IODev      rabbit
   room       Räume->Mitte->Bad,z-functional->mqtt->sonstige
   stateFormat button
   subscribeReading_button stat/hmswitch/state

Um die Meldungen besser benutzen zu können, zerlegt ein Notify sie in Readings.

Internals:
   DEF        mqtt_d_hmswitch:button:.* {
#HM_58872E_Btn_02 Short
#CMDs_done
return undef if ($EVTPART1 !~ /^HM/i);
my @button = split /_/,$EVTPART1;
my @evt = split / /,$EVENT;
#Log 1, $EVENT;
my $age = ReadingsAge($NAME,$button[1].$button[3],10);
readingsSingleUpdate( $defs{$NAME},$button[1].$button[3],$evt[2]." ".$age,1);
    #AnalyzeCommand(undef,"trigger $NAME $button[1]$button[3]: $evt[2] $age");
return undef;
}
   FUUID      62122731-f33f-6f56-9038-4ba0020fe2ced008
   NAME       n_hmswitch
   NOTIFYDEV  mqtt_d_hmswitch
   NR         426
   NTFY_ORDER 50-n_hmswitch
   REGEXP     mqtt_d_hmswitch:button:.*
   STATE      2022-02-23 21:04:29
   TRIGGERTIME 1645646669.43116
   TYPE       notify
   READINGS:
     2022-02-23 21:01:21   state           active
   helper:
     bm:
       notify_Define:
         cnt        6
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        23.02. 20:57:27
         max        0.177281141281128
         tot        0.757739305496216
         mAr:
           HASH(0x3de5d88)
           n_hmswitch notify mqtt_d_hmswitch:button:.* {
#HM_58872E_Btn_02 Short
#CMDs_done
return undef if ($EVTPART1 !~ /^HM/i);
my @button = split /_/,$EVTPART1;
my @evt = split / /,$EVENT;
#Log 1, $EVENT;
my $age = ReadingsAge($NAME,$button[1].$button[3],10);
readingsSingleUpdate( $defs{$NAME},$button[1].$button[3],$evt[2]." ".$age,1);
    AnalyzeCommand(undef,"trigger $NAME $button[1]$button[3]: $evt[2] $age");
return undef;
}
       notify_Exec:
         cnt        218
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        23.02. 21:04:27
         max        0.299685001373291
         tot        0.926084995269775
         mAr:
           HASH(0x3de5d88)
           HASH(0x2dc3df8)
       notify_Set:
         cnt        17
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        23.02. 20:57:08
         max        0.000131130218505859
         tot        0.00163173675537109
         mAr:
           HASH(0x3de5d88)
           n_hmswitch
           ?
Attributes:
   room       z-functional->notify

Das mit dem Trigger am Ende war ein Versuch. Hat aber auch nichts gebracht.
Soweit funktioniert auch noch alles. Dieses Notify wird angesprochen, die Readings angelegt/geändert und die passenden Events sind auch im Monitor zusehen.
Dann kommt aber das nächste Notify.

Internals:
   DEF        mqtt_d_hmswitch:58872E.*:.* {
    Log 1, "Hier bin ich ".$EVENT;
return undef if ($EVTPART2<2);
if ($EVTPART1 =~ /short/i ){
AnalyzeCommand(undef,"set mqtt_d_dha1c4 toggle");
AnalyzeCommand(undef,"defmod at_n_hmbad at +00:00:30 {return undef;}");
}elsif($EVTPART1 =~ /long/i){
AnalyzeCommand(undef,"set mqtt_d_z_led00 on-for-timer 35");
AnalyzeCommand(undef,"defmod at_n_hmbad at +00:00:30 set mqtt_d_dha1c4 off");
}
return undef;
}
   FUUID      62168507-f33f-6f56-220f-6da2e130edb82cdd
   NAME       n_hmbad
   NOTIFYDEV  mqtt_d_hmswitch
   NR         429
   NTFY_ORDER 50-n_hmbad
   REGEXP     mqtt_d_hmswitch:58872E.*:.*
   STATE      active
   TYPE       notify
   READINGS:
     2022-02-23 21:02:05   state           active
   helper:
     bm:
       notify_Define:
         cnt        9
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        23.02. 20:38:57
         max        0.173310995101929
         tot        1.25672888755798
         mAr:
           HASH(0x3dea050)
           n_hmbad notify mqtt_d_hmswitch:58872E.*:.* {
    Log 1, "Hier bin ich";
return undef if ($EVTPART2<2);
$EVTPART0 =~ s/://;
if ($EVTPART1 =~ /short/i ){
AnalyzeCommand(undef,"set mqtt_d_dha1c4 toggle");
AnalyzeCommand(undef,"defmod at_n_hmbad at +00:00:30 {return undef;}");
}elsif($EVTPART1 =~ /long/i){
AnalyzeCommand(undef,"set mqtt_d_z_led00 on-for-timer 35");
AnalyzeCommand(undef,"defmod at_n_hmbad at +00:00:30 set mqtt_d_dha1c4 off");
}
return undef;
}
       notify_Exec:
         cnt        240
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        23.02. 20:34:09
         max        0.000741004943847656
         tot        0.0415263175964355
         mAr:
           HASH(0x3dea050)
           HASH(0x2dc3df8)
       notify_Set:
         cnt        35
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        23.02. 20:47:47
         max        0.00765609741210938
         tot        0.0183069705963135
         mAr:
           HASH(0x3dea050)
           n_hmbad
           inactive
Attributes:
   room       z-functional->notify

Wie gesagt. Es hat schon mal funktioniert. Jetzt kommt aber keine Reaktion mehr.
Ich habe schon versucht im Eventmonitor ein neues Notify aus diesem Event zu erstellen. Das reagiert auch nicht.
Mit andere Events funktioniert es aber.

Gruß
Detlef

CoolTux

#1
Versuch Testweise
mqtt_d_hmswitch.button:.* {
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Beta-User

notify-"Ketten" auf dasselbe Device mit Änderung von Readings in dem Device sind tricky, man muss die Namen der Eventhandler passend wählen. Benenne den "späteren" mal  so um, dass er bei list TYPE=notify hinter dem anderen kommt.
Insgesamt sollte man das m.E. anders lösen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

rudolfkoenig

ZitatInsgesamt sollte man das m.E. anders lösen.
Z.Bsp. mit userReadings.
Und wenn man eh alles umbaut, kann man auch ueber eine Migration von MQTT auf MQTT2 nachdenken.
Oder Homematic ohne den MQTT-Umweg nach FHEM zu holen.

Kurzfristig ist aber die passende Umbenennung aller notifies wie vom Beta-User geschrieben die einfachste Loesung.

Beta-User

Zitat von: rudolfkoenig am 24 Februar 2022, 09:55:38
Z.Bsp. mit userReadings.
OT: Hatte es verworfen, das Stichwort zu erwähnen, denn ich sah das Problem, dass das gewünschte Reading hier ja nicht unbedingt bereits namentlich bekannt ist. D.h. man muss entweder alle Varianten vorher bereits kennen und kann dann alle "auscodieren" (muss aber auch immer alle evaluieren), oder übersehe ich dabei mal wieder was?

@TE
MQTT2_DEVICE kann auch als "Dispatcher" dienen, ich mache sowas z.B. mit MiLight-Fernbedienungen. Wenn du unbedingt bei "MQTT-classic" bleiben wolltest, wäre MQTT_GENERIC_BRIDGE eine Variante, um dynamisch direkt Perl-Code anflanschen zu können, allerdings würde ich dann einen dummy als "Anknüpfungspunkt" wählen...

Generell scheint mir aber die "Verpackung" auf der Gegenstelle das eigentliche Thema zu sein, egal ob jetzt mit oder ohne MQTT...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

DetlefR

Der Tip mit der Reihenfolge der Notify war hilfreich. Nach Umbenennen und Neustart hat das Notify wieder funktioniert. Ich werde den zweiten Teil aber in einen Dummy auslagern.
Dass Events, die von dem Device ausgewertet werden sollen, von dem sie erzeugt wurden, so problematisch sind, war mir noch nicht bewusst. Aber man lernt ja nie aus.

Danke für die Unterstützung


Beta-User

Zitat von: DetlefR am 24 Februar 2022, 15:23:14
Ich werde den zweiten Teil aber in einen Dummy auslagern.
Das klingt gruselig ::) ...

Aber vielleicht zeigst du uns dann deine Lösung, wenn du sie dahingehend erfolgreich umgebaut hast.

ZitatDanke für die Unterstützung
Gerne!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

DetlefR

ZitatAber vielleicht zeigst du uns dann deine Lösung, wenn du sie dahingehend erfolgreich umgebaut hast.

Das erste Notify schreibt jetzt die Readings in einen Dummy.

mqtt_d_hmswitch:button:.* {
#HM_58872E_Btn_02 Short
#CMDs_done
return undef if ($EVTPART1 !~ /^HM/i);
my $dummy="d_hmswitch";
my @button = split /_/,$EVTPART1;
my @evt = split / /,$EVENT;
#Log 1, $EVENT;
my $age = ReadingsAge($dummy,$button[1].$button[3],10);
readingsSingleUpdate( $defs{$dummy},$button[1].$button[3],$evt[2]." ".$age,1);
return undef;
}


Dieses triggert dann das zweite Notify.

d_hmswitch:58872E.*:.* {
    #Log 1, "Hier bin ich ".$EVENT;
return undef if ($EVTPART2<2);
if ($EVTPART1 =~ /short/i ){
AnalyzeCommand(undef,"set mqtt_d_dha1c4 toggle");
AnalyzeCommand(undef,"defmod at_n_hmbad at +00:00:30 {return undef;}");
}elsif($EVTPART1 =~ /long/i){
AnalyzeCommand(undef,"set mqtt_d_z_led00 on-for-timer 35");
AnalyzeCommand(undef,"defmod at_n_hmbad at +00:00:30 set mqtt_d_dha1c4 off");
}
return undef;
}


Aber vielleicht war sowieso alles umsonst. Der "WAF" für diese Schalter ist äußerst gering. Wenn ich nicht finde, wie man die Zeiten für "Short" verlängern kann, sind sie raus. ;)