FHEM Forum

FHEM - Hardware => Einplatinencomputer => Thema gestartet von: Dirk070 am 24 November 2014, 20:15:03

Titel: (gelöst) DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: Dirk070 am 24 November 2014, 20:15:03
Hallo zusammen,

hat schon jemand probiert, den DHCP-Server auf dem RPI zu installieren und dann mit dem Presence-Modul per SNMP zu arbeiten? Für Erfahrungswerte wäre ich sehr dankbar.

Schöne Grüße, Dirk


Schöne Grüße, Dirk
Titel: Antw:DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: betateilchen am 24 November 2014, 20:26:12
DHCP Server auf dem Raspi ist Schnullerpulle... das läuft völlig problemlos. Aber was man mit SNMP auf dem Raspi will, ist mir unklar.
Titel: Antw:DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: Dirk070 am 24 November 2014, 20:30:20
Nun: iPhone bekommt vom RPI-DHCP eine IP und mit FHEM-Presence-Modul fragt man per SNMP ab. Im Wiki wird das von einer AirPort abgefragt, aber die neue Extreme unterstützt kein SNMP mehr. Daher die Idee, den RPI als DHCP zu nutzen.


Schöne Grüße, Dirk
Titel: Antw:DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: Dirk070 am 24 November 2014, 22:48:16
So, der DHCP-Server läuft.
Nun muss ich noch den SNMP-Server ans Laufen bekommen und dann die Abfrage der Leases hinbekommen.
Sollte da jemand Input liefern können, immer her damit
Titel: Antw:DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: flocko am 25 November 2014, 02:00:08
Hallo,

ich hänge da auch gerade dran. Selbes Problem wie bei dir. Die neue TimeCapsule unterstützt kein SNMP.
Ich habe DHCPD und SNMPD auf dem Cubietruck installiert. Ausserdem habe ich meine TimeCapsule in den "NAT Only" Modus versetzt. So wie hier beschrieben: https://www.autoitconsulting.com/site/networking/configuring-an-airport-extreme-for-nat-only-mode/ (https://www.autoitconsulting.com/site/networking/configuring-an-airport-extreme-for-nat-only-mode/)

Ein
$ snmpwalk -c public -v 1 10.0.0.16 .1.3.6.1.2.1.3.1.1.2
gibt mir
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.1 = Hex-STRING: 90 72 40 01 XX XX
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.3 = Hex-STRING: E8 94 F6 DF XX XX
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.5 = Hex-STRING: 84 38 35 46 XX XX
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.6 = Hex-STRING: E8 94 F6 DF XX XX
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.12 = Hex-STRING: E8 94 F6 DF XX XX
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.30 = Hex-STRING: 02 43 09 C0 XX XX
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.109 = Hex-STRING: E8 94 F6 DF XX XX
iso.3.6.1.2.1.3.1.1.2.3.1.10.0.0.187 = Hex-STRING: 00 17 88 15 XX XX


Das funktioniert aber leider nur so halb.
In der DHCP.leases stehen z.B. folgende Einträge:

lease 10.0.0.188 {
  starts 2 2014/11/25 00:51:57;
  ends 2 2014/12/02 00:51:57;
  cltt 2 2014/11/25 00:51:57;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet b8:78:2e:3f:XX:XX;
  uid "\001\270x.?\027\340";
  client-hostname "TEST";


Dieser Client taucht zum Beispiel nie beim SNMPWALK auf und somit auch nicht in FHEM auf. Weiß jemand warum?

FHEM zeigt mir die Geräte manchmal als Present. Wenn ich dann aber zum Testen Offline gehe, dauert es ca. 5 Minuten und sie sind Absent. Allerdings komme ich von da an nicht mehr in "Present". Ich geh Online mit dem iPhone oder dem Android Tablet und selbst nach einiger Zeit zeigt der oben genannte SNMPWALK nicht das Device an. Und somit natürlich leider auch nicht FHEM.

Ich hoffe ich konnte dir ein wenig helfen? Bist du weiter gekommen?
Weiß jemand was da bei mir schief läuft?

Viele Grüße
Volker


EDIT:
Ah, eventuell liegt es an meiner TimeCapsule. Ich habe die Vermutung, dass die Clients die dort gelistet sind für den DHCPD Server inaktiv sind und deswegen nicht angezeigt werden. Merkwürdig. Ich werde morgen mal testen die TimeCapsule komplett als Bridge laufen zu lassen und das NAT über IPTABLES zu machen. Ich werde mich da mal reinfuchsen.
Titel: Antw:DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: Dirk070 am 25 November 2014, 19:21:21
Mein aktueller Stand:

Aus dem Web:
SNMP-Server installieren

sudo apt-get install snmpd snmp
sudo nano /etc/snmp/snmpd.conf
Change the agentAddress
agentAddress 161
Below the line:
#rocommunity public localhost
add:
rocommunity public        (without the initial #)

Restart the SNMP deamon:
sudo /etc/init.d/snmpd restart

Nach dieser Installation bekomme ich schonmal eine Antwort auf den snmpwalk.

snmpwalk -c public -v 1 192.168.1.11 .1.3.6.1.2.1.3.1.1.2

In FHEM bleibt es aber dauerhaft beim Status "absent", die WLAN-Adresse aus dem iPhone habe ich geprüft (alle Buchstaben klein, Doppelpunkte raus, ein 0x davor).....

Also leider noch keine endgültige Lösung  :'(
Titel: Antw:DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: Dirk070 am 25 November 2014, 19:44:14
Offenbar prüft FHEM auch beim Restart erst nach dem Zeitintervall.
Nun habe ich ein "Present".

HURRA! :) :)
Titel: Antw:DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: flocko am 25 November 2014, 19:53:20
Glückwunsch. :)

Wenn du jetzt das iPhone WLAN abschaltest und wartest bist es in Absent geht und du es danach wieder aktivierst, geht er dann wieder in "Present"?

Das klappt nämlich bei mir nicht.
Ich gebe auf und nehme die einfache Lösung. Habe noch n alten TP-LINK Router hier rumfliegen mit Gigabit Switch. Der wird jetzt das Routing übernehmen und die TimeCapsule häng ich als Bridge dran fürs WLAN.
Titel: Antw:DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: flocko am 25 November 2014, 20:34:44
Status bei mir:
Funktioniert so wie es soll. Da schlage ich mir zwei Nächte um die Ohren um das hinzubekommen, und dann regelt es mein DDWRT Router ganz von alleine. Mit 2 Mausklicks DHCP und SNMP konfiguriert, eben in FHEM die IP geändert und es funktioniert alles wie ich will. Jetzt erstmal ausführlich testen. :)
Titel: Antw:DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: Dirk070 am 25 November 2014, 22:36:52
Zitat von: flocko am 25 November 2014, 19:53:20
Glückwunsch. :)

Wenn du jetzt das iPhone WLAN abschaltest und wartest bist es in Absent geht und du es danach wieder aktivierst, geht er dann wieder in "Present"?

Das klappt nämlich bei mir nicht.

Schlimmer, es bleibt nun dauerhaft beim Present....
Vielleicht kann ja mal jemand helfen und das Coding aus der MyUtils erklären oder wie man das debuggen kann.
Offenbar wird der Status nicht sauber gelesen sondern nur, ob die MAC-Adresse in der DHCP-Liste auftaucht.
Shit, wäre ja auch zu schön gewesen. Für heute ist Schluss mit Hobby, morgen klingelt wieder der Wecker.
Titel: Antw:DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: flocko am 25 November 2014, 23:34:27
Ich glaube nicht dass es an dem Myutils Code liegt.
Was zeigt die Abfrage von snmpwalk -c public -v 1 192.168.1.11 .1.3.6.1.2.1.3.1.1.2

Der Wert muss da raus, dann wird es auch in FHEM absent angezeigt.

Allerdings hat es bei mir bis zu 10 Minuten gedauert bis der Lease beim snmpwalk nicht angezeigt wurde.

Aber genau das hat nicht funktioniert bei mir. Jetzt mit dem Billo Linux Router und der TimeCapsule nur als WLAN AccessPoint funktioniert es genau wie ich es mir gewünscht habe.
Titel: Antw:DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: Dirk070 am 26 November 2014, 13:21:09
Schaut man sich die Leases des DHCP an (sudo nano /var/lib/dhcp/dhcpd.leases), kann man am Binding-State erkennen, ob das Gerät "active" oder "free" ist.
Diese Info müsste man per SNMP lesen können, dann könnte man die Utils entsprechend umbauen....
Titel: Antw:DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: flocko am 26 November 2014, 16:24:44
Kann man das nicht mit einem Cat grep per Script automatisch in eine Datei schreiben lassen und die info in FHEM einlesen? Ich mache sowas ähnliches bei meinen arduino scripts.
Titel: Antw:DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: Dirk070 am 26 November 2014, 16:29:37
Ich überlege auch, die Datei mit einem Perl-Script (bin zwar auch Entwickler, aber kein Perl) zu lesen.
Hier hat jemand so was ähnliches schon gebaut: http://www.omar.org/opensource/reportdhcp/source.html (http://www.omar.org/opensource/reportdhcp/source.html)

Da werden auch schon die Binding Stats gelesen. Wenn sich das mal jemand anschaut, der sich damit auskennt... ;) ;)
Titel: Antw:DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: Dirk070 am 26 November 2014, 16:50:59
So was hier müsste man doch schon nutzen können, um die Infos zu splitten, oder?

# Reads and munges the leases file generated by dhcpd
sub ParseLeaseFile {

our %lease;
unless(open (IN, $dhcpfile)) {
print "\nError: unable to open file $dhcpfile: $! \n";
exit -1;
}
my @leases = <IN>;
my $data = "";
foreach $line (@leases) {
unless ($line =~ m/^#/) { # ignore commented lines
$data .= $line;
}
}
my @data = split (/lease /, $data); #split each lease into an array entry
foreach (@data) {                 #create hash of hashes keyed on ip from the array
my @temp = split(/{/, $_);
chop($temp[0]); # 0 is IP
chop($temp[1]); # 1 is the rest...
chop($temp[1]);
$temp[1] =~ tr/\t//d;
@t = split(/;\n/, $temp[1]); #split each lease on newline
my $i=0;
while ($t[$i]) {
my $string = $t[$i];
$string =~ tr/\n//d;
$string =~ s/^\s*//; # remove any leading spaces
@words = split(/\s+/, $string); #hashes keyed on first word

if ($words[0]) {
$key = shift(@words);
$lease{$temp[0]}{$key}="@words";
$lease{$temp[0]}{"hardware"}=~ s/ethernet//;
$lease{$temp[0]}{"binding"}=~ s/state //;
}
$i++;
}
}
my @temp = sort(keys(%lease));
my $prev = ""; # checks for duplicates
@ips=grep($_ ne $prev && (($prev) = $_), @temp);
$entries = @ips;
}

Titel: (gelöst) DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: Dirk070 am 27 November 2014, 16:34:13
Ich habe auf Basis des verlinkten Scripts eine Lösung hinbekommen.
Das Script ist sicher noch nicht optimal. Die manuellen Aufrufe funktionieren, nun folgt der Praxistest.

Wer es probieren möchte, hier meine komplette 99_myUtils.pm:
##############################################
# $Id: 99_Utils.pm 3595 2013-08-05 05:38:48Z tobiasfaust $
package main;
use strict;
use warnings;
use POSIX;
#use Net::SNMP;
use Data::Dumper;

sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
# start with your own functions below this line

##################################################

# Reads and munges the leases file generated by dhcpd
sub DHCPcheck($) {

my $mac = shift;

###--------------------------OPTIONS--------------------------###

# Change to your dhcp file and dhcpd.conf:
# (Currently set to ISC DHCP defaults)

my $dhcpfile = "/var/lib/dhcp/dhcpd.leases";
my $active = "active";

my $line;
my $key;
my $entries;
my $temp;
my $ip;
my @t;
my @words;
my @ips;

###----------------------End of Options-----------------------###

our %lease;
unless(open (IN, $dhcpfile)) {
                return 0;
                return "Error: unable to open file $dhcpfile";
exit -1;
}
my @leases = <IN>;
my $data = "";
foreach $line (@leases) {
unless ($line =~ m/^#/ || length($line) < 2) { # ignore commented lines and empty ones (only CR)
$data .= $line;
}
}
# Split Leases into Array, cut out first empty entry, because first line starts with Split pattern
my @tmpdata = split (/lease /, $data); #split each lease into an array entry
        my @data = grep{ $_ ne ""; } @tmpdata;
foreach (@data) {                 #create hash of hashes keyed on ip from the array
my @temp = split(/{/, $_);
chop($temp[0]); # 0 is IP
chop($temp[1]); # 1 is the rest...
chop($temp[1]);
$temp[1] =~ tr/\t//d;
@t = split(/;\n/, $temp[1]); #split each lease on newline
my $i=0;
while ($t[$i]) {
my $string = $t[$i];
$string =~ tr/\n//d;
$string =~ s/^\s*//; # remove any leading spaces
@words = split(/\s+/, $string); #hashes keyed on first word

if ($words[0]) {
$key = shift(@words);
$lease{$temp[0]}{$key}="@words";
$lease{$temp[0]}{"hardware"}=~ s/ethernet//;
$lease{$temp[0]}{"binding"}=~ s/state //;
}
$i++;
}
}
my @temp = sort(keys(%lease));
my $prev = ""; # checks for duplicates
@ips=grep($_ ne $prev && (($prev) = $_), @temp);
$entries = @ips;

#Finds entry for a given MAC address (hardware id in leases file)

        foreach $ip (@ips) {
                if ($lease{$ip}{"hardware"} =~ /$mac/) {
                    if ($lease{$ip}{"binding"} =~ /$active/) {
return 1;
} }
}

return 0;
}

1;


Der Aufruf aus der fhem.cfg erfolgt ähnlich wie bei der SMTP-Variante (xx ist die Mac-Adresse):
# Presence per DHCP auf dem RPI
define iPhone PRESENCE function {DHCPcheck("xx:xx:xx:xx:xx:xx")} 15 15
attr iPhone room Presence
attr iPhone event-on-change-reading state


Ergänzung; damit in der Leases (File: /var/lib/dhcp/dhcpd.leases) nur ein Eintrag pro Mac-Adresse erzeugt wird, muss der folgende Parameter (File: /etc/dhcp/dhcpd.conf) gesetzt werden:
one-lease-per-client true;

Schöne Grüße,
Dirk
Titel: Antw:(gelöst) DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: Dirk070 am 28 November 2014, 11:55:17
Ich habe noch eine Benachrichtigung per Push (über Pushover) eingerichtet.

Sub in der 99_myUtils (token und user ersetzen, ist hier gut erklärt http://www.meintechblog.de/2013/11/howto-mit-fhem-push-nachrichten-aufs-iphone-schicken-update/ (http://www.meintechblog.de/2013/11/howto-mit-fhem-push-nachrichten-aufs-iphone-schicken-update/)), ein Wiki dazu gibt es auch:
sub Pushover($) {

my $text = shift;

# Pushover iPhone
system ("curl -s -F 'token=axxxxxxxxxxxxxxx' -F 'user=uxxxxxxxxxxxxxx' -F 'message=$text' https://api.pushover.net/1/messages.json")

}


Aufruf dann per Watchdog:
define watchdog_Abwesenheit watchdog iPhone:absent 00:01 iPhone:present { Pushover("Abwesend") } ; setstate watchdog_Abwesenheit defined
attr watchdog_Abwesenheit regexp1WontReactivate 1
define watchdog_Anwesenheit watchdog iPhone:present 00:01 iPhone:absent { Pushover("Anwesend") } ; setstate watchdog_Anwesenheit defined
attr watchdog_Anwesenheit regexp1WontReactivate 1


Viel Spaß.
Titel: Antw:(gelöst) DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: widdi am 14 Dezember 2014, 11:49:38
Hallo zusammen,
ich freue mich diesen Thread gefunden zu haben. Ich habe meinen DHCP-Server jetzt ganz auf einen OpenWRT-Router verlegt und "snmpd" installiert, da bei den neuen AirPort-Geräten nicht mehr dabei ist.

Die mitgelieferte /etc/snmpd.conf sieht so aus:
agentaddress UDP:161                                                                                                                                                   
sysLocation office                                                                                                                                                     
sysContact bofh@example.com                                                                                                                                             
sysName HeartOfGold                                                                                                                                                     
com2sec ro default public                                                                                                                                               
com2sec rw localhost private                                                                                                                                           
group public v1 ro                                                                                                                                                     
group public v2c ro                                                                                                                                                     
group public usm ro                                                                                                                                                     
group private v1 rw                                                                                                                                                     
group private v2c rw                                                                                                                                                   
group private usm rw                                                                                                                                                   
view all included .1                                                                                                                                                   
access public "" any noauth exact all none none                                                                                                                         
access private "" any noauth exact all all all                                                                                                                         
exec  filedescriptors /bin/cat /proc/sys/fs/file-nr                                                                                                                     


Ist das richtig so?

Das iOS-Gerät bezieht seine IP-Adresse jetzt von dem OpenWRT.
Über snmpwalk -c public -v 1 10.0.0.4 .1.3.6.1.2.1.3.1.1.2 taucht das gerät auch auf:

SNMPv2-SMI::mib-2.3.1.1.2.4.1.10.0.0.8 = Hex-STRING: E5 3A 0A F1 21 8C
Das müsste also so auch stimmen.

Egal wie lange das iOS-Gerät jetzt von dem WLAN getrennt ist, der Eintrag taucht auch nach Stunden noch auf (folglich auch "present" in FHEM).
Hat der SNMPD oder Dnsmasq (DNS- und DHCP-Server von OpenWRT) noch Konfigurationsbedarf?
In FHEM steht das iOS-Gerät dauernd auf "present", nachdem es den DHCP-Lese bekommen hat.
Lohnt es sich DD-WRT zu flashen (wie im Thread schon erwähnt wurde), ist dort alles besser vorkonfiguriert?

Danke für eure Hilfe.
Titel: Antw:(gelöst) DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: sun am 13 Februar 2015, 22:56:55
Hallo,

ich verwende das Skript von Dirk auf einem Ubuntu Server unter FHEM. Die Anwesenheitserkennung funktioniert soweit getestet. Was ich aber sehe ist das im Log bei jedem Aufruf zwei Fehler eingetragen werden:
2015.02.13 22:37:46 1: PERL WARNING: Use of uninitialized value in substitution (s///) at ./FHEM/99_myUtils.pm line 263, <IN> line 528.
2015.02.13 22:37:46 1: PERL WARNING: Use of uninitialized value in substitution (s///) at ./FHEM/99_myUtils.pm line 264, <IN> line 528.

die werden ausgelöst von
$lease{$temp[0]}{"hardware"}=~ s/ethernet//;
$lease{$temp[0]}{"binding"}=~ s/state //;

und zwar immer beim verarbeiten der letzten Zeile des Lease files.
Ich habe schon versucht das Problem zu lösen kenne mich aber offensichtlich zu wenig mit Perl aus.
Hat jemand eine Idee ?

Gruß,

sun
Titel: Antw:(gelöst) DHCP Server auf dem RPI & Presence per SNMP
Beitrag von: sun am 22 Februar 2015, 14:33:21
Falls noch jemand das Problem mit den Log einträgen hat. Ich habe die beiden Zeilen ersetzt durch:

                                if ($lease{$temp[0]}{"hardware"}) {
                                  $lease{$temp[0]}{"hardware"}=~ s/ethernet//;
                                }
                                if ($lease{$temp[0]}{"binding"}) {
                                  $lease{$temp[0]}{"binding"}=~ s/state //;
                                }


Damit ist das warning bei mir verschwunden und die Funktionalität bleibt bestehen.