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).
Die Hardware:
- 1wire USB Adapter (DS9490R Datenblatt – Hobby Boards – USA)
- Temperatursensor (DS18S20 Datenblatt – Hobby Boards USA – Conrad Elektronik)
- Twisted Pair Kabel
Die Software:
- Linux
- owfs 1-wire Filesystem
- evtl mysql
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.