Bash und Python --> snmp

  • Hy zusammen,

    ich bin nun neu hier angemeldet da ich ein kleines Problem mit der Wertübergabe per SNMP an einen anderen RaspberryPi habe.

    Zur Ausgangslage:


    Ein RaspberryPi2 mit ein paar Temperatursensoren und einem DHT11.
    Dieser Raspberry zeigt mir schon wunderbar über MRTG und Routers2 die Werte der Sensoren,einigen Laptops und der CPU Temperatur eines neuen RaspberryPi3.
    RaspberryPi3 mit einem Luftdrucksensor BMP085.

    Etliches habe ich mir mit Codeschnippseln und Tutorials angepasst.

    Die CPU Temperatur des RPi3 ging ohne Probleme mit einer Anleitung via SNMP.


    Auf dem RPi3 habe ich den Luftdrucksensor zum laufen bekommen und habe mir das Script von Adafruit so angepasst das es mir nur den Wert des Luftdrucks ausgibt.
    Da ich nichts gefunden habe wie ich ein Pythonscript in die snmpd.conf einbinden kann habe ich einfach, wie in einem anderen Tutorial gesehen, das Phytonscript in ein Shellscript gepackt. Dies gibt mir ebenso nur den Wert aus. Das passt schonmal.

    Nun habe ich wie mit dem Temperaturscript für die CPU das selbe mit dem Barometerscript getan.
    Den SNMP Dienst habe ich auch neugestartet jedoch bekomme ich keine Werte über SNMP geliefert. Laut dem MIB-Browser ist das Script drin aber es kommen nachfolgend keine Werte.
    Anbei die Codes:

    Bash
    #!/bin/sh
    bar = /home/pi/Skripte/mrtg/barometer.py
    
    
    echo $bar
    Python
    #!/usr/bin/python
    import Adafruit_BMP.BMP085 as BMP085
    sensor = BMP085.BMP085()
    print (sensor.read_pressure())

    Ich hoffe es kann mir jemand damit helfen.
    Zusätzlich muss ich noch sagen dass ich nicht sonderlich viel Programmierkenntnisse besitze.
    Sollte ich etwas vergessen haben gebt mir einen Hinweis und ich liefere nach.

    MfG

  • Ich bin zu verkatert um dein ganzes Setup nachvollziehen zu koennen/wollen, aber eines faellt sofort auf: dein bash-script tut *nicht*, was du glaubst das es tut.

    Um bar den Wert die Ausgabe des Skriptes annehmen zu lassen, musst du "command substition" verwenden:

    Code
    variable = $(kommando)

    Unter der Annahme das barometer.py ausfuehrbar ist (shebang scheint ja zu stimmen), fehlen da also noch $().

  • Hmm.

    Da gehts schon los. Ich habe mir jetzt nun ein paar Googleergbnisse angesehen und andere vorhandene Scripte um daraus schlau zu werden.
    Auch habe ich mir nochmal das bereits funktionierende Script für die CPU Temperatur angesehen was wie folgt aussieht.

    Bash
    #!/bin/bash
    tempread=`cat /sys/class/thermal/thermal_zone/temp`
    temp=`echo "scale=2; $tempread / 1000" | bc`
    
    
    echo=$temp

    sowie das was an snmp übergeben wird

    Bash
    #!/bin/sh
    
    
    /home/pi/Skripte/mrtg/cpu_raspberry3.sh | sed s/[.]//g | tr [:space:] \\n

    Das geht ja.

    Nun hatte ich versucht deinen Hinweis in die Tat umzusetzen mit

    Code
    bar = $/home/pi/Skripte/mrtg/barometer.py


    oder auch als

    Code
    bar=$(home/pi/Skripte/mrtg/barometer.py)


    auch schreibweisen mit `` oder "".

    Gibt es vielleicht irgendwo ein Tutorial wo erklärt wird wie man externe Ausgaben einliest? Ich finde immer nur sachen wie ich einen Dateipfad ausgeben kann oder wie ich ein Backup anfertige.
    Ich bin ja Lernwillig aber ich benötige eben Hilfe dazu.

    Danke erstmal für deine Hilfe

  • Das ist einer der Gruende, warum ich BASH bloede finde - Leerzeichen sind an den komischsten Stellen relevant oder nicht.

    Fuer mich funktioniert sowohl der backtick als auch $(kommand), aber nur genau so:

    Bash
    #!/bin/bash
    foo=$(/tmp/test.py)
    bar=`/tmp/test.py`
    echo "FOO: $foo"
    echo "BAR: $bar"

    test.py gibt einfach nur etwas aus, und - WICHTIG - ist natuerlich ausfuehrbar. Sprich auf der Kommandozeile reicht "$ /tmp/test.py" einzugeben, man muss *nicht* python davor schreiben.

    Wenn man aber

    Code
    foo = $(...)

    schreibt (also Leerzeichen um das gleich, so wie du es gemacht hast), geht's nicht mehr.

    Tutorials gibt es bestimmt zuhauf - bash shell programming oder aehnliche Dinge kannst du googeln, und da kommt vieles bei rum. Oder ein paar O'Reilly Buecher kaufen.

  • Ok dass funktioniert nun. Danke

    Jedoch kommen noch keine Werte über snmp

    die Zeile in der snmpd.conf sieht wie folgt aus.

    Code
    extend-sh barometer /bin/sh /home/pi/Skripte/mrtg/barometer.sh

    dies habe ich anhand des bereits funktionierenden CPU-Temp Beispiels angelegt.

  • So wie es aussieht, gibt das Script doch direkt den gefragten Wert aus.
    Die Zuweisung an die Variable ist also gar nicht noetig.

    Also mal so probieren:

    Code
    #!/bin/[b]bash[/b]
    /home/pi/Skripte/mrtg/barometer.py

    (Ich wuerde bash nehmen weil sh vielleicht eine andere Shell ist)

    Oder gleich das andere Script direkt aufrufen, ich sehe keinen Grund warum das nicht gehen sollte.

  • Ich habe jetzt beides getestet. Sowohl das script auf #!/bin/bash umgeändert als auch versucht das Pythonscript in der snmpd.conf aufzurufen. Es bleibt dabei. Mit einem snmpwalk finde ich weiterhin keine brauchbaren Werte.

    Gibt es denn noch einen anderen Weg um den RaspberryPi2 die Werte des RPi3 zukommen zulassen?
    Was ich auch nicht verstehe ist warum die Werte der CPU Temperatur gut ankommen.

    Unter Delphi kannte ich es dass man einer Variable auch einen Datentyp zuweisen muss. Gibt es das hier nicht? Ist jede Zahl ein integer oder float?

    Danke erstmal

  • Da ich nun immer weiter hin und her getestet hatte aber nichts finden konnte warum es nicht geht hängt der Sensor nun an dem ersten, dem eigentlichen Monitoring Raspberry.
    Die eigentliche Idee war zwei räumlich ( mehrere Kilometer entfernt voneinander) getrennte Systeme mit Wetteraufzeichungen laufen zu lassen und diese auf einem MRTG Server auswerten zu lassen. Die Verbindung sollte über VPN geschehen.

    Wenn ich das nächste mal Zeit habe werde ich die Werte in eine Textdatei ausgeben lassen welche auf einem Netzlaufwerk liegt und so die Daten vom Server auslesen lassen.

    Danke dennoch für eure Hilfestellung.

  • Danke dennoch für eure Hilfestellung.

    Da ist noch etwas:

    snmp braucht einen Parametersatz, hier am Beispiel des SenseHat (AstroPi)

    Client

    Code
    /usr/local/bin/snmp_sense-hat_hum-temp.py 
    
    
    .1.3.6.1.2.1.25.1.9
    gauge
    25244
    raspi15

    Das ist das Python-Script dahinter:

    Der "factor" ist für die Ungenauigkeit des SenseHat.
    Die Multiplikation dient dazu,um möglichst genaue Daten (5stellig) zu übertragen.
    Mein snmp frisst nur Integer.

    Das hier ist der MRTG-Teil:

    YTicsFactor[] und Factor[] dienen jetzt wieder dazu, um den 5stelligen Wert auf eine normale Temperaturanzeige zu bekommen.

    Und hier der snmpd-Teil des Client:

    Code
    pass .1.3.6.1.2.1.25.1.8 /usr/local/bin/snmp-cpu-temp
    pass .1.3.6.1.2.1.25.1.9 /usr/local/bin/snmp_sense-hat_hum-temp.py
    pass .1.3.6.1.2.1.25.1.10 /usr/local/bin/snmp_sense-hat_press-temp.py


    Einmal ein Bash-Script, und 2 Python-Scripte mit 2 Temperaturwerten, der Code sieht ähnlich aus.

    snmp neu starten, sollte so laufen, falls nicht, wirds mühsam, ich kämpfe gerade seit Freitagabend
    nach einem Upgrade mit Rechteproblemen. Vorher lief alles einwandfrei.

    Test:
    snmpget -v 2c -c public 127.0.0.1 .1.3.6.1.2.1.25.1.9


    Wenn das kommt:

    Code
    iso.3.6.1.2.1.25.1.9 = No Such Instance currently exists at this OID


    dann hast Du meistens ein Rechte-Problem, so wie ich seit Freitag.
    Die Abfrage der CPU-Temperatur funktioniert allerdings:

    Code
    iso.3.6.1.2.1.25.1.8 = Gauge32: 49388


    Sehr interessanter Link  und schau mal hier hinein

    Viel Spass beim Basteln

    Jürgen

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!