(FHEM) 10 MQTT DEVICE.pm

Aus TippvomTibb
Zur Navigation springen Zur Suche springen

10_MQTT_DEVICE

[Zurueck Uebersicht]

Ein MQTT_DEVICE fungiert als fhem-device, das mqtt-topics zugeordnet ist. 

Steckbrief

Define

define <name> MQTT_DEVICE <IODev>

Wenn man es so mach wie im der commandref beschrieben erhaelt man eine Fehlermeldung.

client device hash no IODev provided 

Das Attribut IODev hat sich damit wohl erledigt.

Set

set <name> <command> z.B. on oder off; erst nach der Anlage durch Attribut in der Detail-Ansicht vorhanden.
set <name> <reading> <value> erst nach der Anlage durch Attribut in der Detail-Ansicht vorhanden.
set extensions erst nach der Anlage durch Attribut in der Detail-Ansicht vorhanden.

Get

  

Readings

  

Attributes

attr <name> publishSet [[<reading>:]<commands_or_options>] <topic>
attr <name> publishSet_<reading> [<values>]* <topic>
attr <name> autoSubscribeReadings <topic>
attr <name> subscribeReading_<reading> [{Perl-expression}] [qos:?] [retain:?] <topic>
attr <name> retain <flags> ...
attr <name> qos <flags> ...
attr <name> useSetExtensions [0|1]

Erlaeuterungen

Aus dem Forumsbetrag:

MQTT_DEVICE wird verwendet, wenn das physikalische Device (Sensor oder Aktor) über mqtt kommuniziert. (Kein dummy mehr nötig!)
MQTT_BRIDGE ist für den Fall, dass ein fhem-device existiert und dieses über mqtt sicht- bzw. steuerbar gemacht werden soll.

Es wird die im IODev-attribute angegebne MQTT-verbindung verwendet. Messages von mqtt updaten die readings dieses devices direkt, es wird kein weiterer dummy benötigt. MQTT_DEVICE verwendet man zur Einbindung von über mqtt erreichbaren sensoren und aktoren.

In den Topic-namen der vorgenannten Attribute werden aktuell noch keine Wildcards unterstützt.

Um das Erstellen der Readings zu vereinfachen gibt es das Attribute autoSubscribeReadings.

'attr <name> autoSubscribeReadings wohnzimmer/+' sorgt dafür, dass für alle empfangenen Messages automatisch das jeweils passende 'subscribeReading_xxx'-Attribut erstellt und das zugehörige Reading auch gleich geupdated wird.

Beispiele

#1

define licht_kinderzimmer MQTT_DEVICE <IODev>
attr licht_kinderzimmer publishSet on off fhem/kinderzimmer/licht
attr licht_kinderzimmer subscribeReading_state fhem/kinderzimmer/licht/set

Mit 'set licht_kinderzimmer on' schickt man jetzt eine message 'on' an das topic fhem/kinderzimmer/licht. Umgekehrt kann das reading state über messages an fhem/kinderzimmer/licht/set gesetzt werden.

#2

define heizung_kinderzimmer MQTT_DEVICE  <IODev>
attr heizung_kinderzimmer publishSet_desired-temp fhem/kinderzimmer/temperatur
attr heizung_kinderzimmer subscribeReading_messured-temp fhem/kinderzimmer/temperatur/set
attr heizung_kinderzimmer stateFormat messured-temp

#3

attr heizung_kinderzimmer autoSubscribeReadings fhem/kinderzimmer/+/set

sorgt dafür, dass für alle empfangenen Messages automatisch das jeweils passende 'subscribeReading_xxx'-Attribut erstellt und das zugehörige Reading auch gleich geupdated wird. Das letzte '+' im Topic wird als Name des Readings benutzt. Also wenn eine Message '17.5' an 'fhem/kinderzimmer/messured-temp/set' empfangen wird, wird 'attr heizung_kinderzimmer subscribeReading_messured-temp fhem/kinderzimmer/messsured-temp' gesetzt und gleichzeitig das Reading 'messured-temp' erzeugt und auf den Wert '17.5' gesetzt. Wenn alle gewünschten Readings auf diese Weise angelegt sind, kann man das Attribut 'autoSubscribeReadings' wieder entfernen.

#4

attr mqttest publishSet on off switch:on,off level:slider,0,1,100 /topic/123

Hierdurch entstehen im DeviceOverview ein on und eine off Taster und eine Lampe zum signalisieren des Zustandes (reading switch). Beim Betaetigen des on oder off Tasters wird eine Nachricht on bzw. off an den Topic '/topic/123' gepublished. Achtung das "Root-Slash" gehoert da nicht hin! Vom Original habe ich es hier so falsch uebernommen. Der slider muss in diesem Fall mit set ausgeloest werden und uebermittelt den jeweils eingestellten Wert an den Broker und an das Reading level.

#5

attr MQTT_DEVICE_Test publishSet_trigger 1 home/basement/0_terrace/awning/trigger

Hier wird trigger (Ergaenzung von publishSet_) als Auswahl und Reading uebernommen. Die Auswahl kann man einschraenken indem man durch Leerzeichen getrennt die Optionen anhaengt. Die Bedeutung des * ist mir nicht klar. Ich haette hier erwartet, dass man damit den Defaultwert der Combobox (Select) beeinflussen kann. Am Ende steht noch der Topic wohin geschickt werden soll.

#6

attr MQTT_DEVICE_Test autoSubscribeReadings home/basement/0_terrace/awning

Hier wird deutlich, dass ich mir abgewoehnen muss in einen Topic mehrere Wertepaare zu publishen. Ich habe zum Beipiel das gemacht:

home/basement/0_terrace/awning/ ALIVE 2022-08-10T17:41:04+0800
home/basement/0_terrace/awning/ RSSI -80

Das raecht sich jetzt. Abgesehen davon, dass hier keine Leerzeichen in Topic verarbeitet werden koennen, funktioniert so die richtige Zuordnung der Readings nicht. Also in Zukunft nur noch ein Wert pro Topic (Brian;-) und der letzte Eintrag des Topics ist der Name des Wertes. Allerdings hat das autoSubscribeReading auch Probleme mit

home/basement/0_terrace/awning/state 0 0 0

Und selbst nach der Anpassung im Pub-Client funktioniert autosubscribe nicht so richtig.

#7

attr mqttest retain 0 defines retain 0 for all readings/topics (due to downward compatibility) attr mqttest retain *:0 1 test:1 defines retain 0 for all readings/topics except the reading 'test'. Retain for 'test' is 1

Das mit der 1 im zweiten Beispiel ist irgendwie Murks. Laut Beschreibung soll das ein Ausschluss im Sinne von "auszer" bewirken. Im zweiten Beispiel also * (alle) auf retain 0 1 (auszer) test auf 1

#8

attr <name> qos <flags> ...

Hier gilt die gleiche (merkwuerdige) Schreibweise wie bei retain. Specifies the QOS flag for all or specific readings. Possible values are 0, 1 or 2. Constants may be also used: at-most-once = 0, at-least-once = 1, exactly-once = 2


#9

attr MQTT_DEVICE_Test setExtensions 1

Schalten die Extensions im set Kommando ein, die da waeren:

  • on-for-timer <seconds>
  • off-for-timer <seconds>
  • on-till <timedet> bei der Angabe timedet HH:MM:SS ist SS optinal also eigentlich HH:MM:[SS] und wird per default auf 00 gestezt.
  • on-till-overnight <timedet>
  • off-till-overnight <timedet>
  • blink <number> <blink-period> die Periode bezieht sich auf die Ein- und Auschaltzeit (blink requires count as integer and duration as float )Kommazahlen werden mit Punkt eingegeben.
  • intervals <from1>-<till1> <from2>-<till2>...
  • toggle wechselt in den gegeteiligen Zustand aus 'off' wird 'on' und aus 'on' wird 'off'. Ein Dimmwert wird als 'on' interpretriert und fuehrt zum 'off'

set switch on-for-timer 12.5 set switch on-till {sunset()} set switch blink 3 1 set switch intervals 08:00-12:00 13:00-18:00