[74_XiaomiBTLESens.pm] Xiaomi Bluetooth Sensoren FlowerSens/Thermometer

Begonnen von CoolTux, 11 Januar 2018, 15:42:45

Vorheriges Thema - Nächstes Thema

CoolTux

Mal schauen was trinitywhm hat.
Habe schon öfters über Probleme mit älteren bluez Versionen gelesen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

trinitywhm


CoolTux

Dann schlage ich vor einfach mal auf Stretch zu gehen und dann zu schauen. Versprechen kann ich nichts aber es wäre ein Anfang.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

trinitywhm

Die Antwort habe ich befürchtet. Aber ich weiß dass das der nächste sinnvolle Schritt ist.
Wir allerdings adhoc jetzt nix, melde mich wenn ich damit durch bin und ob es was gebracht hat.
Danke bis hierhin.

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

distel

Hi,

das Thema hier hast Du noch auf dem Schirm? https://forum.fhem.de/index.php/topic,82572.msg757022.html#msg757022

Kurzfassung:
- Keine Zombies mehr
- selten klappt das Verarbeiten der Rückmeldung (beobachtet, wenn nur eine Zeile als Antwort kommt)
- häufig klappt das Verarbeiten der Rückmeldung nicht (beobachtet, wenn mehr als eine Zeile als Antwort kommt)

Gruß Dirk
NUC-I37100
Docker: eBus, fhem, ha-bridge, unifi
Hardware: Homematic, FS20, Somfy RTS, 1wire, FBAHA, enOcean

CoolTux

Hab ich auf dem Schirm. Glaube habe auch schon was gemacht.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Zitat von: trinitywhm am 29 Januar 2018, 20:58:56
Auch wenn das zwei verschiedene Probleme sein mögen, habe ich dennoch immernoch o.g. Meldungen im Log. Auch mit verbose 0 auf allen Pflanzensensoren kommen die Timeout-Meldungen im Log. Habe die Pflanzensensoren nun alle disabled.
@CoolTux: Ist denn hier eine Lösung in Sicht, oder soll ich zunächst wieder auf das alte Modul zurückgehen?

Kannst Du mir ein Gefallen tun und das ganze bitte einmal ohne SSH testen?


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

distel

Zitat von: CoolTux am 31 Januar 2018, 08:56:20
Hab ich auf dem Schirm. Glaube habe auch schon was gemacht.
Dann schaul ich mal am Abend und zieh die aktuelle devel.zip drauf. Vielleicht ist ja schon alles gut :)
NUC-I37100
Docker: eBus, fhem, ha-bridge, unifi
Hardware: Homematic, FS20, Somfy RTS, 1wire, FBAHA, enOcean

CoolTux

Zitat von: distel am 31 Januar 2018, 12:36:30
Dann schaul ich mal am Abend und zieh die aktuelle devel.zip drauf. Vielleicht ist ja schon alles gut :)

Sei mal so nett. Mich interessiert gerade ob das vom SSH kommt oder generell so nicht ganz sauber läuft.
Danke Dir.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

distel

Zitat von: CoolTux am 31 Januar 2018, 12:39:29
Sei mal so nett. Mich interessiert gerade ob das vom SSH kommt oder generell so nicht ganz sauber läuft.
Danke Dir.
So, hab die aktuelle devel5 nochmal gezogen und probiert. Es scheint wirklich daran zu liegen, dass die Abfragen auf das gelieferte Ergebnis nicht funktionieren, wenn mehr als eine "Antwortzeile" kommt.

Mit dieser Rückgabe klappt es:
2018.01.31 20:30:12 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: call gatttool with command ssh fhem@radiohub-1.home 'timeout 15 gatttool -i hci0 -b 4C:65:A8:D0:42:63 --char-write-req -a 0x10 -n 0100 --listen 2>&1 /dev/null' and loop 0
2018.01.31 20:30:27 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: gatttool loop result Characteristic value was written successfully
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00

2018.01.31 20:30:27 4: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: gatttool result Characteristic value was written successfully
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00

2018.01.31 20:30:27 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Done: gatttool return string: xbtle.temp.eg.flur|4C:65:A8:D0:42:63|ok|write|0x10|{"gtResult":"54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00 "}


Sekunden später klappt es nicht:
2018.01.31 20:33:38 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: call gatttool with command ssh fhem@radiohub-1.home 'timeout 15 gatttool -i hci0 -b 4C:65:A8:D0:42:63 --char-write-req -a 0x10 -n 0100 --listen 2>&1 /dev/null' and loop 0
2018.01.31 20:33:54 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: gatttool loop result Characteristic value was written successfully
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 37 00
...
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00

2018.01.31 20:33:54 4: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: gatttool result Characteristic value was written successfully
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 37 00
...
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00

2018.01.31 20:33:55 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: call gatttool with command ssh fhem@radiohub-1.home 'gatttool -i hci0 -b 4C:65:A8:D0:42:63 --char-read -a 0x35 2>&1 /dev/null' and loop 0


Das Thermometer hat halt die "Angewohnheit", seine Messwerte bis ca. 10x rauszuposaunen. :-/

Hab in Deinen Code geschaut, und bin irgendwo in der Ecke Zeile 490 hängen geblieben. Leider habe ich keine Ahnung vom Array/String-Handling in Perl, daher kann ich nicht beurteilen, was im jeweiligen Falle in $gtResult[1] drin ist. Daher hab ich zwei Log3 Aufrufe eingefügt:
2018.01.31 20:44:34 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: gatttool loop result Characteristic value was written successfully
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00

2018.01.31 20:44:34 4: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: gatttool result Characteristic value was written successfully
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00

2018.01.31 20:44:34 5: XiaomiBTLESens (xbtle.temp.eg.flur) - gtResult[1]: 54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00
Notification handle = 0x000e value
2018.01.31 20:44:34 5: XiaomiBTLESens (xbtle.temp.eg.flur) - json_notification: {"gtResult":"54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00 \nNotification handle = 0x000e value"}
2018.01.31 20:44:36 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: call gatttool with command ssh fhem@radiohub-1.home 'gatt


Knackpunkt dürfte sein, dass im Element [1] nicht nut der "Response"-Teil "54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00" sondern nach einem Umbruch o.ä. auch noch der Führungstext der nächsten Zeile "Notification handle = 0x000e value" drin ist.

Die folgende RegEx "if($gtResult[1] =~ /^([0-9a-f]{2}(\s?))*$/) {" refrenziert aber auf das Ende des Strings, dass erst nach dem zweiten Teil (Führungstext) erreicht ist. Somit scheint mir klar, warum es funktioniert, wenn nur genau eine Antwortzeile zurückkommt.

Das Zeichen, das für den Umbruch sorgt ist ein "0A" in Hex - also klassischer LineFeed. den müsstest Du noch irgendwie ausfiltern/ersetzen, so dass die Antwort tatsächlich "frei" steht. Ich habe eine Ausgabe vom gatttool angehängt, da dort auch noch ein Leerzeichen vor dem 0A steht. Dann kannst Du dagegen prüfen.

Gruß

Dirk
NUC-I37100
Docker: eBus, fhem, ha-bridge, unifi
Hardware: Homematic, FS20, Somfy RTS, 1wire, FBAHA, enOcean

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Zitat von: distel am 31 Januar 2018, 21:04:05
So, hab die aktuelle devel5 nochmal gezogen und probiert. Es scheint wirklich daran zu liegen, dass die Abfragen auf das gelieferte Ergebnis nicht funktionieren, wenn mehr als eine "Antwortzeile" kommt.

Mit dieser Rückgabe klappt es:
2018.01.31 20:30:12 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: call gatttool with command ssh fhem@radiohub-1.home 'timeout 15 gatttool -i hci0 -b 4C:65:A8:D0:42:63 --char-write-req -a 0x10 -n 0100 --listen 2>&1 /dev/null' and loop 0
2018.01.31 20:30:27 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: gatttool loop result Characteristic value was written successfully
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00

2018.01.31 20:30:27 4: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: gatttool result Characteristic value was written successfully
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00

2018.01.31 20:30:27 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Done: gatttool return string: xbtle.temp.eg.flur|4C:65:A8:D0:42:63|ok|write|0x10|{"gtResult":"54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00 "}


Sekunden später klappt es nicht:
2018.01.31 20:33:38 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: call gatttool with command ssh fhem@radiohub-1.home 'timeout 15 gatttool -i hci0 -b 4C:65:A8:D0:42:63 --char-write-req -a 0x10 -n 0100 --listen 2>&1 /dev/null' and loop 0
2018.01.31 20:33:54 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: gatttool loop result Characteristic value was written successfully
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 37 00
...
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00

2018.01.31 20:33:54 4: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: gatttool result Characteristic value was written successfully
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 37 00
...
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00

2018.01.31 20:33:55 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: call gatttool with command ssh fhem@radiohub-1.home 'gatttool -i hci0 -b 4C:65:A8:D0:42:63 --char-read -a 0x35 2>&1 /dev/null' and loop 0


Das Thermometer hat halt die "Angewohnheit", seine Messwerte bis ca. 10x rauszuposaunen. :-/

Hab in Deinen Code geschaut, und bin irgendwo in der Ecke Zeile 490 hängen geblieben. Leider habe ich keine Ahnung vom Array/String-Handling in Perl, daher kann ich nicht beurteilen, was im jeweiligen Falle in $gtResult[1] drin ist. Daher hab ich zwei Log3 Aufrufe eingefügt:
2018.01.31 20:44:34 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: gatttool loop result Characteristic value was written successfully
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00

2018.01.31 20:44:34 4: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: gatttool result Characteristic value was written successfully
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00
Notification handle = 0x000e value,54 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00

2018.01.31 20:44:34 5: XiaomiBTLESens (xbtle.temp.eg.flur) - gtResult[1]: 54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00
Notification handle = 0x000e value
2018.01.31 20:44:34 5: XiaomiBTLESens (xbtle.temp.eg.flur) - json_notification: {"gtResult":"54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00 \nNotification handle = 0x000e value"}
2018.01.31 20:44:36 5: XiaomiBTLESens (xbtle.temp.eg.flur) - ExecGatttool_Run: call gatttool with command ssh fhem@radiohub-1.home 'gatt


Knackpunkt dürfte sein, dass im Element [1] nicht nut der "Response"-Teil "54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00" sondern nach einem Umbruch o.ä. auch noch der Führungstext der nächsten Zeile "Notification handle = 0x000e value" drin ist.

Die folgende RegEx "if($gtResult[1] =~ /^([0-9a-f]{2}(\s?))*$/) {" refrenziert aber auf das Ende des Strings, dass erst nach dem zweiten Teil (Führungstext) erreicht ist. Somit scheint mir klar, warum es funktioniert, wenn nur genau eine Antwortzeile zurückkommt.

Das Zeichen, das für den Umbruch sorgt ist ein "0A" in Hex - also klassischer LineFeed. den müsstest Du noch irgendwie ausfiltern/ersetzen, so dass die Antwort tatsächlich "frei" steht. Ich habe eine Ausgabe vom gatttool angehängt, da dort auch noch ein Leerzeichen vor dem 0A steht. Dann kannst Du dagegen prüfen.

Gruß

Dirk

Ich bilde mir ein jetzt habe ich es. Kannst Du bitte einmal die neuste Develversion Dir holen.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

distel

Zitat von: CoolTux am 01 Februar 2018, 13:57:19
Ich bilde mir ein jetzt habe ich es. Kannst Du bitte einmal die neuste Develversion Dir holen.

Hmm, leider funktioniert es damit nicht.
Ich weiß leider nicht, was die Blumen-Sensoren an Rückgabe liefern, daher fällt es mir schwer, etwas zu ersinnen, was für beide funktioniert.

Das Thermometer liefert wie folgt (Beispiel mit mehr als einer Antwortzeile:
Characteristic value was written successfully\n
Notification handle = 0x000e value: 54 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00\n
Notification handle = 0x000e value: 54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00\n
Notification handle = 0x000e value: 54 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00\n


Wenn du das jetzt Anhand des ": " splittest, bekommst du

Index 0Characteristic value was written successfully\n
Notification handle = 0x000e value
Index 154 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00\n
Notification handle = 0x000e value
Index 254 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00\n
Notification handle = 0x000e value
Index 354 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00\n

Dann greifst Du auf Index 1 zu, hast da aber am Ende noch "zuviel" drinstehen und deine RegEx greift nicht.

Du könntest vor dem splitten die Umbrüche via RegEx durch ": "  ersetzen: ...  =~ s/\n/: /g;
Characteristic value was written successfully: Notification handle = 0x000e value: 54 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00: Notification handle = 0x000e value: 54 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00: Notification handle = 0x000e value: 54 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00:

Und dann wie gehabt anhand von ": " splitten:

Index 0Characteristic value was written successfully
Index 1Notification handle = 0x000e value
Index 254 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00
Index 3Notification handle = 0x000e value
Index 454 3d 32 31 2e 39 20 48 3d 34 36 2e 36 00
Index 5Notification handle = 0x000e value
Index 654 3d 32 31 2e 39 20 48 3d 34 36 2e 35 00
Index 7

Dann musst Du aber auf Index 2 zugreifen, nicht 1. Und da liegt die Crux: Wie genau (also inkl. \n oder ähnlichem sieht die Antwort vom FlowerSensor aus?

Alternativ könntest Du zwei Zweige einbauen, aus denen jeweils nur ein String herauskommt (ähnlich, wie du es mit der aktuellen Fallunterscheidung drin hast. Dann könnte ich "gefahrlos" ergänzen und dir den Teil zukommen lassen.

Gruß Dirk


NUC-I37100
Docker: eBus, fhem, ha-bridge, unifi
Hardware: Homematic, FS20, Somfy RTS, 1wire, FBAHA, enOcean

CoolTux

Guten Morgen Dirk,

Vielen Dank für Deine ausführliche Erklärung. Ich werde mal schauen das ich mir das die Tage anschaue. Denke ich habe da schon eine Idee.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net