MAC Adressen aus eine Textdatei auslesen wegen PRESENCE

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

Vorheriges Thema - Nächstes Thema

CoolTux

Das ist ne Formatierung im Forum.
Das was Du oben schon mit Deiner Datei gemacht hast.

Sicher das das der Inhalt der Datei ist. Sieht eher nach einer Konsolenausgabe aus

Trying 192.168.xx.xx...
Connected to 192.168.xx.xx.
Escape character is '^]'.

Account:*******
^MPassword: *****

User login successful, expired time is "Unlimited".


^MType ? for command help

^MGroejNet-Berlin> srv dhcp status lan1
^MLAN1       : DHCP Server On    IP Pool: 192.168.xx.xx ~ 192.168.xx.xx
^M             Default Gateway: 192.168.xx.xx
^M--------------------------------------------------------------------------------
^MIndex IP Address      MAC Address             Leased Time     HOST ID
^M--------------------------------------------------------------------------------
^M1     192.168.xx.xx   88-71-E5-FB-E7-04       22:43:48       
^M2     192.168.xx.xx   F0-81-73-EA-FB-8E       20:56:49       
^M3     192.168.xx.xx   A0-02-DC-EA-27-B5       21:52:46       
^M4     192.168.xx.xx   A0-20-A6-19-AC-0E       23:22:13       
^M5     192.168.xx.xx   60-01-94-55-F7-8D       21:02:41       
^M6     192.168.xx.xx   EC-10-7B-0F-47-9B       23:22:43       
^M7     192.168.xx.xx   F8-B1-56-AF-25-C6       20:23:14       
^M8     192.168.xx.xx   C4-73-1E-D5-8F-C9       22:31:57
^M9     192.168.xx.xx   D8-49-2F-39-2B-32       23:53:44
^M10    192.168.xx.xx   60-01-94-14-E1-7A       23:58:42     
^M11    192.168.xx.xx   2C-3A-E8-31-57-46       21:02:41     

^MGroejNet-Berlin> exit
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

Ist es auch die in eine Datei geschrieben wurde.
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

CoolTux

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

Hatte es nur schnell in der Befehlzeile getestet hiermit:

{ open FILE, "/home/pi/draytekdhcp.log" or die "Couldn't open file: $!";; while (<FILE>){ $_ =~ /(.+?):(.+)/;; fhem("setreading dummy $1 $2") } close FILE }


Hatte ich hier im Forum gefunden vorhin ;)
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

CoolTux

Zitat von: Groej am 01 April 2018, 11:09:12
Hatte es nur schnell in der Befehlzeile getestet hiermit:

{ open FILE, "/home/pi/draytekdhcp.log" or die "Couldn't open file: $!";; while (<FILE>){ $_ =~ /(.+?):(.+)/;; fhem("setreading dummy $1 $2") } close FILE }


Hatte ich hier im Forum gefunden vorhin ;)

Ach so. Da habe ich keine Ahnung von. Dachte du hast ne vernünftige Sub in einer myUtils gemacht und Mit FileRead() das ganze ausgelesen.
Ich mach dann mal Ostern.

Bis die Tage
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

betateilchen

#20
Zitat von: Groej am 01 April 2018, 11:09:12
Hatte es nur schnell in der Befehlzeile getestet hiermit:

Hatte ich hier im Forum gefunden vorhin ;)

Und hast Du das einfach nur kopiert oder hast Du wenigstens verstanden, was Du da tust?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Groej

So halbwegs. Ich sagte ja ich kappier das mit den Array auslesen nicht. Also das die Datei geöffnet wird und eine Schleife läuft bis die Datei durch ist und dann die Datei geschlossen wird ist klar. Dabei werden dann die Readings in den Test Dummy geschrieben.

Aber das hier versteh ich nicht: $_ =~ /(.+?):(.+)/

Damit wird ja gesagt wie und was er auslesen soll.
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

Groej

So ich hab schon mal das Script gebastelt was die Daten vom Router holt.
Jetzt ist nur die Frage in eine Datei schreiben und dann die MAC Adressen irgendwie auslesen oder in einen Rutsch die MAC Adressen auslesen und in einen FHEM Dummy schreiben als Reading?
Egal wie, die Frage ist wie man das macht. Da brauch ich wirklich Hilfe.
Wie gesagt da hab ich keine Peilung von. Googel aber fleißig weiter. Vielleicht komm ich ja auch selber drauf.

Script:
#!/usr/bin/perl

use warnings;
use Net::Telnet ();

print "Begin\n";
$remote = new Net::Telnet (Timeout => 10,Errmode=>'die');
$remote->open("192.168.xx.xx");
print "connect\n";
$remote->waitfor('/Account:$/i');
$remote->print("xxxx") or die $remote->errmsg;
$remote->waitfor('/Password: $/i');
$remote->print("xxxx") or die $remote->errmsg;
print "logged in\n";
$remote->waitfor('/GroejNet-Berlin> $/');
print "vor Ausgabe\n";
@output = $remote->cmd("srv dhcp status lan1");
#$remote->waitfor('/^MGroejNet-Berlin>$/');
print @output;
$remote->close;


Ausgabe:
LAN1       : DHCP Server On    IP Pool: 192.168.10.50 ~ 192.168.10.78
             Default Gateway: 192.168.10.1
--------------------------------------------------------------------------------
Index   IP Address      MAC Address             Leased Time     HOST ID
--------------------------------------------------------------------------------
1       192.168.xx.xx   DC-4F-22-11-77-17       22:15:10        yyyyyyyyyyyyyyyy
2       192.168.xx.xx   F0-81-73-EA-FB-8E       19:00:03        yyyyyyyyyyyyyyyy
3       192.168.xx.xx   A0-02-DC-EA-27-B5       17:15:05        yyyyyyyyyyyyyyyy
4       192.168.xx.xx   A0-20-A6-19-AC-0E       14:40:05        yyyyyyyyyyyyyyyy
5       192.168.xx.xx   60-01-94-55-F7-8D       18:45:59        yyyyyyyyyyyyyyyy
6       192.168.xx.xx   EC-10-7B-0F-47-9B       22:10:24        yyyyyyyyyyyyyyyy
7       192.168.xx.xx   D8-49-2F-39-2B-32       12:49:47
8       192.168.xx.xx   2C-3A-E8-31-57-46       18:43:07        yyyyyyyyyyyyyyyy
9       192.168.xx.xx   88-30-8A-EC-C9-CD       16:07:17        yyyyyyyyyyyyyyyy


Natürlich kann die Ausgabe länger oder kürzer sein je nach dem wieviele Geräte sich per DHCP eine Adresse geholt haben.
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

CoolTux

#23
Meine persönliche Meinung kennst Du ja, ich würde das gleich verarbeiten.
Willst Du ausschließlich die MAC Adressen ohne jeglichen anderen Bezug?
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

betateilchen

#24
Ich würde den Text


  • über FileRead() in ein Array einlesen
  • über das array loopen und in der Schleife
  • jede Zeilen mit split anhand des Leerzeichens zerlegen
  • eine Zeile nur dann verarbeiten, wenn das zweite Element 192.168. enthält

Funktionsprinzip:



my ($err,@inhalt) = FileRead(...);

foreach my $zeile (@inhalt){
   my @z = split("[ \t]+",$zeile);
   next unless($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.
}

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Groej

Hallo,

danke für die weitere Hilfe.

ich hab das ganze jetzt mit meinem kleinen vorhandenen Wissen gemacht und es auf der Linux Ebene vom Raspi gemacht zum Testen mit folgenden Code:

#!/usr/bin/perl

use warnings;
use Net::Telnet ();

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

foreach my $zeile (@output){
   my @z = split("[ \t]+",$zeile);
   next unless($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 "mac_$z[2] $z[4]\n";
}


und bekomm dann folgendes raus:


connect

logged in

Use of uninitialized value $z[1] in pattern match (m//) at test.pl line 24.
Use of uninitialized value $z[1] in pattern match (m//) at test.pl line 24.
mac_EC-10-7B-0F-47-9B Galaxy-A3-2017

mac_F0-81-73-EA-FB-8E amazon-f5eccfdce

mac_DC-4F-22-11-77-17 Zaehler4OG0

mac_88-71-E5-FB-E7-04 amazon-ceabd40d8

mac_A0-02-DC-EA-27-B5 amazon-c8585ce31

mac_A0-20-A6-19-AC-0E FHEM-Status1

mac_D8-49-2F-39-2B-32

mac_88-30-8A-EC-C9-CD android-5b7ed7d1f40c56f5

Use of uninitialized value $z[1] in pattern match (m//) at test.pl line 24.
Use of uninitialized value $z[1] in pattern match (m//) at test.pl line 24.


Ich versteh nicht warum diese Zeilen kommen:

Use of uninitialized value $z[1] in pattern match (m//) at test.pl line 24.

Ja ich hab es jetzt mit einen Rustch gemacht ohne Datei zwischendurch. Weiß aber noch nicht ob ich das ins FHEM packe oder es vom Raspi machen lasse und dann im Script über Telnet zu FHEM schicke.
Könnte ich das eigentlich so 1 zu 1 in eine 99_myUtils packen? Klar mit sub usw . dann.

Gruß

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

JoWiemann

Zitat von: Groej am 05 April 2018, 19:19:28
Ich versteh nicht warum diese Zeilen kommen:

Use of uninitialized value $z[1] in pattern match (m//) at test.pl line 24.

Ja ich hab es jetzt mit einen Rustch gemacht ohne Datei zwischendurch. Weiß aber noch nicht ob ich das ins FHEM packe oder es vom Raspi machen lasse und dann im Script über Telnet zu FHEM schicke.
Könnte ich das eigentlich so 1 zu 1 in eine 99_myUtils packen? Klar mit sub usw . dann.


Hm, das my @z = split("[ \t]+",$zeile); führt zu einem nicht initialisiertem Element $z[1]. Um das zu kontrollieren gibt doch auch noch den Wert von $zeile aus.

Das Ganz in eine myUtils zu packen ist dann sicherlich eine gute Idee. Hier kannst Du dann die Readings eines Dummys füllen.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

betateilchen

Die perl Warnungen kannst Du getrost ignorieren, die sind nicht schlimm. Sie kommen daher,


  • dass Du meinen als "Funktionsprinzip" gekennzeichneten Beispielcode einfach übernommen hast
  • ohne ihn wirklich syntaktisch korrekt fertigzustellen
  • und ohne ihn zu verstehen
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Groej

Moin,

na Dein Code betateilchen verstehe ich so.

Die Ausgabe von meiner Telnetabfrage wird Zeilenweise eingelesen. Die Zeile wird dann in einzelne Teile geteilt und die Trennug ist ein Tab. Dann wird gesucht ob im zweiten Wert der Zeile Z1 ein Text steht der mit 192.168. anfängt. Wenn ja werden alle Werte in dieser Zeile in die Variable beginnend mit z0 und Endet mit zx geschrieben. Ich gebe dann mit meinem print Befehl Z2 und z4 aus. Das ganze wird so lange gemacht bis alle Zeilen durchgearbeitet sind durch foreach. Richtig verstanden?

In der Telnetausgabe sind Zeilen bei wo keine IP Adressen stehen bzw. wo welche stehen aber nicht an der richtigen stelle. Wahrscheinlich müßte ich noch eine if Anweisung schreiben nach next. Wenn der Inhalt in z1 nicht in da ist das er diese Zeile übergeht und zur nächsten geht um die Fehlermeldung weg zu bekommen. Bin ich da auf dem richtigen Weg mit? Weiß nur gerade nicht wann else stehen müßte bzw ob man überhaupt ein else braucht.

Gruß

Jörg

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

CoolTux


next unless(defined($z[1]) and $z[1] =~ m/192\.168\./);
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