Presence

Begonnen von Mike Wiebe, 04 September 2017, 12:43:10

Vorheriges Thema - Nächstes Thema

Mike Wiebe

Hallo Leute,
es gibt ja einige Möglichkeiten die Präsenz von Handys öder ähnlichem im eigenen Netz abzufragen.
Alle benutzen aber irgendwelche Hardware (Fritzbox, etc.). Ein Fhem Modul, dass einen Arp-ping, unabhängig
vom benutzten Betriebssystem, auf einen bestimmten IP-Bereich absetzt gibt es aber anscheinend nicht.
Das wäre mal was!
Ich versuche das auf meinem (Windows) Fhemserver gerade per Batch:
Arp-Ping auf den Dhcp-Bereich meinens Routers --> Ergebnis in Textdatei --> nach bekannten Mac-Adressen
suchen und --> per telnet den entsprechenden Dummy setzen.
Das ist natürlich gebastelt und ein Fhem-Modul das regelmäßig, wenn Zeit ist, das selbe tut wäre viel eleganter.
Leider kann ich kein Perl und kann mir auch nicht die Zeit nehmen es zu lernen.
Vielleicht hat da draußen ja ein Perlkundiger Langeweile und nimmt sich des Problems mal an.
Ich würde mich auf alle Fälle sehr freuen, da im im Moment schier daran verzweifele mit plink einen Telnetbefehl an Fhem abzusetzen.

Liebe Grüße

Mike

CoolTux

So weit mir bekannt gibt es ein nmap Modul. Ich glaube mich erinnern zu können das dieses Modul genau für sowas gedacht ist.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

justme1968

das nmap modul ist eher dazu gedacht neue rechner im netz zu erkennen. es ist nicht dafür gedacht zeitnah eine presence erkennen zu machen.

was willst du denn genau erreichen? einzelne bekennte ziele zeitnah erkennen? nimm pro gerät ein presence device und nimm dir presence variante bei der du eigenen code angeben kannst. hier kannst du auch dein arp-ping aufrufen.

ein anderer weg könnte auch sein das presence colectord protokoll zu implementieren. damit könntest du direkt mehrere presence devices von außen aktualisieren.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Mike Wiebe

Von den Devices die ich erkennen will, kenne ich nur die Mac-Adresse da sie alle über Dhcp mit einer IP versorgt werden. Es muß also so etwas wie ein Scan über einen bestimmten IP-Bereich stattfinden. So mache ich es grad per Batch auf meinen Windows Server. Den Dhcp Bereich meines Routers Arp-Pingen. Das Ergebnis des Scans in eine Datei schreiben. Die Datei nach bekannten Mac-Adressen durchsuchen und bei Treffern per Telnet einen Dummy in Fhen setzen. Das mit dem per Telnet setzen klappt aber leider nicht. (Habs mit plink versucht.) Meine Batch braucht für 100 IP Adressen ca 10-15 Minuten. Solche Erkenn- bzw. Reaktionszeiten wären durchaus ok.

Grüße Mike

borsti67

ich mache das gerade testweise mit "arp-scan". Das ist äußerst schnell und verbrät augenscheinlich nicht viel Last dabei, so dass ich das minütlich laufen lassen kann. Leider lässt die Zuverlässigkeit arg zu wünschen übrig (ich habe noch einen extra-Counter, der erst nach 5 vergeblichen Scans auf "abwesend" schaltet). Bei 2 Geräten habe ich spätestens alle 2-3 Tage eine angebliche Abwesenheit, ist nur eine Person zu Hause mehrmals täglich.  :-[
Daher suche ich auch immer noch nach einer besseren Methode...
Code kann ich bei Bedarf gern posten.
cu/2
Borsti
---
FHEM 5.8 auf Synology DS211j (bis 11/17) | FHEM 6.0 auf Raspi Zero W (bis 11/20) | FHEM 6.2 als VM in Synology DS1815+ (ab 11/20)

Mike Wiebe

Hallo Borsti,
das ist, denke ich, aber ein generelles Problem. Die meisten Handys schalten das W-Lan auf Standby um Strom zu sparen. Beim Scannen muss man "Glück haben" das eine App mal wieder Daten an ihren großen Bruder übermittelt. Eigentlich erschreckend wie oft es funktioniert!  ;)
An deinem Code bin ich auf alle Fälle interessiert. Bei mir ist das alles nicht zeitkritisch. Ich will damit Heizungen runterregeln und vergessenes Licht ausschalten. Besser es geht 30 min. später noch aus als nie. :) Gern stehe ich für dich auch als zusätzlicher Betatester zur Verfügung.

Gruß
Mike

Hollo

Zitat von: Bastelfredi am 04 September 2017, 21:11:58
Von den Devices die ich erkennen will, kenne ich nur die Mac-Adresse da sie alle über Dhcp mit einer IP versorgt werden...
Die Datei nach bekannten Mac-Adressen durchsuchen und bei Treffern per Telnet einen Dummy in Fhen setzen...
Dann setz die Lease-Time herunter und werte die Leases aus, dann hast Du ein bekanntes Zeitraster und die Devices.
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

igami

Wenn die Zeit nicht so relevant ist, dann kannst du ruhig das Nmap Modul verwenden.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Mike Wiebe

Hallo Hollo,
gerade als dein Post kam war ich au der DHCP Tabelle meines Routers. Da steht sogar online/offline drin.
Hab aber keine Ahnung wie ich an die Daten komme. Aber der Ansatz ist gut. Da ich kein Perl, aber gut Batchen kann,
werde ich 2 Scripts schreiben. 1 läuft in Kreis, macht arp-pings auf meinen Dhcp Bereich und schreibts in ein Textfile.
Ein zweites dass das File nach einer Mac-Adresse durchsucht und einen entsprechenden Returncode zurückgibt.
Damit kann ich dann hoffentlich in Fhem meine Presence Variablen im shellscript Mode füllen.

LG
Mike

PS. An eleganteren Lösungen bin ich natürlich weiterhin interessiert.

borsti67

Hallo Bastelfredi,

so hab ich das in meiner Utils:
sub
AtHomeCheck($)
{
# arp-scan braucht root-Rechte, daher SUID gesetzt...!
#
# Parameter: Anzahl Versuche, bis der ROOMMATE abwesend gesetzt wird
# (das User-Attribut "retryCount" wird benutzt, um Fehlversuche zu speichern)
# bei jedem ROOMMATE-Device wird das User-Attribut "MAClist" benötigt
# beinhaltet durch Leerstellen getrennte MAC-Adressen, die überwacht werden

  my($maxretries) = @_;

  my @roommates = devspec2array("TYPE=ROOMMATE");
  my $scanresult = lc(join(" ",qx(arp-scan -glq -r 5)));
  foreach(@roommates)
  {
    my $mate = $_;
    my $isonline = -1;
    my @macs = split(' ', AttrVal($mate, "MAClist", ""));
    foreach(@macs)
    {
      $isonline = index($scanresult, trim(lc));
      last if ($isonline != -1)
    }
    Log 4,"$mate aktuell: " . Value($mate) . " Neu: " . $isonline . " Vergleich ergibt " . index("abwesend|absent|verreist|gone", Value($mate));
    if ($isonline != -1)
    {
fhem("attr $mate retryCount 0");
fhem("set $mate home") if (index("abwesend|absent|verreist|gone|???", Value($mate)) != -1);
    }
else
{
  my $retrycount = AttrNum($mate, "retryCount", 0);
  if ($retrycount > $maxretries)
  {
fhem("set $mate absent") if (index("abwesend|absent|verreist|gone|???", Value($mate)) == -1)
  }
  else
  {
fhem("attr $mate retryCount " . ($retrycount + 1))
  }
    }
  }
  undef;
}


Die ruft man dann dann per AT regelmäßig auf (im Beispiel minütlich, wobei erst nach 5 vergeblichen Kontakt-Versuchen derjenige auf "abwesend" gestellt wird):
define at_Anwesenheit at +*00:01:00 { AtHomeCheck(5) }

Bei Deinen Roommates muss zum einen der Fehlversuchs-Zähler als UserAttr "retryCount" definiert sein (das kann man vermutlich eleganter lösen, wird schließlich nur rein intern benötigt), zum anderen müssen die das UserAttr "MAClist" haben, da stehen mit Leerstelle getrennt 1-n MAC-Adressen drin, die zu diesem Bewohner gehören. Meist ist das wohl nur eine (Smartphone), aber ich habe z.B. zusätzlich noch meinen eBook-Reader mit drin. Es genügt natürlich, wenn eine einzige Antwort kommt, um "Anwesend" zu schalten.

Für Verbesserungsvorschläge bin ich immer zu haben!  ;)
cu/2
Borsti
---
FHEM 5.8 auf Synology DS211j (bis 11/17) | FHEM 6.0 auf Raspi Zero W (bis 11/20) | FHEM 6.2 als VM in Synology DS1815+ (ab 11/20)

Mike Wiebe

Wenn ich es richtig verstanden habe, müsste ein Device dann so aussehen:


define MeinHandy ROOMMATE
attr MeinHandy userattr retryCount
attr MeinHandy MAClist ff ff ff ff ff ff
attr MeinHandy alias Status MeinHandy
attr MeinHandy devStateIcon .*home:user_available:absent .*absent:user_away:home .*gone:user_ext_away:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown:home
attr MeinHandy group MeinHandy
attr MeinHandy icon people_sensor
attr MeinHandy retryCount 0
attr MeinHandy room TEST
attr MeinHandy rr_realname group
attr MeinHandy sortby 1
attr MeinHandy webCmd state


Bleibt nur noch das Problem, dass mein Fhem auf einem Windows-Server läuft.
Arp-ping gibts da nur als Thirdparty Tool für die Komandozeile.
Mein Arp-ping kann auch keine Mac-Adresse pingen.
Ich pinge die IP und bekomme die Mac zurück.

Sieht aus, als müsste ich mal das Betriebssystem wechseln.
Wiederstrebt mir ja, weil ich da alles neu lernen muß.
Mein Windows hab ich als MSCA halt im Griff.

Danke für deine Hilfe. Hat mich in meinem Verständnis ein gutes Stück weiter gebracht.
Allein schon die bislang unbekannte ROOMMATE Definition bring einen Fhem Rookie wie mich schon weiter.
Wenn meine Windowslösung läuft. werd ich sie hier mal posten

Schönen Tag

Mike

borsti67

Hallo Mike,

das Device sollte so passen, ja.
Hinsichtlich des passenden ARP-Tools kann ich leider spontan nicht helfen - kann man evtl. mit www.nmap.org was werden?
cu/2
Borsti
---
FHEM 5.8 auf Synology DS211j (bis 11/17) | FHEM 6.0 auf Raspi Zero W (bis 11/20) | FHEM 6.2 als VM in Synology DS1815+ (ab 11/20)

igami

Schon Mal vorab: bei Windows und dem NMap Modul gibt es noch ungelöste Probleme. Ich weiß aber nicht mehr genau was für welche.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Mike Wiebe

So! Nachdem ich nun viel rumprobiert habe, ist meine Lösung für meinen Windows-Fhem-Server grundsätzlich fertig. Ich konnte viele der Anregungen hier verarbeiten. Mit Nmap für Windows kann ich z. B. das Netzwerk viel schneller scannen als mit Arp-scan. So scanne ich bei jedem Durchgang 5x in eine Datei. Einen "Treffer hab ich meistens  ;-) Die Datei durchsuche ich nach den Mac-Adressen und setze per Powershell einen HTTP-Request auf den Fhemserver ab um meine Telefondummys zu setzen. Telnet wäre mir lieber gewesen, aber mit plink hab ichs nicht hinbekommen aus der Komandozeile was zu schicken. Das Script belastet Netzwerk und Server so wenig, das ich es theoretisch im Kreis laufen lassen kann. Bei mir läuft es alle 5 Minuten. Im Moment ist es so, das einige der Handys im Haus im Standby derart Offline gehen, dass ich sie nicht mehr erwische. Hierfür werde ich noch versuchen Borsti67s retryCount in meine Roommates zu implementieren.

Vielen Dank an alle für die guten Tips.

Mike