Modul-Diskussion/Hilfe: MQTT_GENERIC_BRIDGE

Begonnen von Master_Nick, 11 Oktober 2018, 17:23:24

Vorheriges Thema - Nächstes Thema

Master_Nick

#120
Ursache gefunden - siehe unten


Mhhh....  ;D

Was mach ich denn gerade falsch? Ich habe einen Dummy in FHEM mit MQTT_GENERIC_BRIDGE hängen der auf NodeRed Seite Logik schaltet. Aber es wird einfach nichts gepublished.


Internals:
   NAME       Lautsprecher
   NR         311
   STATE      on
   TYPE       dummy
   READINGS:
     2018-12-16 14:20:09   state           on
Attributes:
   devStateIcon on:10px-kreis-gruen off:10px-kreis-rot .*:hourglass
   group      Klingel
   icon       audio_sound
   mqttDefaults base={"homeland/haushalt/doors/doormodule/frontdoor/speaker"} pub:qos=2 sub:qos=2 retain=1
   mqttForward all
   mqttPublish state:topic={"$base/$name/set"} state:qos=2 state:retain=1
   mqttSubscribe state:topic={"$base/$name"} state:qos=2
   room       Haustür
   setList    on off
   userattr   mqttAlias:textField-long mqttDefaults:textField-long mqttDisable:both,incoming,outgoing mqttForward:all,none mqttPublish:textField-long mqttSubscribe:textField-long



*EDIT* Mein Problem äußerte sich woanders... https://forum.fhem.de/index.php/topic,94542.msg872598.html#msg872598

Aber das Problem war wohl "state:topic={"$base/$name/set"} state:qos=2" damit kann man nachvollziehbar das MQTT Modul in FHEM töten.

Geht das noch nicht? Da Variablen zu nutzen? state:topic={"$base/$name/set"}set state:qos=2 oder state:topic={"$base/$name"}/set state:qos=2 mag er beides net.
Funktionieren tut es nur mit "mqttSubscribe state:topic=homeland/haushalt/heizung/Heizungssteuerung/state/set state:qos=2"
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Master_Nick

Auch nochmal zum Thema retain...

Wende ich es falsch an? boost und windowOpen werden von NodeRed immer als nicht definiert angemeckert - somit vermute ich sie sind nicht mit Retain im MQTT.

Internals:
   DEF        00:1A:22:0C:18:D4 TouchPi3
   MAC        00:1A:22:0C:18:D4
   NAME       Wohnzimmer_Thermostat
   NR         130
   STATE      Gewünschte Temperatur: 20.5 Fenster auf/zu: 0 Boost: 0 Ventil: 80
   TYPE       EQ3BT
   VERSION    2.0.5
   loglevel   4
   READINGS:
     2018-07-03 23:40:42   battery         ok
     2018-12-16 15:27:40   bluetoothDevice hci0
     2018-12-16 15:28:24   boost           0
     2018-11-24 10:48:51   childlock       1
     2018-12-16 15:28:56   consumption     5373.802
     2018-12-16 15:28:56   consumptionToday 115.532
     2018-12-16 00:03:07   consumptionYesterday 99.536
     2018-12-16 15:16:03   desiredTemperature 20.5
     2018-07-03 23:40:42   ecoMode         0
     2018-12-16 13:49:09   errorCount-setBoost 2
     2018-12-13 21:02:26   errorCount-setDesiredTemperature 4
     2018-12-13 21:12:59   errorCount-updateStatus 25
     2018-12-13 20:00:34   errorCount-updateSystemInformation 1
     2018-12-16 15:28:16   firmware        110
     2018-12-16 15:28:24   lastChangeBy    FHEM
     2018-07-03 23:40:43   mode            Manual
     2018-12-16 15:28:56   valvePosition   80
     2018-12-16 15:28:20   windowOpen      0
   helper:
     currenthcidevice 0
     handlesetBoost 0x0411
     handleupdateStatus 0x0411
     handleupdateSystemInformation 0x0411
     listensetBoost
     listenupdateStatus 02 01 29 50 04 29
     listenupdateSystemInformation 01 6e 00 00 7f 75 81 61 67 65 65 60 67 64 a6
     retryCountersetBoost 0
     retryCounterupdateStatus 0
     retryCounterupdateSystemInformation 0
     valuesetBoost 4500
     valueupdateStatus 03120C100F1C
     valueupdateSystemInformation 00
     hcidevices:
       0
Attributes:
   alexaName  Heizung
   alexaRoom  Wohnzimmer
   genericDeviceType thermostat
   group      Klima
   icon       sani_heating
   mqttDefaults base={"homeland/haushalt/heizung/$device"} pub:qos=2 sub:qos=2 retain=1
   mqttPublish desiredTemperature:topic={"$base/$name"} desiredTemperature:qos=2 desiredTemperature:retain=1 boost:topic={"$base/$name"} boost:qos=2 boost:retain=1 windowOpen:topic={"$base/$name"} windowOpen:qos=2 windowOpen:retain=1 valvePosition:topic={"$base/$name"} valvePosition:qos=2 valvePosition:retain=1
   mqttSubscribe desiredTemperature:stopic=homeland/haushalt/heizung/Wohnzimmer_Thermostat/desiredTemperature/set desiredTemperature:qos=2 boost:stopic=homeland/haushalt/heizung/Wohnzimmer_Thermostat/boost/set boost:qos=2
   room       Echo,Messungen,Wohnzimmer
   sshHost    TouchPi3
   stateFormat Gewünschte Temperatur: desiredTemperature Fenster auf/zu: windowOpen Boost: boost Ventil: valvePosition
   userattr   mqttAlias:textField-long mqttDefaults:textField-long mqttDisable:both,incoming,outgoing mqttForward:all,none mqttPublish:textField-long mqttSubscribe:textField-long
   verbose    1
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

HomeAlone

Bei meinen Tests ist mir noch etwas aufgefallen: Mir fehlt die Möglichkeit, beim Eintreten eines events (z.B. Änderung des state Attributes), nicht nur auf dieses zugreifen zu können, sondern auf beliebige Elemente des devices, um diese via publish an (hier) Node-Red weiterzuleiten.

Z.B. möchte ich neben dem Device Namen (geht ja über $device) auch noch mitteilen, um welchen Device Type es sich handelt. Das kann man entweder im Attribut group festhalten oder bei einigen devices wird das im Attribut subtype festgehalten (EnOcean Switches).

Frage: Geht es aktuell schon und ich bekomme es nur nicht hin oder wäre es möglich, das noch mit einzubauen? (publish mit beliebigen Readings des betroffenen Devices befüllen).

Vorweihnachtliche Grüße
Sascha



hexenmeister

Mit 'expression' kann man die Nachricht redefinieren. Ich überlege mir, eine Hilfsfunktion zu schreiben, die man einfacher in Expression verwenden kann.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Master_Nick

Hätte noch die Frage zum Retain und das Thema mit den $base $name sachen beim subscribe ( https://forum.fhem.de/index.php/topic,94542.msg877319.html#msg877319 ).

Ist die Verwendung von Retain (ich möchte es nutzen) mit der folgenden Art gewährleistet?
Ich habe manchmal das Gefühl es sind keine retainten... (weil nix ankommt beim neu deploy von node red)

mqttDefaults base={"homeland/haushalt/heizung/$device"} pub:qos=2 sub:qos=2 retain=1
   mqttPublish desiredTemperature:topic={"$base/$name"} desiredTemperature:qos=2 desiredTemperature:retain=1 boost:topic={"$base/$name"} boost:qos=2 boost:retain=1 windowOpen:topic={"$base/$name"} windowOpen:qos=2 windowOpen:retain=1 valvePosition:topic={"$base/$name"} valvePosition:qos=2 valvePosition:retain=1
   mqttSubscribe desiredTemperature:stopic=homeland/haushalt/heizung/Wohnzimmer_Thermostat/desiredTemperature/set desiredTemperature:qos=2 boost:stopic=homeland/haushalt/heizung/Wohnzimmer_Thermostat/boost/set boost:qos=2
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

hexenmeister

Ich habe nicht vergessen, nur die Zeit ist gerade etwas knapp :/
Zum retain: habe getestet und kann bestätigen, dass das in Verbindung mit MQTT2_CLIENT nicht funktioniert. Mit MQTT und MQTT2_SERVER dagegen schon. Muss in das MQTT2_CLIENBT-Modul reinschauen. Entweder ist das dort gar nicht implementiert, oder erwartet andere Parameter als MQTT2_SERVER. Ich melde mich wieder...
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

hexenmeister

Habe mir den Code in MQTT2_CLIENT angesehen. Dort ist die eigentliche Logik für 'retain' gar nicht implementiert. Dagegen kann die Bridge nichts ausrichten. Tut mir leid.

Man kann es gut sehen in der folgenden Methode. Es wird zwar ein entsprechendes Parameter erwartet (und davor auch korrekt übergeben), aber niergendwo mehr benutzt.
# send topic to client if its subscriptions matches the topic
sub
MQTT2_CLIENT_doPublish($@)
{
  my ($hash, $topic, $val, $retain, $immediate) = @_;
  my $name = $hash->{NAME};
  return if(IsDisabled($name));
  $val = "" if(!defined($val));
  my $msg = pack("C",0x30).
            MQTT2_CLIENT_calcRemainingLength(2+length($topic)+length($val)).
            pack("n", length($topic)).
            $topic.$val;
  MQTT2_CLIENT_send($hash, $msg, $immediate)
}


Da es im Commandref als implementierte Feature beschrieben ist, halte ich es für einen Bug. Erstele am besten einen entsprechenden neuen Thread.

Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

joschi2009

Hallo zusammen,

folgendes Problem,

ein Dummy ist wie folgt definiert:

define display dummy
  attr display userReadings rechteck
  attr display mqttPublish rechteck:topic=/display1/rectangle

 
dazu gibt es ein notify, welches das userReading rechteck des dummy display verändert sobald state des dummy display auf 1 gesetzt wird:

define display_notify_1 notify display:1 setreading display rechteck 1,1,10,10,50000


das notify funktioniert auch soweit und setzt das userReading rechteck des dummies auf den gewünschten Wert. Allerdings wird der Wert nicht gepublisht.

Setze ich jedoch im Webinterface von fhem mit dem gleichen Befehl des notifys,

setreading display rechteck 1,1,10,10,50000

so wird gepublisht.

Hab ich irgendwo einen Denkfehler?

VG

joschi2009


Maui

Wird denn in beiden Fällen ein Event ausgelöst?

joschi2009


Maui

Ob dich das der Lösung näher bringt weiß ich nicht, aber wenn du eh setreading nimmst, warum machst dann ein userreading? Brauchst doch gar nicht

joschi2009

ja, so fit bin ich noch nicht, aber auch ohne userReading kein Unterschied.

Aber Danke für die Antwort

Maui

Ich wüsste auch nicht wirklich warum es nicht gehen sollte mit notify. Kannst es nochmal mit DOIF probieren (finde ich eh eleganter) aber dürfte keinen Unterschied machen.

joschi2009

#133
auch schon probiert, gleiches Ergebnis :(... naja mal ne Nacht drüber schlafen.

kleines Update, das Phänomen tritt anscheinend nur bei dummy-Devices auf.

Master_Nick

@hexenmeister - sofern die Antwort an mich geht :-D

Ich habe MQTT 1 (Mosquitto) mit der normalen Bridge von dir. Und da hinterfrage ich ein wenig, ob das Retain geht :-D Mit MQTT2 bin ich net unterwegs - wüsste nicht warum ^^

Zitat von: hexenmeister am 29 Dezember 2018, 22:39:52
Habe mir den Code in MQTT2_CLIENT angesehen. Dort ist die eigentliche Logik für 'retain' gar nicht implementiert. Dagegen kann die Bridge nichts ausrichten. Tut mir leid.

Man kann es gut sehen in der folgenden Methode. Es wird zwar ein entsprechendes Parameter erwartet (und davor auch korrekt übergeben), aber niergendwo mehr benutzt.
# send topic to client if its subscriptions matches the topic
sub
MQTT2_CLIENT_doPublish($@)
{
  my ($hash, $topic, $val, $retain, $immediate) = @_;
  my $name = $hash->{NAME};
  return if(IsDisabled($name));
  $val = "" if(!defined($val));
  my $msg = pack("C",0x30).
            MQTT2_CLIENT_calcRemainingLength(2+length($topic)+length($val)).
            pack("n", length($topic)).
            $topic.$val;
  MQTT2_CLIENT_send($hash, $msg, $immediate)
}


Da es im Commandref als implementierte Feature beschrieben ist, halte ich es für einen Bug. Erstele am besten einen entsprechenden neuen Thread.
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)