[Modul] Bluetooth Presence (Linux Only)

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;
	}
}	

Hallo,
wollte heute dein Modul installieren und bekomme beim übernehmen der Konfiguration folgende Fehlermeldung:

BTPDevice.PNG

Hier ist noch die Fehlermeldung vom Log:

Hi,

ja das ist noch ein Fehler im Modul. Ich arbeite gerade an einer Aktualisierung. Ich schau mal das ich das heute noch fertig bekomme.

@steppe
Ich habe den LEScan ins Modul integriert. Allerdings hab ich das etwas anders gelöst, da bei deiner Variante der BT Modul pauschal 3 Sekunden geblockt wird. Ich frage die Daten „non-blocking“ ab, so dass das Programm direkt beenden kann, sobald das Device gefunden habe.

@immergut
Dein Problem ist mit dem Update ebenfalls gelöst.

Danke @traxanos,
Fehlermeldung kommt nicht mehr. Modul lässt sich installieren; jedoch wird kein Scan ausgeführt. Auch wenn ich in der Instanz auf „Suchen“ gehe, passiert nichts. Im Log steht nur, dass die Einstellungen gespeichert wurden; aber nichts von einem Scan.

Grüße,
Jürgen

@immergut

Der Scan selber wird auch nicht protokolliert. Damit das Modul funktioniert, muss folgender Befehl auf der Konsole auch klappen:

hcitool -i hci0 name MACADRESSE

Probier das doch mal mir einer gültigen MacAdresse.

@traxano
Habe gerade nochmal versucht. Mit meinem Handy funktioniert es. Wenn ich jedoch auf LE umstelle und die MAC meines G-tag Dongles eingebe, tut sich nichts. Der G-tag hat aber vorher monatelang mit deinem Modul funktioniert. Nur seit ein paar Tagen nicht mehr. Vielleicht hat der G-tag auch eine Macke. Werde mir mal einen Neuen bestellen und nochmal testen.

Gruß und guten Rutsch ins neue Jahr,
Jürgen

Die LE Funktion habe ich doch gerade erst die Tage eingebaut. Somit kann das nicht schon Monate lang funktioniert haben. Ich vermute das du es ohne LE-Modus nutzen musst.

Ohne LE geht es auch nicht. Ich hatte definitiv dein Modul vorher schon im Einsatz (ohne die Ckeckbox LE) und mein G-tag wurde erkannt.
Wenn ich aber jetzt auf der Konsole „hcitool -i hci0 name MACADRESSE“ die MAC meines Handys eingebe, kommt als Antwort Nexus 5x. Bei der MAC meines G-tag kommt aber nichts zurück.

Gruß

Vielleicht ist er aber bald ein Jahr alt und die Batterie erschöpft.
Bei den gefallenen Preisen hab ich meine Horde an G-Tags komplett durch neue ersetzt, statt die Batterien zu tauschen.
In meiner Bluetooth-Präsenz-Lösung hab ich eine „Heart-Beat“-Funktion eingebaut, d.h. das Skript zählt die Anzahl der Meldungen der einzelnen Tags pro Zeiteinheit. Wenn die Beats über 90 pro Minute liegen, betrachte ich den Dongle noch als voll funktionsfähig.

Viele Grüsse
Harald

Ich hatte des öfteren Probleme mit „Semaphore Timeout“
Vielleicht ist mein Raspberry etwas zu sehr ausgelastet. Jedenfalls konnte ich eine Verbesserung erzielen, indem ich die Differenz der Semaphore Zeit (6 Sekunden) und die $timeout = time() + 5; auf 2 Sekunden erhöht habe.
Da der Scan relativ schnell fündig wird habe ich die $timeout = time() + 4; gesetzt. (Vielleicht gibt das Probleme wenn man sehr viele Bluetooth Sachen hat)

Bis jetzt klappt das bei mir so.

Grüße
Stefan