Presence und iPhone / Android

Begonnen von JoWiemann, 07 September 2017, 11:58:59

Vorheriges Thema - Nächstes Thema

HausHH

Guten Abend allerseits,

auch von mir einen herzlichen Dank für die vielen Ansätze, dieses Dilemma zu lösen.

@en-trust: ich verstehe Dein DOIF nicht. HA.SvenWlan ist doch der Lanping. Der wird doch nicht besser, wenn man ihn per statusRequest noch einmal aufruft. Anschließend überschreibt er auch noch den Status des Presence-Device, der mit Hping3 ermittelt wurde  ???
Zitat
define Galaxy.A5.Compare DOIF ([HA.SvenWlan] ne [Galaxy.A5.Wlan]) (set HA.SvenWlan statusRequest) (setreading Galaxy.A5.Wlan state [HA.SvenWlan:state])
attr Galaxy.A5.Compare group Anwesenheit,Status
attr Galaxy.A5.Compare room 3.2_Anwesenheit,Status
Meiner Meinung nach müsste es umgekehrt sein und ich habe es bei mir auch so implementiert und es funktioniert bisher gut.
Ich empfehle außerdem ein "do always" und ein Wiederholintervall, bei mir "Repeatcmd 120". Hier mein DOIF:


define DI_SGS7_Refresh DOIF ([SGS7_Ping] eq "absent")\
(set SGS7 statusRequest)\
DOELSE\
(setreading SGS7 state present)
attr DI_SGS7_Refresh do always
attr DI_SGS7_Refresh repeatcmd 120
attr DI_SGS7_Refresh room Anwesenheit

Bei mir wird also der StatusRequest des Hping3-Device ausgeführt, wenn der Lanping "absent" liefert.
Wenn der Lanping hingegen "present" liefert, kann ich damit den Status des Hping3-Device überschreiben.



Ich habe aber ein anderes Problem mit diesem Ansatz: durch den StatusRequest wird im Log immer "StatusRequest" geloggt, auch wenn der Status die ganze Zeit "Present" ist. Das an sich wäre nicht so schlimm. Allerdings fasse ich mehrere Handys per Structure zusammen und lasse mir über eine Readingsgroup den letzten Statuswechsel auf einem Dashboard anzeigen. Als ich noch Lanping exklusiv genutzt habe, hat das wunderbar geklappt, d.h. der letzte Statuswechsel war dann teilweise stundenlang her und ich konnte auch einen Blick sehen, wann ich das Haus verlassen habe.
Jetzt, wo der Status meistens per Hping3 ermittelt wird, ist er durch das Intervall von 120 Sekunden eigentlich immer aktuell, obwohl kein erkennbarer Statuswechsel stattgefunden hat. So sieht das aus:
2018-02-13_18:54:39 SGS7 statusRequest
2018-02-13_18:56:39 SGS7 statusRequest
2018-02-13_18:58:39 SGS7 statusRequest
2018-02-13_18:59:07 SGS7 absent
2018-02-13_19:00:39 SGS7 statusRequest
2018-02-13_19:02:39 SGS7 statusRequest
2018-02-13_19:04:39 SGS7 statusRequest
2018-02-13_19:04:51 SGS7 present


Hat jemand eine Idee, wie ich die StatusRequest-Events ignorieren kann? Es geht weniger um die Einträge im Log als vielmehr um die Anzeige des Timestamps in den Readings der STRUCTURE.
Ich habe schon ein paar Stunden gesucht, aber nichts sachdienliches gefunden. Oder woran kann es sonst liegen, dass die Readings der STRUCTURE bei jedem StatusRequest aktualisiert werden?
Eine vergleichsweise erstellte STRUCTURE über PRESENCE-Devices des FRITZBOX-Ansatzes zeigt dieses Verhalten ebenfalls nicht. Ich habe allerdings den Eindruck, dass die Fritzbox-Methode etwas träger ist bzw. dass es nach dem Verlassen des WLANs etwas länger dauert, bis die Mac-Adresse nicht mehr gefunden wird. Daher würde ich die Hping3-Methode nicht so schnell aufgeben wollen.

Ich danke für jeden Hinweis.



HausHH

Zitat von: HausHH am 13 Februar 2018, 20:30:50

Es geht weniger um die Einträge im Log

Das konnte ich scheinbar mit dem Attribut ignoreRegexp lösen. Hat aber natürlich leider keine Auswirkung auf die Readings, d.h. da wäre ich weiter dankbar über Tipps.

frank

#137
kommt der statusrequest vom structure?
dann reicht doch event-on-change.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

HausHH

Vielen Dank für den Tipp, manchmal liegt die Lösung so nah, .... hier aber leider nicht  ;)

Der Statusrequest kommt vom DOiF, der in Post #136 steht.

Die STRUCTURE sieht so aus:
Internals:
   ATTR       Anwesend_Chk
   CHANGED   
   CHANGEDCNT 97
   DEF        Anwesend_Chk MotoG5 SGS7
   NAME       ST_Anwesenheit_Chk
   NR         250
   NTFY_ORDER 50-ST_Anwesenheit_Chk
   STATE      present
   TYPE       structure
   Helper:
     DBLOG:
       state:
         logdb:
           TIME       1518718528.67816
           VALUE      present
   READINGS:
     2018-02-15 19:42:25   LastDevice      SGS7
     2018-02-15 19:42:25   LastDevice_Abs  SGS7
     2018-02-15 19:42:25   state           present
Attributes:
   alias      Anwesend_Chk
   clientstate_behavior relativeKnown
   clientstate_priority present absent
   devStateIcon present:HOME_Status.1 undefined:HOME_Status.1 absent:HOME_Status.3
   event-on-change-reading state
   group      PRESENCE
   room       Anwesenheit


Und eins der beiden Smartphones:
Internals:
   CHANGED   
   DEF        function {CheckPhone("192.168.x.x","2c:0e:3d:xx:xx:xx")} 3600 3600
   INTERVAL_NORMAL 3600
   INTERVAL_PRESENT 3600
   MODE       function
   NAME       SGS7
   NOTIFYDEV  global
   NR         248
   NTFY_ORDER 50-SGS7
   STATE      present
   TYPE       PRESENCE
   Helper:
     DBLOG:
       state:
         logdb:
           TIME       1518720265.988
           VALUE      statusRequest
   READINGS:
     2018-02-15 12:55:20   model           function
     2018-02-15 19:44:27   presence        present
     2018-02-15 19:44:27   state           present
   helper:
     CURRENT_STATE present
     call       {CheckPhone("192.168.x.x","2c:0e:3d:xx:xx:xx")}
Attributes:
   Anwesend_Chk ST_Anwesenheit_Chk
   event-on-change-reading state
   icon       it_smartphone
   room       Anwesenheit
   userattr   Anwesend_Chk Anwesend_Chk_map structexclude


Als ich noch kein ignoreRegexp in der Definition des Logfiles für das Smartphone hatte, wurde ja immer "statusRequest" geloggt. Aber anschließend wurde nicht  "present" geloggt, obwohl im state die ganze Zeit "present" stand. Das habe ich nicht so richtig verstanden, wäre mir aber auch egal, wenn es denn so funktionieren würde, wie es gedacht ist.

HausHH

Ich habe jetzt noch mal die DOIFs deaktiviert, um absolute Gewissheit zu erhalten.
Und siehe da: der Timestamp in der STRUCTURE wird nicht mehr aktualisiert, auch wenn die PRESENCE-Devices entsprechend aktualisiert werden (INTERVAL-Werte jeweils 3600).

TJa, was tun? Die DOIFs und die Lanpings entfernen und die PRESENCE-Devices trotz der Darstellung in diesem Thread auf 30-Sekunden-Intervall setzen und vielleicht werden die Akkus schnell leer gesogen?
Oder doch die PRESENCE-Erkennung der Fritzbox nehmen und versuchen, die Trägheit der Erkennung (weg) zu optimieren, z.B. durch geringere Polling-Intervalle?

Ich weiß es nicht. Ich werde noch mal etwas testen. Mal schauen, welche Erkenntnisse noch auf mich warten ....

Master_Nick

#140
Also ich nutze eine Structure die NUR auf present oder absent reagiert (es kommt noch bald hinzu - possible absent und possible present).

In dieser Structure sind alle Handys als:

function {CheckPresence("HANDY1", "XX:XX:XX:XX:XX:XX")} 300 300

Im Hintergrund liegt das Script aus EDIT 4 von mir: https://forum.fhem.de/index.php/topic,76342.msg754319.html#msg754319


Damit hab ich alles abgedeckt was ich benötige und kann mit dem übergeordneten Ding arbeiten in jeglichen Schaltungen. Aktuell reagiere ich auf absent und present demnächst gilt dann (present or possible present or possible absent) und nur absent ist dann wirklich abwesend. Jedes einzelne Handy hat ein Threshold von 2 bei der Überwachung.

Damit fahre ich zu 100% ohne Fehlerkennung. Man könnte nun natürlich noch einen Watchdog auf das Übergeordnete Element (bei mir Anwesenheit) setzen und sagen wenn 5  Minuten absent dann setze was anderes auf Off. Dann hat man es 4 Stufig abgefangen ;-D
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Master_Nick

#141
Huhu,
hatte heute nochmal was geändert bei mir.
Vielen Dank nochmal an alle beteiligten - das script ist ja nur eine Version der hier schon vorhandenen ;-)
Funktioniert bei mir immer noch ohne jede Fehlerkennung.

EDIT 5 meiner Version des Scriptes:

- Max Retries im Default auf 8 gesetzt (nach update auf performantere Hardware ergab 10 immer ein timeout anstatt ein away - hatte mit der Verwendung von Structure kein Probleme ergeben aber Optik...)
- Kommentare angepasst

Vorraussetzungen des Scripts: arp-scan und hping3 sind installiert, ausführender user muss sudo nutzen dürfen

Aufruf des Scripts: sudo scriptname.sh IP/DNS-Name MAC-Adresse
Aufruf in FHEM machbar über das Modul presence: define NameDesPresenceDevices presence function {CheckPresence("IP/DNS-NAME", "XX:XX:XX:XX:XX:XX")} 300 300 (hier alle 5 Minuten bei present und absent).



Erklärung des Scripts:
Es wird erst über mit 8 Versuchen geschaut, ob das Gerät mittels arp-scan gefunden werden kann (Vorteil von arp-scan ist, dass es nicht den System cache nutzt sondern pro instanz schaut was so los ist im Netzwerk).
Wird etwas gefunden gibt es "1" zurück, bei nicht erfolgreicher Suche wird die nächste Stufe aufgerufen. Nun wird mittels hping3 versucht das Handy aufzuwecken und erneut mittels arp-scan geschaut, ob es aufzufinden ist, dieser Versuch wird auch 8 Mal unternommen. Wird etwas gefunden gibt es "1" zurück, wenn nicht wird 0 zurück gegeben.

Ich verwende das Script in einer Kombination mit Structure, hier sind die Presence Devices alle als "Bewohner" gekennzeichnet und ein Structure Device "Anwesenheit" übernimmt sobald einer von den Presence Devices als "present" markiert wird diesen Status ebenfalls. Sind alle "absent" übernimmt es diesen Status. Meine Presence Devices habe ich noch auf absenceThreshold 2 gesetzt. Ich habe nun noch "maybe present und maybe absent" ebenfalls als present interpretieren lassen und schalte dafür noch einen Dummy über den Structure Device Anwesenheit, dieser nimmt dann die Statuus "present", "maybe present" und "maybe absent" als present und nur "absent" als absent an.

Script für die Anwesenheitserkennung mittels WLAN (presence.sh):
#!/bin/bash
# detect Iphone/Android by IP/HOSTNAME and MAC address.
# use MAC address too, to prevent false positives if IP might change
# returns 1 or 0

# number of retries, less is faster, but less accurate
PREMAXRETRIES=8
MAXRETRIES=8

# exit immediately if no parameters supplied
if [ $# -lt 2 ]
  then
    echo "UNDEF"
  exit 1
fi

# Set variables
IP=`echo $1 | grep -oP '([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}'`
HOST=`host -4 $1 | grep -oP '([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}'`
MAC=$2
COUNT=0
PRECOUNT=0

if [ -z "$IP" ]; then
IP=${HOST}
if [ -z "$IP" ]; then
echo "0"
exit 0
fi
fi

while [ ${PRECOUNT} -lt ${PREMAXRETRIES} ];
do
PRECHECK=`sudo arp-scan -q -g ${IP} | grep -o "${MAC}"`
if [ ${#PRECHECK} -eq ${#MAC} ]; then
   # exit when phone is detected
   echo "1"
   exit 0
   fi
   ((PRECOUNT++))
done


while [ ${COUNT} -lt ${MAXRETRIES} ];
do
  # Change dev and eth0 if needed
  #   sudo ip neigh flush dev eth0 ${IP}
  sudo hping3 -q -2 -c 10 -p 5353 -i u1 ${IP} >/dev/null 2>&1
  #sudo hping3 -q -2 -c 10 -p 5353 -i u1 ${IP}
  sleep .1
  # Only arp specific device, grep for a mac-address
  STATUS=`sudo arp-scan -q -g ${IP} | grep -o "${MAC}"`

  if [ ${#STATUS} -eq ${#MAC} ]; then
     # exit when phone is detected
     echo "1"
    exit 0
  fi
  ((COUNT++))
  sleep .1
done
# consider away if reached max retries
echo "0"



Und hier noch die 99_myUtils.pm für presence

package main;
use strict;
use warnings;

sub CheckPresence($$)
{
  my ($ip,$mac)= @_;
  my $ret = "";

  $mac = lc($mac);

  $ret = qx( /opt/fhem/FHEM/presence.sh $ip $mac);

  $ret =~ s,[\r\n]*,,g;        # remove CR from return-string

  if ( $ret != 0 && $ret != 1) {
    Log3 "CheckPresence", 2, "CheckPresence: $ret";
    return 0;
  }

  return $ret;

}

1;
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Master_Nick

#142
 :) Mittels der Hilfe von CoolTux habe ich es heute geschafft, dass meine Structure für die Anwesenheit auch maybe present und maybe absent als present interpretiert und man somit dadurch schon mal eine Stufe mehr hat. Denn aus einem maybe absent oder maybe present kann jederzeit wieder ein present werden.

Bei uns ist die Situation so, dass bei der Waschmaschine kein WLAN ist (bisher).

Der Trick für die presence Devices war es das maybe absent auf maybe_absent zu mappen, da Leerzeichen nicht gut sind für eine Structure ;-)

bewohner_map presence:^maybe.absent:maybe_absent presence:^maybe.present:maybe_present presence:present:present presence:absent:absent

clientstate_priority present|maybe_present|maybe_absent absent

Ansonsten kann ich weiter berichten, die Anwesenheitserkennung über diese Lösung funktioniert immer noch Fehlerfrei.
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

HausHH

Zitat von: Master_Nick am 10 März 2018, 19:25:58
Ansonsten kann ich weiter berichten, die Anwesenheitserkennung über diese Lösung funktioniert immer noch Fehlerfrei.

Das kann ich mittlerweile auch bestätigen. Wobei das Handy meiner Frau (Moto G5S) mit der Fritzbox-Variante gut zurecht kommt, während mein Galaxy S7 mit der Hping3-Variante besser zurecht kommt. Der Akku wird auch nicht merklich strapaziert.
Das mehrstufige Verfahren mit Hping3 für den Fall, dass der klassische Lan-Ping versagt, habe ich daher nicht gebraucht.

Gut, wenn man die Auswahl hat  :)
Wenn es mal schlechter wird, würde ich Deine letzten Änderungen nachvollziehen, daher hier schon mal danke für's Posten!

Master_Nick

Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Ajuba

Das klingt alles sehr viel versprechend, ich scheitere aber mit meinen knappen Linux Kenntnissen schon am Script und muss um Hilfe bitten:
pi@raspberrypi:/opt/fhem/FHEM$ sudo presence.sh XXX.XXX.X.XX xx:xx:xx:xx:xx:xx
sudo: presence.sh: command not found

Meine IP Adresse habe ich geXXXt. Die MAC Adresse (Kleinbuchstaben) ebenso.

Was habe ich bisher gemacht
sudo apt-get install arp-scan
sudo apt-get install hping3


in /opt/fhem/FHEM mit nano presence.sh erstellt und das script von post 141 hinein kopiert
sudo nano presence.sh
#!/bin/bash
# detect Iphone/Android by IP/HOSTNAME and MAC address.
# use MAC address too, to prevent false positives if IP might change
# returns 1 or 0

# number of retries, less is faster, but less accurate
PREMAXRETRIES=6
MAXRETRIES=6

# exit immediately if no parameters supplied
if [ $# -lt 2 ]
  then
    echo "UNDEF"
  exit 1
fi

# Set variables
IP=`echo $1 | grep -oP '([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}'`
HOST=`host -4 $1 | grep -oP '([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}'`
MAC=$2
COUNT=0
PRECOUNT=0

if [ -z "$IP" ]; then
IP=${HOST}
if [ -z "$IP" ]; then
echo "0"
exit 0
fi
fi

while [ ${PRECOUNT} -lt ${PREMAXRETRIES} ];
do
PRECHECK=`sudo arp-scan -q -g ${IP} | grep -o "${MAC}"`
if [ ${#PRECHECK} -eq ${#MAC} ]; then
   # exit when phone is detected
   echo "1"
   exit 0
   fi
   ((PRECOUNT++))
done


while [ ${COUNT} -lt ${MAXRETRIES} ];
do
  # Change dev and eth0 if needed
  #   sudo ip neigh flush dev eth0 ${IP}
  sudo hping3 -q -2 -c 10 -p 5353 -i u1 ${IP} >/dev/null 2>&1
  #sudo hping3 -q -2 -c 10 -p 5353 -i u1 ${IP}
  sleep .1
  # Only arp specific device, grep for a mac-address
  STATUS=`sudo arp-scan -q -g ${IP} | grep -o "${MAC}"`

  if [ ${#STATUS} -eq ${#MAC} ]; then
     # exit when phone is detected
     echo "1"
    exit 0
  fi
  ((COUNT++))
  sleep .1
done
# consider away if reached max retries
echo "0"

Dann mit Ctrl X y gespeichert
Den Owner korrigiert
sudo chown fhem:dialout presence.sh
und ausführbar gemacht mit
sudo chmod +x presence.sh
ls -la liefert folgendes
-rwxr-xr-x  1 fhem dialout   1387 Mar 19 19:50 presence.sh
Hier nochmal die Fehlermeldung
pi@raspberrypi:/opt/fhem/FHEM$ sudo presence.sh XXX.XXX.X.XX xx:xx:xx:xx:xx:xx
sudo: presence.sh: command not found

Wahrscheinlich ein primitiver Anfängerfehler. Wer hat einen Tip?
FHEM auf RPi3, Homematic CCU3 mit Cuxd und CUL 868 für FS20, Siemens S7 über CP343-1,
DbLog zu MySQL auf NAS QNAP TS-253D,
Yeelight

MadMax-FHEM

Wenn das Script nicht im Pfad/PATH liegt, dann musst du es (Linux Console) so starten:

./presence.sh xxxxx

Oder mit dem kompletten Pfad:

/opt/fhem/FHEM/presence.sh xxxx

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Ajuba

Danke, erste Hürde genommen. Das funktioniert.

und was mache ich beim Fhem Aufruf falsch?
defmod Ajuba PRESENCE function {CheckPresence("XXX.XXX.X.XX", "xx:xx:xx:xx:xx:xx")} 300 300

setstate Ajuba error
setstate Ajuba 2018-03-19 22:33:16 model function
setstate Ajuba 2018-03-19 22:33:16 state error

FHEM auf RPi3, Homematic CCU3 mit Cuxd und CUL 868 für FS20, Siemens S7 über CP343-1,
DbLog zu MySQL auf NAS QNAP TS-253D,
Yeelight

HausHH

Zitat von: Ajuba am 19 März 2018, 22:34:57
Danke, erste Hürde genommen. Das funktioniert.

und was mache ich beim Fhem Aufruf falsch?
defmod Ajuba PRESENCE function {CheckPresence("XXX.XXX.X.XX", "xx:xx:xx:xx:xx:xx")} 300 300

setstate Ajuba error
setstate Ajuba 2018-03-19 22:33:16 model function
setstate Ajuba 2018-03-19 22:33:16 state error

99_myUtils.pm vergessen?
Stand zumindest nicht im Text.


Master_Nick

#149
Jep denke auch da fehlt noch die Utils!

Aber generell muss man dich loben für die perfekte Auflistung deiner Taten. So war es super zu analysieren was noch fehlte :-)
Gute Arbeit! 8)

*Edit* Ein Stück weit mein Fehler :-) hätte sie nochmal wiederholen sollen - habe ich oben korrigiert (hier isse auch noch mal).

Meine 99_myUtils.pm für presence

package main;
use strict;
use warnings;

sub CheckPresence($$)
{
  my ($ip,$mac)= @_;
  my $ret = "";

  $mac = lc($mac);

  $ret = qx( /opt/fhem/FHEM/presence.sh $ip $mac);

  $ret =~ s,[\r\n]*,,g;        # remove CR from return-string

  if ( $ret != 0 && $ret != 1) {
    Log3 "CheckPresence", 2, "CheckPresence: $ret";
    return 0;
  }

  return $ret;

}

1;
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)