[gelöst] 2 local-bluetooth in einem "Presence local-bluetooth" zusammen

Begonnen von Diggewuff, 10 Juni 2016, 11:54:19

Vorheriges Thema - Nächstes Thema

Diggewuff

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...

Markus Bloch

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
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Diggewuff

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?

Diggewuff

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?

Markus Bloch

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
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Diggewuff

#20
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.

Diggewuff

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

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Diggewuff

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.