[Gelöst] Variablen Wert eines Readings in Fhem publishen?

Begonnen von Gisbert, 06 Juli 2019, 11:13:34

Vorheriges Thema - Nächstes Thema

Gisbert

Hallo,

ich nutze für meine ESPs das Modul MQTT-DEVICE und komme damit ganz gut zurecht.

Meistens will man ja Messwerte von den Geräten subskribieren, oder publisht fest vereinbarte Befehle, z.B. zum Schalten.

Jetzt habe ich die Anforderung, dass ich gerne einen Wert eines Readings aus Fhem heraus publishen möchte; die möglichen Werte sind ganze Zahlen von 1 bis 100, aber es handelt sich dabei um variable Werte, die sich aus einer anderen Messung speisen.

Es gibt folgenden Eintrag in der commandref:
set <name> <reading> <value>
sets reading <reading> and publishes the command to topic configured via attr publishSet_<reading>


<value> ist in meinem Fall kein statischer Wert, sondern der Inhalt eines Readings. Ist so etwas umsetzbar, und wie lautet dann ein entsprechender Befehl?

Vielleicht kann mich hierbei jemand unterstützen. Die einzige Idee, die ich bisher habe, und die sehr umständlich ist, wäre abzufragen, ob das Readings den Wert <value> hat, und dann diesen konkreten Wert zu publishen.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

rudolfkoenig


Beta-User

Du musst ein setreading-Attribut definieren. Wenn du also resistor als Reading setzbar haben willst, dann den Präfix lt cref mit resistor ergänzen. Dann sollte der set-Befehl funktieren.
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

Gisbert

Zitat von: rudolfkoenig am 06 Juli 2019, 11:38:42
Schau Dir mal MQTT_GENERIC_DEVICE an.
Laut commandref gibt es:  MQTT   MQTT2_DEVICE   MQTT_BRIDGE   MQTT_DEVICE   MQTT_GENERIC_BRIDGE, aber nicht MQTT_GENERIC_DEVICE. Ist MQTT_GENERIC_BRIDGE gemeint?

Zitat von: Beta-User am 06 Juli 2019, 12:56:44
Du musst ein setreading-Attribut definieren. Wenn du also resistor als Reading setzbar haben willst, dann den Präfix lt cref mit resistor ergänzen. Dann sollte der set-Befehl funktieren.

Ich entnehme beiden Aussagen, dass es wohl möglich ist, aber leider :'( habe ich noch nicht genau verstanden, wie es geht.
Zu setreading steht in der commandref:
setreading <devspec> <reading> <value>
- aber den Wert des <reading> gibt es ja schon.

Zitat von: Beta-User am 06 Juli 2019, 12:56:44
Wenn du also resistor als Reading setzbar haben willst, dann den Präfix lt cref mit resistor ergänzen.
Das verstehe leider auch nicht :'(

Ich werde mich wohl mit dem Modul MQTT_GENERIC_BRIDGE auseinandersetzen (müssen). Das wird für mich aber eine harte Nuss werden, was ich bisher im Wiki, dem verlinkten Thread und commandref überflogen habe. Ich mach erst mal eine Pause und melde mich ggf. später nochmals.

Vielen Dank und viele Grüße
Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Beta-User

Sorry, vorher war mobil...

Also: Du brauchst für ein generisches MQTT-Gerät wie einen tasmota keine MQTT_GENERIC_BRIDGE, um einen "freien Wert" an das Gerät schicken zu können.

Du hast bereits ein MQTT_DEVICE für den betreffenden tasmota-ESP, oder?

Dann setzt du dort einfach für jedes beliebige Reading, (das muß vorher nicht vorhanden sein) ein Attribut, das sich eben aus einem Präfix "publishSet_" und dem (gewünschten) Readingnamen zusammensetzt.

Komplett für das Beispiel "resistor":

attr <dein MQTT_DEVICE-Gerätenamen> publishSet_resistor <topic-Pfad>

(topic-Pfad dazu kann z.B. sein: "meinHaus/MeinEG/HeizungsESP/Widerstand/set")

Dann kannst du einfach
set <dein MQTT_DEVICE-Gerätenamen> resistor 55

verwenden, um diesen Wert "55" als payload an den angegebenen topic zu übermitteln...

(@Rudi: Im Prinzip machen also die publishSet_.*-Attribute das, was bei einem MQTT2_DEVICE die setList machen 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

Gisbert

Hallo Beta-User,

ZitatDu hast bereits ein MQTT_DEVICE für den betreffenden tasmota-ESP, oder?
In Fhem ist für mein Vorhaben ein MQTT_DEVICE geplant, und auf dem ESP wird ein eigener Sketch mit MQTT vorhanden sein.

Ich kann deinen Ausführungen folgen bis zum folgenden Punkt, das wird alles so funktionieren:
set <dein MQTT_DEVICE-Gerätenamen> resistor 55
Wie bekomme ich aber statt der "55" einen variablen Wert des Readings <resistor> gepublisht?

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Beta-User

Du kannst jeden Wert setzen; 55 war nur ein Beispiel.... Dazu kann man dann auch widgetOverride verwenden, um z.B. einen Slider zu verwenden (siehe erste paar Beiträge in diesem Thread: https://forum.fhem.de/index.php/topic,86932.msg819123.html#msg819123; das "Modul" war nur eine Variante von MQTT_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

Gisbert

Hallo Beta-User,

mir ist klar, dass ich jeden beliebigen Wert (oder Zeichenkette) senden kann. Ich glaube wir reden aneinander vorbei.

Die Betonung im obigen Satz liegt auf dem Subjekt, d.h. ich muss den Wert eintippen (oder sonst irgendwo hart verdrahtet in ein notify oder DOIF, ...reinschreiben.

Ich möchte (und muss) aber den Inhalt des Readings (der sich ständig ändert, ohne dass ich davon etwas weiß) zum ESP schicken, ohne irgendwo einen spezifischen Wert zum Publishen einzutragen.

Ich hoffe, dass ich meine Nöte verständlich geschildert habe. Um es in Worte zu fassen, müsste die Aufgabe folgendermaßen lauten:

  • Lies den Wert des Readings <resitors> und merke dir ihn irgenwo
  • Sende den ausgelesenen und gemerkten Wert an den ESP

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Beta-User

Das verstehe ich wirklich nicht...

Also: Entweder du hast eine Logik, die den Wert berechnet (Reaktion auf einen anderen Meßwert durch einen Eventhandler, z.B. notify. dort wird dann gerechnet, welchen Wert "resistor" haben soll und die entsprechende Anweisung an das MQTT_DEVICE gegeben; das macht dann das publish. Problem gelöst, oder?

Oder noch anders formuliert: <value> muß erst im Zeitpunkt des publishs feststehen, es kann zu einem beliebigen Zeitpunkt einen beliebigen Wert haben, du kannst das in sehr kurzer Frequenz neu setzen...

Oder der Wert kommt vom ESP, dann ist es eine Info, und die hat in publishSet dann nichts verloren (weil man nicht den reinkommenden Wert nutzen sollte, um denselben Wert zu berechnen und zurückzuschicken; das ist sonst "infinte loop"-verdächtig.

Würde evtl. mehr Sinn machen, du machst entweder selbst mal einen Test (und läßt den ESP an der seriellen Schnittstelle ausspucken, was er empfängt oder liest den MQTT-Verkehr mit) oder schaust dir nochmal das MiLight-Beispiel an (da wird via Colorpicker ein beliebiger Brightness-Wert zwischen 0-255 gesendet bzw. ein Farbwert).
(Fyi: die Terminologie ist hier eine andere als bei MQTT2_DEVICE, wo z.B. noch $EVTPART1 verwendet wird und klarer ist, dass das, was gesendet wird eigentlich eine Variable ist. Wenn dir diese Schreibweise einfacher vorkommt, kannst du auch einfach MQTT2_CLIENT und MQTT2_DEVICE verwenden. Das geht auch parallel zu MQTT+MQTT_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

PatrickR

{fhem('set MQTTGERAET resistor '.ReadingsVal('GERÄT', 'READING', '')}

So in etwa. Quick'n'dirty.


Von unterwegs gesendet.
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

Gisbert

Hallo PatrickR,
Hallo Beta-User,

dein Vorschlag wird leider mit einem Fehler quittiert (in der Art "syntax error at (eval 2555493) line 1, at EOF" - wobei die Zahl nach eval auch anders lauten könnte.

Ich habe aber noch ein weiteres Problem.
Ich möchte die Spannung und den Istwert, die beide vom ESP gepublisht werden, in Fhem empfangen.
Das funktioniert wie folgt:
defmod Heizung_Widerstand MQTT_DEVICE
attr Heizung_Widerstand IODev MyBroker
attr Heizung_Widerstand autoSubscribeReadings Heizung/Widerstand/+
attr Heizung_Widerstand subscribeReading_Istwert Heizung/Widerstand/Istwert
attr Heizung_Widerstand subscribeReading_Spannung Heizung/Widerstand/Spannung

Soweit so gut.
Wenn ich den Sollwert aus Fhem publishen möchte, kann ich das wie folgt machen:
attr Heizung_Widerstand publishSet Heizung/Widerstand/Sollwert
Das Publishen aus Fhem funktioniert dann so:
set Heizung_Widerstand 12000
Der Wert taucht dann als Readings state auf.
Auch das ist ok, das Subskribieren funktioniert weiterhin.
Wenn ich jedoch das Attribut publishSet_Sollwert (mit Heizung/Widerstand/Sollwert) bemühe, dann funktioniert zwar der Publishbefehl nach wie vor (set <name> <reading> <value>), aber das Subskribieren ist komplett eingestellt.

________________________________________
Um in der ursprünglichen Frage weiterzukommen, habe ich das Attribut publishset benutzt.
Ich möchte den Wert des userReadings Aussentemp als Sollwert publishen - wie mache ich das?
defmod Heizung_Widerstand MQTT_DEVICE
attr Heizung_Widerstand IODev MyBroker
attr Heizung_Widerstand publishSet Heizung/Widerstand/Sollwert
attr Heizung_Widerstand subscribeReading_Istwert Heizung/Widerstand/Istwert
attr Heizung_Widerstand subscribeReading_Spannung Heizung/Widerstand/Spannung
attr Heizung_Widerstand userReadings Aussentemp {ReadingsVal('TH.Kuhlmannweg8','temperature','')*8500}

setstate Heizung_Widerstand 11000
setstate Heizung_Widerstand 2019-07-11 22:31:54 Aussentemp 185300
setstate Heizung_Widerstand 2019-07-11 22:22:52 Istwert 10000
setstate Heizung_Widerstand 2019-07-11 22:31:54 Spannung 3.28
setstate Heizung_Widerstand 2019-07-11 22:22:27 state 11000
setstate Heizung_Widerstand 2019-07-11 22:31:54 transmission-state incoming publish received


Ich verstehe immer noch nicht, wie ich den Wert des userReadings Aussentemp als Sollwert publishen kann.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Beta-User

Zum Einstellen der subscriptions kann ich wenig sagen, bin auf MQTT2_DEVICE...

Was das userReading angeht, habe ich den dringenden Verdacht, dass das kein geräteinternes Event erzeugt. Dafür benötigst du einen anderen Weg (z.B. notify ,(wahlweise mit direktem publish über das IO oder dem Setzen des Readings in Heizung_Widerstand) oder MQTT_GENERIC_BRIDGE mit einer entsprechenden publish-Expression für den Außentemperaturfühler, hilfsweise vielleicht auch ein sleep im userReading (argh, lieber nicht...)).
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

Gisbert

Hallo zusammen,

in der Zwischenzeit habe ich eine total simple Lösung (selbst) gefunden.
Das Publishen eines Readings eines beliebigen Devices geht wohl so (getestet):
set publish <MQTT device> [<device>:<reading>]

Für mich ist deshalb die Sache gelöst.
Hier noch die Definition des MQTT-Devices:
defmod Heizung_Widerstand MQTT_DEVICE
attr Heizung_Widerstand IODev MyBroker
attr Heizung_Widerstand publishSet Heizung/Widerstand/Sollwert
attr Heizung_Widerstand subscribeReading_Istwert Heizung/Widerstand/Istwert
attr Heizung_Widerstand subscribeReading_Spannung Heizung/Widerstand/Spannung
attr Heizung_Widerstand userReadings Widerstand {round(32.84216*exp(-0.052613*ReadingsVal('TH.Kuhlmannweg8','temperature','')),0)}


Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY