MQTT2 Device - SetList

Begonnen von gloob, 10 Mai 2019, 22:21:34

Vorheriges Thema - Nächstes Thema

gloob

Hallo,

Ich habe folgendes MQTT2 Device:

defmod MQTT2_Visualizer MQTT2_DEVICE
attr MQTT2_Visualizer IODev MQTT2
attr MQTT2_Visualizer readingList /MQTT_Visualizer/resetReason:.* ResetReason
attr MQTT2_Visualizer room MQTT

setstate MQTT2_Visualizer 2019-05-10 22:15:09 ResetReason External System


Jetzt würde ich gerne das Device um ein setList erweitern.
Hat bitte jemand auf die Schnelle einen Tipp für mich wie es geht?

Irgendwie blicke ich da nicht durch. Wie das Set dann im Device gehandelt wird ist eine andere Sache :)
Dort habe ich folgendes:
void messageReceived(String &topic, String &payload) {
  Serial.println("incoming: " + topic + " - " + payload);
}


Gruß
Stefan

Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

OdfFhem

Hallo,

ich verwende setList z.B. nach folgendem Muster:

attr MQTT2_Visualizer setList\
abc:a,b,c /MQTT_Visualizer/set {"abc":"$EVTPART1"}\
txt:textField /MQTT_Visualizer/txt $EVTPART1



  • stellt Auswahlliste bereit und generiert JSON-Nachricht
  • stellt Eingabefeld bereit und generiert einfache Nachricht

Beta-User

In der mqtt2.template-file gibt es noch einige Beispiele mehr, mit Widgets, zusammengebautem json...
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

pechnase

Ich hänge meine Frage mal hier an, da es auch um setList geht.

Grundsätzlich bin ich dabei meine MQTT-DEVICE auf MQTT2-DEVICE umzustellen. Zum publishen habe ich bei MQTT-DEVICE folgendes attr mit Auswahlliste verwendet:
attr Bewaesserung publishSet_BFeuchteschwellwertSoll 100 150 200 250 300 350 400 450 500 550 600 650 700 750 800 fhem/whng3/Bewaesserung/BFeuchteschwellwertSoll


Bei einem MQTT2-DEVICE muss das wohl über setList funktionieren, ich bekomme es aber nicht hin. Kann mir bitte jemand einen Tipp geben. Aus den Beispielen habe ich mir die Antwort leider nicht ableiten können  >:(

Danke für die Unterstützung.

Wolfgang
2 x RPI mit FHEM 5.8 (RPI B+ & RPI 2B) verbunden über FHEM2FHEM
- HM Fensterkontakte, Rauchmelder, Fernbedienung, Schalter
- Optolink (Selbstbau) Vitotronic 200KW2
- 1-wire DS1820 Temp.Sensoren, TX29DT-IT
- CUL (busware), nanoCUL, Jeelink (Nachbau), FHEMduino

Beta-User

Einfache Form sollte so gehen:
attr Bewaesserung setList BFeuchteschwellwertSoll:100,150,200,250,300,350,400,450,500,550,600,650,700,750,800 fhem/whng3/Bewaesserung/BFeuchteschwellwertSoll $EVTPART1
Dasselbe als widget (https://wiki.fhem.de/wiki/FHEMWEB/Widgets):
attr Bewaesserung setList BFeuchteschwellwertSoll:selectnumbers,100,50,800,0,lin fhem/whng3/Bewaesserung/BFeuchteschwellwertSoll $EVTPART1
Oder mit mehr Zwschenstufen:
attr Bewaesserung setList BFeuchteschwellwertSoll:selectnumbers,100,10,800,0,lin fhem/whng3/Bewaesserung/BFeuchteschwellwertSoll $EVTPART1

Hoffe, dass die Beispiele das Prinzip soweit erklären :) .
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

pechnase

@Beta-User herzlichen Dank für die schnelle Antwort. Funktioniert, habe mal die einfache Form gewählt.
2 x RPI mit FHEM 5.8 (RPI B+ & RPI 2B) verbunden über FHEM2FHEM
- HM Fensterkontakte, Rauchmelder, Fernbedienung, Schalter
- Optolink (Selbstbau) Vitotronic 200KW2
- 1-wire DS1820 Temp.Sensoren, TX29DT-IT
- CUL (busware), nanoCUL, Jeelink (Nachbau), FHEMduino

Beta-User

Danke für die Rückmeldung.

Die anderen beiden sollten dann auch funktionieren, wobei die letzte Variante voraussetzt, dass das Zieldevice die 10-er Schritte versteht. (Wenn es noch filigraner ginge, könntest du auch kleinere Zwischenwerte nutzen, geht nur darum, das Prinzip etwas klarer zu machen...)
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

Klausi

Guten Tag allseits,

auch ich habe Fragen bezüglich MQTT2 + setList.

Über eine serielle Verbindung ermittle ich mittels Modul OBIS die Daten meines EasyMeters.
Das funktioniert seit langem. 

Hier das list

Internals:
   DEF        /dev/ttyAMA0@9600,7,E,1 Standard
   DeviceName /dev/ttyAMA0@9600,7,E,1
   FD         8
   FUUID      5c8382ad-f33f-4f33-2d81-cdca521f0db529f7
   MeterType  Standard
   NAME       SWU_Q3D
   NR         128
   PARTIAL   
   STATE      Gesamt= 309.73 Watt | L1= 14.36 Watt | L2= 51.03 Watt | L3= 244.34 Watt
   TYPE       OBIS
   READINGS:
     2019-06-11 13:42:29   0.0.96.1.255.255 1ESY1160287766
     2019-06-11 13:42:29   1.0.0.0.0.255   11-53-43-18-2
     2019-06-11 13:42:29   1.0.96.5.5.255  80
     2019-06-10 14:57:16   5.255           1ESY1160287766
     2019-06-10 22:27:20   5.5.255         80
     2019-06-11 13:42:29   Verbrauch       2.294
     2019-04-17 20:38:42   Version         ESY5Q3DB1004 V3.04
     2019-06-11 00:01:00   p_day           5.153
     2019-06-01 00:01:00   p_month         153.584
     2019-06-10 00:01:00   p_week          43.326
     2019-06-11 13:42:29   power           309.73
     2019-06-11 13:42:29   power_G         309.73
     2019-06-11 13:42:29   power_L1        14.36
     2019-06-11 13:42:29   power_L2        51.03
     2019-06-11 13:42:29   power_L3        244.34
     2019-06-11 13:42:29   power_total     9323.710572
     2019-04-17 20:33:41   state           opened
     2019-06-11 13:42:29   total_consumption 9323.710572
   helper:
     BUFFER     
     EoM        1
     SPEED      5
     SPEED2     5
     TRIGGERTIME 1555526021.21758
     Channels:
     DEVICES:
       
       300
       
     directions:
Attributes:
   interval   300
   room       EasyMeter
   stateFormat {"Gesamt= " . ReadingsVal('SWU_Q3D','power_G',' ')." Watt | L1= " . ReadingsVal('SWU_Q3D','power_L1',' ') . " Watt | L2= " . ReadingsVal('SWU_Q3D','power_L2',' ') . " Watt | L3= " . ReadingsVal('SWU_Q3D','power_L3',' ') . " Watt"}
   userReadings Verbrauch {(sprintf("%.3f",(ReadingsNum("SWU_Q3D","total_consumption",0) - Value("Watt_gestern"))))},
power_G {ReadingsNum("SWU_Q3D","power",0)},
power_total {ReadingsNum("SWU_Q3D","total_consumption",0)}
   verbose    3



Nun möchte ich Daten des OBIS Moduls (Bsp. power_L1, power_L2,  power_L3) über MQTT2 andern Clients mitteilen.
Dazu habe ich folgendes Device erstellt.

defmod MQTT2_SWU_Q3D MQTT2_DEVICE SWU_Q3D
attr MQTT2_SWU_Q3D IODev MQTT_Server
attr MQTT2_SWU_Q3D autocreate 1
attr MQTT2_SWU_Q3D room MQTT2_DEVICE


Wie muss das readingList und setList definiert werden?

Besten Dank für die Hilfe

lg Klausi

Beta-User

Hmm, hat nicht mehr viel mit der Ausgangsfrage zu tun...

Also: Was du vorhast, ist nichts, was ich selbst mir MQTT2_DEVICE lösen würde. Um Daten von einem vorhandenen (Nicht-MQTT-) Device per MQTT zu versenden, gibt es MQTT_GENERIC_BRIDGE (oder MQTT_BRIDGE, dessen Einsatz in neuen Installationen aber aus mehreren Gründen nicht mehr zu empfehlen ist). Die greift die Events bei entsprechend konfigurierten Devices direkt ab und schickt die festgelegten Readings dann per MQTT raus (als IO funktionieren sowohl 00_MQTT wie auch MQTT2_SERVER und -CLIENT).

Man kann das auch mit MQTT2_DEVICE erreichen, die setList müßte dann der Spur nach so aussehen:
power_L1:textField fhem/SWU_Q3D/power_L1 $EVTPART1
Nur hast du dann ja immer noch nicht die Werte an das Device weitergegeben, was einen weiteren Eventhandler (z.B. notify) erfordert, der die Werte dann im MQTT2_DEVICE setzt...
Da kannst du auch gleich eine entsprechende publish-Anweisung in das notify einbauen, der Spur nach (könnte auf beliebige Reading-Änderungen von SWU_Q3D lauschen):
set <mqtt-io> publish fhem/SWU_Q3D/$EVTPART0 $EVTPART1
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

Klausi

Vielen Dank Beta-User für die rasche Antwort

lch habe vergessen zu erwähnen, dass das OBIS-Modul und das MQTT2 Device sich auf dem selben Rechner
befindet. Ebenfalls auf diesem Rechner befindet sich MQTT2 Server.

Deshalb hatte ich die Meinung, dass Daten des OBIS-Moduls relativ einfach zum MQTT2 Device gelangen
könnten. Mir fehlt nur der Weg dahin und die Definition des setList.

Wenn ich nach deinem Vorschlag setList definiere zu
power_L1:textField fhem/SWU_Q3D/power_L1 $EVTPART1

und dann manuell

set MQTT_SWU_Q3D power_L1        145

eingebe

erscheint im MQTT Esplorer

-fhem
    -SWU_Q3D
     power_L1 = 145

Was muss ich tun, dass  $EVTPART1  den aktuellen Wert power_L1 aus dem OBIS-Modul erhält?

lg Klausi

Beta-User

Das setup entspricht dem, was zu vermuten war. Daher nochmal: Für deinen Anwendungsfall ist MQTT2_DEVICE nicht optimal, da du ein notify (oder einen anderen Event-Handler) brauchst, das auf Änderungen am OBIS-Device hört und das dann in das MQTT2_DEVICE schreibt (so wie du das manuell gemacht hast). Das wäre "der Weg dorthin", und das hat nichts mit MQTT(2) zu tun, sondern ist normales Event-handling in FHEM.

Verwende also besser MQTT_GENERIC_BRIDGE (+die passenden Einstellungen am OBIS-Devic). Dann brauchst du für diese ganze Aktion keinen (weiteren) Eventhandler und auch kein MQTT2_DEVICE.
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

Klausi

Die Lösung über ein notify (obwohl Du sagst "nicht optimal") ist mit meinen derzeitigen Kenntnissen wohl der einfachere Weg, da ich über  MQTT_GENERIC_BRIDGE wieder bei null anfangen muss.

Auch ist mir nicht klar, welche Einstellungen am OBIS-Modul dann notwendig wären.

Ich bedanke mich für Deine Unterstützung.

lg Klausi

Beta-User

Wenn du ein notify verwendest, brauchst du _keine_ Einstellungen am OBIS-Gerät...

(Die Einsteigerdoku hast du aber gelesen und auch mal das Wiki zu notify?!?)

Ich komme nochmal zurück auf das hier:
Zitat von: Beta-User am 11 Juni 2019, 14:27:44
Da kannst du auch gleich eine entsprechende publish-Anweisung in das notify einbauen, der Spur nach (könnte auf beliebige Reading-Änderungen von SWU_Q3D lauschen):
set <mqtt-io> publish fhem/SWU_Q3D/$EVTPART0 $EVTPART1
Da das mqtt-io "MQTT_Server" heißt also:
set MQTT_Server publish fhem/SWU_Q3D/$EVTPART0 $EVTPART1
Dann brauchst du gar kein MQTT2_DEVICE mehr (und auch keine MQTT_GENERIC_BRIDGE), nur das notify.

Aber bevor du nicht einen eigenen Versuch postest, wie das notify aussehen könnte, brauchst du nicht auf Hilfe von meiner Seite hoffen, und es ist m.E. reichlich unhöflich, für Fragen zu notify einen Thread von jemandem anderen in einem völlig falschen Forenbereich zu kapern! Das ist im Prinzip eine Anfängerfrage...

Bitte also dazu ggf. einen neuen Thread aufmachen.
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

Klausi

Hallo Beta-User,

dass ich meine Frage im falschen Forenbereich stelle, war mir am Anfang nicht bewusst, da ich der Meinung war, dass sich mein Problem mit einer korrekten setList Definition löst.

Wie sich durch Deine Hilfe zeigte, ist die Lösung u.a. ein notify.
Du hast mir in Deinen  Antworten einige Hilfestellungen gegeben, mit denen ich hoffe, ein entsprechendes
notify zu erstellen.

Es war also nicht meine Absicht, mich in einen fremden Thread zu schmuggeln.
Ich entschuldige mich dafür und bedanke mich für Deine vorgeschlagenen Hinweise.

lg Klausi

Klausi

Hallo Beta-User,

ich muss  nun doch noch einmal in diesem Thread posten, weil ich Dir meine Lösung melden möchte.

Der Hinweis, über einen Event-Handler die Daten vom OBIS-Modul zum MQTT2 Server zu bringen war der
entscheidende Hinweis. Wie Du schon sagtest, ist dann auch kein MQTT2 Device notwendig.

Ich habe es letztendlich mit DOIF gelöst.
defmod di_Q3D DOIF (["SWU_Q3D:power_"])\
(\
set MQTT_Server publish fhem/SWU_Q3D/p_L1 [SWU_Q3D:power_L1];;\
set MQTT_Server publish fhem/SWU_Q3D/p_L2 [SWU_Q3D:power_L2];;\
set MQTT_Server publish fhem/SWU_Q3D/p_L3 [SWU_Q3D:power_L3];;\
set MQTT_Server publish fhem/SWU_Q3D/p_sum [SWU_Q3D:power];;\
set MQTT_Server publish fhem/SWU_Q3D/p_ges [SWU_Q3D:total_consumption];;\
)
attr di_Q3D do always
attr di_Q3D room DOIF


Also nochmals danke für Deine vor allem rasche Hilfe

lg Klausi