Einen wert per SNMP pollen

Begonnen von crispyduck, 23 Januar 2016, 08:01:10

Vorheriges Thema - Nächstes Thema

crispyduck

Hallo,

Bin noch ziemlicher Anfänger, habe bis jetzt nur einen Stromzähler mit Modbus und einen über S0 eingebunden.

Habe nun zwei Ethernet Temperatur Fühler bei welchen der wert nur via SNMP gepollt werden kann, oder direkt am eingebauten Webserver abgelesen werden kann.

Gibt es nicht eine einfache Möglichkeit eine einzige OID zu pollen und den Wert dann anzuzeigen, bzw. auch zu loggen?

Habe jetzt schon viel gesucht und einiges gelesen, aber bis jetzt nur Systat und Presence,  als Modul gefunden welche SNMP nutzen.

Ich brächte wie gesagt nur einen einzigen Wert einer OID.
Eventuell müsste ich diesen für die Verarbeitung noch anpassen; bekomme entweder als Str "21,5" oder als Int "215" für 25,5°C.

Wäre super wenn sich das über SNMP lösen lässt, ansonsten werde ich die Werte wohl mit Httpmod abfragen müssen.

Danke,
Crispyduck

marvin78

Ein at mit Funktionsaufruf einer sub in der myUtils. Diese sollte sowas enthalten:

$result=qx(snmpget -v 1 -c private 192.168.XX.XX iso.3.6.1.2.1.105.1.1.1.3.1.54 i 1)

Dann das Ergebnis in einen dummy schreiben und loggen. Voraussetzung ist, dass Net-Snmp auch installiert ist.

crispyduck

Okay, danke erstmals.

Muss mich wohl noch etwas einlesen wie das in der myUtils aussieht und wie ich das dann in ein dummy bekomme.

Hab jetzt gerade mal 3 Tage FHEM laufen, und alles mal auf einer Synology DS215j zum laufen zu bringen war nicht so einfach. Vorallem Device::SerialPort auf der NAS zum laufen zu bringen war echt eine Spielerei.

Lg,
Andi

UliM

Hi,
zum Auslesen der Werte aus dem Webserver könntest Du Dir mal HTTPMOD anschauen.
Gruß, Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

crispyduck

Hi,

ja HTTPMOD hab ich mir schon angesehen, und werde ich sicher auch noch benutzen, aber hier würde ich doch gerne SNMP nutzen, weil es wie ich finde für diese Anwendung doch irgendwie sauberer ist.

THX,
Andi

crispyduck

#5
Hallo,

okay, bin mal etwas schlauer, aber funktionieren tut es leider auch noch nicht.

erstens einmal hab ich probleme snmpget via FHEM zu sterten:
PERL WARNING: Can't exec "snmpget": No such file or directory at /usr/local/FHEM/share/fhem/FHEM/99_myUtils.pm line 23

Via commandline geht die Abfrage ohne Probleme:
nynasxxx> snmpget -v 1 -c public 10.0.0.41 iso.3.6.1.4.1.21795.4.1.3.1.4.1
SNMPv2-SMI::enterprises.21795.4.1.3.1.4.1 = STRING: "22.0"

Hab nun auch ein dummy angelegt (Temp1), allerdings bin ich mir noch nicht sicher wie ich den return Wert der Funktion korrekt in das dummy schreibe.

define Temp1job at +*00:01:00 {fhem("set Temp1 { snmpTemp("10.0.0.41") }");;}
oder
define Temp1job at +*00:01:00 {my $val = { snmpTemp("10.0.0.41") };;fhem("set Temp11 $val");;}
oder
muss ich das direkt in der funkton machen?

Meine myUtils:
package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.
sub snmpTemp($) {
my ($ip) = @_;
my $result;
$result=qx(snmpget -v 1 -c public $ip iso.3.6.1.4.1.21796.4.1.3.1.4.1);
return $result;
}
1;

Bin für jeden Tip dankbar. ;-)

PS: Ach ja; net-snmp hab ic via IPKG auf der NA installiert, da cpan leider nicht richtig funktioniert. Kann es sein das daher PERL nicht auf snmpget zugreifen kann?

Lg,
Andi

vbs

Was spricht eigentlich dagegen, das SYSSTAT-Modul zu nutzen, um die SNMP-Sachen zu holen?

marvin78

Bitte verwende Code Tags. Es ist extrem anstrengend, das so zu lesen.

Code für DEF im Frontend:

+*00:01:00 {my $val = snmpTemp("10.0.0.41");fhem("set HWgSTE1 $val")}


Code für myUtils:


sub snmpTemp($) {
  my ($ip) = @_;
  my $send="snmpget -v 1 -c public $ip iso.3.6.1.4.1.21796.4.1.3.1.4.1";
  my $result;
  $result=qx($send);
  return $result;
}


Ungetestet.

crispyduck

THX,

Ja, sorry ist wirklich sch... zu lesen.

Muss nun erst mal snmpget via PERL zum laufen bringen.

Lg,
Andi

marvin78

So wie ich es gepostet habe, müsste es gehen (ungetestet). Die Variable kann man nicht so einfügen, wie du es oben gemacht hast. Sonst schau mal ins Log.

crispyduck

Hi, danke.

Das define dürfte noch nicht ganz passen; aber vorerst bekomme ich auch mit der myUtils Funktion von dir den Fehler:
2016.01.23 19:56:12 1: PERL WARNING: Can't exec "snmpget": No such file or directory at /usr/local/FHEM/share/fhem/FHEM/99_myUtils.pm line 24.


Lg,
Andi

crispyduck

#11
Ok, scheint doch das das Perl NET::SNMP modul nicht richtig intalliert ist.

Hab jetzt am Anfang meiner myUtils Funktion use Net::SNMP; hinzugefügt, was zu folgendem Fehler führte:

Can't locate Net/SNMP.pm in @INC (you may need to install the Net::SNMP module) (@INC contains: /usr/lib/perl5/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl . /usr/local/FHEM/share/fhem/FHEM) at /usr/local/FHEM/share/fhem/FHEM/99_myUtils.pm line 21. BEGIN failed--compilation aborted at /usr/local/FHEM/share/fhem/FHEM/99_myUtils.pm line 21.


Rest dürfte funktionieren; hab snmpget mal durch einem anderen befehl ersetzt und da funktioniert es.

Define siehrt jetzt so aus:
define Temp11job at +*00:01:00 {my $var = snmpTemp("10.0.0.41");;fhem ("set Temp1 $var" );;}

Werde morgen oder nächste Woche mal propieren net-snmp mit make und ./configure --with-perl-modules zu installieren.

Anscheinend fehlt bei der über IPKG installierten Version das Perl Modul.

Lg,
Andi

crispyduck

Okay, das war der falsche Ansatz, hatte noch etwas zu wenig Ahnung von Perl.  :P

Das problem lag eher daren das FHEM snmpget nicht gefunden hat; lösung war ganz simpel, einfach fhem.sh um "USBU=/opt/bin" ergänzen:


#!/bin/sh
#
#
HOME=/usr/local/FHEM
PERL=/usr/local/perl
USBU=/opt/bin
KMOD=/var/packages/usb-driver-kernel
PATH=$HOME:$PERL:$USBU:$PATH
export PATH


und die Funktion in der myUtils.pm funktioniert eigentlich auch so wie schon von marvin78 vorgeschlagen:


sub snmpTemp($) {
  my ($ip) = @_;
  my $result=qx(snmpget -v 1 -c public $ip iso.3.6.1.4.1.21796.4.1.3.1.4.1);
  return $result;
}


Funktioniert soweit nun mal mit aufruf von snmpget.

Da ich nun aber auch das perl modul Net::SNMP zum laufen gebracht habe bin ich noch am überlegen ob ich die Funktion nicht noch umschreibe und den wert direkt mit perl abfrage ohne snmpget aufzurufen.

Lg,
Andi

justme1968

schau dir doch mal das SYSSTAT modul und die aktuelle test version hier: http://forum.fhem.de/index.php/topic,42771.msg348498.html#msg348498 an.

damit kannst du snmp abfragen direkt in readings verwandeln. in der test version auch komplett non blockiging.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

crispyduck

Danke!

ja, werde es über SYSSTAT lösen, will damit ohnehin noch meien NAS selbst so wie auch meinen zweiten FHEM Server im Heizraum welcher, wenn dann endlich das Optolink Kabel da ist mit der Vissmann Vitotronic sprechen soll.

Vor hätte ich da noch einiges, hoffe nur das mich die Motivation nicht wieder verlässt.  ;)

Lg,
Andi