PRESENCE Erweiterung um arping

Begonnen von gammelobst, 27 Juni 2016, 00:58:48

Vorheriges Thema - Nächstes Thema

gammelobst

Hallo,

ich bin gerade dabei meine TV-Ecke zu automatisieren. Bei der PS3, PS4 sowie der XBox One ist es kein Problem über einen Watchdog, der die Presence-Änderung checkt, die Quelle am Onkyo-AVR auf die entsprechende Konsole zu schalten.
Allerdings erkennt das PRESENCE-Modul leider meine XBox 360, sowie andere Geräte nicht, die den Echo-Request blocken.
Nach ein wenig Nachforschung kann ich alle meine nicht auf ping reagierenden Kisten mit dem "arping"-command erreichen.
Wenn die Unterstützung von "arping" noch integriert werden könnte wäre ich euch echt dankbar.

cya

marvin78

PRESENCE unterstützt doch schon jetzt die Verwendung von shell-scripts oder eigenen Funktionen. Damit sollte sich doch recht leicht etwas bauen lassen.

dev0

Das war auch meine erste Idee, der Nachteil davon ist aber, dass arping min. 1,5 Sekunden blokieren würde, wenn die Mac nicht erreichbar ist.
Alternativ dazu könnte man mit hilfe eines cron jobs jegelmäßig die dazugehörige IP anpingen, damit die lokale arp table die MAC enthält und die MAC nur in der Ausgabe von arp sucht.

marvin78

Man könnte die eigene Funktion mit Blocking.pm bauen.

justme1968

presence nutzt jetzt schon Blocking.pm. auch für die function variante.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

gammelobst

hmm,

als quick'n'dirty-Lösung hab ich in 73_PRESENCE.pm in Zeile 662 "ping" durch "sudo arping" ersetzt und passwortloses sudo erlaubt.
Ja ich weiss, dass das nicht schön ist,, geht jetzt aber wunderbar...

cya

PS: Wenn ich mehr Perl drauf hab wird das bestimmt besser...

nesges

#6
Damit fahr ich ganz gut:

sub presence_arping($;$) {
    my $device = shift;
    my $count = shift || 3;

    my $ip = undef;
    if($device !~ /^(?:\d{1,3}\.){3}\d{1,3}$/) {
        $ip = InternalVal($device, 'ADDRESS', undef);
    } else {
        $ip = $device;
    }

    if(! $ip) {
        Log 3, "presence_arping($device) - parameter '$device' is neither IP nor PRESENCE (could not read ADDRESS)";
    } else {
        # necessary: chmod +s /usr/sbin/arping
        my $temp = qx(arping -c $count $ip 2>&1);
        chomp $temp;
       
        if($temp ne "") {
            Log 5, "presence_arping($device) - arping $ip command returned with output:\n$temp";
            return ($temp =~ /\d+ [Bb]ytes (from|von)/ and not $temp =~ /[Uu]nreachable/) ? 1 : 0;
        } else {
            Log 3, "presence_arping($device) - could not execute arping $ip command";
        }
    }
    return 0;
}


Parameter 1: IP oder Name eines PRESENCE Objektes mit gesetztem Internal ADDRESS
Parameter 2: (optional) Anzahl arpings (Default: 3)

define MORLH468 PRESENCE function { presence_arping('192.168.178.60') }

Update: Typo im Code korrigiert