Zum Inhalt

Pi trifft den Graphen

Vor Kurzem hatte ich mich auf die Schnelle mit dem BMP085 auseinander gesetzt. Und da Adafruit gute Vorarbeit leistete, war das Endergebnis recht schnell erreicht und ich hatte die drei Werte, welche der Sensor ausgeben kann, aus dem unendlichen Schwarz der Konsole auf den Schirm gelockt. Leider sind die Werte dort nicht wirklich nützlich. Also habe ich mir einen Tag Zeit genommen, um noch ein wenig mit dem Sensor zu spielen, die Werte zu speichern und über ein gefälligeres Medium – einen Browser – auszugeben.

rrdplot_titel

Hier nun ein kurzer Abriss darüber, wie ich es anstellte, was ich mir dabei dachte und wie ihr es mir nachmachen könnt, gesetzt den Fall, ihr seid im Besitz eines Raspberrys und eines BMP085. Am Ende könnt ihr euch hier auch das Python-Script laden und selber etwas experimentieren. Und hey, solltet ihr Fragen oder Tipps haben, einfach ab damit in die Kommentare. Aber beginnen wir.

Ich starte hier nicht von Null, sondern gehe davon aus, dass ihr den Sensor schon einmal kurz in Betrieb genommen habt. Solltet ihr das noch nicht erledigt haben, dann findet ihr hier die Anleitung dazu: [KLICK]

Folgendes wollte ich erreichen: Die Messwerte des Sensors sollen in einer Round Robin Datenbank gespeichert werden. Mit Hilfe dieser Datenbank sollen Kurven geplottet und als PNG-Datei auf dem Webserver abgelegt werden, um sie dann über eine Html-Seite abrufen zu können. Somit benötigen wir auf dem Raspberry einen Webserver und das RRD-Tool. Um das RRD-Tool über Python ansprechen zu können, gibt es eine Erweiterung. Das hat die ganze Sache sehr einfach gestaltet.

Da ich die meiste Zeit mit Apache2 arbeite, habe ich diesen Webserver für meine Umsetzung gewählt. Natürlich geht auch jeder anderer Webserver. Mit dem folgenden Befehl installiert ihr die nötige Software:

  • sudo apt-get install apache2 rrdtool python-rrd

Ist das erledigt, erstellt ihr einen Ordner im WWW-Verzeichnis eures Servers, wo ihr später die Grafiken ablegt.

  • mkdir/var/www/plots

Ich habe es „plots“ genannt. Natürlich könnt ihr eure Grafiken auch direkt in das www-root legen. Dann bleibt euch dieser Schritt hier erspart. Wichtig ist nur, dass ihr euch den richtigen Pfad merkt, da ihr den dann gegebenenfalls im Script anpassen müsst. Des Weiteren habe ich in das gleiche Verzeichnis eine ganz einfache HTML-Datei hinterlegt, welche schon die richtigen Links zu den Grafiken beinhaltet und sich alle 60 Sekunden automatisch neu lädt.

index_html

Das Python-Script mit dem Hauptprogramm habe ich unter /home/pi/Adafruit-Raspberry-Pi-Python-Code/Adafruit_BMP085/ abgelegt, da sich dort auch die Bibliothek zum Ansprechen des Sensors befindet. Als globale Variablen habe ich den Datenbank-Name, den Filename, den Zeitintervall für die Messung, den Pfad für die Grafiken und die Schleifenbedingung deklariert. Wenn Ihr die Grafiken direkt in das Root-Verzeichnis von eurem Webserver legen wollt, dass müsst ihr hier den Pfad in „/var/www/“ abändern.

bmp085_rrd_01

Danach lasse ich kontrollieren, ob die Datenbankdatei eventuell schon vorhanden ist. Ist sie es nicht, dann wird sie neu angelegt und für die drei Werte (Temperatur, Luftdruck, Höhenlage) vorbereitet. Ist die Datei schon vorhanden, dann wird diese genommen und weiter mit den nächsten Werten befüllt. Sie wir also fortgesetzt und nicht gelöscht. Das hat den Vorteil, dass man bei einem Stromausfall nur eine Lücke, nicht aber einen Komplettverlust aller alten Werte zu befürchten hat.

bmp085_rrd_02

3. Sensor initialisieren, Bildschirmausgabe (ungenutzt)

bmp085_rrd_03

Hier nun seht ihr die Funktion zum Plotten der Graphen. Es wird nur der Wert der Messgröße übergeben und danach erstellt die Funktion drei unterschiedliche Grafiken: für die täglichen, die wöchentlichen und die monatlichen Werte. Die Grafiken werden in dem oben angegebenen Pfad abgelegt.

bmp085_rrd_04

Das Hauptprogramm ist – wie ich finde – selbsterklärend. Es werden die drei Werte ermittelt, anschließend in die RRD-Datei geschrieben und danach wird die Funktion zum Plotten der Grafik aufgerufen. Die ersten beiden Zeilen sind hier im Prinzip überflüssig, da ich das Datum und die Uhrzeit nur für die Bildschirmausgabe benötige, welche jedoch deaktiviert ist. In meinem ersten Script wollte ich die Werte erst in eine SQLite-Datenbank schreiben. Das habe ich jedoch aufgegeben, da eine RRD-Datei für das Speichern von Messwerten optimiert ist. Eine RRD-Datei ist kompakter, da sie sich alleine aufräumt. Das heißt je älter ein Messwert ist, desto wahrscheinlicher ist es, dass er aus der Datenbank gelöscht wird. Je weiter die Kurve zurück reicht, um so unschärfer wird sie. Meiner Meinung nach ist das jedoch sehr gut zu verkraften, da man bei den alten Temperaturwerten nur noch einen Trend sehen möchte und keine genauer Werte.

Ich habe hier nur die Temperatur und den Luftdruck plotten lassen, da sich die Höhenlage eher nicht verändert. Solltet ihr auch diesen Wert plotten lassen wollen, dann fügt einfach nach der Messung ein plotten(‚alti‘) ein. Allerdings vergesst danach nicht, die Grafiken in der HTML-Datei zu verlinken. Sonst seht ihr nichts.

bmp085_rrd_05

Das Script ist noch lange nicht vollkommen, jedoch ist es ein guter Anfang. Wenn man es kürzer haben möchte, kann man sämtliche Bildschirmausgaben aus dem Script löschen. Ich habe sie im Script gelassen, da ihr so beim ersten Test mehr Informationen bekommt und sich so vielleicht einige Fragen selber beantworten. Später könnt ihr es ja optimieren.

Sicher gibt es bessere Techniken und Möglichkeiten, eine RRD-Datei auszulesen und zu visualisieren (z. B. Cacti), allerdings zum Spielen und um ein wenig Erfahrungen mit dem Sensor zu sammeln, war das Python-Script in Verbindung mit dem RRD-Tool genau die richtige Wahl.

Noch ein kleiner Tipp: Wenn ihr die Konsole schließt, dann beendet ihr damit auch automatisch das Phyton-Script. Damit das nicht passiert, bzw. das Script auch nach dem Schließen der SSH-Konsole im Hintergrund weiter läuft, startet das Script mit dem folgenden Befehl:

  • nohup python BMP085_rrd_v2.py > /var/www/script.log

Alle Fehlerausgaben, werden dabei in eine log-Datei unter /var/www/script.log abgelegt. So könnt ihr dort nachsehen, wenn etwas schief läuft. Nach ein paar Stunden Testlauf bekam mein Auge dann die folgenden Graphen zu sehen und ich war vorerst zufrieden:

rrdplot01             rrdplot02

So, nun seid ihr an der Reihe. Hier ist das Script und die HTML-Datei: [BMP085] Viel Spaß beim Spielen.

Published inNützlichesRaspberry

23 Comments

  1. ines ines

    Hallo
    Dein Script funktioniert wunderbar danke
    wo wird eigentlich die datenbank abgelegt…

    • dasI dasI

      Hi ines. Vielen Dank für Deinen Kommentar. Die Datenbankdatei heißt bmp085.rrd und wird vom Script im gleichen Ordner erzeugt, wo Du das Script abgelegt hast. Gruß, dasI

      • ines ines

        Versuche die Daten noch zu googledocs zu exportieren mit hilfe vom adafruitsgoogledocs script nur schreibt er mir dort keine korrekten daten obwohl im Terminal alles korrekt ausgelesen wird.
        Vielleicht die Tabelle falsch formatiert obwohl mit dem Sensor DHT11 funktioniert es mit googledocs…

        • dasI dasI

          Hoi ines, mit googledocs habe ich nur ein bisschen gespielt, als ich mit Hilfe eines DS18S20 über one-wire die Temperatur gemessen habe. Wenn Du magst, kann ich Dir das Script per Mail schicken. Ich habe mich dabei an diese Seite gehalten:[KLICK] Da steht im Prinzip alles, was man wissen muss, um zum Ziel zu kommen. Stellst Du Deine Sachen ebenfalls irgendwo online? Dann schaue ich gern auch mal über Dein Script.

          Vielleicht komme ich ja am WE dazu, selber mal googledocs zu integrieren. Interessant finde ich es schon. 🙂

          Gruß, dasI

          • ines ines

            Wäre nett wenn du mir das script zukommen läßt.Ich habe eigentlich nur das orginal
            von Adafruits genommen.
            http://learn.adafruit.com/bmp085/using-the-bmp085
            Online stell ich erst mal nichts da ich noch am Python lernen bin zu fehlerhaft um das zu veröffentlichen.
            Zur Zeit versuche ich ein DHT11 mit in dein Script zu integrieren mal sehen ob das was wird.

            Ines

          • dasI dasI

            Hoi ines. Ich habe mich am WE hingesetzt und mal mit Google-Docs und dem BMP085 etwas gespielt. Das Ergebnis kannst Du hier sehen: [KLICK] Ich denke das hilft Dir mehr, als wenn ich Dir einfach das Script schicke. Solltest Du Fragen haben, dann weißt Du ja, wie Du mich findest. 🙂

            Im Übrigen bin ich ebenfalls ein blutiger Anfänger, was das Programmieren mit Python betrifft und somit sind auch bei mir Fehler nicht ausgeschlossen. Aber das ist ja der Sinn dieses Austausches hier: Ich will selber besser werden. Also veröffentliche Deine Ergebnisse ruhig online.

            Gruß, dasI

  2. ines ines

    Danke für deine Hilfe werde mich am Wochenende mal hinsetzen und versuchen deinen Code zu verstehen.
    Ich lerne erst seit ca 1 woche Python und es wird wohl noch eine Weile dauern bis ich was eigenes schreibe.Zur Zeit baue ich auch noch eine Alarmanlage mit Reed Kontakten PIR-Sensor und Webcam. Das Grundgerüst habe ich mir aus dem Netz geladen und für mich erweitert und angepaßt… wird natürlich noch dauern bis das fertig ist. Ziel ist es dann alles später mit den anderen Sensoren per php grafisch darzustellen..

  3. Dreamoffice Dreamoffice

    Hallo
    Ich habe alles nach Anleitung installiert und beim Ausfuehren bekomme ich diese Meldung

    pi@raspberrypi ~/Adafruit-Raspberry-Pi-Python-Code/Adafruit_BMP085 $ sudo ./BMP085_rrd_v2.py
    Traceback (most recent call last):
    File „./BMP085_rrd_v2.py“, line 7, in
    import rrdtool
    ImportError: No module named rrdtool

    kann sich einer erklaeren woran es leiegen koennte? RRDTOOL ist installiert

    Gruss Dreamoffice

    • dasI dasI

      Hallo Dreamoffice. Ich habe Dir gerade eine Mail geschrieben. Scheinbar ist die Mail, die ich Dir über FB geschrieben habe, doch nicht bei Dir angekommen. Wie dem auch sei – zu Deinem Problem: Python benötigt natürlich das zugeordnete Modul, welches aber erst installiert werden muss. Bei Dir ist das scheinbar nicht passiert, deshalb führe bitte folgenden Befehl auf Deinem Raspberry in der Konsole aus:

      sudo apt-get install python-rrd.

      Danach sollte es auch mit dem Script klappen. Gruß, dasI

  4. Dreamoffice Dreamoffice

    Danke geht perfekt

    ich habe dir auch eine email geschickt

    • ines ines

      Habe versucht das ganze mit einem 1wire Sensor nachzubauen.
      Hier mein Script
      #!/usr/bin/python
      # -*- coding: utf-8 -*-

      from time import sleep
      import sys
      import datetime
      import time
      import os
      import rrdtool

      dbname = ‚1wire‘
      rrd_root = „/home/mikelsoft/rrd/“
      rrd_graph_root = „/var/www/1wire/“
      log_rrd = True

      sensor_list = []
      sensor_locations = []
      sensor_dict = {}

      dead_max = 80
      dead_hi = -0.02
      dead_lo = -0.08
      error_temp = -999

      verbose_level = 1
      read_sens = 1

      def LogToRRD (rrdKey, rrdValue, rrdDevice, graphLabel, graphColour):
      if not os.path.exists(rrd_root + rrdDevice + „.rrd“):
      print „Erzeuge Datenbankn“
      ret = rrdtool.create(rrd_root + rrdDevice + „.rrd“, „–step“, „60“,
      „DS:“ + rrdKey + „:GAUGE:120:-273:5000“,
      „RRA:AVERAGE:0.5:1:1200“,
      „RRA:MIN:0.5:12:2400“,
      „RRA:MAX:0.5:12:2400“,
      „RRA:AVERAGE:0.5:12:2400“)

      ret = rrdtool.update(rrd_root + rrdDevice + „.rrd“, ‚N:‘ + str(rrdValue));
      ret = rrdtool.graph(rrd_graph_root + rrdDevice + „_stunde.png“, „–start“, „-4h“, „–title=“ + rrdDevice.title() + “ Letzte Stunde“,
      ‚–watermark=zentis.dyndns.org‘,
      „-w 800“,
      „–alt-autoscale“,
      „DEF:“ + rrdKey + „=“ + rrd_root + rrdDevice + „.rrd:“ + rrdKey + „:AVERAGE“,
      „LINE1:“ + rrdKey + graphColour + „:“ + rrdKey + “ “ + graphLabel)

      ret = rrdtool.graph(rrd_graph_root + rrdDevice + „_tag.png“, „–start“, „-4d“, „–title=“ + rrdDevice.title() + “ Diesen Tag“,
      ‚–watermark=zentis.dyndns.org‘,
      „-w 800“,
      „–alt-autoscale“,
      „DEF:“ + rrdKey + „=“ + rrd_root + rrdDevice + „.rrd:“ + rrdKey + „:AVERAGE“,
      „LINE1:“ + rrdKey + graphColour + „:“ + rrdKey + “ “ + graphLabel)

      ret = rrdtool.graph(rrd_graph_root + rrdDevice + „_monat.png“, „–start“, „-1m“, „–title=“ + rrdDevice.title() + “ Diesen Monat“,
      ‚–watermark=zentis.dyndns.org‘,
      „-w 800“,
      „–alt-autoscale“,
      „DEF:“ + rrdKey + „=“ + rrd_root + rrdDevice + „.rrd:“ + rrdKey + „:AVERAGE“,
      „LINE1:“ + rrdKey + graphColour + „:“ + rrdKey + “ “ + graphLabel)

      def read_sensor(sensor_slave):

      sensor_device = ‚/sys/bus/w1/devices/‘ + str(sensor_slave) + ‚/w1_slave‘
      try:
      file = open(sensor_device)
      filecontent = file.read()
      file.close()
      stringvalue = filecontent.split(„n“)[1].split(“ „)[9]
      if stringvalue[0].find(„YES“) > 0:
      temp = error_temp
      else:
      temp = float(stringvalue[2:]) / 1000
      except IOError:
      print „PANIC read_sensor – Cannot find file >“ + sensor_slave + “ cat /sys/devices/w1_bus_master1/w1_master_slaves“
      sys.exit(1)
      #
      return(temp)
      while (True):

      sensor_count = 0
      sensor_slaves = ‚/sys/devices/w1_bus_master1/w1_master_slaves‘
      file = open(sensor_slaves)
      w1_slaves = file.readlines()
      file.close()
      print(‚Sensor ID | Temperature‘)
      print(‚—————————–‚)
      for line in w1_slaves:
      w1_slave = line.split(„n“)[0]
      #time.sleep(0.2)
      temperature = read_sensor( w1_slave)
      if log_rrd == True:
      LogToRRD(„Temperature“,temperature,“temp“, „[deg C]“, „#CC0000“)
      funktoniert aber nicht erzeugt nur leere Grafiken.Vieleicht kannst du mir ja helfen
      was an dem Script falsch ist.
      Mit einen DHT11 habe ich es hinbekommen nur bei
      diesen klappt es nicht.
      Die Sensoren funktionieren kann sie per Whatsup per Script auslesen ohne Probleme.
      cu Inesa

      • dasI dasI

        Hallo Inesa. Ich habe mal eben die 1-wire-Schaltung zusammengesteckt und Dein Script ausprobiert. Ohne Dir auf die Füße treten zu wollen, aber das Script würde schöner aussehen und wäre besser zu verstehen, wenn Du ihm ein paar hilfreiche Kommentare spendieren würdest. 😉

        Wie dem auch sei, bei mir hat das Script funktioniert. Allerdings hatte ich kleine Probleme mit der Formatierung und ich habe die RRD-Datei mit ins WWW-Verzeichnis geschrieben. temp_stunde Ich packe Dir das Script mal als Anhang hier [KLICK] an den Kommentar. Vielleicht nimmst Du das einfach, überträgst es auf Deinen Raspberry und probierst es noch einmal aus.

        Und überprüfe doch bitte einmal, ob das Script wirklich in die RRD-Datei schreibt. Schau Dir mal die Skala Deiner Grafiken an. Wenn da nur 0,-Werte stehen, dann schreibt er keine Daten.

        Gruß, dasI

        PS.: Hast Du meine Mail bekommen?

  5. ines ines

    Hallo
    Und vielen dank für deine hilfe.
    eine email habe ich nicht bekommen vieleicht
    mal inesaweiser@gmail probieren.
    Das Script schreibt jetzt in die Datenbank
    und gibt mir auch einen Grafen aus. 🙂
    Die Größe der Datenbank ändert sich aber nicht ??
    Da ich mehere Sensoren betreiben will habe
    ich das Script nochmal abgeändert
    und dieser code ist dabei rausgekommen.
    (ich denke diesmal auch besser kommentiert) 🙂
    Diesmal aber habe ich das Problem das rrd nur eine Temp darstellt im Grafen. Bei der ausgabe in der Konsole werden mir beide Temperaturen angezeigt.

    Hier mal der code vom Script vieleicht hast du ja noch mal einen tip für mich wie ich das besser mache

    bis bald
    Inesa

    #!/usr/bin/python
    # -*- coding: utf-8 -*-

    from time import sleep
    import sys
    import datetime
    import time
    import os
    import rrdtool
    from time import *

    dbname = ‚1wire‘
    steps = 25
    rrd_root = „/home/mikelsoft/rrd/“
    rrd_graph_root = „/var/www/bmp085/“
    log_rrd = True

    # Zeitvariable definieren
    lt = localtime()

    d
    def LogToRRD (rrdKey, rrdValue, rrdDevice, graphLabel, graphColour):
    if not os.path.exists(rrd_root + rrdDevice + „.rrd“):
    print „Erzeuge Datenbankn“
    ret = rrdtool.create(rrd_root + rrdDevice + „.rrd“, „–step“, „60“,
    „DS:“ + rrdKey + „:GAUGE:120:-273:5000“,
    „RRA:AVERAGE:0.5:1:1200“,
    „RRA:MIN:0.5:12:2400“,
    „RRA:MAX:0.5:12:2400“,
    „RRA:AVERAGE:0.5:12:2400“)

    ret = rrdtool.update(rrd_root + rrdDevice + „.rrd“, ‚N:‘ + str(rrdValue));
    ret = rrdtool.graph(rrd_graph_root + rrdDevice + „_stunde.png“, „–start“, „-4h“, „–title=“ + rrdDevice.title() + “ Letzte Stunde“,
    ‚–watermark=zentis.dyndns.org‘,
    „-w 800“,
    „–alt-autoscale“,
    „DEF:“ + rrdKey + „=“ + rrd_root + rrdDevice + „.rrd:“ + rrdKey + „:AVERAGE“,
    „LINE1:“ + rrdKey + graphColour + „:“ + rrdKey + “ “ + graphLabel)

    ret = rrdtool.graph(rrd_graph_root + rrdDevice + „_tag.png“, „–start“, „-4d“, „–title=“ + rrdDevice.title() + “ Diesen Tag“,
    ‚–watermark=zentis.dyndns.org‘,
    „-w 800“,
    „–alt-autoscale“,
    „DEF:“ + rrdKey + „=“ + rrd_root + rrdDevice + „.rrd:“ + rrdKey + „:AVERAGE“,
    „LINE1:“ + rrdKey + graphColour + „:“ + rrdKey + “ “ + graphLabel)

    ret = rrdtool.graph(rrd_graph_root + rrdDevice + „_monat.png“, „–start“, „-1m“, „–title=“ + rrdDevice.title() + “ Diesen Monat“,
    ‚–watermark=zentis.dyndns.org‘,
    „-w 800“,
    „–alt-autoscale“,
    „DEF:“ + rrdKey + „=“ + rrd_root + rrdDevice + „.rrd:“ + rrdKey + „:AVERAGE“,
    „LINE1:“ + rrdKey + graphColour + „:“ + rrdKey + “ “ + graphLabel)

    # 1-Wire Slave-Liste oeffnen
    while (True):
    file = open(‚/sys/devices/w1_bus_master1/w1_master_slaves‘) #Verzeichniss evtl.$

    # 1-Wire Slaves auslesen
    w1_slaves = file.readlines()

    # 1-Wire Slave-Liste schliessen
    file.close()

    # Bildschirmausgabe
    print(‚Sensor ID | Temperatur‘)
    print(‚—————————-‚)

    # Versuche Alle Sensoren auslesen
    for line in w1_slaves:

    # 1-wire Slave extrahieren
    w1_slave = line.split(„n“)[0]

    # 1-wire Slave Datei oeffnen
    file = open(‚/sys/bus/w1/devices/‘ + str(w1_slave) + ‚/w1_slave‘)

    # Inhalt des 1-wire Slave File auslesen
    filecontent = file.read()

    # 1-wire Slave File schliessen
    file.close()

    # Temperatur Daten auslesen
    stringvalue = filecontent.split(„n“)[1].split(“ „)[9]

    # Temperatur konvertieren
    temperature = float(stringvalue[2:]) / 1000

    # Temperatur ausgeben
    print(str(w1_slave) + ‚ | %5.3f °C‘ % temperature)

    # Werte in Datei schreiben
    # Zeit und Datum erfassen
    Datum = strftime(„%d.%m.%Y“)
    Uhrzeit = strftime(„%H:%M:%S“)
    if log_rrd == True: #wenn Sensor erkannt übergebe an rrdtool
    LogToRRD(„Temperature“,temperature,“temp“, „[deg C]“, „#0D4F8B“)

    #sys.exit(0)
    import time
    print „Neue Messung startet in %s Sekunden“ %(steps)
    time.sleep(steps)

    • dasI dasI

      Hallo Inesa. Ich habe Dir eine Mail geschrieben. Dein Script liest die Temperatursensoren der Reihe nach aus, schreibt dann aber nur den Wert des letzten Temperatursensors, der ausgelesen wurde, in die Datenbank. Ergänze Dein Script mal wie folgt:

      if log_rrd == True: #wenn Sensor erkannt übergebe an rrdtooll
      print(‚Schreibe:‘, temperature)
      LogToRRD(„Temperature“,temperature,“temp“, „[deg C]“, „#0D4F8B“)

      Dann siehst Du es auch. Du speicherst die Werte beider Sensoren nacheinander in die gleiche Variable (temperature) und überschreibst damit immer den ersten Wert. Entweder du schreibst die Werte in ein Array und übergibst dieses Array an Deine Funktion zum Schreiben der RRD-Datei, oder Du baust Dir eine Schleife, welche die Temperatursensoren der Reihe nach ausliest und entsprechend in die RRD-Datei schreibt.

      Ich hoffe das hilft Dir weiter. Gruß, dasI

  6. ines ines

    Hallo

    Habe das jetzt so gelößt ist wahrscheinlich programiertechnisch nicht so der Hit.
    Mit der funktion read_sensor werden die Daten eingelesen und dann an rrd tool übergeben

    #!/usr/bin/python
    # -*- coding: utf-8 -*-

    from time import sleep
    import sys
    import datetime
    import time
    import os
    import rrdtool
    from time import *
    import re

    dbname = ‚temperature‘
    steps = 25
    rrd_root = „/home/mikelsoft/rrd/“
    rrd_graph_root = „/var/www/bmp085/“
    log_rrd = True
    red_sensor = True

    # Zeitvariable definieren
    lt = localtime()

    def LogToRRD (rrdKey, rrdValue, rrdDevice, graphLabel, graphColour):
    if not os.path.exists(rrd_root + rrdDevice + „.rrd“):
    print „Erzeuge Datenbankn“
    ret = rrdtool.create(rrd_root + rrdDevice + „.rrd“, „–step“, „60“,
    „DS:“ + rrdKey + „:GAUGE:120:-273:5000“,
    „RRA:AVERAGE:0.5:1:1200“,
    „RRA:MIN:0.5:12:2400“,
    „RRA:MAX:0.5:12:2400“,
    „RRA:AVERAGE:0.5:12:2400“)

    ret = rrdtool.update(rrd_root + rrdDevice + „.rrd“, ‚N:‘ + str(rrdValue));
    ret = rrdtool.graph(rrd_graph_root + rrdDevice + „_stunde.png“, „–start“, „-4h“, „–title=“ + rrdDevice.title() + “ Letzte Stunde“,
    ‚–watermark=zentis.dyndns.org‘,
    „-w 800“,
    „–alt-autoscale“,
    „-v Grad Celsius“,
    „DEF:“ + rrdKey + „=“ + rrd_root + rrdDevice + „.rrd:“ + rrdKey + „:AVERAGE“,
    „LINE1:“ + rrdKey + graphColour + „:“ + rrdKey + “ “ + graphLabel)

    ret = rrdtool.graph(rrd_graph_root + rrdDevice + „_tag.png“, „–start“, „-4d“, „–title=“ + rrdDevice.title() + “ Diesen Tag“,
    ‚–watermark=zentis.dyndns.org‘,
    „-w 800“,
    „–alt-autoscale“,
    „-v Grad Celsius“,
    „DEF:“ + rrdKey + „=“ + rrd_root + rrdDevice + „.rrd:“ + rrdKey + „:AVERAGE“,
    „LINE1:“ + rrdKey + graphColour + „:“ + rrdKey + “ “ + graphLabel)

    ret = rrdtool.graph(rrd_graph_root + rrdDevice + „_weekly.png“, „–start“, „-4w“, „–title=“ + rrdDevice.title() + “ Diese Woche“,
    ‚–watermark=zentis.dyndns.org‘,
    „-w 800“,
    „–alt-autoscale“,
    „DEF:“ + rrdKey + „=“ + rrd_root + rrdDevice + „.rrd:“ + rrdKey + „:AVERAGE“,
    „LINE1:“ + rrdKey + graphColour + „:“ + rrdKey + “ “ + graphLabel)

    ret = rrdtool.graph(rrd_graph_root + rrdDevice + „_monat.png“, „–start“, „-1m“, „–title=“ + rrdDevice.title() + “ Diesen Monat“,
    ‚–watermark=zentis.dyndns.org‘,
    „-w 800“,
    „–alt-autoscale“,
    „-v Grad Celsius“,
    „DEF:“ + rrdKey + „=“ + rrd_root + rrdDevice + „.rrd:“ + rrdKey + „:AVERAGE“,
    „LINE1:“ + rrdKey + graphColour + „:“ + rrdKey + “ “ + graphLabel)

    def read_sensor(path):
    value = „U“
    try:
    f = open(path, „r“)
    line = f.readline()
    if re.match(r“([0-9a-f]{2} ){9}: crc=[0-9a-f]{2} YES“, line):
    line = f.readline()
    m = re.match(r“([0-9a-f]{2} ){9}t=([0-9]+)“, line)
    if m:
    value = str(float(m.group(2)) / 1000.0)
    f.close()
    except (IOError), e:
    print time.strftime(„%x %X“), „Error reading“, path, „: „, e
    return value

    temp0_path = „/sys/bus/w1/devices/10-0008028d898b/w1_slave“
    temp1_path = „/sys/bus/w1/devices/10-0008028d53af/w1_slave“
    import time
    temp0 = read_sensor(temp0_path)
    time.sleep(1)
    temp1 = read_sensor(temp1_path)

    if log_rrd == True:
    LogToRRD(„Temperature“,temp0,“temp0″, „[deg C]“, „#0D4F8B“)
    LogToRRD(„Temperature“,temp1,“temp1″, „[deg C]“, „#0D4F8B“)

  7. Thomas Thomas

    Hi,

    weis jemand warum 4 Datenbanken angelegt wurden?

    „RRA:AVERAGE:0.5:1:2160“,
    „RRA:AVERAGE:0.5:5:2016“,
    „RRA:AVERAGE:0.5:15:2880“,
    „RRA:AVERAGE:0.5:60:8760“,

    und wie sich die werte berechnen?

    Gruß
    Thomas

    • dasI dasI

      Hallo Thomas. Vielen Dank für Deinen Kommentar. Bei den angeführten Zeilen handelt es sich um die Reservierung für den Platz, der nötig ist, um eine bestimmte Anzahl an Werten speichern/ archivieren zu können.

      • jede Minute mit 2160 Werten –> Zeitraum für 36 Stunden
      • alle 5 Minuten mit insgesamt 2016 Werten –> Zeitraum für eine Woche
      • alle 15 Minuten mit insgesamt 2880 Werten –> Zeitraum für einen Monat
      • alle 60 Minuten mit insgesamt 8760 Werten –> Zeitraum für ein Jahr

      Berechnet habe ich diese Angaben wie folgt:
      36 Sunden
      1 Stunde –> 3600 Sekunden, 36 Stunden –> 129600 Sekunden, das ergibt bei einem Wert pro Minute –> 129600 / 60 Sekunden –> 2160 Werte
      Wochenwerte
      1 Stunde –> 3600 Sekunden, 24 Stunden –> 86400 Sekunden, für 7 Tage –> 604800 Sekunden / (5 Minuten * 60 Sekunden) –> 2016 Werte
      Monatswerte
      1 Stunde –> 3600 Sekunden, 24 Stunden –> 86400 Sekunden, für 30 Tage –> 2592000 Sekunden / (15 Minuten * 60 Sekunden) –> 2880 Werte
      Jahreswerte
      1 Stunde –> 3600 Sekunden, 24 Stunden –> 86400 Sekunden, für 365 Tage –> 31536000 Sekunden / (60 Minuten * 60 Sekunden) –> 8760 Werte

      Dabei werden immer die Durchschnittswerte (AVERAGE) gespeichert.

      Ich hoffe ich konnte Dir mit diesen Ausführungen helfen. Solltest Du noch weitere Fragen haben, dann stell sie hier ruhig. Gruß, dasI

    • Thomas Thomas

      Hallo dasI,
      erst mal vielen dank für die Antwort. Bin noch RRD Anfänger.

      meint das nicht bei dem Beispiel “RRA:AVERAGE:0.5:5:2016″, 5*steps*2016=datenbank größe. Also über 5 schritte wird ein Average wert gespeichert.
      5*10*2016=100800s=28stunden???

      Was ich auch nicht verstehe habe es selbst auch noch nicht in meinem Programm gelöst. In dem Monats graph gibt es nur 2 Wochen??

      Gruß
      Thomas

  8. Blub Blub

    Hallo zusammen kann mir eigentlich jemand sagen warum wir den SMbus benutzen und nicht I2C ich weis das beide relativ gleich sind bis auf Takt und High/low Amplituden.
    Aber warum wird dann der SMbus verwendet wenn I2C eig schneller ist?

    dasBlub

    • dasI dasI

      Hallo Blub. In meinem Beitrag geht es im Prinzip nur um das Speichern und Visualisieren der Messwerte vom BMP085. Die Abfrage der Messwerte des BMP085 übernimmt hier ein Script von Adafruit. Aus diesem Grund kann ich Dir diese Frage nicht mit völliger Sicherheit beantworten.

      Man verbessere mich bitte, wenn ich hier etwas Falsches schreibe. Der SMBus basiert auf dem I2C-Protokoll und ist so auch abwärts kompatibel zum reinen I2C. Ich habe im Netz noch kein Projekt gesehen, was über I2C kommuniziert und dabei nicht den SMBus benutzt. Kann es also sein, dass der Raspberry nur über den SMBus per I2C kommunizieren kann?

      Gruß
      dasI

  9. Leif Leif

    Sorry, I can’t write German. I am new to python and have used the BMP085_rrd_v2.py script to produce these graphs. I would like to use rrdtools GPRINT statement to have the last value in the rrd displayed on the graph. Also I have calculated the pressure at sea level and am storing this in the rrd. I would like to have this displayed on the same graph as the BMP085_pres graph using another LINE1 statement but don’t know how. Can anyone help please.

  10. Uwe Henn-Kaffai Uwe Henn-Kaffai

    https://www.leben-zwo-punkt-null.de/pi-trifft-die-graphen/

    Hallo. deine Links zeigen ins ….

    siehe unten


    Diese Website ist nicht sicher.

    Dieses Problem deutet eventuell auf den Versuch hin, Sie zu täuschen bzw. Daten, die Sie an den Server gesendet haben, abzufangen. Die Website sollte sofort geschlossen werden.


    Zur Startseite wechseln
    Details

    Der Hostname im Sicherheitszertifikat der Website stimmt nicht mit dem Namen der Website überein, die Sie besuchen möchten.
    Fehlercode: DLG_FLAGS_SEC_CERT_CN_INVALID
    Webseite trotzdem laden (Not recommended)

    • chweber chweber

      Hallo Uwe, vielen Dank für den Hinweis. Ich habe den Fehler für diesen Artikel berichtigt, die Berichtigung für den Rest des Blogs wird folgen. Liegt im Grunde nur darin begründet, das mir zwar beide Domains (com und de) gehören, aber nur die de-Domain im Zertifikat steht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.