Presence und iPhone / Android

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

Vorheriges Thema - Nächstes Thema

czcbe

Jaa, mit Powershell wäre ich sowas von begeistert, ich habe hier manchmal eeeextrem Mühe mit dem Code, einmal Doppelpunkt, aber nur wenn x,y, aber nur im Modul A (alt), A (neu) kann das noch nicht, dann wieder Komma wenn es in Klammern steht, aber geschweifte Klammern sind dann wieder nur bei IFs erlaubt und mehrere Abfragen sind mit ";;" zu trennen etc. Äh...das ist ein anderes Thema.

Theoretisch könnte ja von Perl aus wirklich jedes beliebige Code-Teil aufgerufen werden, sofern das Grundbetriebssystem das unterstützt?
Inzwischen habe ich jedenfalls rausgefunden, dass es ein grundsätzliches Problem im 99_myUtils.pm gibt. Die Funktion bekommt nämlich gar kein Resultat zurück. Ich dachte zuerst es liegt evtl. am CR/LF in der Ausgabe.

Hier mal mein Code 99_myUtils.pm:
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.



package main;
use strict;
use warnings;

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


  $mac = lc($mac);

  $ret = qx( /cygdrive/d/Downloads/2CheckItOut/fhem_portable/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;
   #return 0;
}

1;




Hier die 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=`arp -a | 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}
  ping  ${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=`arp -a | 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"


Host habe ich rauskommentiert, da Windows diesen command nicht kennt und ich ja mit IPs arbeite. Und wie gesagt, direkter Aufruf von der presence.sh gibt korrekte Ausgabe 0 oder 1.
FHEM 5.9 mit TabletUI | Pagebuttonmenü | Win2012R2 | Lubuntu 18.04 | Load-Balancing/Failover 2xFHEM | cygwin | nanoCUL 433 | Harmony Hub | IT Funksteckdosen | Squeezebox-Server (LMS) | Kodi | Sprachsteuerung | Webcams | Wetteransage | Telegram Bot | Presence-Script | Winconnect-Powershell

chq

#196
Wie kann man denn ein Script von einem Mac aus in opt/fhem/FHEM speichern? User: pi, Passwort: raspberry

Per Cyberduck scheint es nicht zu gehen, also muss wohl das Terminal ran, oder?

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

Wernieman

1. Ändere das Passwort!
2. Ob der User pi in den Ordner von FHEM schreiben darf .....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

chq

#198
Habe nun alles soweit ausgeführt (anbei eine Anleitung für mich):

presence.sh und 99_myUtils.pm hab ich aus Beitrag 141 (https://forum.fhem.de/index.php/topic,76342.msg769242.html#msg769242) entnommen.

1. sudo apt-get install arp-scan
2. sudo apt-get install hping3
3. Zu folgendem Verzeichnis navigieren: cd /opt/fhem/FHEM
4. Script erstellen: sudo nano
5. Inhalt von presence.sh reinkopieren
6. ctrl-o
7. Als Dateiname presence.sh angeben
8. ctrl-x
9. in FHEM via Browser (Port 8083):

Edit files -> myUtilsTemplate.pm -> hinter 'Save as den Dateinamen 99_myUtils.pm angeben -> Code von 99_myUtils.pm unten reinkopieren -> Save as anklicken

10. sudo chmod +x /opt/fhem/FHEM/presence.sh
11. sudo /opt/fhem/FHEM/presence.sh 192.168.0.5 00:cd:fe:f0:70:fb (gibt eine 1 zurück)
12. In FHEM via Browser (Port 8083):

define chrisPresent presence function {CheckPresence("192.168.X.XX", "xx:xx:xx:xx:xx:xx")} 60 60

Leider erscheint bei mir unter PRESENCE -> chrisPresent lediglich "error"

Wo kann ich ansetzen?

Gruß Chris

Edit: Im Logfile steht das hier:

2018.05.29 09:19:45 2: PRESENCE (chrisPresent) - error while processing check: unexpected function output (expected 0 or 1): Undefined subroutine &main::CheckPresence called at (eval 32) line 1.
2018.05.29 09:20:45 1: ERROR evaluating {CheckPresence("192.168.XX.XX", "xx:xx:xx:xx:xx:xx")}: Undefined subroutine &main::CheckPresence called at (eval 34) line 1.
So einfach wie möglich, so kompliziert wie nötig

czcbe

Die Funktion "CheckPresence" wird scheinbar nicht erkannt. Bedeutet, dass in der 99_myUtils.pm vermutlich was nicht stimmt beim Aufrufen.

Es sollte am Schluss in der letzten Zeile die 1; stehen.
FHEM 5.9 mit TabletUI | Pagebuttonmenü | Win2012R2 | Lubuntu 18.04 | Load-Balancing/Failover 2xFHEM | cygwin | nanoCUL 433 | Harmony Hub | IT Funksteckdosen | Squeezebox-Server (LMS) | Kodi | Sprachsteuerung | Webcams | Wetteransage | Telegram Bot | Presence-Script | Winconnect-Powershell

chq

#200
Das steht bei mir in der 99_myUtils.pm:

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;


Ich verstehe nicht, warum es bei Master_Nick geht und dann bei mir trotz gleichen "Inhalts" nicht.

Müssen die Buchstaben der MAC-Adresse bei
define chrisPresent presence function {CheckPresence("192.168.X.XX", "xx:xx:xx:xx:xx:xx")} 60 60
groß oder klein geschrieben werden?

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

nils_

Zitat von: chq am 29 Mai 2018, 11:06:42
Das steht bei mir in der 99_myUtils.pm:

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;


Ich verstehe nicht, warum es bei Master_Nick geht und dann bei mir trotz gleichen "Inhalts" nicht.

Gruß Chris

guck mal hier:
https://wiki.fhem.de/wiki/99_myUtils_anlegen
und hier:
https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/myUtilsTemplate.pm

vielleicht fällt dir der unterscheid auf :)
kleiner tipp myUtils_Initialize
viele Wege in FHEM es gibt!

chq

Ok, der vertrottelte Anfänger hat Folgendes mitgenommen:

myUtils_Initialize($$)
{
  my ($hash) = @_;
}


ist fester Bestandteil der 99_myUtils.pm und wurde von Master_Nick nur deshalb nicht angegeben, da jedem fortgeschrittenen Nutzer klar sein sollte, dass seine Darstellung lediglich ein Auszug aus seiner 99_myUtils.pm darstellt und nicht seine komplette.

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

chq

#203
Jetzt läuft's, juhuu- vielen Dank für die Unterstützung!

Hat hier nochmal jmd. an den  Presence Parametern "60 60" gedreht? Hab das Gefühl, dass es mit höheren Einstellungen (z.B. "200 200") zuverlässiger funktioniert.

Gruß Chris

Edit: Naja, meistens geht's. Muss mir glaub noch was basteln, um die fehlerhaften Absents seitens meines iPhone6s rauszufiltern.  :P
So einfach wie möglich, so kompliziert wie nötig

chaot4ever

Hab ein Problem mit presence.sh: Ich krieg immer 12x die Antwort: "ioctl: No such device" und dann eine "0".
Verwende ich aber eine ältere presence.sh (identische Gruppe, Eigentümer und Rechte) mit folgendem Inhalt wird mein iPhoneX korrekt an- und abgemeldet:
#!/bin/bash

declare -a DEVICES
sudo hping3 -2 -c 10 -p 5353 -i u1 $1 -q >/dev/null 2>&1
DEVICES=`arp -an | awk '{print $4}'`
CHECK="$2"
if [[ ${DEVICES[*]} =~ $CHECK ]]
then
echo "1"
else
echo "0"
fi

An was kann das liegen?

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

miche

Hallo,

bei mir lief das ganze jetzt seit Monaten stabil, doch seit kurzem werden die beiden iPhones in der Nacht manchmal nicht mit hping 3 gefunden und dann meint FHEM es ist niemand zu Hause.
Hat jemand eine Idee warum dies so sein könnte? Ansonsten funktioniert dies sehr zuverlässig,  nur Nachts tritt dies auf!

RappaSan

Ich hatte ein ähnliches Problem mit der Erkennung. Erst als ich bei meiner FritzBox den automatischen Kanalwechsel abgestellt hatte, funktionierte die Erkennung wieder zuverlässig.

Master_Nick

Mahlzeit, ich kann von keinerlei dieser Probleme berichten.
Nutze für jedes Gerät einen absenceThreshold von 3 - es muss also 3 Checks abwesend sein, nachdem es mal anwesend war um als absent zu gelten.
Ansonsten fasse ich den Status aller presence einheiten mittels structure zusammen und habe auch da einen dummy device der erst mal x minuten Abwesen sein muss, damit der Hauptdummy auf absent geht.
Bei jeder present erkennung ist aber sofort ganz oben auch present angekommen.

Damit habe ich seit meiner Erstellung/Anpassung des Script keinerlei Fehlerkennungen. Schalte sogar Devices im Haus aus, wenn keiner da ist.
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.... ;-)

Sigi3000

Hallo liebe FHEM Gemeinde!

vielen Dank für die top Anleitung aber dennoch scheint sich bei mir ein Fehler eingeschlichen zu haben den ich nicht beheben kann.

PRESENCE (Sigi_iPhone_WLan) - error while processing check: unexpected function output (expected 0 or 1): Not enough arguments for main::CheckPresence at (eval 3818) line 1, near ""192.168.x.xx", "xx:xx:xx:xx:xx:xx")"


hat jemand einen Reim darauf was mir fehlen könnte?
bekomme für den state eine Error Meldung.

in der sudoers habe ich auch schon unter den user fhem den Pfad der presence.sh hinzugefügt.

Danke und LG
Sigi