[GELÖST] PRESENCE - BT LE Integration

Begonnen von Mitch, 14 November 2014, 09:51:23

Vorheriges Thema - Nächstes Thema

Mitch

Hallo Markus,

meinst Du es ist möglich, das PRECENSE Modul so umzubauen, damit
Zitathcitool lescan
unterstütz wird?

Ich bin leider in Perl nicht wirklich fit, weswegen ich da nichts machen kann  :-[


Siehe Diskussion hier: http://forum.fhem.de/index.php/topic,28753.0.html -> hier steht auch die Lösung

Vielen Dank!
FHEM im Proxmox Container

Markus Bloch

Hallo Mitch,

generell würde ich sagen ja, .... aber.

Das Problem ist, dass der Aufruf von "hcitool lescan" unbegrenzt lange läuft, bis man mit [STRG]+[C] den Scan abbricht. Das macht es in Perl wiederum etwas schwieriger, da ich das ganze nur durch ein temporäres File umgehen kann, in das die laufende Ausgabe von hcitool gepiped wird und ich dann nach einer definierten Zeit den prozess kille und anschließend schaue, ob die gewünschte Adresse in der entsprechenden Datei auftaucht.

Leider fehlt mir dazu akut die Zeit. Ich weis nicht, wann ich das umsetzen kann.

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

justme1968

man kann das doch 'einfach'  mit open mode -| als prozess starten und über die io redirection die ausgaben vom lescan direkt in fhem pipen und über die fhem selectlist laufen lassen. da blockiert nichts und das fhem modul bekommt alle ausgaben live mit.

gruß
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Markus Bloch

versteh grad nicht wirklich was du genau meinst o.O
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

justme1968

du kannst mit einem open nicht nur ein file öffnen sondern auch einen anderen prozess starten und dessen stdout oder stdin als datenquelle bzw. ziel verwenden. in c/c++ geht das mit popen. in perl in dem du beim open den mode -| bzw. |- verwendest. als 'filenamen' gibst du das binary an das gestartet werden soll. dieses wird automatisch per fork/exec gestartet. den filedescriptor den du bekommst hängst du in die fhem selectlist.

sobald das gestartete binary nach stdout schreibt wird die readFn deines fhem moduls aufgerufen und du kannst diese daten mit sysread lesen.

das ganze ist nicht blockierend.

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

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

Mitch

Wow, ich verstehe nur Bahnhof  ???

ich habe mir einen Shellscript geschrieben, der einen lescan für 5 Sekunden ausführt. Das Ergebnis wird in eine TXT geschrieben und dann wird mir grep -c geschaut, wie oft die Mac Adresse vorkommt und das Ergebnis wieder in einen TXT.
Ist der Tag sichtbar, also anwesend, ist das Ergebnis > 0

Meine Idee war jetzt, den Script per at alle 5 Min auszuführen und dann das Ergebnis aus der TXT einlesen und nachschauen, ob > 0. Wenn ja, dann present, ansonsten absent.

Aber rein vom text scheint die "Lösung" von Andre viel einfacher.
FHEM im Proxmox Container

Markus Bloch

Hallo Mitch,

dein Shellskript kannst du ja bereits jetzt schon mit PRESENCE verwenden. Voraussetzung, es gibt nur eine 0 oder eine 1 als Ausgabe aus (STDOUT).

define <name> PRESENCE shellscript "/opt/script.sh"

worum es mir aber geht ist eine native Unterstützung.

@andre:

Ach das meinst du, ja daran habe ich auch schon gedacht. Allerdings finde ich das "manuelle" rumfummeln in der select-list nicht umbedingt modultechnisch sauber. Ich möchte es vermeiden mit meinen Modulen in Variablen von fhem.pl direkt rum zu werkeln. Meiner Meinung sollte es Modulen nicht erlaubt sein, so etwas zu machen (klare Schnittstellentrennung zwischen fhem.pl und Modulen) und wenn dann nur durch entsprechende Funktionen die für Module gedacht sind (Stichwort: Beeinflussung/Manipulation von anderen Definitionen egal ob gewollt oder unabsichtlich).

Desweiteren muss der hcitool lescan nach x Sekunden wieder gekillt werden und dann eben jedesmal wiederneu aufgerufen werden, da er ja jeden BT-Tag ja nur einmal anzeigt nach dem Start, also jedesmal killen und wieder von vorne neu den Prozess starten. Da der Scan momentan ja mit einem Blocking-Call läuft könnte ich auch garnicht auf die select-list zurück greifen.

Meine Idee geht momentan eher in die Richtung: hcitool lescan mit open() starten (so wie von andre vorgeschlagen). Dann eine gewisse Zeit einen sleep (so ca. 5 Sekunden). Dann prüfen, ob was da ist und einlesen und schauen, ob die zu prüfende Adresse im Output auftaucht. Anschließend den hcitool prozess killen. Das ganze natürlich nachwievor als BlockingCall ;-)

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

justme1968

die selectlist ist ja genau dafür vorgesehen. ohne funktioniert die readFn nicht. das es gekapselt über eine schnittstelle sauberer wäre bedeutet nicht das es ohne nur ein 'rumfummeln' ist.

ich hatte hast hcitool lescan so verstanden das es ein mal gestartet immer weitere die aktuell sichtbaren devices meldet. wenn das nicht so ist hilft readFn hier natürlich nicht.

deine idee mit dem 5 sekunden warten und dann lesen sollte aber auch ohne BlockingCall gehen. wenn dir die selectlist wirklich so zuwider ist kannst du ja einfach selber nach 5 sekunden mit select auf dem filedescriptor nachsehen ob was da ist. das geht auch ohne blockieren. wenn was da ist lesen und einfach das file zu machen. der hcitool prozess sollte sich dan automatisch beenden.

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

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

Mitch

#8
Das hcitool läuft einfach und meldet alles, was es sieht.
Theroretisch kann es ja einfach immer laufen?

Zum Script, ich bin da leider nicht so fit.
So sieht das aus, was ich gebastelt habe:
# Launch script in background
./btlescan.sh &
# Get its PID
PID=$!
# Wait for 30 seconds
sleep 30
# Kill it
kill $PID
grep -c 0E:0A:14:09:7F:DE bluetooth.txt


Der Script btlescan ruft einfach das hcitool auf uns schreibt das Ergebnis in die Datei bluetooth.txt

Leider funktioniert das nicht mit dem Presence Modul.


Mit meinem laienhaften Verstädnis wäre es doch am einfachsten, das Presence Modul startet hcitool lescan und schaut regelmässig in den Output, ob eine bestimmte, die gesuchte MAC Adresse in der Liste ist?
FHEM im Proxmox Container

justme1968

wenn man es ein mal starten und immer laufen lassen kann ist glaube ich die variante mit der selectlist am besten. auch wenn markus es nicht mag :)
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Mitch

#10
Für alle, die das auch integrieren wollen, ich habe jetzt mal einen Script geschrieben, den man mit dem PRESENCE Modul benutzen kann:

#!/bin/bash
hcitool lescan > /tmp/res.txt & sleep 10
pkill --signal SIGINT hcitool
sleep 1
device=$(grep -c 00:00:00:00:00:00 /tmp/res.txt)
if [ $device -gt 0 ]; then
        echo "1"
else
        echo "0"
fi


Im Script muss 00:00:00:00:00:00 gegen die gesuchte Adresse getauscht werden.

Den Script am besten nach /opt/fhem/ speichern.

Als nächstes ein PRESENCE Device anlegen:

define BluetoothTag PRESENCE shellscript "/opt/fhem/lescan.sh"
FHEM im Proxmox Container