Commentum? Der Einfall...

Wer aufhört besser zu werden hat aufgehört gut zu sein!

DENDROBATES: Baumsteigerfrosch

Systeminformationen

 

Systeminformation 0.1.2
Rechnername:
DENDROBATES
Modell:
Raspberry Pi 3 Model B Rev 1

Betriebssystem:
Linux DENDROBATES 4.9.35-v7+ #1014 SMP Fri Jun 30 14:47:43 BST 2017 armv7l GNU/Linux
Version:
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
Firmware:
Jul 3 2017 14:20:31
Copyright (c) 2012 Broadcom
version 4139c62f14cafdb7d918a3eaa0dbd68cf434e0d8 (tainted) (release)

 

Aktuell stellt Denrobates verschiedene Daten zur Verfügung. In einem Gartenhaus untergebracht liefert er Temperaturen (gemessen an 3 verschieden Stellen), Luftfeuchtigkeit und Helligkeitswerte. Diese Daten dienen der Unterstützung der vom Rechner "Litoria" zur Verfügung gestellten Wetterdaten. Weiterhin zeichnet er regelmäßig Bilder in der Umgebung der Wetterstation auf. Alle Daten werden in einer lokalen MySql-Datenbank gespeichert, parallel dazu werden alle Werte in fortlaufenden Dateien gespeichert.

Sensoren

Temperatursensor vom Typ DS18B20 ds12b80für die Erfassung der Aussentemperatur

 

ds18b20, versuchsaufbau

Python-Programm zum Auslesen des Sensors als Aussenthermometer und Speicherung der Werte in einer Mysql-Datenbank

 

#!/usr/bin/python
# coding=utf-8
# Außentemperatur.py
#----------------

import os, sys, time
import MySQLdb
import Adafruit_DHT
import shlex
import subprocess

#Datenbank für die Speicherung dee Messwerte

db = MySQLdb.connect("localhost", "root", "Passwort", "aussenstation")
curs=db.cursor()



# Aussensensor lesen und verarbeiten

def aktuelle_temperatur_aussen():

    # 1-wire Slave Datei lesen
    aussensensor = open('/sys/bus/w1/devices/28-000009577af8/w1_slave')
    aussensensorinhalt = aussensensor.read()
    aussensensor.close()

    # Temperaturwerte auslesen und konvertieren
    aussensensorwert = aussensensorinhalt.split("\n")[1].split(" ")[9]
    aussentemperatur = float(aussensensorwert[2:]) / 1000

    # Temperatur ausgeben
    aussenrueckgabewert = '%6.2f' % aussentemperatur
    return(aussenrueckgabewert)
aussenmessdaten = aktuelle_temperatur_aussen()
aussenwann = time.strftime("%Y-%m-%d %H:%M:%S")
print aussenwann
print aussenmessdaten

fileHandle = open ( '/media/usb0/messwerte/Messwerte.txt', 'a' )
fileHandle.write ( "Aussensensor:  " )
fileHandle.write (aussenwann)
fileHandle.write ( " " )
fileHandle.write (aussenmessdaten)
fileHandle.write ("\n")
fileHandle.close()

# Werte des Bodensensors in die Datenbank schreiben

curs.execute ("INSERT INTO temperaturaussen (wann,temp) VALUES (%s,%s)",(aussenwann, aussenmessdaten,))
db.commit()

Temperatursensor vom Typ DS18B20 (wasserdicht) DS18B20 wasserdichtfür die Erfassung der Bodentemperatur

ds18b20, versuchsaufbau wasserdicht

Zum Testen wurde der DS18B20 in ein Glas Wasser mit Eiswürfeln gelegt.

Python-Programm zum Auslesen des Sensors als Aussenthermometer und Speicherung der Werte in einer Mysql-Datenbank

 

#!/usr/bin/python
# coding=utf-8
# Bodentemperatur.py
#----------------

import os, sys, time
import MySQLdb
import Adafruit_DHT
import shlex
import subprocess

#Datenbank für die Speicherung der Messwerte

db = MySQLdb.connect("localhost", "root", "####", "aussenstation")
curs=db.cursor()

# Bodensensor lesen und verarbeiten

def aktuelle_temperatur_boden():

    # 1-wire Slave Datei lesen
    bodensensor = open('/sys/bus/w1/devices/28-80000003ac22/w1_slave')
    bodensensorinhalt = bodensensor.read()
#    print bodensensorinhalt
    bodensensor.close()

    # Temperaturwerte auslesen und konvertieren
    wert = bodensensorinhalt.split("\n")[1].split(" ")[9]
    bodentemperatur = float(wert[2:]) / 1000

    # Temperatur ausgeben
    bodenrueckgabewert = '%6.2f' % bodentemperatur
    return(bodenrueckgabewert)
bodenmessdaten = aktuelle_temperatur_boden()
bodenwann = time.strftime("%Y-%m-%d %H:%M:%S")
print bodenwann
print bodenmessdaten

fileHandle = open ( '/media/usb0/messwerte/Messwerte.txt', 'a' )
fileHandle.write ( "Bodensensor:  " )
fileHandle.write (bodenwann)
#fileHandle.write ( " " )
fileHandle.write (bodenmessdaten)
fileHandle.write ("\n")
fileHandle.close()


# Werte des Bodensensors in die Datenbank schreiben

curs.execute ("INSERT INTO temperaturboden (wann,temp) VALUES (%s,%s)",(bodenwann, bodenmessdaten,))
db.commit()

 

Temperatursensor und Luftfeuchtigkeitssensor vom Typ DHT11 dht11zur Messung von Umfeldtemperatur und Luftfeuchtigkeit

Python-Programm zur Erfassung der Temperatur und Luftfeuchtigkeit und der Speicherung in einer Mysql-Datenbank.

#!/usr/bin/python
# coding=utf-8
# Außentemperatur_und_Luftfeuchte.py
#-----------------------------------
import os, sys, time
import MySQLdb
import Adafruit_DHT
import shlex
import subprocess
# Datenbank für die Speicherung der Messwerte
db = MySQLdb.connect("localhost", "root", "XXXX", "aussenstation")
curs=db.cursor()
# Aussensensor DHT11 (Temperatur und Feuchtigkeit) auslesen und verarbeiten
sensor = Adafruit_DHT.DHT11
pin = 4
try:
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    wann = time.strftime("%Y-%m-%d %H:%M:%S")
    print wann
    print humidity
    print temperature

    curs.execute ("INSERT INTO tempfeuchte (wann, feuchte, temp) VALUES (%s,%s,%s)",(wann, humidity, temperature,))
    db.commit()
    print("Done")
except:
    print("Error. Rolling back.")
    db.rollback()

 

 

Speicherung der Daten in einer RRD-Datenbank und Erzeugen von Grafiken

Hierfür verwendete Shell-Scripts 

createT.sh

#!/bin/bash
rrdtool create /media/usb0/temperatur/temperature.rrd --step 300 \
DS:temp0:GAUGE:1200:-30:70 \
DS:temp1:GAUGE:1200:-30:70 \
DS:temp2:GAUGE:1200:-30:70 \
RRA:AVERAGE:0.5:1:960 \
RRA:MIN:0.5:96:3600 \
RRA:MAX:0.5:96:3600 \
RRA:AVERAGE:0.5:96:3600

 

Mit diesem Skript wird die Datenbank temperatur.rrd angelegt. Initial, wird danach in der Regel nicht mehr benötigt.

Dieses Python-Programm liest dann regelmäßig die Sensordaten aus und aktualisiert die RRD. Ebeno werden die Scripts zur Erzeugung der Grafiken ausgeführt. Ein Cronjob sorgt für die automatische Ausführung.

hole_temperatur.py

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

import re, os, rrdtool, time

# Funktion: Lese und analysiere Sensorendatei(en)
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

# Lege Zugriffspfade für die 1-wire Sensordaten fest
pathes = (
  "/sys/bus/w1/devices/28-000009577af8/w1_slave",
  "/sys/bus/w1/devices/28-80000003ac22/w1_slave",
  "/sys/bus/w1/devices/28-80000003ac22/w1_slave"
)

# Lege Zugriffspfad für die RRD (round-robin-database) fest

rrdpath = ( "/media/usb0/temperatur" )

# Lese die Sensordaten
data = 'N'
for path in pathes:
  data += ':'
  data += read_sensor(path)
  time.sleep(1)

# Füge die Daten in die RRD (round-robin-database) ein
print (os.path.dirname(os.path.abspath(__file__)))
#rrdtool.update(
#  "%s/temperature.rrd" % (os.path.dirname(os.path.abspath(__file__))),
#  data)
#print data
from rrdtool import update as rrd_update
ret = rrd_update('/media/usb0/temperatur/temperature.rrd',data)
rrdtool.update ("/media/usb0/temperatur/temperature.rrd", data)


# Grafiken erzeugen
os.system("bash /media/usb0/temperatur/Stundengrafik.sh")
# Tage
os.system("bash /media/usb0/temperatur/Tagesgrafik.sh")
# Wochen
os.system("bash /media/usb0/temperatur/Wochengrafik.sh")
# Monate
os.system("bash /media/usb0/temperatur/Monatsgrafik.sh")
# Jahre
os.system("bash /media/usb0/temperatur/Jahresgrafik.sh")

 

Stundengrafik.sh

#!/bin/bash
rrdtool graph /media/usb0/temperatur/Stundentemperatur.png \
  -s -1h -e 'now' \
  DEF:temp0=/media/usb0/temperatur/temperature.rrd:temp0:AVERAGE \
  LINE2:temp0#FE9A2E:Umfeld \
  DEF:temp1=/media/usb0/temperatur/temperature.rrd:temp1:AVERAGE \
  LINE2:temp1#F80404:Boden \
  DEF:temp2=/media/usb0/temperatur/temperature.rrd:temp2:AVERAGE \
  LINE2:temp2#0101DF:Teich

Dieses Script erzeugt die Grafik zum Stundenverlauf.

Tagesgrafik.sh

#!/bin/bash
rrdtool graph /media/usb0/temperatur/Tagestemperatur.png \
  -s 'now - 1 day' -e 'now' \
  DEF:temp0=/media/usb0/temperatur/temperature.rrd:temp0:AVERAGE \
  LINE2:temp0#FE9A2E:Umfeld \
  DEF:temp1=/media/usb0/temperatur/temperature.rrd:temp1:AVERAGE \
  LINE2:temp1#F80404:Boden \
  DEF:temp2=/media/usb0/temperatur/temperature.rrd:temp2:AVERAGE \
  LINE2:temp2#0101DF:Teich

Dieses Script erzeugt die Grafik zum Tagesverlauf.

Wochengrafik.sh

#!/bin/bash
rrdtool graph /media/usb0/temperatur/Wochentemperatur.png \
  -s 'now - 1 week' -e 'now' \
  DEF:temp0=/media/usb0/temperatur/temperature.rrd:temp0:AVERAGE \
  LINE2:temp0#FFFF00:Umfeld \
  DEF:temp1=/media/usb0/temperatur/temperature.rrd:temp1:AVERAGE \
  LINE2:temp1#F80404:Boden \
  DEF:temp2=/media/usb0/temperatur/temperature.rrd:temp2:AVERAGE \
  LINE2:temp2#0101DF:Teich

Dieses Script erzeugt die Grafik zum Wochenverlauf.

Monatsgrafik.sh

#!/bin/bash
rrdtool graph Monatstemperatur.png \
  -s 'now - 1 month' -e 'now' \
  DEF:temp0=/media/usb0/temperatur/temperature.rrd:temp0:AVERAGE \
  LINE2:temp0#FE9A2E:Umfeld \
  DEF:temp1=/media/usb0/temperatur/temperature.rrd:temp1:AVERAGE \
  LINE2:temp1#F80404:Boden \
  DEF:temp2=/media/usb0/temperatur/temperature.rrd:temp2:AVERAGE \
  LINE2:temp2#0101DF:Teich

Dieses Script erzeugt die Grafik zum Monatsverlauf.

Jahresgrafik.sh

#!/bin/bash
rrdtool graph /media/usb0/temperatur/Jahrestemperatur.png \
  -s 'now - 1 year' -e 'now' \
  DEF:temp0=/media/usb0/temperatur/temperature.rrd:temp0:AVERAGE \
  LINE2:temp0#FE9A2E:Umfeld \
  DEF:temp1=/media/usb0/temperatur/temperature.rrd:temp1:AVERAGE \
  LINE2:temp1#F80404:Boden \
  DEF:temp2=/media/usb0/temperatur/temperature.rrd:temp2:AVERAGE \
  LINE2:temp2#0101DF:Teich

Dieses Script erzeugt die Grafik zum Jahresverlauf.

Tageswerte_Sichern.sh:

#!/bin/bash
y=$(date +%y)
m=$(date +%m)
d=$(date +%d)
echo $y $m $d
makestr="/media/usb0/temperatur/sicherung/"$y$m$d
if [[ ! -d $makestr ]]; then
        echo "Verzeichnis: "$makestr" muß noch angelegt werden!"
        mkdir $makestr
        cp /media/usb0/temperatur/Tagestemperatur.png $makestr
        echo "Kopie wurde durchgeführt"
else
        echo "Kopie wurde durchgeführt!"
fi

Sichern der aktuellen Grafik zum Tagesverlauf in ein Sicherungsverzeichnis mit entsprechendem Zeitstempel.

Wochenwerte_Sichern.sh

#!/bin/bash
y=$(date +%Y)
m=$(date +%m)
d=$(date +%d)
kwnow=`date +%V`
kwnext=`date --date=+1week +%V`
echo $y
echo $m
echo $d
Kalenderwoche=$(date +%V)
echo "Kalenderwoche: " $Kalenderwoche
DIESEWOCHE=$kwnow
NAECHSTEWOCHE=$kwnext
makestr="/media/usb0/temperatur/sicherung/"$kwback$y
echo $makestr
echo "Diese Woche: "$DIESEWOCHE
echo "Nächste Woche: "$NAECHSTEWOCHE
if [ $kwnext -lt $kwnow ];
        then y=$(date +%y)
                m=$(date +%m)
                d=$(date +%d)
                newsave=$makestr$m
if [[ ! -d $makestr ]];
        then
                echo "Verzeichnis "$makestr" existiert noch nicht und wird angelegt!"
                mkdir $makestr
                cp /media/usb0/temperatur/Wochentemperatur.png $makestr
                echo "Kopie wurde durchgeführt!"
        fi
else
        echo "Noch keine neue Woche erreicht!"
fi
Sichern der aktuellen Grafik zum Wochenverlauf in ein Sicherungsverzeichnis mit entsprechendem Zeitstempel.

Monatswerte_Sichern.sh:


#!/bin/sh
HEUTE=`date +%d`
MORGEN=`date +%d -d "1 day"`
makestr="/media/usb0/temperatur/sicherung/"$y$m
if [ $MORGEN -lt $HEUTE ];
        then y=$(date +%y)
m=$(date +%m)
d=$(date +%d)
        if [[ ! -d $makestr ]];
                then mkdir $makestr
        cp /media/usb0/temperatur/Tagestemperatur.png $makestr
        fi
else
        echo "Noch kein neuer Monat!"
fi
Sichern der aktuellen Grafik zum Monatsverlauf in ein Sicherungsverzeichnis mit entsprechendem Zeitstempel.

Jahreswerte_Sichern.sh:

#!/bin/bash
#!/bin/bash
HEUTE=`date +%d`
MORGEN=`date +%d -d "1 day"`
y=$(date +%y)
MAKESTR="/media/usb0/temperatur/sicherung/"$y
echo $MORGEN
echo $HEUTE
if [ $MORGEN -lt $HEUTE ];
        then
        y=$(date +%y)
        m=$(date +%m)
        d=$(date +%d)
        echo $y
        echo $m
        if [[ ! -d $makestr ]]; echo $d
                then mkdir $makestr
        fi
else
        echo "Noch kein neues Jahr erreicht!"
fi

Sichern der aktuellen Grafik zum Jahresverlauf in ein Sicherungsverzeichnis mit entsprechendem Zeitstempel.

Auswertung der Daten auf andere Art

PHP Code:
<?php // Bei dieser Variante werden die Temperaturdaten in einfache Textdateien geschrieben // und dann von einem Python-Skript an die RRD übertragen $pw=''; //Schleife bei falschen werten while($pw < 3) { $pw = 9; // Hole Sensordaten S1 (Umgebungstemperatur) $temp = exec('cat /sys/bus/w1/devices/28-000009577af8/w1_slave |grep t='); $temp = explode('t=',$temp); $temp = $temp[1] / 1000; $temp = round($temp,2); // Hole Sensordaten S2 (Bodentemperatur) $temp1 = exec('cat /sys/bus/w1/devices/28-80000003ac22/w1_slave |grep t='); $temp1 = explode('t=',$temp1); $temp1 = $temp1[1] / 1000; $temp1 = round($temp1,2); // Hole Sensordaten S3 (Teichtemperatur) $temp2 = exec('cat /sys/bus/w1/devices/28-80000003ac22/w1_slave |grep t='); $temp2 = explode('t=',$temp2); $temp2 = $temp2[1] / 1000; $temp2 = round($temp2,2); //Trenne Dezimalstellen ab um falsche Werte aussortieren zu können $t = explode(" ", $temp); $t1 = explode(" ", $temp1); $t2 = explode(" ", $temp2); //Wenn Wert größer als 50 ist wird die Schleife neu gestartet (falsche Messergebnisse verhindern --sollte bei Bedarf angepasst werden) if ($t[0] > 50) { $pw = 1; } if ($t1[0] > 50) { $pw = 1; } if ($t2[0] > 50) { $pw = 1; } } // Schreibe den Wert von S1 in die Textdatei $handle = fopen ("/media/usb0/temperatur/s1.txt", w); fwrite ($handle, $temp); fclose ($handle); // Schreibe den Wert von S2 in die Textdatei $handle = fopen ("/media/usb0/temperatur/s2.txt", w); fwrite ($handle, $temp1); fclose ($handle); // Schreibe den Wert von S3 in die Textdatei $handle = fopen ("/media/usb0/temperatur/s3.txt", w); fwrite ($handle, $temp2); fclose ($handle);?>

>

Log-Dateien, Textdateien:

S1.txt:

s1

Hier wird nach Aufruf des Scripts "Auswerten_der_Sensoren" der aktuelle Wert (Temperatur) des ersten eingelesenen Sensors gespeichert.
Der Wert kann von anderen Scripten weiterverabeitet werden.

S2.txt:

s2

 Hier wird nach Aufruf des Scripts "Auswerten_der_Sensoren" der aktuelle Wert (Temperatur) des zweiten eingelesenen Sensors gespeichert.

Der Wert kann von anderen Scripten weiterverabeitet werden.

S3.txt:

s3

Hier wird nach Aufruf des Scripts "Auswerten_der_Sensoren" der aktuelle Wert (Temperatur) des dritten eingelesenen Sensors gespeichert.
Der Wert kann von anderen Scripten weiterverabeitet werden.

Bilddateien:

Stundentemperatur.png:

Stundentemperatur

Grafik zum stündlichen Verlauf.

Tagestemperatur.png:

Tagestemperatur

Grafik zum Tagesverlauf.

Wochentemperatur.png:

Wochentemperatur

Grafik zum Wochenverlauf.

Monatstemperatur:

Monatstemperatur

Grafik zum Monatsverlauf.

Jahrestemperatur.png

Jahrestemperatur

Grafik zum Jahresverlauf. Da noch nicht viele Werte vorliegen sieht die Grafik noch ziemlich leer aus. Aber der Aufbau ist erkennbar.

Nach der Installation von zwei Webcams habe ich versehentlich vergessen, das Webverzeichnis auf eine externe Festplatte zu legen. So wurden in einminütigem Abstand auf die SD-Platte Fotos geschickt. Nun scheint sich diese verabschiedet zu haben (Stand 07/2018).

Terminvorschlag: 02.11.2018.

#### Beachten: im Script werden 3 DS18B20 ausgelesen, es sind aber nur 2 abgeschlossen !!! ####

#### Achtung: DHT11 muß in der Nähe der Wetterstation unter einem kleinen Dach installiert werden, Feuchtigkeitsermittlung! ####

#### Wichtig: Testen der Verwendbarkeit eines 4-poligen Kommunikationskabels vom Teich aus an DENDROBATES. Dieses Kabel soll die Werte von 2 DS18B20 (1 x Teichwasser, 1 x Boden unmittelbar neben Teich) übertragen. Alte ISDN-Verkabelung? ####

#### Alternativ: Anderen Raspberry in die Filterverkleidung einbauen und verwenden ####

So sieht das Ganze nach dem Verlöten und Unterbringung in einem Gehäuse aus:

#### Fotos und Beschreibung eingügen ####

 

Zurück

Commentum © 1999                                                                                                                Impressum                                                                               Der Einfall, die Lüge, die Erdichtung 

Cookies erleichtern die Bereitstellung unserer Dienste. Mit der Nutzung unserer Dienste erklären Sie sich damit einverstanden, dass wir Cookies verwenden.
Ok Ablehnen