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
Versuch Testweise
mqtt_d_hmswitch.button:.* {
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.
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.
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...
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
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!
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. ;)