FHEM Forum

FHEM - Hausautomations-Systeme => Unterstützende Dienste => Thema gestartet von: Diggewuff am 10 Juni 2016, 11:54:19

Titel: [gelöst] 2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Diggewuff am 10 Juni 2016, 11:54:19
Moin Leute,

bei mir hat sich mal wieder eine frage ergeben wozu ich im Internet nicht viel gefunden habe.

Ich überwache momentan Anwesenheitsstati von Bewohnern über "Presence local-bluetooth". Da die Reichweite des internen Bluetooth Chips im Raspi 3 nicht ganz für meine Wohnung reicht und ich feststelle das trotz "absenceThreshold 3" teilweise fehlerhafte Abwesenheiten erkannt werden, habe ich jetzt vor, noch einen weiteren Bluetooth stick ein zu binden.

Diesen würde ich gerne zusätzlich zum internen Bluetooth am gleiche Raspi über ein USB Verlängerungskabel betreiben.
Ist es möglich statt local-bluetooth einen lan-bluetooth mit 2 presenced oder collectord am gleiche Raspi zu betreiben?
oder 2 local-bluetooth in einem "Presence local-bluetooth" zusammen zu führen, eventuell in dem man dem Raspi beibringt bei einer "Presence local-bluetooth" anfrage das "hcitool" über beide Bluetooth Chips ablaufen zu lassen?

Ich freue mich schon auf euer Feedback.
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Markus Bloch am 10 Juni 2016, 15:32:42
Hallo Diggewuff,

generell kann man presenced und collectord auf dem gleichen Raspberry betreiben.

Es gibt hier nun mehrere Möglichkeiten, wie man das lösen kann:

1. Auf dem Raspberry läuft eine presenced Instanz, welche von mehreren FHEM-PRESENCE-Definitionen benutzt wird (lan-bluetooth) über 127.0.0.1
2. Man stellt einen weiteren Raspberry woanders in der Wohnung auf um eine bessere Abdeckung zu erzielen. Auf beiden Raspberrys läuft presenced, auf einem läuft der collectord, welcher mit beiden presenced's kommuniziert. In FHEM benutzen dann alle PRESENCE-Definitionen den collectord um nach der jeweiligen Adresse zu suchen.

Eine presenced Instanz kann mehrere Geräte gleichzeitig prüfen. presenced kann aktuell allerdings nicht erkennen, welche BT-Sticks zur VErfügung stehen und diese direkt einzeln ansprechen um einen Scan durchzuführen. Das muss man vorher mit hciconfig entsprechend einstellen.

Gruß
Markus
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Diggewuff am 10 Juni 2016, 15:50:27
Die Hauptfrage war allerdings ob ich an einem PI mehrere Bluetooth Geräte nutzen kann (einmal das interne Bluetooth Modul und einmal einen über ein langes USB Verlängerungskabel woanders in der Wohnung positionierten Bluetooth USB Stick) sprich, Gerätepresenzen über zwei Bluetooth Module an einem Pi überwachen. Oder spricht Local-Bluetooth automatisch beide Module an?

Ich möchte nur für die Präsenzerkennung kein zweites PI betreiben.
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Markus Bloch am 10 Juni 2016, 16:04:09
Das ist eine gute Frage und ich muss gestehen, dass ich so einen Fall noch nicht hatte und auch nicht ausprobiert habe. Ich würde daher Dich einfach mal fragen, was denn deine Resultate ergeben ;)

Hab jetzt auf die schnelle im Internet auch keine passende Antwort finden können. Von daher würde ich Dir raten: "Ausprobieren, lernen und andere teilhaben lassen"

Gruß
Markus
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Diggewuff am 10 Juni 2016, 16:13:13
Ich werde Weinmichel gleich zuhause bin einfach mal einen Bluetooth Stich anstopseln, aber da ich noch pludriger Anfänger in Sachen Linux bin, wüsste ich noch nicht einmal wie ich überprüfen kann welche der BT dann benutzt wird. Hast du in die Richtung vielleicht einen Tipp für mich? 
Hcitool Abfrage über 2 BT Geräte konsolidieren?!?
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Markus Bloch am 10 Juni 2016, 16:19:00
Ich müsste jetzt selbst erstmal zuhause nachschauen was da so geht und was man sehen und beeinflussen kann.

Ich werd am Wochenende mal schauen.

Gruß
Markus
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Diggewuff am 10 Juni 2016, 16:29:00
 Das wäre toll. Ich freue mich auf deine Rückmeldung.
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: justme1968 am 10 Juni 2016, 16:32:00
man kann mehrere stick gleichzeitig anstecken.

bei jedem hcitool aufruf muss man dann das device (hci0, hci1,...) mit -i übergeben.

gruss
  andre
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Diggewuff am 10 Juni 2016, 17:23:02
Gibt es denn eine Möglichkeit im presence modul in FHEM zu hinterlegen welche devices alle übergeben werden sollen?
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Markus Bloch am 10 Juni 2016, 17:25:55
Aktuell nicht, bisher ruft PRESENCE einfach nur hcitool name <adresse> auf. Welcher BT-Empfänger dann verwendet wird, entscheidet hcitool selbstständig. Aktuell kann man den zu nutzenden Empfänger nicht konfigurieren, es sei denn, man fügt das von Andre vorgeschlagene "-i <device>" manuell in presenced oder PRESENCE dem hcitool Aufruf hinzu.

Gruß
Markus
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Diggewuff am 10 Juni 2016, 18:18:59
auf welcher Grundlage entscheidet hcitool denn welcher BT-Empfänger verwendet wird? oder verwendet hcitool beide wenn eine bei der name anfrage nicht fündig wird?
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: justme1968 am 10 Juni 2016, 18:23:32
wenn nichts angegeben wird ist der default das erste device. und es wird auch nur das erste verwendet.

du brauchst also pro hui device einen presenced.

gruss
  andre
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Diggewuff am 10 Juni 2016, 18:53:04
Also hcitool so ein zu stellen dass es beide BTSticks verwendet wird dann nicht gehen.
kann ich denn 2 presences auf einem pi verwenden und diese dann auf dem gleichen pi über colectord zusammenfassen?
Titel: Antw:2 local-bluetooth in einem &quot;Presence local-bluetooth&quot; zusammen
Beitrag von: justme1968 am 10 Juni 2016, 18:54:32
genau. so sollte es gehen. am einfachsten wenn du dir den presenced kopiererst und jeweils eine version mit passenden ports und devices erzeugst.
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Diggewuff am 10 Juni 2016, 18:56:38
ich blicke immer noch nicht ganz durch ist presenced ein fhem Modul?

Edit: schon rausgefunden. lesen hilft das werde ich nachher mal testen aber jetzt muss ich erstmal mit meiner besseren hälfte zu IKEA sonst geht der WAF wieder runter ;-)
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Diggewuff am 11 Juni 2016, 03:46:57
ich habe jetzt nochmal ein bisschen rum probiert und bin zu dem Entschluss gekommen das es wohl die sauberste Lösung ist, das presence Modul selbst an zu passen, allerdings bin ich der perl Programmiersprache nicht wirklich mächtig so dass ich bei der syntax ein wenig Hilfe brauchen könnte.

Die derzeitige schleife sieht folgendermaßen aus siehe Zeile 838 in 73_PRESENCE.pm:
$devname = qx(hcitool name $device);

        chomp($devname);
        Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

        if(not $devname =~ /^\s*$/)
        {
            $return = "$name|$local|present|$devname";
        }
        else
        {
            $return = "$name|$local|absent";
        }

       
Die würde ich jetzt folgendermaßen abändern:
                $devname = qx(hcitool -i hci0 name $device);                            #stufe 1

        chomp($devname);
        Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

        if(not $devname =~ /^\s*$/)
        {
            $return = "$name|$local|present|$devname";
        }
        else
        {
            $devname = qx(hcitool -i hci1 name $device);                        #stufe 2

            chomp($devname);
            Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

            if(not $devname =~ /^\s*$/)
            {
                $return = "$name|$local|present|$devname";
            }
            else
            {
                $devname = qx(hcitool -i hci2 name $device);                    #stufe 3

                chomp($devname);
                Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

                if(not $devname =~ /^\s*$/)
                {
                    $return = "$name|$local|present|$devname";
                }
                {
                    $devname = qx(hcitool -i hci3 name $device);                #stufe 4

                    chomp($devname);
                    Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

                    if(not $devname =~ /^\s*$/)
                    {
                        $return = "$name|$local|present|$devname";
                    }
                    else
                    {
                        $devname = qx(hcitool -i hci4 name $device);            #stufe 5

                        chomp($devname);
                        Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

                        if(not $devname =~ /^\s*$/)
                        {
                            $return = "$name|$local|present|$devname";
                        }
                        else
                        {
                            $return = "$name|$local|absent";
                        }
                    }
                }
            }
        }


ist jetzt mangels Programmierkentnissen eine copy and paste Lösung aber vielleicht hat ja noch jemand einen tip für mich wie ich die abfrage:
pi@raspberrypi:~ $ hcitool dev
Devices:
hci1 B8:27:EB:A7:F2:FB
hci0 00:15:83:D2:1A:D6

integrieren kann, um nur die hciX abzufragen die auch tatsächlich angeschlossen sind...
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Markus Bloch am 11 Juni 2016, 12:22:49
Hi,

so könnte man es machen, dann dürftest du dein FHEM aber nicht mehr updaten (zumindest PRESENCE), da du dann eine lokale Modifikation an der Datei vorgenommen hast, die bei einem update überschrieben würde.

Was justme1968 und ich meinen ist nicht die Anpassung von PRESENCE sondern die Anpassung von presenced, so dass du dann 2 verschiedene Instanzen von presenced (einmal für hci0 und eins für hci1) laufen hast. Der collectord würde dann beide Instanzen nutzen und du hättest die Raumunterscheidung drin.

Gruß
Markus
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Diggewuff am 11 Juni 2016, 14:40:49
das habe ich schon verstanden. halte das allerdings nicht für wirklich sinnvoll, da ich ja nur die Reichweite verbessern will und nicht auf einer Erkennung nach räumen aus bin.
Hat jemand eine Idee wie ich über ein Attribut das ich auf 1, 2, 3, 4 oder 5 setze den Ablauf meines scripts auf die Ausführung nur bis stufe 1, 2, 3, 4 oder 5 begrenzen kann?
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Diggewuff am 11 Juni 2016, 17:01:52
ich habe das ganze jetzt so gelöst dass ich einfach 5 Geräte abfrage und bei einem Fehler (Meldung: "Invalid device: No such device") weil das gerät nicht verfügbar ist das nächsten nehme.
         $devname = qx(hcitool -i hci0 name $device);                            #stufe 1

        chomp($devname);
        Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

        if(not ($devname eq "Invalid device: No such device") && not ($devname =~ /^\s*$/))
        {
            $return = "$name|$local|present|$devname";
        }
        else
        {
            $devname = qx(hcitool -i hci1 name $device);                        #stufe 2

            chomp($devname);
            Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

            if(not ($devname eq "Invalid device: No such device") && not ($devname =~ /^\s*$/))
            {
                $return = "$name|$local|present|$devname";
            }
            else
            {
                $devname = qx(hcitool -i hci2 name $device);                    #stufe 3

                chomp($devname);
                Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

                if(not ($devname eq "Invalid device: No such device") && not ($devname =~ /^\s*$/))
                {
                    $return = "$name|$local|present|$devname";
                }
                else
                {
                    $devname = qx(hcitool -i hci3 name $device);                #stufe 4

                    chomp($devname);
                    Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

                    if(not ($devname eq "Invalid device: No such device") && not ($devname =~ /^\s*$/))
                    {
                        $return = "$name|$local|present|$devname";
                    }
                    else
                    {
                        $devname = qx(hcitool -i hci4 name $device);            #stufe 5

                        chomp($devname);
                        Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

                        if(not ($devname eq "Invalid device: No such device") && not ($devname =~ /^\s*$/))
                        {
                            $return = "$name|$local|present|$devname";
                        }
                        else
                        {
                            $return = "$name|$local|absent";
                        }
                    }
                }
            }
        }


allerdings schreibt das Programm für jedes nicht vorhandene device eimal"Invalid device: No such device" ins logfile.

Liebe PERL Experten: Hat jemand eine Ahnung wie sich das unterdrücken lässt?
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Markus Bloch am 11 Juni 2016, 20:14:31
Hast du das verbose level hochgestellt? Wenn du das Attribut "verbose" nicht gesetzt hast, dann sollte da keine Meldung kommen, da diese nur ab verbose level 4 kommt.

Gruß
Markus
Titel: Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Diggewuff am 11 Juni 2016, 20:24:38
Verbösre steht auf 3. Es handelt sich bei den log Einträgen glaube ich nicht um Regulierer LogFile Einträge die durch das Programm generiert werden sondern ich glaube das diese direkt von der Shell erzeugt werden da auch vor dem Eintrag kein Zeitstempel oder verbose Level Steht.  Wenn ich den von mir geänderten Teil als eigenständiges Perl Skript auf der Shell ausführe werden diese Zeilen auch geplotet.
Titel: [gelöst] Antw:2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Diggewuff am 12 Juni 2016, 03:11:30
Ich habe es jetzt endgültig hinbekommen.  ;D ;D ;D

Mit meiner Modifikation probiert das PRESENCE Modul im modus Local Bluetooth bei Aufruf bis zu 5 lokal eingebundene Bluetooth Geräte durch um ein Präsentes gerät zu finden, so lassen sich mehrere USB-Kabel gebundene Bluetooth Dongle in der Wohnung verteilen, wodurch die Zuverlässigkeit extrem nach oben geht.
Ansonsten wird das Modul nicht beeinträchtigt.

Falls jemand Interesse hat hier mein fertiger Code:
einfach die Zeilen 838-850 in der heute aktuellen 73_PRESENCE.pm durch diesen code ersetzen.
oder meine 73_PRESENCE.pm aus dem Anhang verwenden.
nicht vergessen das update von 73_PRESENCE.pm abzuschalten "attr global exclude_from_update 73_PRESENCE.pm"
        #$devname = qx(hcitool name $device);

        #chomp($devname);
        #Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

        #if(not $devname =~ /^\s*$/)
        #{
        #    $return = "$name|$local|present|$devname";
        #}
        #else
        #{
        #    $return = "$name|$local|absent";
        #}
$devname = qx(hcitool -i hci0 name $device 2>&1);                            #stufe 1

        chomp($devname);
        #Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

        if(not ($devname eq "Invalid device: No such device") && not ($devname =~ /^\s*$/))
        {
            $return = "$name|$local|present|$devname";
        }
        else
        {
            $devname = qx(hcitool -i hci1 name $device 2>&1);                        #stufe 2

            chomp($devname);
            #Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

            if(not ($devname eq "Invalid device: No such device") && not ($devname =~ /^\s*$/))
            {
                $return = "$name|$local|present|$devname";
            }
            else
            {
                $devname = qx(hcitool -i hci2 name $device 2>&1);                    #stufe 3

                chomp($devname);
                #Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

                if(not ($devname eq "Invalid device: No such device") && not ($devname =~ /^\s*$/))
                {
                    $return = "$name|$local|present|$devname";
                }
                else
                {
                    $devname = qx(hcitool -i hci3 name $device 2>&1);                #stufe 4

                    chomp($devname);
                    #Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

                    if(not ($devname eq "Invalid device: No such device") && not ($devname =~ /^\s*$/))
                    {
                        $return = "$name|$local|present|$devname";
                    }
                    else
                    {
                        $devname = qx(hcitool -i hci4 name $device 2>&1);            #stufe 5

                        chomp($devname);
                        #Log3 $name, 4, "PRESENCE ($name) - hcitool returned: $devname";

                        if(not ($devname eq "Invalid device: No such device") && not ($devname =~ /^\s*$/))
                        {
                            $return = "$name|$local|present|$devname";
                        }
                        else
                        {
                            $return = "$name|$local|absent";
                        }
                    }
                }
            }
        }


Ich freue mich auf euer Feedback!
evtl. ja sogar vom Entwickler von 73_PRESENCE.pm
Titel: Antw:[gelöst] 2 local-bluetooth in einem &quot;Presence local-bluetooth&quot; zusammen
Beitrag von: justme1968 am 12 Juni 2016, 10:30:12
wie weit sind denn die beiden empfänger von einander entfernt? und bist du wirklich sicher das die zu erlässigkeit wirklich deshalb steigt oder alleine dadurch das es mehr als einen versuch gibt? 

ich habe bei mir auch manchmal aussetzer. selbst wenn direkt neben dem empfänger. der nächste scan funktioniert dann gleich wieder.

da müsste absenceThreshold helfen.

gruss
  andre
Titel: Antw:[gelöst] 2 local-bluetooth in einem "Presence local-bluetooth" zusammen
Beitrag von: Diggewuff am 12 Juni 2016, 13:47:13
Es geht mir nicht um die Anzahl der Versuche bei mir ist der Punkt dass meine Wände ziemlich dick sind effektiv ist das Raspi hci0 nur wenige Meter vom Bluetooth Dongle hci1 entfernt. Allerdings befindet sich eine ziemlich dicke Wand dazwischen so dass vor meiner Modifikation ich die ganze Wohnung erkannt werden konnte. Die Anzahl der Versuche habe ich schon vor meiner Modifikation über den absenceThreshold auf 3 gesetzt.  Diesen noch überzusetzen kam für mich allerdings nicht infrage dass dadurch zu einer zu langen Verzögerung bis zur Erkennung der Abwesenheit kommt.
Um nur wenige Meter vom eigentlichen Raspi entfernt ein weiteres Bluetooth Modul zu platzieren kam es für mich nicht infrage ein weiteres Raspi an zu schaffen. Ich denke da bin ich nicht der einzige dem es so geht.