1wire

Wikipedia zum Thema 1wire:

1-Wire bzw. One-Wire oder Eindraht-Bus beschreibt eine serielle Schnittstelle, die mit einer Datenader (DQ) auskommt, die sowohl als Stromversorgung als auch als Sende- und Empfangsleitung genutzt wird. Der Begriff 1-Wire ist irreführend, weil zudem noch eine Masse-Verbindung (GND) erforderlich ist. Diese Masseverbindung wird bei Knopf-förmigen Anordnungen über eine gegenseitige Isolation der Gehäusehälften erreicht. Tatsächlich werden immer zwei physikalische Leiterverbindungen benutzt (GND, DQ).

Verfügbar sind integrierte Bausteine zur Temperaturmessung, Akkuüberwachung, Echtzeituhr, kleine Speicher etc. Die Technik wurde zur Kommunikation zwischen den Komponenten eines Gerätes entwickelt, z. B. zur Erfassung des Akkuzustandes in einem mobilem Datenerfassungsgerät (PDA).

Quelle: http://de.wikipedia.org/wiki/1-Wire

Die Hardware:

Die Software:

Durch owfs wird der 1wire Bus mittles Fuse als Dateibaum ansprechbar. Gemountet sieht das so aus:

# mount | grep 1wire
OWFS on /srv/1wire type fuse.OWFS (rw,nosuid,nodev)
# ls /srv/1wire/ -1
10.0A04E6010800
10.472701020800
10.89FFE5010800
10.E02D01020800
81.F6D42D000000
alarm
bus.0
settings
simultaneous
statistics
structure
system
uncached

 

Hier sind 10.0A04E6010800, 10.472701020800, 10.89FFE5010800 und 10.E02D01020800 die DS18S20 Temperatursensoren. Aktuell im Testbetrieb 2 innen, 2 außen. 81.F6D42D000000 ist der USB 1wire Adapter selbst.

Das folgende Script liest per cron jede Minute die 4 Temperaturwerte aus, updated  eine RRD Datenbank/Grafiken und schreibt die 4 Werte in eine MySQL Datenbank (Teilweise von http://owfs.org/index.php?page=garden).

#!/bin/bash

for i in `cat /proc/mounts | cut -d' ' -f2`; do
        if [ "/srv/1wire" = "$i" ]; then
                echo "owfs mounted, starting...."
                echo "reading sensors..."
                # Read data from sensors
                inside1=`cat /srv/1wire/10.89FFE5010800/temperature`
                inside2=`cat /srv/1wire/10.0A04E6010800/temperature`
                outside1=`cat /srv/1wire/10.472701020800/temperature`
                outside2=`cat /srv/1wire/10.E02D01020800/temperature`

                echo "format data..."
                # Format reading
                inside1=`echo $inside1 | cut -c -4`
                inside2=`echo $inside2 | cut -c -4`
                outside1=`echo $outside1 | cut -c -4`
                outside2=`echo $outside2 | cut -c -4`

                if ([ $inside1 == "0" ] && [$inside2 == "0"]); then

                echo "update rrd..."
                # Update database
                rrdtool update database.rrd N:$inside1:$inside2:$outside1:$outside2
                echo "update mysql..."
                # Insert into mysql
                mysql -h MYSQL_SERVER -u MYSQL_USER --password=MYSQL_PASSWORT 1wire <
CREATE TABLE IF NOT EXISTS `temperature` (
  `idx` int(11) NOT NULL AUTO_INCREMENT,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `inside1` float NOT NULL,
  `inside2` float NOT NULL,
  `outside1` float NOT NULL,
  `outside2` float NOT NULL,
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 ;

Datenbankstruktur die im Beispiel verwendet wurde.

Update alle 15 Minuten

Schreibe einen Kommentar

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