|
Temperaturmessung mit Linux
Wäre es nicht nett eine Wetterstation zu haben? Oder zumindest die Möglichkeit
nachzusehen, warum in der Nacht die Blumen auf Terrasse/Balkon erfroren sind?
Letzteres ist auf jeden Fall möglich. Es lässt sich sogar sehen ob
die Temperatur nicht schon vor ein paar Tagen im Keller war und die Pflanzen
schon längs hinüber sind (was man mit einem Blick aus dem Fenster
auch hätte sehen können).
Zunächst die benötigte Elektronik, welche sehr überschaubar
ist: "Beliebig" viele (die Spannungsversorgung der seriellen Schnittstelle
wird aber hier früh einen Strich durch die Rechnung machen) Temperatursensoren
DS18S20 von Dallas (neu: DS1820,
Maxim/Dallas) und die
folgende Schaltung.
Das ganze mit einer kleinen Platine, Isolierschlauch und einem BNC Stecker einer alten 10Base-T Netzwerkkarte (funktioniert auch ohne noch sehr gut ) in das Gehäuse eins 9 poligen SUB-D Steckers gezwängt.
Die Software um die Sensoren auszulesen gibt es auf der digitemp
Seite. Ich setzte digitemp-3.3.2 ein. Das ist eine etwas ältere Version,
da aber auch die Sensoren nicht die neuen Modelle sind, passt das. Bei meiner
RedHat Kiste musste auch noch das Paket "lockdev" installiert werden.
Mit dem Befehl ./digitemp -i -s/dev/ttyS0 kann nun die Initialisierung durchgeführt werden. (/dev/ttyS0) mit dem passenden device der seriellen Schnittstelle ersetzten. Hier COM1) Dabei wird auch die Konfigurationsdatei .digitemprc angelegt. Mit ./digitemp -a werden die Werte aller erkannten Sensoren ausgelesen und mit der Standard Formatierung augegeben.
Hier die Hilfe Ausgabe:
[nix@nixbox digitemp-3.3.2]# ./digitemp
Error! Not enough arguements.
DigiTemp v3.3.2 Copyright 1996-2004 by Brian C. Lane
GNU Public License v2.0 - http://www.brianlane.com
Compiled for DS9097
Usage: digitemp [-s -i -U -l -r -v -t -a -d -n -o -c]
-i Initalize .digitemprc file
-w Walk the full device tree
-s /dev/ttyS0 Set serial port
-l /var/log/temperature Send output to logfile
-c digitemp.conf Configuration File
-r 1000 Read delay in mS
-v Verbose output
-t 0 Read Sensor #
-q No Copyright notice
-a Read all Sensors
-d 5 Delay between samples (in sec.)
-n 50 Number of times to repeat
0=loop forever
-A Treat DS2438 as A/D converter
-O"counter format string" See description below
-o 2 Output format for logfile
-o"output format string" See description below
-H"Humidity format string" See description below
Logfile formats:
1 = One line per sensor, time, C, F (default)
2 = One line per sample, elapsed time, temperature in C
3 = Same as #2, except temperature is in F
#2 and #3 have the data seperated by tabs, suitable for import
into a spreadsheet or other graphing software.
The format string uses strftime tokens plus 5 special ones for
digitemp - %s for sensor #, %C for centigrade, %F for fahrenheit,
%R to output the hex serial number, and %N for seconds since Epoch.
The case of the token is important! The default format string is:
"%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F" which gives you an
output of: May 24 21:25:43 Sensor 0 C: 23.66 F: 74.59
The counter format string has 2 special specifiers:
%n is the counter # and %C is the count in decimal.
The humidity format uses %h for the humidity in percent
Habe seit ewiger zeit rrdtool-1.0.49-1.1.fc2.dag installiert, da ich auch das rrd "Datenbank" File immer mitgenommen habe ist es jedenfalls sicher das noch alles funktioniert.
Die Initialisierung einer RRD Datenbank für max. drei Sensoren, mit MIN, MAX und AVERAGE ist im folgenden Perl Script beschrieben. Der Aktualisierungsrhythmus ist auf 5 Minuten festgelegt. Das Script (und weitere nützliche Dinge) finden sich im digitemp-x.tar.gz Paket unter "./rrdb".
#!/usr/bin/perl -w
#
# DigiTemp v2.1 RRDB database Creation
#
# Copyright 1997-2001 by Brian C. Lane <bcl@brianlane.com> www.brianlane.com
# All Rights Reserved
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
use Time::Local;
use RRDp;
RRDp::start "/usr/bin/rrdtool";
# Create the database
RRDp::cmd "create digitemp.rrd \
DS:room:GAUGE:600:U:U \
DS:attic:GAUGE:600:U:U \
DS:desk:GAUGE:600:U:U \
RRA:AVERAGE:0.5:1:600 \
RRA:AVERAGE:0.5:6:700 \
RRA:AVERAGE:0.5:24:775 \
RRA:AVERAGE:0.5:288:797 \
RRA:MIN:0.5:1:600 \
RRA:MIN:0.5:6:700 \
RRA:MIN:0.5:24:775 \
RRA:MIN:0.5:288:797 \
RRA:MAX:0.5:1:600 \
RRA:MAX:0.5:6:700 \
RRA:MAX:0.5:24:775 \
RRA:MAX:0.5:288:797";
$answer = RRDp::read;
#print $$answer;
RRDp::end;
|
|
[Okt. 2010] owfs Statt digitemp
Mit owfs lassen sich 1-Wire Buskomponenten in das Dateisystem einbinden (FUSE) und ihre Funktion über einfache Dateioperationen auslesen und steuern. Mein serieller 1-Wire Adapter lässt sich unverändert weiter benutzen und mit dem folgenden Befehl, in das extra dafür angelegte Verzeichnis, "1-wire" einbinden:
owfs -C --passive=/dev/ttyS0 -m /1-wire
Die einzelnen Busteilnehmer werden nun mit ihrer Adresse im Verzeichnis /1-wire/ sichtbar.
10.000010EF0000
...
|-- temperature
|-- temphigh
|-- templow
|-- trim
|-- trimblanket
|-- trimvalid
`-- type
Ein einfaches cat /1-wire/10.000010EF0000/temperature,
gibt den aktuellen Messwert der Temperatur aus.
Es lassen sich weitere 1-Wire Komponenten ansprechen, ich habe z.B. Schalter
vom Typ DS2406 und DS2413 im Einsatz. (Dokumentation zu DS24x auf owfs.org)
3A.00003AC50000
|-- PIO.A
|-- PIO.ALL
|-- PIO.B
|-- PIO.BYTE
|-- address
...
Mit echo 1 > /1-wire/3A.00003AC50000/PIO.A kann Port A eingeschaltet, mit "0" wieder ausgeschaltet werden.
Das ganze lässt sich ein bash Skript einbinden und füttert die bestehende
RRD Datenbank. (Die Adressen der Sensoren müssen entsprechend der Zuordnung
in der RRD Datenbank im Skript hinterlegt werden)
Auslesen:
#function to read values
function readtemp () {
TEMP2=0 # not used
TEMP1=`cat /1-wire/$TEMPID1/temperature|tr -d [:space:]`
TEMP3=`cat /1-wire/$TEMPID2/temperature|tr -d [:space:]`
}
RRD Update:
rrdtool update temperature_logging.rrd N:$TEMP1:$TEMP2:$TEMP3
www.linuxfocus.org - Temperaturüberwachung mit Linux
loetmeister ©2014