Netzwerkgeräte: Verfügbarkeit prüfen

Aus FHEMWiki
Wechseln zu: Navigation, Suche

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;
use POSIX;
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;
}
# http://www.somacon.com/p114.php
# Perl trim function to remove whitespace from the start and end of the string
sub trim($)
{ 
  my $string = shift;
  $string =~ s/^\s+//;
  $string =~ s/\s+$//;
  return $string;
} 
# Left trim function to remove leading whitespace
sub ltrim($)
{
  my $string = shift;
  $string =~ s/^\s+//;
  return $string;
}
# Right trim function to remove trailing whitespace
sub rtrim($)
{
  my $string = shift;
  $string =~ s/\s+$//;
  return $string;
}
######## 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:

  1. 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.

  1. 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).
  2. 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
  3. 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.