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
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
In der mqtt2.template-file gibt es noch einige Beispiele mehr, mit Widgets, zusammengebautem json...
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
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 :) .
@Beta-User herzlichen Dank für die schnelle Antwort. Funktioniert, habe mal die einfache Form gewählt.
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...)
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
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
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
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.
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
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.
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
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
(Sorry für weiteres OT)
Zitat von: Klausi am 12 Juni 2019, 11:27:17
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.
Danke für die Rückmeldung.
ZitatIch 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
Ich kenne mich mit diesem Modul nicht aus und werde in diesem Leben vermutlich auch nicht mehr verstehen, warum man das für solche einfachen Aufgaben nutzt, aber m.E. ist da ein Fehler drin, weil (vermutlich!?) das publish aller Werte jeweils durchgeführt wird, wenn sich einer der power_-Werte ändert.
Wenn, dann wäre das "suboptimal".
Als notify dürfte sowas reichen:
defmod n_Q3D notify SWU_Q3D:.* set MQTT_Server publish fhem/SWU_Q3D/$EVTPART0 $EVTPART1
Das gibt dann allerdings topics, die wie die Readings heißen, dafür wird nur gesendet, was sich geändert hat...
Nochmals kurzes Feedback
ich habe Dein notify eingegeben und es funktioniert, aber es werden mir auch topics gemeldet, die ich garnicht brauche
0.0.96.1.255.255 = 1ESY1160287766 <---
1.0.0.0.0.255 = 11-53-43-18-2 <---
1.0.96.5.5.255 = 80 <---
Verbrauch = 1.624 <---
power = 88.19
power_G = 88.19
power_L1 = 14.56
power_L2 = 60.78
power_L3 = 12.85
power_total = 9328.1730318
total_consumption = 9328.1730318
Du hast völlig recht mit dem Deinen Einwand, dass auf jede Änderung der "power_-Werte" getriggert wird. Deswegen habe ich nun den Event-Trigger auf
(["SWU_Q3D:total_consumption"])
gesetzt.
lg Klausi
:)
...man kann auch bei einem notify den Trigger einschränken...
(Das hätte den Vorteil, dass man es auch als einfachen "Generalersatz" für MQTT_GENERIC_BRIDGE nutzen kann ;) ):
defmod n_publish_MQTT notify SWU_Q3D:(power|total_).* set MQTT_Server publish fhem/$NAME/$EVTPART0 $EVTPART1
Du mußt dann nur noch die Regex anfassen, z.B. so:
(Fenster_sensorx:|SWU_Q3D:(power|total_)).*
Dann wird auch jede triggernde Reading-Änderung von Fenster_sensorx "ver-mqtt".
Hi zusammen,
ich hoffe, ich darf hier den alten Beitrag noch erweitern. Mein Thema passt meiner Ansicht nach ganz gut in die Reihe, weil das Problem auch mit dem gut beschriebenen setList-Attribut bei MQTT2-Devices zusammenhängt:
Ich habe in FHEM ein MQTT2_DEVICE angelegt(, welches einen Arduino mit PWM-Dimmermodul schalten soll). Die Kommunikation über MQTT funktioniert zwischen dem FHEM-Device und dem Arduino einwandfrei. Schalten kann ich den Dimmer über das FHEM-Webfrontend. Jedoch wird mir der aktuelle Status nicht korrekt im FHEM-Webfrontend angezeigt. Hier steht nur unter Internals:
STATE STATE
und unter Readings:
state STATE 2020-05-12 15:33:48
Ich hänge schon seit Stunden an dem wahrscheinlich kleinen Problem und habe schon die verschiedensten Varianten ausprobiert. Aber ich stehe wohl auf dem Schlauch. Hat jemand eine Idee?
Hier die Definition des Device:
defmod Waermelampe MQTT2_DEVICE
attr Waermelampe IODev myBroker
attr Waermelampe alias Wärmelampe
attr Waermelampe group Hühner
attr Waermelampe icon sani_heating
attr Waermelampe room Garten
attr Waermelampe setList STATE:0,25,50,75,100 /Garten/Huehnerstall/HausWaermelampe $EVTPART1
Vielen Dank im Voraus!
Gruß André
Der Zusammenhang ist aber wirklich auch nur sehr lose; mMn. wäre auch das besser in einem eigenen Thread aufgehoben gewesen (es ist kein Vergehen, einen Thread zu öffnen, es ist eher unhöflich, einen uralt-Thread aufzuwärmen, selbst, wenn der noch nicht als [gelöst] gekennzeichnet ist( ;) ))...
Versuch's mal mit Kleinschreibung (STATE sollte man m.E. besser für das Internal freihalten):
attr Waermelampe setList state:0,25,50,75,100 /Garten/Huehnerstall/HausWaermelampe $EVTPART1
(Die bereits vorhandenen Anmerkungen zu einem ggf. passenden widget (würde hier "CT" vorschlagen) gelten auch hier).
Wenn das obige nicht klappt, bitte einen eigenen Thread aufmachen.