FHEM MQTT und Tinkerforge AirQuality Bricklet

Begonnen von Alex_S81, 26 September 2021, 10:54:07

Vorheriges Thema - Nächstes Thema

Alex_S81

Hallo zusammen.

Ich habe einen Raspi 3 B+ auf dem FHEM läuft.
Ein Nano Cul 868 und eine Bresser 5 in 1 Wetterstation laufen einwandfrei, inkl. SVGs etc.

Nun wollte ich den nächsten Schritt machen und für die Innenraumwerte einen Sensor in FHEM integrieren.
Gekauft:  Tinkerforge HAT Brick + AirQuality Bricklet.

Das funktioniert auch soweit über den Tinkerforge Viewer.

Ich hab es nun auch hinbekommen das:
Ich die Werte des Sensors über Mqtt abrufen kann, z.b. mit mqtt.fx
In FHEM läuft ein MQTT Client mit opend
Ein Device "TinkerAir" läuft auch.

Wenn ich mit mqtt.fx ein request mache gibt er die Werte auch in FHEM im device aus.
Siehe Screenshot.

Nun mein Problem.

Ich bekomme es nicht hin das FHEM in definierten Zeitabständen den Sensor von sich aus abfägt. Geht das überhaupt ?


Und kann ich die Werte im Device
get_temperature {"iaq_index": 189, "iaq_index_accuracy": "low", "temperature": 2333, "humidity": 5836, "air_pressure": 99293}
2021-09-26 10:32:03"
als Reading auslesen und wenn ja wie.

Beim NanoCul hab ich das hinbekommen nur hier hakt es ein wenig mit dem Verständnis der commandref.


Wäre sehr dankbar für ein paar Hinweise oder Hilfestellungen.

Gruß Alex






Alex_S81

Achso ja:

FHEM, HAT mit Sensor, NanoCul, MQTT alles läuft auf dem selben Raspi.
Abgerufen wird das im Moment via Tablet im Browser oder vom Smartphone aus.


Beta-User

#2
Siehe Attribut periodicCmd bei MQTT2_DEVICE.
PS: Screenshots vermeiden, besser list o. rawDef in Textform als code #...
PS: ein at mit publish-Befehl an den client würde es auch tun...
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

Alex_S81

Hallo

Da komme ich leider nicht ganz mit.

Ich habe das nicht über mqtt2 gemacht sondern über mqtt_device.
Dort habe ich dann folgendes stehen:

defmod TinkerAir2 MQTT_DEVICE
attr TinkerAir2 autoSubscribeReadings tinkerforge/response/air_quality_bricklet/Qqc/get_temperature
attr TinkerAir2 publishSet tinkerforge/response/air_quality_bricklet/Qqc/get_temperature
attr TinkerAir2 publishSet_get_temperature tinkerforge/request/air_quality_bricklet/Qqc/get_temperature
attr TinkerAir2 subscribeReading_Temperatur tinkerforge/response/air_quality_bricklet/Qqc/get_temperature

setstate TinkerAir2 2021-09-26 17:21:24 IODev MQTTClient
setstate TinkerAir2 2021-09-26 17:28:45 Temperatur {"temperature": 2406}
setstate TinkerAir2 2021-09-26 17:15:39 get_temperature
setstate TinkerAir2 2021-09-26 17:28:45 transmission-state incoming publish received



Mit dem Set Button lässt sich dann ein request auslösen und die Antwort kommt auch.
Bei einem MQTT2_DEVICE ist das mit den Befehlen ganz anders aufgebaut, die selbe raw def funktioniert dort nicht.

Das ist leider alles ziemliches Neuland sorry.

Einen MQTT2_CLIENT bekomme ich zum laufen, ein publish über den set button "tinkerforge/request/air_quality_bricklet/Qqc/get_temperatur"
löst aus und in der konsole spuckt er die werte aus.

defmod MQTT2Client MQTT2_CLIENT 127.0.0.1:1883

setstate MQTT2Client opened
setstate MQTT2Client 2021-09-26 17:39:46 lastPublish tinkerforge/request/air_quality_bricklet/Qqc/get_temperature:
setstate MQTT2Client 2021-09-26 17:21:24 state opened


ZitatPS: ein at mit publish-Befehl an den client würde es auch tun...

Sorry wie meinst du?


Beta-User

Wenn alles Neuland ist (MQTT_DEVICE und MQTT2_DEVICE), dann fang mit MQTT2.* an, und wenn du nichts externes via MQTT am laufen hast, am einfachsten mit MQTT2_SERVER (=deinstalliere Mosquitto). MQTT2_DEVICE kann nämlich auch gleich direkt was mit JSON-encoded Info was anfangen und packt das automatisch aus.

Ansonsten: Ein "at" ist ein Modul, das man zur wiederholenden Ausführung von Befehlen verwendet. Wenn du also sogar schon einen set-Befehl hast, dann kannst du den mit "at" einfach absetzen.

Du solltest halt grundsätzlich entscheiden, wie du weitermachen willst...

PS: "Temperatur" ist kein guter Reading-Name, bleib bei "temperature".
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

Alex_S81

Ok das war jetzt wohl genau das richtige.

Funktioniert mit MQTT2_SERVER jetzt wunderbar ohne Mosquitto.
Auch das at-Modul ist recht Bedienerfreundlich.

Es wurde gleich ein Device angelegt und die Werte werden schön in einem separaten Logfile angelegt.

Vielen Dank für die Hilfestellung.

Beta-User

#6
periodicCmd? Könnte das at überflüssig machen...

Sähe dann (auszugsweise) z.B. so aus (ohne at alle 5 Minuten eine Abfrage):

attr <TinkerAir2> getList temperature:noArg temperature tinkerforge/response/air_quality_bricklet/Qqc/get_temperature
attr <TinkerAir2> periodicCmd temperature:5
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

Alex_S81

#7
Zitat von: Beta-User am 26 September 2021, 20:53:07
periodicCmd? Könnte das at überflüssig machen...

Sähe dann (auszugsweise) z.B. so aus (ohne at alle 5 Minuten eine Abfrage):

attr <TinkerAir2> getList temperature:noArg temperature tinkerforge/response/air_quality_bricklet/Qqc/get_temperature
attr <TinkerAir2> periodicCmd temperature:5


Das werd ich mir die Tage auf jeden Fall noch anschauen und versuchen.

Was mir im Moment aber noch Probleme macht ist das temp, pressure und humidity nicht mit Kommastellen ausgelesen werden.
Sensor gibt dann den Wert z.b. so in das Logfile:  2350 es sind dann tatsächlich 23,50 Grad.
Theoretisch müsste ich die Werte ja nur durch 100 teilen.

Kann man aber dem Server bzw. Device nicht sagen das die letzten 2 Stellen immer Dezimalstellen sind bei bestimmten Werten?

Im Moment lasse ich alle Werte auf einmal auslesen mit "get_all_values"
Das sieht im Log dann so aus wie unten im der Rawdef:
defmod MQTT2_MQTT2Server MQTT2_DEVICE MQTT2Server
attr MQTT2_MQTT2Server readingList MQTT2Server:tinkerforge/response/air_quality_bricklet/Qqc/get_all_values:.* { json2nameValue($EVENT) }\
MQTT2Server:tinkerforge/callback/bindings/last_will:.* last_will
attr MQTT2_MQTT2Server room Logs und Geräte

setstate MQTT2_MQTT2Server 2021-09-27 06:22:04 IODev MQTT2Server
setstate MQTT2_MQTT2Server 2021-09-27 19:05:34 air_pressure 99319
setstate MQTT2_MQTT2Server 2021-09-27 19:05:34 humidity 5891
setstate MQTT2_MQTT2Server 2021-09-27 19:05:34 iaq_index 147
setstate MQTT2_MQTT2Server 2021-09-27 19:05:34 iaq_index_accuracy low
setstate MQTT2_MQTT2Server 2021-09-27 06:11:33 last_will null
setstate MQTT2_MQTT2Server 2021-09-27 19:05:34 temperature 2413




Edit:

Ok da in den Bindings der Tinker Bricklets das hier steht:

request/air_quality_bricklet/<UID>/get_temperature
Anfrage:   
keine Nutzdaten
Antwort:   
temperature – Typ: int, Einheit: 1/100 °C, Wertebereich: [-231 bis 231 - 1]

Gehe ich davon aus dass ich dem Anzeige-Gerät egal welcher Art sagen muss die Temp. wird /100 geteilt wenn ich Grad und nicht 1/100 Grad sehen möchte.

Das bekomme ich in einer Readingsgroup dann so hin:

attr Innenwerte valueFormat { temperature => '{sprintf("%.1f °C",$VALUE/100)}', humidity => '{sprintf("%.1f %%",$VALUE/100)}' }


Geht das nicht auch ein Schritt vorher also das wo das Log erzeugt wird?




Beta-User

Eine solche Automatik existiert nicht. Um das Problem zu lösen, kann man verschiedene Varianten versuchen, ich würde dazu tendieren, in readingList die "einfache" Perl-Anweisung json2NameValue() durch was zu ergänzen, das die Umrechnung vornimmt.
Ungetestet in etwa so:
attr <TinkerAir2> readingList tinkerforge/response/air_quality_bricklet/Qqc/get_all_values:.* {my $rets = json2nameValue($EVENT);; my %cleaned;; for (keys %{$rets}) {$cleaned->{$_} = looks_like_numer($rets->{$_}) ?  $rets->{$_}/100 : $rets->{$_} ;; return \%cleaned }
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