Digitemp
Home > Computer > Digitemp  
 

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).

top Sensoren und digitemp

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

 

top RRDtools

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;

 

 

top [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

 

top Links

www.linuxfocus.org - Temperaturüberwachung mit Linux

owfs.org