erweiterung von PRESENCE/(le)presenced/collectord um rssi werte

Begonnen von justme1968, 10 Juni 2016, 17:36:24

Vorheriges Thema - Nächstes Thema

popy

Zitat von: Phiolin am 30 Oktober 2017, 08:28:00
Kann ich nachher machen, ist aber etwas experimentell. Bei mir funktioniert es aber weitestgehend problemlos seit vielen Wochen. :)
Mittlerweile benutze ich anstatt hcitool cc aber l2ping. Das sollte aber auch auf den meisten Systemen standardmäßig verfügbar sein.
Suche ich später raus, wenn ich wieder Zuhause bin.

Das wäre echt toll wenn du die hcitool version hochladen könntest.
Nur das ich es richtig verstehe, hattest du die "hcitool cc" Version Wochen problemlos im Einsatz oder die l2ping?
Ist mit l2ping auch eine rssi Messung und somit eine Raum Einstufung möglich?

Danke schon mal im Voraus
Tobias

Phiolin

hcitool cc und/oder l2ping werden nur verwendet, um eine lockere, nicht authentifizierte, Verbindung zum Gerät aufzubauen. Dabei bestimmt der Bluetooth Daemon dann auch gleich die RSSI, die man dann über hcitool rssi auslesen kann.
Es funktioniert beides, bei mir lief das l2ping aber stabiler. Ich hatte beides längere Zeit im Einsatz.

Die Stabilität hängt aber meines Erachtens auch weniger von der verwendeten Methode, sondern mehr von der Bluetooth Hardware und den Treibern ab. Meine presenced laufen alle auf Raspberry Pi Model B mit Raspbian und bluez Version 5.23. Damit habe ich aktuell keine Probleme mit dieser Methode. :)

Im Anhang meine presenced Version. Damit die Erweiterung mit den RSSI Werten läuft, muss diese Version explizit mit dem Parameter -r gestartet werden.
Daher muss gegebenenfalls auch noch das entsprechende Init-Script, z.B. in /etc/init.d/presenced, angepasst werden, beispielsweise indem dort in der Zeile DAEMON_ARGS das -r hinzugefügt wird:

DAEMON_ARGS="-v -r -d -l /var/log/$NAME.log"

Ursprünglich hatte ich dies für unsere iPhone und Apple Watches am Laufen. Erwähnenswert ist wahrscheinlich, dass es seit dem neuen WatchOS mit den Apple Watches nicht mehr funktioniert. Apple hat unterbunden, dass irgendwelche anderen Geräte Bluetooth Verbindungen zu den Uhren aufbauen können, daher wird eine Apple Watch aktuell mit keiner mir bekannten Linux-Methode mehr via Bluetooth gefunden. Für die iPhones funktioniert das aber immer noch sehr gut.

Wie ursprünglich geschrieben, ist die RSSI Erweiterung im presenced noch experimentell zu betrachten und auch aus diesem Grund nicht offiziell verfügbar. Da die Funktion auch stark von eurer verwendeten Hardware abhängen kann, ist hier ein Support im Fehlerfall wahrscheinlich schwierig. Man muss halt ein bisschen rumprobieren. :)

popy

#107
Danke für den neuen presenced, läuft soweit und liefert rssi werte.
Habe ihn auf 2x RPIs laufen in verschiedenen Räumen und einen collectord am main FHEM rpi.
Die presence wird in beiden Räumen erkannt wenn ich mich in der Mitte der beiden befinde.
Auch wenn ich nur in einem bin, wird nur dieser bei rooms angezeigt.

Jetzt meine Frage, Sollte nicht anhand des rssi entschieden werden in welchem Raum ich mich aufhalte(oder näher bin)?
Finde aber leider kein reading dazu, z.B.: "room" oder so ähnlich.
Siehe Anhang.

@Phiolin: Wie ist das gedacht?

Danke
pOpY

popy

#108
Vergesst es  ;D Habs, einfach die neueste SVN Version von collectord und schon wird das reading room zur Verfügung gestellt.
Hätte aber eine andere Frage, vorher hatte ich es so:


  • Einen RPI im Wohnzimmer mit mehreren local-bluetooth PRESENCE
  • absenceThreshold bei jedem PRESENCE auf 20, damit einfach ein bisschen Zeit vergeht bis absent gesetzt wird
  • Diese zusammengefasst mit einer structure
  • Auf das Zusammengefasste structure einen watchdog: DEF   P_WZ__BT_All:absent 00:05 P_WZ__BT_All:present {evtWZBTAbsentHandler()} ; setstate watchdog_Niemand_im_WZ defined

Dies funktionierte ganz gut sobald keiner mehr im WZ war wurde nach 5 min der evtWZBTAbsentHandler() ausgeführt, was dann alles abschaltete.

Jetzt wo ich 2 RPIs habe werden die Clients ja nicht mehr absent gesetzt sondern z.B.: nur der room geändert.

Wie realisiere ich das gleiche wie vorher?
Wie kann ich dem Watchdog mitgeben dass er nicht state sondern room von allen liest?

Dann sollte ev. sowas ähnliches wie (symbolisch, syntax ist sicher falsch):

DEF P_BT_.*:room:Wohnzimmer 00:05 P_BT_.*:room:andere {evtWZBTAbsentHandler()} ; setstate watchdog_Niemand_im_WZ defined

funktionieren.

room ist ja nicht mehr gesetzt bzw. ein leerer String sobald das Gerät niergends mehr gesetzt ist, wie kann ich das event "room != Wohnzimmer" mit dem WDT abfangen?

Danke
pOpY


Phiolin

Hm, also ich benutze für die Raumerkennung und Schaltung von Geräten bei Verlassen oder Betreten von Räumen ein DOIF.
Da verwende ich dann als Bedingung einfach eine Regexp mit Counter, wie hier:

[#"^rr_.*":location:$_ eq "Wohnzimmer"] > 0   

^rr_.* matched auf meine Residents Devices und zählt dann wie viele davon im Location Reading gerade "Wohnzimmer" stehen haben.
Diese spezielle Art der Bedingung klappt so aber meines Wissens nur im DOIF. Bei Watchdogs bin ich daher leider raus, da bei mir zu 95% nur DOIF im Einsatz ist.

popy

Zitat von: Phiolin am 30 Oktober 2017, 22:51:18
Hm, also ich benutze für die Raumerkennung und Schaltung von Geräten bei Verlassen oder Betreten von Räumen ein DOIF.
Da verwende ich dann als Bedingung einfach eine Regexp mit Counter, wie hier:

[#"^rr_.*":location:$_ eq "Wohnzimmer"] > 0   

^rr_.* matched auf meine Residents Devices und zählt dann wie viele davon im Location Reading gerade "Wohnzimmer" stehen haben.
Diese spezielle Art der Bedingung klappt so aber meines Wissens nur im DOIF. Bei Watchdogs bin ich daher leider raus, da bei mir zu 95% nur DOIF im Einsatz ist.

Danke für die Info.
Ist mir soweit klar, muss mich aber erst mal mit residents usw. spielen.

Wie machst du eine Verzögerung bei verlassen? oder schaltest du immer gleich beim Event vom PRESENCE?
Wie gesagt jetzt hatte ich absenceThreshold in Kombination mit einem Watchdog verwendet.
absenceThreshold kann ich ja nicht mehr verwenden, da der User nicht mehr absent geht, sondern nur  mehr den "room" wechselt.

Danke
pOpY

Phiolin

#111
Vielleicht mal als Beispiel ein Eindruck von der DOIF Steuerung meiner Sonos Box im Wohnzimmer. Habe das mal teilweise mit Kommentaren versehen. Ein wenig DOIF Kenntnisse sind beim Verständnis sicherlich hilfreich, aber ich hoffe, man versteht es auch so. :)

(
  ## CMD 1: Morgens Radio anschalten
  ([#"^rr_.*":location:$_ eq "Wohnzimmer"] > 0                  # Wenn mindestens ein Bewohner im Wohnzimmer ist
    or [EG.wz.MS.Motion] eq "motion"                                   # oder der Bewegungsmelder im Wohnzimmer Bewegung feststellt
    or [EG.fl.MS.Motion] eq "motion")                                    # oder der Bewegungsmelder im Flur Bewegung feststellt
  and ([Haus] eq "morning"                                                 # (HOMESTATE Modul): Die Daytime auf "morning" steht
    or [06:15-08:30])                                                          # oder es generell zwischen 6:15 und 8:30 ist
  and [DG.az.NE.FritzBoxCallMonitor:event] eq "disconnect"   # und gerade kein Telefonanruf läuft
  and [rgr_Bewohner] eq "home"                                         # überhaupt nur dann, wenn jemand Zuhause ist
  and [Sonos_Wohnzimmer:transportState] ne "PLAYING"     # und im Wohnzimmer nicht schon irgendwas anderes auf der Sonos Box läuft
  and [EG.wz.TV.SonyBravia:power] eq "off"                         # und der Fernseher aus ist
  and [EG.wz.FB.Harmony:currentActivity] eq "PowerOff"       # und die Harmony Fernbedienung auf "Alles aus" steht
) (
  set Sonos_Wohnzimmer RemoveMember Sonos_Wohnzimmer,          # Dann entferne den Wohnzimmer Lautsprecher aus allen Gruppen
  (sleep 2; set Sonos_Wohnzimmer:FILTER=Volume!=25 Volume 25),      # Setze die Lautstärke auf einen normalen Level
  (sleep 5; set Sonos_Wohnzimmer LoadRadio /WDR.2/),                    # Lade den WDR 2 Stream
  (sleep 10; set Sonos_Wohnzimmer Play)                                         # und los gehts :-)
) DOELSEIF (
  ## CMD 2: Wenn irgendwo im Haus ein Sonos Lautsprecher läuft und dann jemand ins Wohnzimmer kommt,
  ## füge den Wohnzimmer Lautsprecher der Gruppe hinzu und nehme damit quasi die Musik mit ins Wohnzimmer (Follow-Me)
  [?Sonos:MasterPlayerPlayingCount] == 1
  and ([#"^rr_.*":location:$_ eq "Wohnzimmer"] > 0
       or [EG.wz.MS.Motion] eq "motion"
       or [EG.fl.MS.Motion] eq "motion")
  and [?Sonos_Wohnzimmer:transportState] ne "PLAYING"
  and [?Sonos_Wohnzimmer:IsMaster] == 1
  and [rgr_Bewohner] eq "home"
  and [EG.wz.TV.SonyBravia:power] eq "off"
  and [EG.wz.FB.Harmony:currentActivity] eq "PowerOff"
) (
  set Sonos_Wohnzimmer:FILTER=Volume>25 Volume 25,
  set [Sonos:MasterPlayerPlaying:"([a-zA-Z_]+)"] AddMember Sonos_Wohnzimmer
) DOELSEIF (
  ## CMD 3: Wenn keiner im Raum ist, stoppe die Wiedergabe im Wohnzimmer
  [#"^rr_.*":location:$_ eq "Wohnzimmer"] == 0
  and [EG.wz.MS.Motion] eq "nomotion"
  and [EG.fl.MS.Motion] eq "nomotion"
) (
  set Sonos_Wohnzimmer RemoveMember Sonos_Wohnzimmer,
  (sleep 5; set Sonos_Wohnzimmer:FILTER=IsMaster=1 Stop)
) DOELSEIF (
  ## CMD 4: Wenn jemand anruft, pausiere die Wiedergabe im Wohnzimmer
  ([DG.az.NE.FritzBoxCallMonitor:event] eq "ring"
  or [DG.az.NE.FritzBoxCallMonitor:event] eq "call")
  and [?Sonos_Wohnzimmer:IsMaster] == 1
  and [?Sonos_Wohnzimmer:transportState] eq "PLAYING"
) (
  set Sonos_Wohnzimmer Pause
) DOELSEIF (
  ## CMD 5: Wenn der Telefonanruf beendet ist, setze die Wiedergabe fort
  [DG.az.NE.FritzBoxCallMonitor:event] eq "disconnect"
  and [?$SELF:cmd_nr] == 4
  and [?Sonos_Wohnzimmer:IsMaster] == 1
  and ([?Sonos_Wohnzimmer:transportState] eq "PAUSED_PLAYBACK"
      or [?Sonos_Wohnzimme:transportState] eq "STOPPED")
) (
  set Sonos_Wohnzimmer Play
) DOELSEIF (
  ## CMD 6: Wenn der Fernseher an ist, stoppe die Wiedergabe im Wohnzimmer
  ([EG.wz.TV.SonyBravia:power] eq "on"
    or [EG.wz.FB.Harmony:currentActivity] ne "PowerOff")
  and [?Sonos_Wohnzimmer:transportState] eq "PLAYING"
) (
  set Sonos_Wohnzimmer RemoveMember Sonos_Wohnzimmer,
  (sleep 5; set Sonos_Wohnzimmer Stop)
) DOELSEIF (
  ## CMD 7: Wenn ansonsten nichts zutrifft und eine Wiedergabe im Wohnzimmer läuft, dann springe hierhin und tue einfach gar nichts
  ## Dann kann später wieder einer der anderen Zweige angesprungen werden, da hier kein "do always" verwendet wird.
  ([#"^rr_.*":location:$_ eq "Wohnzimmer"] > 0
    or [EG.wz.MS.Motion] eq "motion"
    or [EG.fl.MS.Motion] eq "motion")
  and [?Sonos_Wohnzimmer:transportState] eq "PLAYING"
) (
  ## Do nothing
)


Damit die Wiedergabe noch etwas weiter läuft, wenn man den Raum verlässt, verwende ich für den Zweig CMD 3 eine Verzögerung (wait) von 180 Sekunden.

popy

Danke für das Beispiel.
Sorry für die vielen OT Fragen, das es mehr das RESIDENTS Modul betrifft habe ich meine Fragen hier gepostet: https://forum.fhem.de/index.php/topic,19040.msg707270.html#msg707270

Wäre toll wenn du mal drüber lesen könntest und ev. die eine oder andere Antwort hättest.

Danke
pOpY


popy

@Phiolin: Eine Frage noch zu deiner Erweiterung. Was hast du bei den DEF Zeiten für absence und presence in Sekunden eingestellt (Also bei dem PRESENCE Objekt und im collectord)?
Hab das Problem dass wenn ich Raum wechsle geht dass Licht erst ca. 1,5 minuten später an, sprich der room wird gewechselt anhand dem rssi.
Da habe ich aber schon fast keinen Emofang mehr im "alten" raum und stehe fast neben dem RPI im neuen Raum.
Ich vermute es hat damit zu tun dass der presenced den rssi erst nach einem mal erkennen mittels hcitool misst.
Somit hat der alte Raum noch einen höheren rssi wert und der neue gar keinen.
Kann das sein?

Meine Zeiten sind derzeit auf 10 wenn absent und 45 wenn present.
Welche Zeiten hast du konfiguriert, ohne den Akku des Smartphones zu viel zu belasten?
Würde 10,10 gehen (in den PRESENCES & collectord)?
Oder hast du ev. noch einen Einfall was man im Code ändern kann?

Eine Idee von mir wäre gewesen mein notify zum einschalten des lichts nicht auf ROOMMATE (location, was von PRESENCE room kommt) zu machen sondern auf PRESENCE (rooms)...?

Freue mich auf Deine Antwort
Danke
pOpY

Phiolin

Ich habe für PRESENCE 45 und für ABSENCE 60 Sekunden eingestellt.
Zugegebenermaßen ist das bei mir kein so großes Problem, da ich die Räume primär nur für hin- und wieder kommende Sprachdurchsagen im Haus verwende. Sekundär sind sie zwar auch bei der Sonos Steuerung in Verwendung, aber da ich in jedem Raum auch Bewegungsmelder (Lichtsteuerung Philips Hue) habe, die ohnehin alle 20 Sekunden ausgelesen werden, kann ich die meisten Sachen bei denen es nicht unbedingt darauf ankommt WER im Raum ist, sondern nur OB jemand im Raum ist, sowohl über die Bewegungsmelder als auch über die Presence Devices abfragen und habe damit eher schneller Reaktionszeiten.

Vor allem für eine Lichtsteuerung sind die Reaktionszeiten über Presence Devices zu langsam. Hier wirst du wohl um Bewegungsmelder nicht drumherum kommen. Die Presence Devices eignen sich eher für nicht ganz so zeitkritische Dinge.


popy

Danke für deine Einschätzung, werde mir BM besorgen.
Gibt es aus deiner Sicht noch eine Möglichkeit das Erkennen im presenced zu beschleunigen bzw. was ist deine Einschätzung wenn ich es auf 10,10 stelle bzgl. Smartphone Akku?

Danke
pOpY

popy

Hallo.

Habe eine andere Möglichkeit gefunden die Sendestärke (TX Power) des Bluetooth Dongles zu reduzieren (= Reichweite zu reduzieren).
Leider lief bei mir kein Script mit hcitool cc oder l2ping auf meinem rpi2 stabil. Hatte sogar Kernel Crashes.
Mit "hcitool name" stattdessen lief alles super stabil.
Durch das reduzieren der Sendereichweite des USB Bluetooth Dongles kann ich so auch gut zwischen Räumen abgrenzen.
Weiterer Vorteil, es muss nur ein Befehl pro Benutzer abgesetzt werden (hcitool name), dadurch kann der Intervall verkürzt werden und die
Ansprechzeit beim Betreten von Räumen ist schnell (habs auf 15 Sekunden gestellt).

Es läuft bei mir mit folgenden USB Bluetooth Sticks "CSL - USB nano Bluetooth-Adapter V4.0": https://www.amazon.de/gp/product/B00C68IQ3C/ref=oh_aui_search_detailpage?ie=UTF8&psc=1
Der "inolink Bluetooth 4.0 Class 1 USB Adapter" sollte auch gehen.
Wichtig ist der Chipsatz: CSR8510 A10 !

Um hcitool ohne sudo ausführen zu können, folgendes eingeben:
       sudo setcap 'cap_net_raw,cap_net_admin+eip' `which hcitool`

Ab jetzt kann hcitool ohne sudo aufgerufen werden.
Wenn der Schritt ausgelassen wird, dann bei den nächsten Befehlen immer sudo voranstellen.,

Kompatibilität prüfen:
   sudo hciconfig hci0 inqtpl
   
   Die letzte Meldung muss ein: Inquiry transmit power level: ...
   Kommt diese nicht, unterstützt es der Stick nicht!
        Habe einen älteren anderen v4.0 Stick mit anderem Chipsatz, da ging es nicht.
        Mit obigen CSL Stick läuft es aber bei mir.
   
Zum setzten der TX Power:
   sudo bccmd psset -s 0x0000 0x0017 <POWER>
   sudo bccmd coldreset

   <POWER> ist der dBm Wert (kann auch negativ sein)!
   Standard ist 4 bei dem CSL Stick was ungefähr 10m (Klasse 2 entspricht)
   Ein Guter Wert für ca. 4m ist -8 dBm

   Tests haben ergeben dass dieser Wert Fix gespeichert wird!
   War auch nach einem Linux Reboot bzw. Stromlos Schalten noch auf den gesetzten Wert (-8)

        Mit dem Wert muss natürlich experimentiert werden, da die Reichweite ja auch von der Umgebung abhängt (Wände, Aufstellort usw.)
   
Abfragen des Wertes:
   sudo hciconfig hci0 inqtpl

Verwende einfach das normale Presence Modul in FHEM mit den BT MAC Adressen und es läuft super & stabil!

Source ist das RPI Forum, danke an den Poster: https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=155960#p1028789

pOpY


slor

Ich wärm den hier noch mal auf...
Hat sich in der Entwicklung des Moduls mit RSSI noch etwas getan? Im offizellen Presenced ist es ja leider nicht enthalten.
Könnte mir jemand bitte eine kompilierte precenced.deb anhängen? Ich habe die hier angehängte Datei leider nicht zum Laufen bekommen :-(

Danke,
Sebastian
Fhem auf Raspberry Pi 4
CCU3 mit RaspberryMatic mit HMCCU an FHEM
HMCCU, Telegram, Conbee2 und Hue/Tradfri/Osram Lampen AQARA Sensoren, HomeConnect

AmunRe

Zitat von: slor am 23 September 2018, 20:54:03
Ich wärm den hier noch mal auf...
Hat sich in der Entwicklung des Moduls mit RSSI noch etwas getan? Im offizellen Presenced ist es ja leider nicht enthalten.
Könnte mir jemand bitte eine kompilierte precenced.deb anhängen? Ich habe die hier angehängte Datei leider nicht zum Laufen bekommen :-(

Danke,
Sebastian


ich weiß nicht was Du nutzt, aber bei mir sind im normalen Modul die Werte enthalten.
Okay, der Tag ist grad nicht da, aber normal steht da eine Stärke.

4 x Echo Dot, HMLAN Gateway, und diverse HM Komponenten, Philips Hue + OSRAM Plugs

slor

Ich nutze den precenced (ohne le) mit Handys.
Laut einem Post von Phiolin sollte das mit einer weiter unten angehängten Variante gehen.
Ich nutze die neuste Version aus dem contrib. 1.5
Fhem auf Raspberry Pi 4
CCU3 mit RaspberryMatic mit HMCCU an FHEM
HMCCU, Telegram, Conbee2 und Hue/Tradfri/Osram Lampen AQARA Sensoren, HomeConnect