[Modul] Bluetooth Presence (Linux Only)

Hier habe ich ein Modul um die Anwesenheit per Bluetooth zu erkennen. Allerdings ist hier eine Linuxsystem mit Bluez Voraussetzung:

traxanos/SymconBTP · GitHub

Um zu prüfen ob überhaupt irgend ein Bewohner anwesend ist, muss man weiterhin ein extra Script schreiben.

Das sieht bei mir da so aus:

<?
if(GetValueBoolean(57936 /*[System\Anwesenheit\Marco\Zustand]*/) || GetValueBoolean(59291 /*[System\Anwesenheit\Sarah\Zustand]*/)) {
  SetValueBoolean(28259 /*[System\Anwesenheit\Global\Zustand]*/, true);
} else {
  SetValueBoolean(28259 /*[System\Anwesenheit\Global\Zustand]*/, false);
}
?>

Danke für das Modul…

Ich würde es gerne auf Pi 2 nutzen, ich habe auch Bluez schon auf dem PI am laufen, aber ich bekomme nix mit deinem Modul angezeigt :frowning:

Wenn ich manuell hcitool scan ausführe findet er brav die BT Geräte…

Kannst du mit verraten, wie dein Modul das hcitool aufruft ?

So wird aufgerufen

hcitool name MACADRESSE

Auch zu finden unter:

SymconBTP/module.php at master · traxanos/SymconBTP · GitHub

Hi ok das funktioniert auch händisch:

pi@ihome ~ $ hcitool name 00:BB:3A:C9:B6:13
Dannys 2. Fire

Aber dein Modul macht bei mit einfach nix :frowning:

Was bringt der Button Suchen in den Instanzeinstellungen ?

Woran kann das liegen ?

Der Button führt die Prüfung/Suche einmal manuell aus. Steht den was im Logfile? Ist das hcitool im PATH (beim Raspian automatisch der Fall) enthalten? Macadresse richtig geschrieben? Ich mache ja nichts anderes als das was du sonst auch auf dem Terminal machen kannst.

So habe den Fehler gefunden… wenn man vor den Befehl sudo schreibst klappt es…

Habe mal schnell eine Pi Version gemacht:

dr-apple/SymconBTP-PI · GitHub

Jetzt geht es :wink:

Wie hast du es aber mit dem iPhone hinbekommen, weil das iPhone sendet ja nicht immer seine Mac immer aus ?

Also bei mir läuft es nur auf dem Pi! Und da der Server unter Root läuft, wird auch kein Sudo benötigt. Somit hast du eine nicht standardkonforme Installation bei dir laufen.

Wie hast du es aber mit dem iPhone hinbekommen, weil das iPhone sendet ja nicht immer seine Mac immer aus ?

Warum sollte das iPhone seine Mac beim Suchen senden. Dieser Vorgang läuft anders herum ab, ich frage in die Runde wer die MAC-Addresse hat und das entsprechende Gerät schreit seinen Namen.

Habe mal schnell eine Pi Version gemacht:

Mir wäre es im übrigen lieber, wenn du einen Fork meines Repos machst. Dann sieht man auch das Original. Außerdem kannst du dann meine Änderungen jederzeit sauber nach Laden und auch einen Pullrequest stellen (wenn sinnvoll)

Und wie gesagt, ist deine Änderung nicht Pi spezifisch. Kann aber gerne sudo mit in mein Repo aufnehmen da es keinen Nachteil für andere hat, außer dass es vorhanden sein muss.

Das wäre toll

sudo ist mit enthalten.

kannst du mir bitte noch einen gefallen tun mit die Rückgabe hier von geben:

which hcitool

Also wenn ich den Befehl auf der Console auf dem pi eingebe kommt das :

/usr/local/bin/hcitool

Dann darfst du dich nicht wundern warum es nicht klappt. /usr/local ist in Systemdienste nicht verfügbar. Das sudo macht ein neues Terminal auf was die profile lädt. Daher ging es mit sudo. Aber sudo selber wird nicht benötigt. Daher werden ich das sudo wieder entfernen. Installiere doch einfach bluez Paket von der Distribution dann geht es auch direkt. Das geht auch parallel zu deiner Custom Installation.

EDIT:
Du kannst dir alternativ auch ein script unter /usr/bin/hcitool ablegen mit folgendem Hinweis:


#!/bin/sh
/usr/local/hcitool $@

Und dann die Recht auf 0755 anpassen

chmod a+x /usr/bin/hcitool

Aber warum installierst du bluez manuell?

Weil ich nicht weis wie man es auf dem pi normal installiert…

Das ist sehr einfach:

sudo apt-get install bluez

Ah danke, jetzt erinnere ich mich warum ich das nicht so mache :rolleyes:

Weil im RP ist Version 4.99 aber bluez ist schon bei Version 5.35

Aus Neugier, welche Funktion hat dir den in der alten Version gefehlt?

Genau sowas suche ich (mit der Prozedur um an die Neigungsdaten ranzukommen); hast Du da eine Quellenangabe ?
(Bitte PM, falls Links hier wieder mal zensiert werden).

Ein „Bluetooth Presence Skript (Linux Only)“ hab ich mir auch schon geschrieben, noch nicht ganz zuverlässig.
Was mir noch fehlt, ist an Daten zu kommen, die diese Schlüsselanhänger auf Knopfdruck auch aussenden können, bin aber bisher daran gescheitert.
Anwendungen:
BLE-Schlüsselanhänger mit Taste als Anwesenheitskontrolle und Türöffner.
BLE-„Knöpfchen“… / Neigung/ als Indikator, ob meine Mülltonne endlich geleert wurde und wo sie jetzt wieder steht :smiley:

Viele Grüsse
Harald

Hallo,

ich kenne diese Bluetooth Knöpfchen:

SensorBug Low Profile - Bluetooth 4.0 Wireless von BLE Home (Amazon.com)
SensorBug - Bluetooth 4.0 Wireless von BLE Home (Amazon.com)
Sensor BLE Fob - Bluetooth 4.0 Wireless von BLE Home (Amazon.com)

Ohne Gehäuse:
LightBlue Bean von Punch through design (Amazon.com)

Ein Bluetooth Sensor für diverse Wetterparameter:

Texas Instruments TI CC2541 (gibt’s bei Reichelt für ca. 30Euro)

Hier gibt’s schon einen noch stromsparenderen Nachfolger:
TI CC2640. Gibt’s als Kit von TI direkt für ca. 30USD + Versand

Wäre besser das in einem Extra Thread aufzumachen, da es ja nichts mit dem Presence Module zutun hat.

Ich habe das Modul für die Nutzung von Bluetooth LE-Devices erweitert. In meinem Fall sind es die G-Tag von Gigaset. Bisher nur damit getestet.

Datei form.json


    { "name": "ScanInterval", "type": "IntervalBox", "caption": "Sekunden" },
    { "name": "BluetoothLE", "type": "CheckBox", "caption": "Bluetooth LE" }

Datei module.php


    $this->RegisterPropertyInteger('ScanInterval', 60);
    $this->RegisterPropertyBoolean('BluetoothLE', false);


  public function ApplyChanges() {
    parent::ApplyChanges();
//    $this->RegisterPropertyInteger('ScanInterval', 30);


      $mac = $this->ReadPropertyString('Mac');
      $btle = $this->ReadPropertyBoolean('BluetoothLE');//Bluetooth Low Energy
      if (preg_match('/^(?:[0-9A-F]{2}[:]?){6}$/i', $mac)) {
        $lastState = GetValueBoolean($this->GetIDForIdent('STATE'));
//neu
     if ($btle == false)
        {
        $search = trim(shell_exec("hcitool name $mac"));
        }
     else
        {
        $search = trim(shell_exec("hcitool lescan > scan.txt & sleep 3 &&  pkill --signal SIGINT hcitool ; cat scan.txt | grep  $mac"));
        }

        $state = ($search != '');
// neu ende

Ich hoffe, dass mir beim reinkopieren kein Fehler unterlaufen ist, da ich noch ein paar weitere Änderungen eingebaut habe, um den Status etwas stabiler zu halten.

Hier noch mein script für die globale Anwesenheit:

<?
// Die Variable für die globale Anwesenheit muss unter der Kategorie "Anwesenheit" mit dem Variablennamen "Anwesenheit" liegen
$guid = "{4B02618F-358B-4D5F-8018-52250CD05F11}";
$counter = 0;
foreach(IPS_GetInstanceListByModuleID($guid) as $id)
{
	$zustand = GetValueBoolean($zustand_id);
	if ($zustand == true)
	{
	$counter = $counter + 1;
	}
}	 
$KategorieID = @IPS_GetCategoryIDByName("Anwesenheit", 0);
$anwesenheit_id = IPS_GetVariableIDByName ( "Anwesenheit", $KategorieID ) ;
$laststate = GetValueBoolean($anwesenheit_id);
if ($counter > 0) 
{
	if ($laststate == false)
		{
		SetValueBoolean($anwesenheit_id, true);
		}
	}
else
	{
	if ($laststate == true)
		{
		SetValueBoolean($anwesenheit_id, false);
		}
	}
?>

Der Code mag vielleicht nicht gut geschrieben sein? Aber es funktioniert. Verbesserungen sind jederzeit willkommen.

Grüße Stefan

Beim code aufräumen hat sich ein Fehler eingeschlichen.
Im Script für die allgemeine Anwesenheit muss dir foreach Schleife so aussehen:

foreach(IPS_GetInstanceListByModuleID($guid) as $id)
{
	$zustand_id = IPS_GetVariableIDByName ( "Zustand", $id ) ;
	$zustand = GetValueBoolean($zustand_id);
	if ($zustand == true)
	{
	$counter = $counter + 1;
	}
}