MAC Adressen aus eine Textdatei auslesen wegen PRESENCE

Begonnen von Groej, 30 März 2018, 15:12:57

Vorheriges Thema - Nächstes Thema

betateilchen

Zitat von: Groej am 06 April 2018, 06:56:02
und zur nächsten geht um die Fehlermeldung weg zu bekommen.

Es fängt schon damit an, dass die Meldung überhaupt keine Fehlermeldung ist, sondern nur ein Hinweis.
Wäre es eine Fehlermeldung, würde das script nicht weiterarbeiten, sondern abbrechen.

Deshalb meine Aussage:

Zitat von: betateilchen am 05 April 2018, 21:34:56
Die perl Warnungen kannst Du getrost ignorieren, die sind nicht schlimm.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Achja - noch ein gut gemeinter Rat.

Wenn Du vorhast, Deinen Code aus dem script in die 99_myUtils.pm zu übernehmen, dann mach das bitte über "Edit files" direkt in FHEM.
Das hat den Vorteil, dass Du beim Abspeichern der Datei automatisch Hinweise auf die sonst noch bestehenden Syntaxfehler in Deinem Code bekommst.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Groej

#32
Ich weiß :) aber danke für den Tipp.

Danke erstmal an alle hier die mir weitergeholfen haben bis jetzt.

Gruß

Jörg
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

Groej

Moin,

so bekomme es nicht in der 99_myUtils zum Laufen. Habs jetzt auf der Linux ebende gelassen und schick es per Telnet ins FHEM.

#!/usr/bin/perl

use warnings;
use Net::Telnet ();

$draytek = new Net::Telnet (Timeout => 10,Errmode=>'die');
$draytek->open("192.168.10.1");
#print "connect\n";
#print "\n";
$draytek->waitfor('/Account:$/i');
$draytek->print("xxx") or die $draytek->errmsg;
$draytek->waitfor('/Password: $/i');
$draytek->print("xxx") or die $draytek->errmsg;
#print "logged in\n";
$draytek->waitfor('/GroejNet-Berlin> $/'); @output = $draytek->cmd("srv dhcp status lan1");
#print @output;
#$data = $remote->cmd("srv dhcp status lan1");
$draytek->close;
#print "\n";

$fhem = new Net::Telnet (Timeout => 10,Port => 7072,Errmode=>'die');
$fhem->open("127.0.0.1");
$fhem->print("deletereading draytek_mac_addr .*");
$count = 1;

foreach my $zeile (@output){
   my @z = split("[ \t]+",$zeile);
   next unless(defined($z[1]) and $z[1] =~ m/192\.168\./);
   # ab hier erfolgt das Verarbeiten der "gültigen" Zeilen
   # in $z[1] steht die IP, in $z[2] steht die MAC usw.
#print "IP_$count $z[2]\n";
$fhem->print("setreading draytek_mac_addr IP_$count $z[2]");
$count=$count+1;
}

$fhem->print("quit");
$fhem->close;


Ich hab einen AT Befhel in FHEM geschrieben der so aussieht:

define draytek_mac_addr_at at +00:02:00 {system('sudo perl /home/pi/draytek_dhcp_mac.pl&');;}

Jetzt kommt das was ich nicht verstehen. Der AT wird einmal ausgeführt, die Daten werden auch in den Dummy geschrieben, und dann wird der komplette Befehl aus FHEM gelöscht. Er ist dann aus der fhem.cfg weg.

Im LOG von FHEM steht dazu nur:
2018.04.07 08:00:28 3: draytek_mac_addr_at: -1

Am Ende müßte doch eine 1 und nicht -1 stehen richtig?

Gruß

Jörg
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

CoolTux

In der Commandref zum at findest Du die Antwort auf Deine Frage.
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

Groej

Hallo,

danke nochmal für Eure Hilfe und Unterstützung. Ich glaub ich bin am Ziel und bin etwas stolz das mit meinen bescheidenen Kenntnisen hinbekommen zu haben. Ob das alles sauber programmiert ist sei bitte dahin gestellt.

Wie gesagt hab ich jetzt alles in einen PERL Script auf der Lunix Ebende vom RasPi gemacht. Ich bau eine Telnet Verbindung zu meinen Draytek Router auf und lese die DHCP Tabelle aus. @betateilchen Danke für den Anstoß mit dem Split Code von Dir :). Dann suche ich in der Tabelle bestimmte MAC Adressen und setze dann per Telnet die Readings in einen FHEM Dummy auf present oder absent.

Auch das Script über FHEM auszuführen klappt jetzt mit einen AT Befehl. @CoolTux was so ein * Stern doch ausmacht :).

Perl Code:
#!/usr/bin/perl

use warnings;
use Net::Telnet ();

# MAC Adressen eitragen in dem Format: ("xx-xx-xx-xx-xx-xx","xx-xx-xx-xx-xx-xx")
@macs = ("EC-10-7B-0F-47-9B","C8-D7-B0-F7-5F-D4");

$draytek = new Net::Telnet (Timeout => 10,Errmode=>'die');
$draytek->open("IPxxx.xxx.xxx.xxx");
$draytek->waitfor('/Account:$/i');
$draytek->print("Benutzerxxxx") or die $draytek->errmsg;
$draytek->waitfor('/Password: $/i');
$draytek->print("Passwordxxxx") or die $draytek->errmsg;
$draytek->waitfor('/GroejNet-Berlin> $/');
@output = $draytek->cmd("srv dhcp status lan1");
#print @output;
$draytek->close;
#print "\n";
#print "\n";

$fhem = new Net::Telnet (Timeout => 10,Port => 7072,Errmode=>'die');
$fhem->open("127.0.0.1");
#$fhem->print("deletereading draytek_mac_addr .*");

foreach $macs (sort @macs){
# print "MAC $macs\n";
    foreach my $zeile (@output){
     my @z = split("[ \t]+",$zeile);
     next unless(defined($z[1]) and $z[1] =~ m/192\.168\./);
     # ab hier erfolgt das Verarbeiten der "gültigen" Zeilen
     # in $z[1] steht die IP, in $z[2] steht die MAC usw.
     #print "Z $z[2]\n";
      if ($z[2] eq $macs){
       $fhem->print("setreading draytek_mac_addr mac_$macs present");
       goto NEXT_MAC;
       }
     }
  $fhem->print("setreading draytek_mac_addr mac_$macs absent");
  NEXT_MAC:
  #print "\n";
}

$fhem->print("quit");
$fhem->close;


Dummy in FHEM:
define draytek_mac_addr dummy
attr draytek_mac_addr event-on-change-reading .*


AT Befehl in FHEM:
define draytek_mac_addr_at at +*00:02:00 {system('sudo perl /home/pi/draytek_dhcp_mac.pl&');;}

Danke nochmal an alle die geholfen haben.

Schönen Sonntag

Jörg
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280