Netzwerkgeräte: Verfügbarkeit prüfen: Unterschied zwischen den Versionen
Krikan (Diskussion | Beiträge) (Ersetzung www.fhemwiki.de durch wiki.fhem.de) |
(use POSIX; raus) |
||
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) | |||
Zeile 28: | Zeile 28: | ||
use strict; | use strict; | ||
use warnings; | use warnings; | ||
sub | sub | ||
myUtils_Initialize($$) | myUtils_Initialize($$) | ||
Zeile 41: | Zeile 40: | ||
my ($string,$nr) = @_; | my ($string,$nr) = @_; | ||
return substr $string, 0, $nr; | return substr $string, 0, $nr; | ||
} | } | ||
######## FhemLanStat ############ | ######## FhemLanStat ############ | ||
Zeile 95: | Zeile 71: | ||
} | } | ||
1;</nowiki> | 1;</nowiki> | ||
== Beispiel fhem.cfg == | == Beispiel fhem.cfg == | ||
<nowiki>define NetzGeraet1 dummy | <nowiki>define NetzGeraet1 dummy |
Aktuelle Version vom 7. Februar 2022, 12:36 Uhr
Prüfen der Verfügbarkeit über Erweiterung in 99 myUtils anlegen und Linux-Script.
Anmerkung
Da das folgende Beispiel Shell-Befehle direkt durch FHEM aufruft, kann dies zum kompletten Stillstand von FHEM für mehrere Sekunden führen. Es wird daher empfohlen das FHEM Modul PRESENCE zu verwenden. Dieses bietet mehrere Möglichkeiten der Anwesenheitserkennung, die alle von FHEM entkoppelt sind und so einen reibungslosen Ablauf gewährleisten.
Linux-Script
Anlegen lanping.sh zum Beispiel im Verzeichnis modpath/fhem/FhemUtils
#!/bin/bash if [ -n "$1" ]; then /bin/ping -q -c1 $1 &> /dev/null else echo "Nutzung: $0 <host>" exit 1 fi if [ "$?" -gt 0 ]; then echo $1 Fehler else echo $1 Ok fi exit 0
Wichtig: Ausführbar machen mit chmod +x lanping.sh
Erweiterung 99_myUtils
############################################## # $Id: 99_myUtils.pm $ package main; use strict; use warnings; sub myUtils_Initialize($$) { my ($hash) = @_; } sub right{ my ($string,$nr) = @_; return substr $string, -$nr, $nr; } sub left{ my ($string,$nr) = @_; return substr $string, 0, $nr; } ######## FhemLanStat ############ # Aufrufbeschreibung: FhemLanStat('ip-Adresse oder Netzwerkname','Name Dummy',['ip-Adresse oder Netzwerkname','Name Dummy'],[...]) sub FhemLanStat($@) { my $laenge = 0; my $i = 0; my $net_device=""; my $dm_device =""; my $attendance="Abwesend"; my $ret = ""; $laenge = @_; if (($laenge % 2) ne 0){ $ret = "Anzahl Parameter nicht korrekt."; return $ret; } for ($i=0;$i < $laenge;$i+=2){ $net_device = $_[$i]; $dm_device = $_[($i+1)]; # Vollstaendigen Pfad zum Script angeben $net_device=qx(/var/media/ftp/uStor01/fhem/fhem/fhem/FhemUtils/lanping.sh $net_device); if(right(trim($net_device), 2) eq "Ok"){ $attendance="Anwesend"; } else { $attendance="Abwesend"; } fhem "set $dm_device $attendance"; } } 1;
Beispiel fhem.cfg
define NetzGeraet1 dummy attr NetzGeraet1 icon icoHouse.png attr NetzGeraet1 room WerIstZuHause attr NetzGeraet1 setList Anwesend Abwesend define NetzGeraet2 dummy attr NetzGeraet2 icon icoHouse.png attr NetzGeraet2 room WerIstZuHause attr NetzGeraet2 setList Anwesend Abwesend define NetzGeraet3 dummy attr NetzGeraet3 icon icoHouse.png attr NetzGeraet3 room WerIstZuHause attr NetzGeraet3 setList Anwesend Abwesend define WerDa notify WerDa {FhemLanStat("192.168.0.x", "NetzGeraet1", "LaptopPC", "NetzGeraet2", "192.168.x.x", "NetzGeraet3")} define SucheLan at +*00:05:00 trigger WerDa
Nutzung auf einer Fritzbox 7390
Um die o.g. scripts auf einer Fritzbox7390 nutzen zu können, sind einige Anpassungen erforderlich:
- Das script lanping.sh nutzt den Linux-Befehl ping. Dieser ist aus fhem heraus nur verfügbar, wenn fhem
a) nicht als chroot läuft (also mit image von fhem.de , nicht von AVM.de), b) fhem mit user root läuft - dazu [http://wiki.fhem.de/wiki/FritzBox_Parameter_in_fhem_anzeigen#Wichtig diese Anleitung] befolgen und den Neustart der Fritzbox nicht vergessen.
- in der Routine FhemLanStat muss der qx-Aufruf angepasst werden zu qx(sh /var/InternerSpeicher/fhem/lanping.sh $net_device); (ggf auch den Pfad anpassen. Wichtig ist das vorangestellte sh).
- ping hat einen Standard-timeout von 10 Sekunden. Je geprüftem Gerät, das nicht erreichtbar ist, wartet ping also 10 Sekunden auf eine Antwort - das summiert sich schnell zu einer erheblichen Wartezeit. Daher empfiehlt sich das Setzen eines timeout auf zB 2 Sekunden. Dazu kann im script lanping.sh die Zeile mit dem ping-Aufruf um den entsprechenden Parameter W erweitert werden: /bin/ping -q -W2 -c1 $1 &> /dev/null
- Das script lanping.sh nicht mit einem Windows-Editor, sondern mit vi erstellen. Das script ist sonst meist nicht lauffähig, da Windows-Editoren andere Zeilenende-Zeichen verwenden und mit in die Datei speichern. Bedienung von vi ist leider ein Krampf, ein paar Hinweise [http://www.linux-fuer-alle.de/doc_show.php?docid=29&catid=8 hier]. Kurzanleitung:
- Den code von oben z.B. in Windows-Editor kopieren, die vorgenannten Anpassungen durchführen,
- Per PuttY auf die Fritzbox verbinden
- in das fhem-Verzeichnis navigieren (cd /var/InternerSpeicher/fhem)
vi lanping.sh
i
(nicht ENTER drücken) um vi in den Insert-Modus zu bringen- das angepasste script aus dem Windows-Editor in die Zwischenablage kopieren
- Mit der RECHTEN Maustaste in das Telnet-Fenster klicken -> Text wird eingefügt
- ESC-Taste drücken zum Wechsel in Befehlsmodus,
- dann
:w <ENTER>
zum Speichern, :q <ENTER>
zum Verlassen von vi.