Guten Abend,
ich habe da ein weiteres Problem.
Ich möchte eine Anwesenheit in FHEM integrieren. Dies wird hier ausführlich erklärt:
https://wiki.fhem.de/wiki/Anwesenheitserkennung#Das_GEOFANCY_Modul
Ich möchte das Bsp. DHCP Überwachung auf Airport Basestation umsetzen.
Dazu habe ich Net::SNMP mit dem angezeigtem Befehl cpan install use Net::SNMP
installiert.
Er sagt mir: Net::SNMP is up to date (v6.0.1)
Dann habe ich wie in der Anweisung erklärt versucht die Datei 99_myUtils zu erzeugen. Beim Abspeichern bekomme ich aber den Fehler:
Can't locate Net/SNMP.pm in @INC (you may need to install the Net::SNMP module) (@INC contains: . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.20.2 /usr/local/share/perl/5.20.2 /usr/lib/arm-linux-gnueabihf/perl5/5.20 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.20 /usr/share/perl/5.20 /usr/local/lib/site_perl ./FHEM) at ./FHEM/99_myUtils.pm line 12. BEGIN failed--compilation aborted at ./FHEM/99_myUtils.pm line 12.
Damit kann ich leider nichts anfangen? Kann mir hier bitte jemand einen Tipp geben?
Vielen Dank
Gruß Martin
Hallo Martin,
ich hoffe Du hast die 99_myUtils.pm erzeugt und keine 99_myUtils.pl wie im Wiki beschrieben :)
Wie sieht die denn komplett aus?
Die Datei selbst hast Du so angelegt -> https://wiki.fhem.de/wiki/99_myUtils_anlegen ?
Gruß Otto
Hallo Otto,
ja das habe ich gemacht. Über den Fehler bin ich aber auch erst gestolpert:
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
use Net::SNMP;
sub
snmpCheck($$)
{
my ($airport,$client)= @_;
my $community = "public";
my $host = $airport;
my $oid = ".1.3.6.1.2.1.3.1.1.2";
#my $oid = ".1.3.6.1.2.1.3.1.1.2.25.1.10.0.1";
my ( $session, $error ) = Net::SNMP->session(
-hostname => $host,
-community => $community,
-port => 161,
-version => 1
);
if( !defined($session) ) {
return 0;
return "Can't connect to host $host.";
}
my @snmpoids = ();
my $response = $session->get_next_request($oid);
my @nextid = keys %$response;
while ( @nextid && $nextid[0] && $nextid[0] =~ m/^$oid/ ) {
push( @snmpoids, $nextid[0] );
$response = $session->get_next_request( $nextid[0] );
@nextid = keys %$response;
}
if( !defined($response = $session->get_request( @snmpoids ) ) ) {
return 0;
}
foreach my $value (values %$response) {
return 1 if( $value eq $client )
}
return 0;
}
Gruß Martin
Du hast die 1;
am Ende gelöscht! Schlimmer Fehler.
Schau nochmal ins Wiki.
Es könnte auch helfen, nach der CPAN Installation neu zu starten. Aber das weiß ich nicht. Ich hatte das aber schon, das System hat beim ersten mal festgestellt das ein Modul fehlt und dann ist dieser "Fehler" solange da bis irgendwas (ich weiß es leider nicht besser) neu gestartet wird. Im Zweifelsfall das System ;)
Gruß Otto
Zitat von: Otto123 am 03 Februar 2017, 23:02:05
Du hast die 1;
am Ende gelöscht! Schlimmer Fehler.
noch schlimmer ist der Fehler, die _Initialize() Funktion gelöscht zu haben...
Zitat von: betateilchen am 03 Februar 2017, 23:07:15
noch schlimmer ist der Fehler, die _Initialize() Funktion gelöscht zu haben...
Stimmt habe ich übersehen. Das ist der Grund!
Dabei steht es doch wirklich genau hier drin? -> https://wiki.fhem.de/wiki/99_myUtils_anlegen#Eigene_Routinen_einf.C3.BCgen
Gruß Otto
Man braucht keinen WIKI Artikel, man muss einfach die in FHEM mitgelieferte Vorlage mit "Edit files" öffnen, unter dem richtigen Namen abspeichern und lesen, was dort drinsteht.
Hallo :(
ich gebe euch recht... aber in der anderen Datei steht es etwas verwirrender.
Ich habe mit der 99_myUtils noch nicht gearbeitet und da sah es für mich wie ein Beispiel aus.
Und da in der Anleitung steht:
Zuerst ist folgender Code in 99_myUtils.pl einzufügen:
Habe ich dies gemacht.
Mit der Änderung funktioniert das Script.
Die Erkennung aber leider noch nicht. Mal schauen wo da der Fehler zu suchen ist.
Gruß Martin
Zitat von: betateilchen am 03 Februar 2017, 23:16:23
Man braucht keinen WIKI Artikel, man muss einfach die in FHEM mitgelieferte Vorlage mit "Edit files" öffnen, unter dem richtigen Namen abspeichern und lesen, was dort drinsteht.
Wäre ja viel zu einfach ;D ich weiß Du magst das Wiki nicht ::)
Zitat von: martin2day am 03 Februar 2017, 23:18:14
Ich habe mit der 99_myUtils noch nicht gearbeitet und da sah es für mich wie ein Beispiel aus.
Und da in der Anleitung steht:
Zuerst ist folgender Code in 99_myUtils.pl einzufügen:
Habe ich dies gemacht.
Was wieder mal betateilchen Recht gibt :-X
Ich habe den Wikiartikel an dieser Stelle ergänzt/präzisiert.
So dann gute Nacht, jetzt beginnt gleich die Forumspause :P
Gruß Otto
Otto,
vielen Dank.
Das sind halt die Fehler über die man als Anfänger ganz schnell stolpert.
Als Pro bemerkt man das sicher gar nicht, weil man das einfach voraussetzt.
Auf alle Fälle funktioniert auch diese Option wunderbar.
Ich bin echt begeistert, wie zuverlässig das ganze funktioniert und umsetzbar ist.
Gruß Martin
Hallo zusammen
ich versuche nun seit 2 Tagen das ganze zu verwirklichen.
mein dhcp läuft auf einer NanoStation M5 und ich vermute dass die OID nicht übereinstimmt. Der snmp Server ist gestartet, aber unter der mitgelieferten OID im 99_myUtils kommt immer nur "absent"
DEF
function {snmpCheck("10.68.0.1","0x34a395d6843a")} 15 15
MODE function
NAME iPhone
NOTIFYDEV global
NTFY_ORDER 50-iPhone
STATE absent
TIMEOUT_NORMAL 15
TIMEOUT_PRESENT 15
TYPE PRESENCE
Readings presence absent 2017-02-10 19:21:16
state absent
oder hab ich was übersehen?
list vom Device bitte und die komplette Funktion die aufgerufen wird.
Hallo CoolTux
Danke für deine Hilfe, woher bekomme ich die "list vom Device"?
hier ist die 99_mmUtils
##############################################
# $Id: 99_Utils.pm 3595 $
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
sub
snmpCheck($$)
{
my ($airport,$client)= @_;
my $community = "public";
my $host = $airport;
my $oid = ".1.3.6.1.4.1.14988.1.1.1.2.1.3";
#my $oid = ".1.3.6.1.2.1.3.1.1.2.25.1.10.0.1";
my ( $session, $error ) = Net::SNMP->session(
-hostname => $host,
-community => $community,
-port => 161,
-version => 1
);
if( !defined($session) ) {
return 0;
return "Can't connect to host $host.";
}
my %r = ();
my $response = $session->get_next_request($oid);
my @nextid = keys %$response;
while ( $nextid[0] =~ m/^$oid/ ) {
@r{ keys %$response } = values %$response;
$response = $session->get_next_request( $nextid[0] );
@nextid = keys %$response;
}
$response = \%r;
foreach my $value (values %$response) {
return 1 if( $value eq $client );
}
return 0;
}
1;
In der FHEM Kommandozeile list iPhone eingeben.
Bau Dir in Deine Funktion Logausgaben ein. Kannst du am einfachsten mit printf machen. Die Ausgabe erscheint dann im fhem Log.
Ich gehe davon aus das Du Deine Funktion kennst. Schaue also wo er hängt. Der Socketaufbau funktioniert?
die list ist
Internals:
DEF function {snmpCheck("10.68.0.1","0x34a395b6843f")} 15 15
MODE function
NAME iPhone
NOTIFYDEV global
NR 111
NTFY_ORDER 50-iPhone_Robert_orig
STATE absent
TIMEOUT_NORMAL 15
TIMEOUT_PRESENT 15
TYPE PRESENCE
Readings:
2017-02-10 20:24:45 presence absent
2017-02-10 20:24:45 state absent
Helper:
ABSENT_COUNT 0
call {snmpCheck("10.68.0.1","0x34a395b6843f")}
Attributes:
room Anwesenheit
ich glaube es hängt aber an der oid, finde aber keine vernünftige Auskunft der oid's von der NanoStation
Nicht glauben, rausfinden
my $response = $session->get_next_request($oid);
Wie ist hier der Inhalt von $response? Warum lässt Du ihn dir nicht ausgeben?
das ist das Ergebnis von
print Dumper($response);
$VAR1 = {
'.1.3.6.1.4.1.41112.1.1.1.1.1' => 1
};
$VAR1 = {
'.1.3.6.1.4.1.41112.1.1.1.1.1' => 1
};
$VAR1 = {
'.1.3.6.1.4.1.41112.1.1.1.1.1' => 1
};
Also kommen anscheinend Daten. Ist es denn das was Du erwartet hast?
nein.
hab auch andere oid versucht. leider finde ich nicht die richtige für die NanoStaton.
das snmp Protokoll dürfte nicht reglementiert sein, leider.
es soll die Anzahl der angemeldeten Clienten und deren MAC erscheinen.
werde die Suche nicht aufgeben.