Anwesenheitserkennung Bluetooth PebbleBee

Begonnen von tomster, 06 November 2014, 10:01:16

Vorheriges Thema - Nächstes Thema

gero

Es kann immer nur eine Instanz von hcitool laufen.
Wenn du nur wissen willst, ob irgendeiner von den Tags im Haus ist, könnte man eine Liste der Bluetooth Adressen dem Script übergeben. Dazu muss das Script nur minimal angepasst werden. Falls du aber wissen willst, welche Tags in der Nähe sind, ist ein anderes Konzept notwendig.
Am saubersten wäre wahrscheinlich einen multiinstanz-fähigen Ersatz für das hcitool zu schreiben. Alternativ könnte man ein Script im Hintergrund laufen lassen ( unabhängig von fhem), das mittels hcitool lescan alle in der Nähe befindlichen Tags listet. Im PRESENCE Modul wiederum läuft ein anderes Script, das auf diese Informationen zugreift. Vielleicht hab ich heute Abend Zeit mich drum zu kümmern.

Gruß,
Gero
Odroid C1 - CULV3-868, JeeLink
16 x TX 29 DTH
MAX!: 15x Heizkörperthermostat+, 2x Wandthermostat, 14x Fenserkontakt, 1x Ecotaster
FS20 S4A, FS20IRF, BSB-Heizungssteuerung über Atmega2560
Z-Wave: ZME_UZB1, Fibaro Wall Plug + Motion Sensor

Steffen

Guten Morgen!

Wollte kurz mal meine Erfahrung mit dem Script von Gero berichten,
habe dazu ein Notify eingesetzt das mir per Push mitteilt wann ein "absent" eintrifft und das ganze nutze ich auf einen Cubitruck.
Doch war es leider in der Nacht ca.25 mal der Fall, das ich per Push eine Benachrichtigung über einen "absent" bekommen habe!

Die "absent" treten laut den Zeiten sehr sehr sporadisch auf und es ist auch kein wirkliches Muster darin zu erkennen.

Ich werde nochmal den Tag das Script von Mitch testen als vergleich und dann wieder hier berichten.

Trotzdem kann ich nur danke sagen, für eure Mühe und Arbeit und obwohl ich noch ein ziemlicher Anfänger bin kann man dadurch noch einiges Lernen...!

Mfg Steffen

gero

Zitat von: Steffen am 22 November 2014, 08:38:55
Doch war es leider in der Nacht ca.25 mal der Fall, das ich per Push eine Benachrichtigung über einen "absent" bekommen habe!

Die "absent" treten laut den Zeiten sehr sehr sporadisch auf und es ist auch kein wirkliches Muster darin zu erkennen.
Absent kann eigentlich nur noch gemeldet werden, wenn sich der Tag nicht meldet. Was für ein Scantimeout hast du eingestellt? Welches Intervall hast du beim PRESENCE Device angegeben? Wie oft meldet sich dein Tag, wenn du manuell hcitool lescan laufen läßt?

Gruß,
Gero
Odroid C1 - CULV3-868, JeeLink
16 x TX 29 DTH
MAX!: 15x Heizkörperthermostat+, 2x Wandthermostat, 14x Fenserkontakt, 1x Ecotaster
FS20 S4A, FS20IRF, BSB-Heizungssteuerung über Atmega2560
Z-Wave: ZME_UZB1, Fibaro Wall Plug + Motion Sensor

Mitch

#78
Gero, vielen Dank für Deine Unterstützung!!

hcitool könnte ja theoretisch mehrfach gestartet werden, allerdings ist ja der BT Dongle in dem Moment in Gebraucht. Also geht nicht.

Ich könnte mir folgendes vorstellen:
Mit dem Presence Modul wird es wohl schwer. Man könnte aber Dummy Devices benutzen.
Also, man macht einen hcitool lescan für 10 bis 15 sec., danach wird das erzeugte File nach den Adressen durchsucht, sprich man hinterlegt im Script die gesuchten Adressen.
Sobald eine Adresse gefunden wurde, wird der entsprechende Dummy auf on (present) gesetzt.
Wird die Adresse nicht gefunden, dann auf off (absent).
So wird die Liste der gesuchten Adressen abgearbeitet und danach die temp Datei gelöscht.

Den Script könnte man dann entweder aus hem mit einem at regelmässig anstossen, oder per Cronjob.
FHEM im Proxmox Container

Mitch

#79
Hab das jetzt mal nach meiner Idee angepasst:

#!/bin/bash
USAGE="Usage:\n\t$0 <hciX> <bdaddr1> <bdaddr2>  <scantime>"
TMPFILE=/tmp/res.txt

HCITOOL="/usr/bin/hcitool"
HCICONFIG="/usr/sbin/hciconfig"


if [ $# -ne 4 ]; then
        echo -e "$USAGE";
        exit 1
fi

DEV=$1
REMOTE1=$2
REMOTE2=$3
SCANTIME=$4

if [ ! -x $HCITOOL  ] || [ ! -x $HCICONFIG ]; then
        echo "$HCITOOL or $HCICONFIG not found or not executable"
        exit 1
fi

DEVPRESENT=`$HCITOOL dev | grep $DEV`
if [ -z "$DEVPRESENT" ]; then
        $HCICONFIG $DEV down &>/dev/null
        sleep 1
        $HCICONFIG $DEV up &>/dev/null
        sleep 1

        DEVPRESENT=`$HCITOOL dev | grep $DEV`
       
        if [ -z "$DEVPRESENT" ]; then
                echo "device $DEV not present"
                exit 1
        fi
fi

pkill --signal SIGINT hcitool
sleep 1

$HCITOOL lescan > $TMPFILE & sleep $SCANTIME

pgrep hcitool &>/dev/null
if [ $? -ne 0 ]; then
        echo "hcitool has terminated unexpectedly"
        exit 1
fi


pkill --signal SIGINT hcitool

sleep 1

grep -m1 $REMOTE1 /tmp/res.txt &>/dev/null
BINDA=$?
if [ "$BINDA" -eq 0 ]; then
        curl "http://192.168.0.5:8084/fhem?cmd=set%20Pebble.Markus.Dummy%20on"
elif [ $BINDA -eq 1 ]; then
        curl "http://192.168.0.5:8084/fhem?cmd=set%20Pebble.Markus.Dummy%20off"
else
        echo "cannot access result file"
        exit 1
fi

sleep 1

grep -m1 $REMOTE2 /tmp/res.txt &>/dev/null
BINDA=$?
if [ "$BINDA" -eq 0 ]; then
        curl "http://192.168.0.5:8084/fhem?cmd=set%20Pebble.Leoni.Dummy%20on"
elif [ $BINDA -eq 1 ]; then
        curl "http://192.168.0.5:8084/fhem?cmd=set%20Pebble.Leoni.Dummy%20off"
else
        echo "cannot access result file"
        exit 1
fi


Es müssen zwei Dummys angelegt werden (in meinem Fall Pebble.Markus.Dummy und Pebble.Leoni.Dummy)

Aufgerufen wird es mit einem at:
+*00:05 "/opt/fhem/lescan2.sh <hciX> <bdaddr1> <bdaddr2>  <scantime>"

Jetzt wird alle 5 Minuten der Script ausgeführt und nach dem zwei Adressen gesucht (kann auch auf mehr Adressen erweitert werden).

FHEM im Proxmox Container

Mitch

So, so wie es im Moment aussieht, funktioniert das super.

Habe zwei tag mal in Reichweite, mal ausser Reichweite gebracht, mal beide gleichzeitig, mal einzeln.
Alle Test perfekt überstanden.

Einen kleinen Schönheitsfehler, der cURL Befehl löst immer im Log folgende aus:
0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
                                 Dload  Upload   Total   Spent    Left  Speed
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current


Das muss ich noch irgendwie weg bekommen.
FHEM im Proxmox Container

gero

@Mitch: Das ist auch eine mögliche Lösung. Um es aber allgemein verwendbar zu machen, müßtest du dem Script ziemlich viele Parameter übergeben, sonst bleibt es eine Individuallösung.


Gruß,
Gero
Odroid C1 - CULV3-868, JeeLink
16 x TX 29 DTH
MAX!: 15x Heizkörperthermostat+, 2x Wandthermostat, 14x Fenserkontakt, 1x Ecotaster
FS20 S4A, FS20IRF, BSB-Heizungssteuerung über Atmega2560
Z-Wave: ZME_UZB1, Fibaro Wall Plug + Motion Sensor

Mitch

Da geb ich dir vollkommen recht, aber meine Linuxkenntnisse sind sehr rudimentär und von meinen Perlkenntnissen will ich gar nicht sprechen  ;D

Grundsätzlich funktioniert es jetzt bei mir.
Ich habe ja im Moment nur zwei Tags und die werden zuverlässig (bis auf das Logproblem) gescannt und damit schalte ich nun zusätzlich zum Gefency die Anwesenheit.
Bei den tags habe ich noch einen Watchdog eingebaut, weil wenn ich mit dem tag im garten bin, verliert er die Verbindung. Mit dem Watchdog "warte" ich quasi 10 Minuten auf die Rückkehr, erst dann wird die Abwesenheit aktiviert.

Ich werde jetzt mal ein zeitlich so testen, ob das praktikabel ist.

Wenn das alles so funktioniert, dann müssten die "Experte" ran und das ganze in ein vernünftiges Modul verpacken.
FHEM im Proxmox Container

justme1968

wie schaut die ausgabe von lescan aus wenn ein tag länger in reichweite bleibt? wird die mac immer wieder gemeldet? wie ist die zeit zwischen den melden? was passiert wenn ein tag aus der reichweite verschwindet? wird es dann einfach nicht mehr gemeldet?

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Mitch

So lange lescan läuft, wird der Tag auch immer gemeldet, sprich er findet sich in der Liste

z.B.
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7F:DE PebbleBee
0E:0A:14:09:7E:22 (unknown)
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7F:DE PebbleBee
47:4E:97:5E:B5:C3 (unknown)
47:4E:97:5E:B5:C3 (unknown)
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7E:22 (unknown)
0E:0A:14:09:7E:22 PebbleBee
47:4E:97:5E:B5:C3 (unknown)
47:4E:97:5E:B5:C3 (unknown)
0E:0A:14:09:7E:22 (unknown)
0E:0A:14:09:7E:22 PebbleBee
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7F:DE PebbleBee
0E:0A:14:09:7E:22 (unknown)
0E:0A:14:09:7E:22 PebbleBee
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7F:DE PebbleBee
0E:0A:14:09:7E:22 (unknown)
0E:0A:14:09:7E:22 PebbleBee
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7F:DE PebbleBee
0E:0A:14:09:7E:22 (unknown)
0E:0A:14:09:7E:22 PebbleBee
47:4E:97:5E:B5:C3 (unknown)
47:4E:97:5E:B5:C3 (unknown)
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7F:DE PebbleBee
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7F:DE PebbleBee
0E:0A:14:09:7E:22 (unknown)
0E:0A:14:09:7E:22 PebbleBee


Wie man sehen kann, meldt sich der Pebble ca. alle 300ms.
Für andere Tags kann ich nichts sagen, sollte sich aber ähnlich verhalten.

Wenn der Tag nicht mehr in Reichweite ist, dann ist er einfach nicht mehr in der "Liste".
FHEM im Proxmox Container

justme1968

funktioniert das auch ohne die --duplicates option? wird dann auch immer wieder gemeldet?
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Mitch

Ja, hier die Ausgabe von hcitool lescan --duplicates:

47:4E:97:5E:B5:C3 (unknown)
47:4E:97:5E:B5:C3 (unknown)
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7F:DE PebbleBee
0E:0A:14:09:7E:22 (unknown)
0E:0A:14:09:7E:22 (unknown)
0E:0A:14:09:7E:22 PebbleBee
47:4E:97:5E:B5:C3 (unknown)
47:4E:97:5E:B5:C3 (unknown)
0E:0A:14:09:7F:DE (unknown)
47:4E:97:5E:B5:C3 (unknown)
47:4E:97:5E:B5:C3 (unknown)
47:4E:97:5E:B5:C3 (unknown)
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7F:DE PebbleBee
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7F:DE PebbleBee
0E:0A:14:09:7E:22 (unknown)
0E:0A:14:09:7E:22 PebbleBee
47:4E:97:5E:B5:C3 (unknown)
47:4E:97:5E:B5:C3 (unknown)
0E:0A:14:09:7E:22 (unknown)
0E:0A:14:09:7E:22 PebbleBee
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7F:DE PebbleBee
0E:0A:14:09:7E:22 (unknown)
0E:0A:14:09:7E:22 PebbleBee
47:4E:97:5E:B5:C3 (unknown)
47:4E:97:5E:B5:C3 (unknown)
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7F:DE PebbleBee
47:4E:97:5E:B5:C3 (unknown)
0E:0A:14:09:7F:DE (unknown)
47:4E:97:5E:B5:C3 (unknown)
47:4E:97:5E:B5:C3 (unknown)
0E:0A:14:09:7E:22 (unknown)
0E:0A:14:09:7E:22 PebbleBee
0E:0A:14:09:7F:DE (unknown)
0E:0A:14:09:7F:DE PebbleBee
47:4E:97:5E:B5:C3 (unknown)
47:4E:97:5E:B5:C3 (unknown)
FHEM im Proxmox Container

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Mitch

FHEM im Proxmox Container

gero

Leider habe ich zu Hause keine BLE Tags zur Verfügung. Trotzdem hier ein erster Entwurf eines Scriptes. Wenn man dieses Script unabhängig von fhem laufen läßt, so existiert im Verzeichnis $TMPDIR zu jedem vorhandenen Tag eine Datei mit der Bluetoothadresse als Name:
#!/bin/bash
USAGE="Usage:\n\t$0 <hciX>  <scantime> <scanpause>"
TMPFILE=/tmp/lepresent/tmp.out
TMPDIR=/tmp/lepresent

mkdir -p $TMPDIR
rm -f $TMPDIR/*

HCITOOL="/usr/local/bin/hcitool"
HCICONFIG="/usr/local/bin/hciconfig"


if [ $# -ne 3 ]; then
echo -e "$USAGE";
exit 1
fi

DEV=$1
REMOTE=$2
SCANTIME=$3
SCANPAUSE=$3

if [ ! -x $HCITOOL  ] || [ ! -x $HCICONFIG ]; then
echo "$HCITOOL or $HCICONFIG not found or not executable"
exit 1
fi

while [ 1 ]; do

DEVPRESENT=`$HCITOOL dev | grep $DEV`
if [ -z "$DEVPRESENT" ]; then
$HCICONFIG $DEV down &>/dev/null
sleep 1
$HCICONFIG $DEV up &>/dev/null
sleep 1

DEVPRESENT=`$HCITOOL dev | grep $DEV`

if [ -z "$DEVPRESENT" ]; then
echo "device $DEV not present"
exit 1
fi
fi

pkill --signal SIGINT hcitool
sleep 1
$HCITOOL lescan > $TMPFILE & sleep $SCANTIME

pgrep hcitool &>/dev/null
if [ $? -ne 0 ]; then
echo "hcitool has terminated unexpectedly"
continue;
fi


pkill --signal SIGINT hcitool
sleep 1

unset seen
declare -A seen
for w in `cat $TMPFILE`; do
if [[ $w =~ ..:..:..:..:..:.. ]]; then
touch $TMPDIR/$w
seen[$w]=1;
fi
done
for f in `ls $TMPDIR`; do
if [ ! ${seen[$f]+_} ]; then
rm -f $TMPDIR/$f
fi
done

sleep $SCANPAUSE
done


In fhem sieht das Script für das PRESENCE Module dann sehr einfach aus und kann auch für beliebig viele Instanzen mit unterschiedlichen Bluetoothadressen parallel verwendet werden:


#!/bin/bash
USAGE="Usage:\n\t$0 <BT-address>"
TMPDIR=/tmp/lepresent

if [ $# -ne 1 ]; then
echo -e "$USAGE";
exit 1
fi

ADDR=$1

if [ -f $TMPDIR/$ADDR ]; then
echo 1;
else
echo 0;
fi


Testen kann ich es leider erst wieder am Montag. Aber vielleicht bringt es euch trotzdem etwas.

Gruß,
Gero
Odroid C1 - CULV3-868, JeeLink
16 x TX 29 DTH
MAX!: 15x Heizkörperthermostat+, 2x Wandthermostat, 14x Fenserkontakt, 1x Ecotaster
FS20 S4A, FS20IRF, BSB-Heizungssteuerung über Atmega2560
Z-Wave: ZME_UZB1, Fibaro Wall Plug + Motion Sensor