neue Version von 10_MQTT_GENERIC_BRIDGE, mqttpublish funktionieren nicht mehr

Begonnen von Fs79, 21 März 2021, 22:26:48

Vorheriges Thema - Nächstes Thema

Fs79

Servus zusammen,

nutze MQTT_GENERIC_BRIDGE mit "mqttpublish" in meinen Geräten.
Wenn ich die neueste Version mit einem Update einspiele, funktioniert das nicht mehr.
# 04.03.2021 1.4.0
# change     : perl critic fixes by Beta-User

Dieser Code Change (1.4.0) führt bei mir zu dem Fehler mit den nicht funktionierenden mqttpublish.

Eine Rücksetzung auf folgende Version hilft bei mir.
# 16.02.2021 1.3.3
# fix:       : fix cref by Beta-User
#


Wer kann da helfen?
Laut der Datei wohl @hexenmeister.

VG
Frank

Beta-User

Kannst du etwas mehr Infos liefern?

Habe diese hier am Start, und es wird auch weiter gepublisht:
10_MQTT_GENERIC_BRIDGE.pm 24029 2021-03-21 01:43:41Z hexenmeister(Hier mit MQTT2_SERVER, aber das sollte keinen Unterschied machen?)

Interessant wären die Einstellungen an mind. einem Gerät, das nicht so weiter publisht wie du das haben willst, und an der MGB selbst sowie Infos zum verwendeten Interface.

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Fs79

Ich nutze normalerweise das:
define MQTT_loxberry MQTT 127.0.0.1:1883
define mqttGenericBridge MQTT_GENERIC_BRIDGE
attr mqttGenericBridge IODev MQTT_loxberry
attr mqttGenericBridge room B MQTT
attr mqttGenericBridge stateFormat dev: device-count in: incoming-count out: outgoing-count


Und beim Gerät folgendes
attr fakeRoku01_dummy mqttPublish 1:topic=loxb01/fhem/sensor/fakeroku01/1\
2:topic=loxb01/fhem/sensor/fakeroku01/2\
3:topic=loxb01/fhem/sensor/fakeroku01/3\
4:topic=loxb01/fhem/sensor/fakeroku01/4\
5:topic=loxb01/fhem/sensor/fakeroku01/5\
6:topic=loxb01/fhem/sensor/fakeroku01/6\
7:topic=loxb01/fhem/sensor/fakeroku01/7\
8:topic=loxb01/fhem/sensor/fakeroku01/8\
9:topic=loxb01/fhem/sensor/fakeroku01/9\
10:topic=loxb01/fhem/sensor/fakeroku01/10


Habs jetzt auch mit MQTT2_CLIENT probiert, geht mit der neuen Version aber auch nicht.
Mit der alten Version klappt es mit beiden als IO_DEV für die MQTT_GENERIC_BRIDGE.

Beta-User

Danke erst mal für die Infos.

Das ist und bleibt strange. Habe eben folgendes getestet:

defmod fakeRoku01_dummy dummy
attr fakeRoku01_dummy mqttGB1Publish 1:topic=MGB1/fhem/sensor/fakeroku01/1\
2:topic=MGB1/fhem/sensor/fakeroku01/2\
3:topic=MGB1/fhem/sensor/fakeroku01/3\
4:topic=MGB1/fhem/sensor/fakeroku01/4\
5:topic=MGB1/fhem/sensor/fakeroku01/5\
6:topic=MGB1/fhem/sensor/fakeroku01/6\
7:topic=MGB1/fhem/sensor/fakeroku01/7\
8:topic=MGB1/fhem/sensor/fakeroku01/8\
9:topic=MGB1/fhem/sensor/fakeroku01/9\
10:topic=MGB1/fhem/sensor/fakeroku01/10
attr fakeRoku01_dummy readingList 1 2 3 4 5 6 7 8 9 10

setstate fakeRoku01_dummy 2021-03-22 06:56:31 1 test

Auf der MQTT-Seite kommt das erwartete Ergebnis an, wenn ich
set fakeRoku01_dummy 1 test
set fakeRoku01_dummy 1 2.4

ausführe (das andere Präfixe hat m.E. keinen Einfluss, und auch wenn ich dem noch eine setList spendiere, bleibt das Ergebnis erwartungsgemäß gleich).
(EDIT: verschluckten Zeilenumbruch ergänzt).
Fragen:
- Hattest du ein Komplettupdate gemacht und bist sicher, dass insgesamt neue Moduldateien da sind?
- Was ist das für ein Perl bzw. Betriebssystem (Versionsnummern, Perl geht z.B. über fheminfo)?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Fs79

FHEMINFO
ConfigType: configFile
SVN rev: 24029
OS: linux
Perl: 5.28.1


Es funktioniert bis zum FakeRoku alles, es wird aber nichts per MQTT gesendet.
Hab auch ein Komplettupdate gemacht, es ging nicht.
Dann zurückrüsten des MGB Moduls und es ging wieder.

Beta-User

Sehr seltsam, hätte vermutet, das ist ein älteres Perl.

Wie "befüllst" du denn den dummy und kannst du mal ein komplettes list von diesem Device liefern?

Das scheint ja die Schnittstelle zu sein, mit der du was an loxone sendest, oder wird damit auch empfangen und der Empfang soll quittiert werden? Dann müßte das mqttForward-Attribut auf "all" gesetzt werden, da dummy (und es wäre ein bug gewesen, wenn es vorher geklappt hat...).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Fs79

Ich sende nur den Status an MQTT, der dann an Loxone gesendet wird.
Passieren tut folgendes:
Harmony Remote drückt eine Taste, geht dann ans Gerät FakeRoku.
FakeRoku hört drauf und führt ein Notify auf eine Funktion aus:
define fakeRoku01_01 notify fakeRoku01:keypress:.Up { set_key_fakeroku01("1") }
define fakeRoku01_02 notify fakeRoku01:keypress:.Home { set_key_fakeroku01("2") }
define fakeRoku01_03 notify fakeRoku01:keypress:.Left { set_key_fakeroku01("3") }
define fakeRoku01_04 notify fakeRoku01:keypress:.Info { set_key_fakeroku01("4") }
define fakeRoku01_05 notify fakeRoku01:keypress:.Right { set_key_fakeroku01("5") }
define fakeRoku01_06 notify fakeRoku01:keypress:.Play { set_key_fakeroku01("6") }
define fakeRoku01_07 notify fakeRoku01:keypress:.Down { set_key_fakeroku01("7") }
define fakeRoku01_08 notify fakeRoku01:keypress:.Search { set_key_fakeroku01("8") }
define fakeRoku01_09 notify fakeRoku01:keypress:.Fwd { set_key_fakeroku01("9") }
define fakeRoku01_10 notify fakeRoku01:keypress:.Rev { set_key_fakeroku01("10") }


Funktion set_key_fakeroku

set_key_fakeroku01($) {
        my ($key) = @_;
        my $dummy = "fakeRoku01_dummy" ;
#       Log(3,"key: $key") ;
#       Log(3,"dummy: $dummy") ;
        fhem "set $dummy $key 1 ; sleep 0.5 ; set $dummy $key 0";
}


Und dann fakeRoku01_dummy

define fakeRoku01_dummy dummy
attr fakeRoku01_dummy mqttPublish 1:topic=loxb01/fhem/sensor/fakeroku01/1\
2:topic=loxb01/fhem/sensor/fakeroku01/2\
3:topic=loxb01/fhem/sensor/fakeroku01/3\
4:topic=loxb01/fhem/sensor/fakeroku01/4\
5:topic=loxb01/fhem/sensor/fakeroku01/5\
6:topic=loxb01/fhem/sensor/fakeroku01/6\
7:topic=loxb01/fhem/sensor/fakeroku01/7\
8:topic=loxb01/fhem/sensor/fakeroku01/8\
9:topic=loxb01/fhem/sensor/fakeroku01/9\
10:topic=loxb01/fhem/sensor/fakeroku01/10
attr fakeRoku01_dummy readingList 1 2 3 4 5 6 7 8 9 10
attr fakeRoku01_dummy room H Harmony


Keine Rückgabe von MQTT oder Auswertung, einfach nur stumpf senden (1 und dann 0).
Damit schalte ich in Loxone Lichtbausteine.

Beta-User

Na ja, wenn ich das richtig deute, setzt du eigentlich immer "state", und nicht die Zahlenreadings.

Kannst du mal das hier ergänzen:
attr fakeRoku01_dummy setList 1 2 3 4 5 6 7 8 9 10bzw. jeweils statt "set" in dem Code "setreading" verwenden?
fhem "setreading $dummy $key 1 ; sleep 0.5 ; setsetreading $dummy $key 0";
(Eine der beiden Stellschrauben sollte ausreichen).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Fs79

Habs jetzt verändert.
attr fakeRoku01_dummy setList 1 2 3 4 5 6 7 8 9 10
set_key_fakeroku01($) {
        my ($key) = @_;
        my $dummy = "fakeRoku01_dummy" ;
#       Log(3,"key: $key") ;
#       Log(3,"dummy: $dummy") ;
        fhem "setreading $dummy $key 1 ; sleep 0.5 ; setreading $dummy $key 0";
}


Resultat ist leider das gleiche, mit der alten MGB Version läuft es, mit der neuen Version nicht.
alte Version

2021-03-22 15:23:23 MQTT_GENERIC_BRIDGE mqttGenericBridge transmission-state: outgoing publish sent
2021-03-22 15:23:23 MQTT_GENERIC_BRIDGE mqttGenericBridge outgoing-count: 122
2021-03-22 15:23:23 dummy fakeRoku01_dummy 1: 1
2021-03-22 15:23:23 fakeRoku fakeRoku01 keypress: Up
2021-03-22 15:23:23 MQTT_GENERIC_BRIDGE mqttGenericBridge transmission-state: outgoing publish sent
2021-03-22 15:23:23 MQTT_GENERIC_BRIDGE mqttGenericBridge outgoing-count: 123
2021-03-22 15:23:23 dummy fakeRoku01_dummy 1: 0


neue Version
2021-03-22 15:24:23 dummy fakeRoku01_dummy 1: 1
2021-03-22 15:24:23 fakeRoku fakeRoku01 keypress: Up
2021-03-22 15:24:23 dummy fakeRoku01_dummy 1: 0

Beta-User

Irgendwie hatte ich sowas schon vermutet, das Problem liegt vom Bauchgefühl her daran, dass wir uns noch in einer/der Eventverarbeitung befinden (aus dem notify raus).
Wenn das stimmt, müßte man das durch den "sleep-Trick" umgehen können:
fhem "sleep 0.01; setreading $dummy $key 1 ; sleep 0.5 ; setreading $dummy $key 0";
(Vermutlich verheddere ich mich da mit den ";"...)
Dann wäre die spannende Frage, ob es Zufall war, dass es vorher funktioniert hat, aber darüber müßte ich dann auch erst mal intensiver nachdenken, ob das ggf. dadurch zu umgehen sein könnte, dass man MGB eine niedrigere Prio innerhalb der Eventverarbeitung zuweist...

So oder so: Danke für die geduldige Mithilfe!

Nachtrag:
Die direkte Umsetzung könnte sein, in MQTT_GENERIC_BRIDGE_Initialize() die Benachrichtigungsreihenfolge zu ändern (z.B. in Zeile 527 einfügen (braucht vermutlich einen Neustart)):
$hash->{NotifyOrderPrefix} = "55-"
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Fs79

Ich danke dir, dass du dich dem Thema überhaupt annimmst.
Das hat leider nichts gebracht.
Beide Änderungen nicht.

Ich verstehe leider nicht, was ich hier tue. Daher habe ich auch keine Möglichkeit ausser zu sagen, dass es nicht funktioniert.

Ich habe auch mal folgendes probiert.
sub
set_key_fakeroku01($) {
        my ($key) = @_;
        my $dummy = "fakeRoku01_dummy" ;
        fhem "setreading $dummy $key 1";
}

Also wirklich nur eine 1 senden, auch das klappt nicht.
Denkst du auch damit noch, dass es ein Timing Thema ist=

Beta-User

Erst mal zur Sicherheit:
Wenn du eines dieser Readings außerhalb der Eventverarbeitung setzt, dann wird diese Änderung auch gepublisht, oder?

Ansonsten: wenn, dann muss das erste sleep schon vor das "set/setreading", damit das im Hintergrund erst mal darauf wartet, dass die aktuelle Eventverarbeitung durch ist, und dann erst NACH der Rückgabe an fhem.pl allgemein den Befehl raushaut.
Hattest du meinen Edit gesehen?
Zitat von: Beta-User am 22 März 2021, 15:39:19
Nachtrag:
Die direkte Umsetzung könnte sein, in MQTT_GENERIC_BRIDGE_Initialize() die Benachrichtigungsreihenfolge zu ändern (z.B. in Zeile 527 einfügen (braucht vermutlich einen Neustart)):
$hash->{NotifyOrderPrefix} = "55-"

Die Änderungen habe ich mir nochmal grob durchgesehen, da ist eigentlich nichts dabei, das diesen Effekt erklären würde...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Fs79

Das habe ich auch probiert.
Ich habe jetzt auch mal ein anderes Gerät probiert, mit dem neuen Modul wird auch hier nichts versendet.


userreading
stateown {my $r=ReadingsVal('vuunowz','state',2);
if ( $r =~ "absent" ) { $r="2"; }
elsif  ( $r =~ "off" ) { $r="0"; }
elsif  ( $r =~ "on" ) { $r="1"; }
;$r}
mqttPublish
stateown:topic=loxb01/fhem/sensor/eg/wz/vuuno4k/state

Das ist einer meiner Vu+ Sat Receiver. Der sendet mit dem neuen Modul auch nichts.
Dort ist es nur eine eigene Variable die ich sende.

Beta-User

Hmm, ist etwas Stochern im Nebel:

Kannst du die Topics mal "einpacken" und dann in Schritt 2 auch die Zeilenumbrüche rauswerfen und durch Leerzeichen ersetzen:mqttPublish stateown:topic={"loxb01/fhem/sensor/eg/wz/vuuno4k/state"}
attr fakeRoku01_dummy mqttPublish 1:topic=loxb01/fhem/sensor/fakeroku01/1 2:topic=loxb01/fhem/sensor/fakeroku01/2 3:topic=loxb01/fhem/sensor/fakeroku01/3 4:topic=loxb01/fhem/sensor/fakeroku01/4 5:topic=loxb01/fhem/sensor/fakeroku01/5 6:topic=loxb01/fhem/sensor/fakeroku01/6 7:topic=loxb01/fhem/sensor/fakeroku01/7 8:topic=loxb01/fhem/sensor/fakeroku01/8 9:topic=loxb01/fhem/sensor/fakeroku01/9 10:topic=loxb01/fhem/sensor/fakeroku01/10


[OT 1]
Dein userReadings-Eintrag sollte einen trigger erhalten:
attr vuunowz userreading stateown:state.* {my $r=ReadingsVal($name,'state',2); ...

[OT 2]
"Geschönte und gekürzte" Code-Auszüge sind nicht immer zielführend, da wir sonst ggf. auch Übertragungsfehler mitkopieren und dann irgendwann gar nichts mehr paßt...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rudolfkoenig

Habt ihr schon mal mit einem "attr global verbose 5" Log versucht?