[Erledigt]: Anwesenheitserkennung/Batterieüberwachung

Begonnen von micky0867, 22 August 2016, 20:02:01

Vorheriges Thema - Nächstes Thema

micky0867

Ich habe einen Erweiterungsvorschlag zur Anwesenheitserkennung:
http://www.fhemwiki.de/wiki/Anwesenheitserkennung#Batterie.C3.BCberwachung_.28aktuell_nur_G-Tags.29

Die Batterieüberwachung sollte bei sehr vielen LE-Devices funktionieren.
Spezifikation: https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.battery_level.xml

Dazu habe ich ein Shellscript gebaut, mit dem alle Devices vom Typ "MODE=lan-bluetooth" in FHEM abgefragt werden.
Zu diesen Devices wird die BT-Adresse aus FHEM geholt, der Batteriestand per gatttool ermittelt und dieser unter dem gewählten Attribut wieder in FHEM zurück geschrieben.

Voraussetzung:
lepresenced, socat, bluez, gatttool, root Rechte

Getestet auf Opensuse 13.2, mit bluez 5.2.3


#! /bin/bash

# Falls unter allowed_telnetPort ein Passwort gesetzt ist
TELNETPASSWORD=""
# Das Attribut, fuer den Batteriezustand
ATTRIBUT="batterylevel"


[ ! -z "$TELNETPASSWORD" ] && TELNETPASSWORD="$TELNETPASSWORD\n"
TAGS=$(echo -e "${TELNETPASSWORD}list MODE=lan-bluetooth" | socat -t60 - TCP:127.0.0.1:7072 | grep -v "Password" | tr "[:cntrl:]" "\n" | sed 's/ //g')
for tag in $TAGS
do
  [ "$1" = "-v" ] && echo "Ermittle Adresse fuer $tag ..."
  ADDR=$(echo -e "${TELNETPASSWORD}list $tag" | socat -t60 - TCP:127.0.0.1:7072 | grep "ADDRESS" | awk '{print $2}' | tr "[:cntrl:]" "\n" | sed 's/ //g')
  [ "$1" = "-v" ] && echo "Ermittle $ATTRIBUT fuer $tag ($ADDR) ..."
  LEVEL=$(gatttool -t random -b $ADDR --char-read --uuid 0x2a19 2>&1 | awk '{if($1 == "handle:") {printf("%d\n",strtonum("0x"$4))}}')
  if [ ! -z "$LEVEL" ]; then
    echo -e "${TELNETPASSWORD}setreading $tag $ATTRIBUT $LEVEL" | socat -t60 - TCP:127.0.0.1:7072 | grep -v "Password"
    [ "$1" = "-v" ] && echo "Setze $ATTRIBUT fuer $tag auf $LEVEL"
  else
    [ "$1" = "-v" ] && echo "$tag ($ADDR) nicht in der Naehe"
  fi
  [ "$1" = "-v" ] && echo ""
done


Beispielausgabe, wenn das Script mit dem Parameter "-v" aufgerufen wird (ohne -v sagt das Script nichts):
Zitat
Ermittle Adresse fuer nut_A ...
Ermittle batterylevel fuer nut_A (FC:A5:B4:78:3B:AC) ...
Setze batterylevel fuer nut_A auf 100

Ermittle Adresse fuer nut_B ...
Ermittle batterylevel fuer nut_B (F3:44:04:81:54:89) ...
nut_B (F3:44:04:81:54:89) nicht in der Naehe



Micky

Devender

Hallo Micky,

vielen Danke für deine Erweiterung. Ich setzte es zusätzlich zu der bereits dokumentierten Variante ins Wiki.

Viele Grüße,
Dirk
FHEM 5.8 auf RasPi mit Jessy - CUL868, JeeLink Lacrosse
Komponenten: HM, IT, ELV, FB7390, FritzPL543,Sonos Play3
Mehrere Wandtablets sowie einen Smart Mirror
https://wiki.fhem.de/wiki/Anwesenheitserkennung#PRESENCE-Modul

Taasba

#2
Hallo Micky,

lieben Dank für Dein ShellScript  :)

Ich habe es mal unter Debian/Jessie (RasPi3) versucht, bekomme jedoch die Fehlermeldung, dass der G-Tag nicht in der Nähe ist.

Folgendes wirft das Script Aufruf in der Shell aus:
"Ermittle Adresse für (NAME unter fhem)
"Ermittle batterylevel für (NAME unter fhem) (MAC)
"(Name unter fhem) (MAC) nicht in der Naehe

Stimmt ja aber nicht, da die G-Tags in fhem und unter lescaned ja auch gefunden werden.

Nachtrag: "Wenn das Programm mit den Fehlermeldungen durchgelaufen ist, werden alle G-Tags auf "absent" gesetzt. Es hilft nur ein Neustart.

Hast Du eine Idee?

Lieben Dank

Torsten
- fhem mit RasPi3 (debian-jessie) - HomeMatic (CCU2 - HMLAN-Adapter) und diverse HM Komponenten - 6 G-Tags (Anwesenheitserkennung) - SolVisMax Remotecontrol
- CUL 433 (Eigenbau - Arduino Nano C1101) - Alexa

hermi

#3
Hallo zusammen,

habe heute erfolgreich einen Gigaset Keeper unter Debian/Jessie (RasPi3) mit in Betrieb genommen und anfänglich auch Probleme.

1) Ich habe nur einen G-Tag, weshalb die Anfrage "list MODE=lan-bluetooth" keine Liste von Tags ausgibt, sondern die "Internals" meines Tags. Deshalb funktioniert das Script im weiteren Verlauf nicht. Abhilfe schafft dieser kleine Zusatz:

if [ -z "$LETAGS" ]; then
   TAGS=$(echo -e "${TELNETPASSWORD}list MODE=lan-bluetooth" | socat -t60 - TCP:127.0.0.1:7072 | grep -v "Password" | tr "[:cntrl:]" "\n" | sed 's/ //g')
+  # If TAGS starts with "Internals:" we have only one TAG
+  if [ ! -z $(echo "$TAGS" | grep '^Internals:') ]; then
+    # Get its name from the NAME internals
+    TAGS=$(echo "$TAGS" | grep 'NAME' | sed s/NAME//)
+  fi
else
   TAGS="$LETAGS"
fi


2) Weiterhin musste ich im gatttool-Aufruf das "-t random" entfernen, da das Script sonst hängen blieb (und damit möglicherweise auch lepresenced störte?):

     ADDR=$(echo "$TCONFIG" | awk '{if($1=="ADDRESS") print $2}' | tr "[:cntrl:]" "\n" | sed 's/ //g')
     [ ! -z "$VERBOSE" ] && echo "Fetching $ATTRIBUT for $tag ($ADDR) ..."
-    LEVEL=$(gatttool -t random -b $ADDR --char-read --uuid 0x2a19 2>&1 | awk '{if($1 == "handle:") {printf("%d\n",strtonum("0x"$4))}}')
+    LEVEL=$(gatttool -b $ADDR --char-read --uuid 0x2a19 2>&1 | awk '{if($1 == "handle:") {printf("%d\n",strtonum("0x"$4))}}')
     if [ ! -z "$LEVEL" ]; then
       echo -e "${TELNETPASSWORD}setreading $tag $ATTRIBUT $LEVEL" | socat -t60 - TCP:127.0.0.1:7072 | grep -v "Password"


3) Zusätzlich musste ich gawk installieren, da ich sonst einen Fehler bezüglich der Funktion "strtonum()" bekam.

Mit diesen Änderungen kann ich jetzt problemlos den Batteriestatus auslesen. lepresenced wird zwar weiterhin gestört (wohl weil das hci0-Device vom gatttool übernommen wird), aber im bluetooth_thread() wird der lescan nach einer RETRY_SLEEP-Zeit von einer Sekunde wieder neu gestartet. Vielleicht macht es Sinn, diese RETRY_SLEEP-Zeit etwas zu erhöhen, damit der gatttool-Befehl etwas mehr Zeit hat?

Grüße,
Hermann

Nachtrag:
Die o.g. Änderungen betreffen nicht das Script, welches am Anfang dieses Themas gezeigt ist, sondern die erweiterte Version (https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery), auf welche in http://www.fhemwiki.de/wiki/Anwesenheitserkennung#Batterie.C3.BCberwachung_.28alle_Devices_vom_Typ_.22MODE.3Dlan-bluetooth.22.29 Bezug genommen wird.

Mumpitz

hallo zusammen

ich habe das script soeben ausgeführt, direkt auf der Konsole des Raspi. Das Script holt die beiden MAC Adressen der G-Tags heraus und listet sie auf. Leider erscheint bei beiden die Meldung,


gtag_mumpitz (7C:XX:80:AA:5F:8C) nicht in der Naehe



gtag_weib (7C:XX:80:XX:5F:8C) nicht in der Naehe


Die beiden G-Tags sind jedoch gemäss fhem zu Hause....

hat jemand eine Idee?

hermi

Hallo Mumpiz,

hast Du das Script auch mit root-Rechten (sudo) ausgeführt?

Gruß,
Hermann

Mumpitz

Hallo hermi
Danke für die schnelle Antwort!

Hier meine Eingabe
root@raspberrypi:/opt/fhem# sudo ./batterie_gtag_neu.sh -v
Ermittle Adresse fuer gtag_mumpitz ...
Ermittle batterylevel fuer gtag_mumpitz (7C:2F:XX:AA:5F:8C) ...
gtag_reto (7C:2F:XX:AA:5F:8C) nicht in der Naehe


Daran kanns also nicht liegen. Wenn ich nur das gattool nehme erscheint: Connection refused

Weisst du Rat?

DeeSPe

Bei mir läuft das Skript wenn ich es so geändert habe sehr gut  (auch ohne gawk).
So werden auch nur Geräte berücksichtigt die present sind.

#! /bin/bash
# Falls unter allowed_telnetPort ein Passwort gesetzt ist
TELNETPASSWORD=""
# Das Attribut, fuer den Batteriezustand
ATTRIBUT="battery"

[ ! -z "$TELNETPASSWORD" ] && TELNETPASSWORD="$TELNETPASSWORD\n"
TAGS=$(echo -e "${TELNETPASSWORD}list MODE=lan-bluetooth:FILTER=presence=present" | socat -t60 - TCP:127.0.0.1:7072 | grep -v "Password" | tr "[:cntrl:]" "\n" | sed 's/ //g')
# If TAGS starts with "Internals:" we have only one TAG
if [ ! -z $(echo "$TAGS" | grep '^Internals:') ]; then
  # Get its name from the NAME internals
  TAGS=$(echo "$TAGS" | grep 'NAME' | sed s/NAME//)
fi
for tag in $TAGS
do
  [ "$1" = "-v" ] && echo "Ermittle Adresse fuer $tag ..."
  ADDR=$(echo -e "${TELNETPASSWORD}list $tag" | socat -t60 - TCP:127.0.0.1:7072 | grep "ADDRESS" | awk '{print $2}' | tr "[:cntrl:]" "\n" | sed 's/ //g')
  [ "$1" = "-v" ] && echo "Ermittle $ATTRIBUT fuer $tag ($ADDR) ..."
  stringZ=$(sudo gatttool -b 7C:2F:80:AB:FB:D1 --char-read --handle=0x001b)
  stringZ=${stringZ:33:2}
  stringZ=$(echo "$stringZ" | tr a-f A-F)
  LEVEL=$(echo "ibase=16; $stringZ" | bc)
  if [ ! -z "$LEVEL" ]; then
    echo -e "${TELNETPASSWORD}setreading $tag $ATTRIBUT $LEVEL" | socat -t60 - TCP:127.0.0.1:7072 | grep -v "Password"
    [ "$1" = "-v" ] && echo "Setze $ATTRIBUT fuer $tag auf $LEVEL"
  else
    [ "$1" = "-v" ] && echo "$tag ($ADDR) nicht in der Naehe"
  fi
  [ "$1" = "-v" ] && echo ""
done


Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

hermi

@Mumpiz:
Ich hatte manchmal das Problem, dass der erste Aufruf des Scripts fehlschlug, bei zweiten Mal funktionierte es aber immer.

@DeeSPe:
Du benutzt das Original-Script von micky0867, welches den 'bc' zur Berechnung nutzt. Ich habe die Version von hier genommen: https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery. Diese benutzt awk (gawk) zur Berechnung.

DeeSPe

Ich habe einfach beide (das hier vorgeschlagene und das aus dem Wiki) Skripte gemischt so dass es funktioniert.
So kommt jedenfalls immer ein Batteriewert wenn das Script läuft und es läuft nicht unnötig obwohl das Device absent ist.

Ich weiß dass das Skript aus github gawk benutzt! Das fand ich eben auch nicht so gut. Deswegen meine Änderungen.

Habe das Skript zwar umgeschrieben und getestet, benutze es aber nicht.
Bei mir läuft das Skript aus dem Wiki in leicht abgewandelter Form. Dieses wird dann von einem notify bei erkannter Anwesenheit ausgeführt.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Mumpitz

Hallo DeeSpe

ich habe Dein Script ebenfalls versucht. Ich kriege dabei folgende Meldung:


root@raspberrypi:/opt/fhem# sudo ./batterie_gtag_neu.sh -v
Ermittle Adresse fuer gtag_mumpitz ...
Ermittle battery fuer gtag_mumpitz (7C:2F:XX:AA:5F:8C) ...
connect: Connection refused (111)
gtag_reto (7C:2F:XX:AA:5F:8C) nicht in der Naehe

Ermittle Adresse fuer gtag_weib ...
Ermittle battery fuer gtag_weib (7C:2F:XX:AA:5F:03) ...
connect: Connection refused (111)
gtag_susanne (7C:2F:XX:AA:5F:03) nicht in der Naehe


ich habe auch versucht, das script mehrmals auszuführen, ebenfalls ohne Erfolg.

Hast Du sonst noch eine Idee?

DeeSPe

Zitat von: Mumpitz am 22 November 2016, 20:20:56
Hallo DeeSpe

ich habe Dein Script ebenfalls versucht. Ich kriege dabei folgende Meldung:


root@raspberrypi:/opt/fhem# sudo ./batterie_gtag_neu.sh -v
Ermittle Adresse fuer gtag_mumpitz ...
Ermittle battery fuer gtag_mumpitz (7C:2F:XX:AA:5F:8C) ...
connect: Connection refused (111)
gtag_reto (7C:2F:XX:AA:5F:8C) nicht in der Naehe

Ermittle Adresse fuer gtag_weib ...
Ermittle battery fuer gtag_weib (7C:2F:XX:AA:5F:03) ...
connect: Connection refused (111)
gtag_susanne (7C:2F:XX:AA:5F:03) nicht in der Naehe


ich habe auch versucht, das script mehrmals auszuführen, ebenfalls ohne Erfolg.

Hast Du sonst noch eine Idee?

Hmmm, keine Ahnung! Da es ja vom Script gefunden wurde muss es ja auch present sein.
Das "connect: Connection refused (111)" verstehe ich nicht!
Was ist mit dem Skript aus dem Wiki? Funktioniert es damit bei Dir?

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Mumpitz

Zitat von: DeeSPe am 22 November 2016, 20:30:51
Hmmm, keine Ahnung! Da es ja vom Script gefunden wurde muss es ja auch present sein.
Das "connect: Connection refused (111)" verstehe ich nicht!
Was ist mit dem Skript aus dem Wiki? Funktioniert es damit bei Dir?

Gruß
Dan

hallo Dan

Wenn ich das betreffende Script nehme erscheint folgendes:

root@raspberrypi:/opt/fhem# ./batterie_gtag_mumpitz.sh
connect: Connection refused (111)
Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.


Das script sieht so aus:
#!/bin/bash
stringZ=$(sudo gatttool -b 7C:2F:80:SS:5F:8C --char-read --handle=0x001b)
stringZ=${stringZ:33:2}
stringZ=$(echo "$stringZ" | tr a-f A-F)
decimal=$(echo "ibase=16; $stringZ" | bc)
perl /opt/fhem/fhem.pl 7072 "setreading gtag_mumpitz Batterie $decimal"

DeeSPe

Ich habe echt gerade keine Ahnung was da bei Dir schief läuft!
Auch bei dem Skript aus dem Wiki kommt ja bei Dir "connect: Connection refused (111)"!

Der GTag ist aber nicht mit irgendwas gekoppelt!?

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Mumpitz

Zitat von: DeeSPe am 22 November 2016, 20:56:40
Ich habe echt gerade keine Ahnung was da bei Dir schief läuft!
Auch bei dem Skript aus dem Wiki kommt ja bei Dir "connect: Connection refused (111)"!

Der GTag ist aber nicht mit irgendwas gekoppelt!?

Gruß
Dan
Nein. Ich habe ihn auch nie auf dem Handy eingerichtet oder die App installiert.
In fhem funktioniert er einwandfrei! Sprich die Stati wechseln innerhalb Sekunden!


Gesendet von iPad mit Tapatalk

DeeSPe

Bin echt überfragt warum immer "connection refused" kommt.
Macht das BT bei Dir evtl. noch Anderes als die GTag-Erkennung?
Alles nur Spekulation!

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Mumpitz

Zitat von: DeeSPe am 22 November 2016, 21:47:32
Bin echt überfragt warum immer "connection refused" kommt.
Macht das BT bei Dir evtl. noch Anderes als die GTag-Erkennung?
Alles nur Spekulation!

Gruß
Dan
Nicht das ich wüsste und wollte!
Wie kann ich das nachschauen?

DeeSPe

H
Zitat von: Mumpitz am 22 November 2016, 22:04:07
Nicht das ich wüsste und wollte!
Wie kann ich das nachschauen?

Hätte ja sein können dass Du BT noch für Audioübertragung (TTS) oder sowas benutzt.
Ich bin nun echt ratlos, sorry...

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Mumpitz

Zitat von: DeeSPe am 22 November 2016, 22:09:25
H
Hätte ja sein können dass Du BT noch für Audioübertragung (TTS) oder sowas benutzt.
Ich bin nun echt ratlos, sorry...

Gruß
Dan
Leider nein!

Besten Dank trotzdem für Deine Hilfe.

Vielleicht weiss ja sonst jemand Rat!?

Mumpitz

Kann es sein das es was mit btmgmt le on zu tun hat?

Es gibt diesbezüglich ja einige Einträge das das aus unerklärlichen Gründen teils User aktivieren müssen..

Leider komme ich nicht drauf wie man den Befehl absetzt. In welchem Ordner?

hartenthaler

Auf meinem Raspi kennt das Kommando echo anscheinend den Parameter "-e" nicht, braucht ihn aber auch nicht, so dass ich ihn gelöscht habe, da es sonst nicht funktioniert.
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

fisch192

@Mumpitz

Hallo könntest du das Problem bei dir lösen? Bin leider in der selben Situtation. In Fhem wird der G-tag als Present gekennzeichnet jedoch wenn ich lebattery -v ausführe bekomme ich immer wieder  Connection refused (111).

sudo /opt/fhem/script/lebattery -v
Ermittle Adresse fuer markus_b ...
Ermittle battery fuer markus_b (7C:2F:80:AC:9B:D1) ...
connect: Connection refused (111)

Mumpitz

Zitat von: fisch192 am 18 Februar 2017, 21:58:18
@Mumpitz

Hallo könntest du das Problem bei dir lösen? Bin leider in der selben Situtation. In Fhem wird der G-tag als Present gekennzeichnet jedoch wenn ich lebattery -v ausführe bekomme ich immer wieder  Connection refused (111).

sudo /opt/fhem/script/lebattery -v
Ermittle Adresse fuer markus_b ...
Ermittle battery fuer markus_b (7C:2F:80:AC:9B:D1) ...
connect: Connection refused (111)
Leider nein. Ich muss auf Grund des Fehlers auf den Status der Batterie verzichten....


micky0867


baumix

Nabend zusammen,

sehr interessates Thema und ja, bei mir kommt auch der gleiche Fehler.
Ich habe hier zwei LE-Tags namens WIM ... funktionierten bis gestern, jedoch ohne lepresenced - heute wollte ich lepresenced zum Laufen bekommen und nun auch den Batteriestand auslesen. Wenn ich das richtig verstehe, fragt das Skript per telnet zu fhem die Adressen ab und versucht dann, mittels gattool deren Batterielevel auszulesen, korrekt? Also klappt die Verbindung zu fhem - die Adressen konnten ja ausgelesen werden - aber nicht die Verbindung mittels gattool, oder? Ich dachte erst, das liegt daran, dass lepresenced Bluetooth auf dem rpi3 blockiert, aber das funktioniert durchaus gemeinsam.

Bei Tests mit

gatttool -t random -b 08:7C:BE:00:36:89 --char-read --handle=0x001f
connect error: Connection refused (111)


kam es zu der bekannten Meldung  :(
Ich habe nun herausgefunden, dass meine Tags mittels

# gatttool -b 08:7C:BE:00:36:89 --char-read --handle=0x001f
Characteristic value/descriptor: 63


sehr wahrscheinlich den Batteriestand ausgeben. Wie ist das bei den GTags? Im Skript wird ja noch -t $TYPE angegeben, $TYPE steht auf "public", damit geht es auch. Jetzt muss ich nur noch herausfinden, wie ich das Skript anpassen muss, damit es auch meine Tags auslesen kann:

# ./lebattery -v
Determining address for AnwesendLETag ...
Determining type for AnwesendLETag ... Quintic
Fetching batterylevel for AnwesendLETag (08:7C:BE:00:32:EE) ...
awk: line 2: function strtonum never defined
No valid data found for AnwesendLETag (08:7C:BE:00:32:EE)

Determining address for leTag2 ...
Determining type for leTag2 ... Quintic
Fetching batterylevel for leTag2 (08:7C:BE:00:36:89) ...
awk: line 2: function strtonum never defined
No valid data found for leTag2 (08:7C:BE:00:36:89)


Interessant dabei ist, dass der eine Tag nach dem Aufruf anfängt zu piepen ;) der zweite jedoch nicht ...

Grüße

Baumix

baumix

Hallo Mumpitz,

Zitat von: Mumpitz am 21 November 2016, 23:12:10
Daran kanns also nicht liegen. Wenn ich nur das gattool nehme erscheint: Connection refused

Hast Du gatttool schonmal im interaktiven Modus getestet?

# gatttool -I
[                 ][LE]> connect 08:7C:BE:00:32:EE
Attempting to connect to 08:7C:BE:00:32:EE
Connection successful
[08:7C:BE:00:32:EE][LE]> char-read-hnd 0x001f
Characteristic value/descriptor: 59
[08:7C:BE:00:32:EE][LE]>


Ok, der char-read-hnd passt zwar nur auf meine Quintic-Tags, aber wenn der Connect geht ...

Grüße

Baumix

micky0867

Das aktuelle lebattery setzt nur bei nuts den Typ random, alle anderen werden als public behandelt.
"strtonum" kommt vom awk...meiner kann das... Da muss ich wohl besser selbst umrechnen 🤔

Gesendet von meinem Toaster.


fisch192

 So hab nun den Fehler bei mir gefunden. Nach einem Downgrade der Firmware auf die 3.18.17 Version funktioniert das auslesen der G-tag. Fehler 111 taucht nicht mehr auf.

sudo rpi-update 8521fd34c8f66b6d109acce943f6e25ec93ec005

Mumpitz

Zitat von: baumix am 22 Februar 2017, 01:26:51
Hallo Mumpitz,

Hast Du gatttool schonmal im interaktiven Modus getestet?

# gatttool -I
[                 ][LE]> connect 08:7C:BE:00:32:EE
Attempting to connect to 08:7C:BE:00:32:EE
Connection successful
[08:7C:BE:00:32:EE][LE]> char-read-hnd 0x001f
Characteristic value/descriptor: 59
[08:7C:BE:00:32:EE][LE]>


Ok, der char-read-hnd passt zwar nur auf meine Quintic-Tags, aber wenn der Connect geht ...

Grüße

Baumix

Hallo Baumix

das ich habe ich soeben versucht: Immernoch die gleiche Meldung:


root@raspberrypi:~# gatttool -I
[                 ][LE]> connect 7C:2F:80:AA:5F:8C
Attempting to connect to 7C:2F:80:AA:5F:8C
Error: connect: Connection refused (111)
[7C:2F:80:AA:5F:8C][LE]>


Hmm, ein Downgrade? bin ich etwas skeptisch zu machen...

mumpitzstuff

Ihr solltet nicht vergessen, dass dieses Skript für unterschiedliche BLE Tags Anpassungen benötigt, weil diese manchmal den random Parameter beim Gatttool Aufruf benötigen oder andere uuids oder handles verwenden für den Batteriestatus. Im Prinzip müsste man das Skript kontinuierlich erweitern und anhand des Namens des Tags die Gatttool Aufrufe bzw. die Auswertung der Ergebnisse unterschiedlich für jeden BLE Tag gestalten (wenn man Glück hat funktioniert vielleicht auch mal eine Einstellung mit 2 oder mehr verschiedenen BLE Tags zusammen). Ich glaube eine 3 Zeiler Universallösung wird kaum möglich sein.

Ich würde deshalb vorschlagen, dass wenn es bei jemanden läuft, derjenige ein list vom BLE Tag zusammen mit den verwendeten gatttool Aufrufparamern postet. Dann können andere mit dem gleichen Tag diese Settings übernehmen und können auftretende Probleme woanders suchen.

baumix

Hi,

Zitat von: micky0867 am 22 Februar 2017, 13:40:37
"strtonum" kommt vom awk...meiner kann das... Da muss ich wohl besser selbst umrechnen 🤔

Jepp, bei mir war mawk installiert ... seit dem ich das durch gawk ersetzt habe, funktioniert es!

baumix

Hi,

Zitat von: mumpitzstuff am 23 Februar 2017, 17:47:02
Ihr solltet nicht vergessen, dass dieses Skript für unterschiedliche BLE Tags Anpassungen benötigt, weil diese manchmal den random Parameter beim Gatttool Aufruf benötigen oder andere uuids oder handles verwenden für den Batteriestatus. Im Prinzip müsste man
[...]

Ja, das ist wahr. Deswegen hatte ich mich ja eingeklinkt  ;) Ich bin nicht so der Held beim Skripten ...

Zitat
Ich würde deshalb vorschlagen, dass wenn es bei jemanden läuft, derjenige ein list vom BLE Tag zusammen mit den verwendeten gatttool Aufrufparamern postet. Dann können andere mit dem gleichen Tag diese Settings übernehmen und können auftretende Probleme woanders suchen.

Gute Idee. Aber wie aussagekräftig ist ein list? Letztlich entscheidend ist doch nur der device_name, oder?

Bei mir funktioniert es nun, nachdem ich folgende Zeile im Skript angepasst (und gawk statt mawk installiert) habe:

    LEVEL=$(gatttool -t $TYPE -b $ADDR --char-read --handle=0x001f 2>&1 | awk '{if($1 == "Characteristic") {printf("%d\n",strtonum("0x"$3))}

Gatttool bringt folgende Ausgabe:

# gatttool -t public -b 08:7C:BE:00:32:EE --char-read --handle=0x001f
Characteristic value/descriptor: 54


Bin erst seit ein paar Tagen am Testen und die Batterie ist schon auf 84% runter ... da bin ich ja mal gespannt  :-\

Grüße

Baumix

mumpitzstuff

Das mit der Liste habe ich deshalb angesprochen, weil ich bereits dran bin das Skript in ein Fhem Modul zu packen. Damit das für unterschiedliche tags funktioniert brauch ich halt je den Namen und den funktionierenden gatttool Aufruf. Ich muss mal sehen ob es funktioniert und dann melde ich mich dann noch mal.

Das würde euch die Installation sehr vereinfachen.

micky0867

Ich habe lebattery jetzt auf gawk umgestellt.

Gesendet von meinem Toaster.


mumpitzstuff

Hat jemand Lust mal meinen ersten Versuch eines FHEM Moduls dafür zu testen? Bei mir gehts auf jeden Fall mit 2 G-Tags. Die nut Devices hab ich auch drin, da kann ich aber nichts garantieren, da ungetestet. Ich würde gern die Liste der unterstützten Tags nach und nach erweitern und eventuell vorhandene Bugs beheben.

Funktionsweise: Das Modul macht im Prinzip das, was vorher das Shellskript gemacht hat, nur eben innerhalb von FHEM und mit minimalem Installationsaufwand. Es fragt alle 6h die Tags ab, die innerhalb von PRESENCE mit lan-bluetooth eingerichtet wurden und ergänzt dann im Device das Reading "batteryLevel".

Installation:
- be sure that bluez is installed: sudo apt-get install bluez
- add the new update site: update add http://raw.githubusercontent.com/mumpitzstuff/fhem-BleTagBattery/master/controls_bletagbattery.txt
- run the update and wait until finished: update all
- restart fhem: shutdown restart
- define a new device: define <name of device> BleTagBattery


Ich würde mich freuen, wenn es mal jemand mit einem G-Tag testen könnte und mir eine kurze Rückmeldung geben könnte. Das Ding ist aktuell aber mit heißer Nadel gestrickt, es können also durchaus noch Fehler drin sein.

Bei positiver Rückmeldung mache ich einen separaten Beitrag auf, um mehr Feedback bzw. Informationen darüber zu erhalten, wie ich weitere Tags unterstützen kann.

hartenthaler

#35
Also ich habe das mal getestet. Das einzige Reading, das angezeigt wird ist "state" und hat den Wert "active". Aber mein logfile hat sehr viele neue Einträge:

2017.02.26 23:42:58 3: pr_Gtag_rot device opened
2017.02.26 23:42:58 0: Featurelevel: 5.8
2017.02.26 23:42:58 0: Server started with 197 defined entities (fhem.pl:13501/2017-02-24 perl:5.020002 os:linux user:fhem pid:4294)
2017.02.26 23:42:59 3: telnetForBlockingFn_1488148979: port 40826 opened
2017.02.26 23:43:45 3: Sub BleTagBattery_Define (tag_battery) - defined
2017.02.26 23:43:45 3: list MODE=lan-bluetooth : Internals:
   ADDRESS    xx:xx:xx:xx:xx:xx
   DEF        lan-bluetooth xx:xx:xx:xx:xx:xx 127.0.0.1:5333 60
   DeviceName 127.0.0.1:5333
   MODE       lan-bluetooth
   NAME       pr_Gtag_rot
   NOTIFYDEV  global
   NR         458
   NTFY_ORDER 50-pr_Gtag_rot
   PARTIAL   
   STATE      absent
   TIMEOUT_NORMAL 60
   TIMEOUT_PRESENT 60
   TYPE       PRESENCE
   Readings:
     2016-04-22 22:08:03   device_name     Gigaset G-tag
     2017-02-26 23:42:59   presence        absent
     2017-02-26 23:42:59   state           absent
   Helper:
     ABSENT_COUNT 0
     CURRENT_TIMEOUT normal
Attributes:
   group      Gtag
   room       Präsenz

2017.02.26 23:43:45 3: list Internals: : No device named Internals: found
2017.02.26 23:43:45 3: list ADDRESS : No device named ADDRESS found
2017.02.26 23:43:45 3: list DEF : No device named DEF found
2017.02.26 23:43:45 3: list lan-bluetooth : No device named lan-bluetooth found
2017.02.26 23:43:45 3: list 127.0.0.1:5333 : No device named 127.0.0.1:5333 found
2017.02.26 23:43:45 3: list 60 : No device named 60 found
2017.02.26 23:43:45 3: list DeviceName : No device named DeviceName found
2017.02.26 23:43:45 3: list 127.0.0.1:5333 : No device named 127.0.0.1:5333 found
2017.02.26 23:43:45 3: list MODE : No device named MODE found
2017.02.26 23:43:45 3: list lan-bluetooth : No device named lan-bluetooth found
2017.02.26 23:43:45 3: list NAME : No device named NAME found
2017.02.26 23:43:45 3: list pr_Gtag_rot : Internals:
   ADDRESS    xx:xx:xx:xx:xx:xx
   DEF        lan-bluetooth xx:xx:xx:xx:xx:xx 127.0.0.1:5333 60
   DeviceName 127.0.0.1:5333
   MODE       lan-bluetooth
   NAME       pr_Gtag_rot
   NOTIFYDEV  global
   NR         458
   NTFY_ORDER 50-pr_Gtag_rot
   PARTIAL   
   STATE      absent
   TIMEOUT_NORMAL 60
   TIMEOUT_PRESENT 60
   TYPE       PRESENCE
   Readings:
     2016-04-22 22:08:03   device_name     Gigaset G-tag
     2017-02-26 23:42:59   presence        absent
     2017-02-26 23:42:59   state           absent
   Helper:
     ABSENT_COUNT 0
     CURRENT_TIMEOUT normal
Attributes:
   group      Gtag
   room       Präsenz

2017.02.26 23:43:45 3: list NOTIFYDEV : No device named NOTIFYDEV found
...
2017.02.26 23:43:45 3: list presence : No device named presence found
2017.02.26 23:43:45 3: list absent : No device named absent found
2017.02.26 23:43:45 3: list 2017-02-26 : No device named 2017-02-26 found
2017.02.26 23:43:45 3: list 23:42:59 : No device named 23:42:59 found
2017.02.26 23:43:45 3: list state : No device named state found
2017.02.26 23:43:45 3: list absent : No device named absent found
2017.02.26 23:43:45 3: list Helper: : No device named Helper: found

Vielleicht kannst Du ja erkennen, was da schief geht.
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

mumpitzstuff

Oh das ist interessant. Du hast nur einen Tag und da spuckt der verwendete Befehl das komplette Listing des Tags aus. Das bringt das Modul durcheinander. Ich habe zwei Tags, da wird lediglich eine Liste mit den Namen generiert.

tag1
tag2


Das ist ein Bug den ich beheben muss! Bitte erst mal deinstallieren.

Mit 2 oder mehr Tags sollte es aber gehen. Das Reading wird auch nicht in meinem Device eingetragen, sondern direkt beim Tag selbst.

krikan

@mumpitzstuff:
Kannst Du bitte die Vorstellung Deines Moduls im passenden Forumsbereich in einem neuen Beitrag posten. Die Modulvorstellung und Diskussion dazu gehört nicht in dieses Unterforum "Wiki". Vielen Dank.

Gruß, Christian

mumpitzstuff

Sehe ich nicht ganz so, denn mit einem solchen Modul lässt sich das Wiki wesentlich vereinfachen und auch der Endanwender hat es einfacher, indem er nicht selbst an irgendwelchen Skripten rumfummeln muss. Nach ein bischen Finetuning hoffe ich deshalb, dass es dort aufgenommen werden kann.

Das Thema berührt deshalb leider mehrere Themenbereiche, unter anderem auch die Erweiterung/Vereinfachung des Wikis.

Um deiner Aufforderung nachzukommen werde ich das Thema verlagern und mich erst wieder hier melden, wenn die Funktion sichergestellt ist und das Wiki entsprechend angepasst werden könnte.

krikan

In diesem Thema https://forum.fhem.de/index.php/topic,68104.0.html geht es mit dem Modul 74_BleTagBattery.pm von mumpitzstuff weiter.