:: fischer-net.de

Im Artikel 1-Wire Software unter Linux - Teil 1 habe ich die Voraussetzungen für den Einsatz der hier vorgestellten Softwarepakete DigiTemp und OWFS 1-Wire Filesystem bereits beschrieben. Zur Erinnerung: für den Einsatz beider Softwarepakete muß der entsprechende Kerneltreiber in Verbindung mit einem DS9490R Busmaster entladen werden. Am besten macht man dieses dauerhaft über eine Blacklist-Regel (siehe dazu die Anleitung in Teil 1). Dieser Teil beschreibt nun den Einsatz des Softwarepaketes OWFS 1-Wire Filesystem.

 

OWFS 1-Wire Filesystem

Im Vergleich zu DigiTemp ist OWFS weitaus mächtiger: Nahe zu alle erdenklichen 1-Wire Devices aus den Bereichen Temperatur, Luftfeuchte, LCD, Luftdruck, Zähler, Speicher, Volt, Schalter sowie Wetter können überwacht und gesteuert werden. Dabei kann der Zugriff auf die Devices über das Filesystem, eine WebGui, FTP und/oder einen Remote-Server erfolgen. OWFS unterstützt diverse Programmiersprachen wie z.B. perl, python, php, tcl, Java und C und ist lauffähig unter i386, MIPS, ARM, Coldfire, Linux, FreeBSD sowie Windows (Cygwin). Und das Gute daran: es ist OpenSource unter der GPLv2 Lizenz.

Dieser Artikel beschreibt die beispielhafte Installation von OWFS auf Ubuntu 11.10 oneiric. Die Installation auf anderen Distributionen können demnach etwas abweichen. Doch zuvor ein Einblick in die einzelnen Dienste und Anwendungen, die das Softwarepakte OWFS mit sich bringt. Hierbei gilt: nicht alle Dienste werden zum Betrieb benötigt! Man sollte sich darauf beschränken, was man tatsächlich nutzen will.

 

owserver

Der Dienst owserver ist die Backend-Komponente des OWFS 1-Wire Bus Control System. owserver regelt den physikalischen Zugriff auf den am seriellen oder USB-Port angeschlossenen Busmaster und stellt den 1-Wire Bus über Netzwerk-Sockets (TCP) für andere Client-Prozesse zur Verfügung. Dabei können die Clients sowohl lokal auf dem gleichen Rechner laufen als auch über ein Netzwerk z.B. von einem anderen Rechner remote zugreifen. Jeder Client (owfs, owhttpd, owftpf) kann theoretisch auch direkt auf den 1-Wire Bus ohne Einsatz des owserver-Backends zugreifen, doch wird der gleichzeitige physikalische Zugriff auf USB-Ports in der Regel verhindert. Deshalb ist es ratsam den owserver als "Vermittlungsdienst" einzusetzen. Plant man z.B. ausschließlich nur die Nutzung der WebGui owhttpd, kann auf die Backend-Komponente verzichtet werden. Selbiges gilt natürlich auch für den ausschließlichen Einsatz von owftpd oder owfs. In diesem Falle muß die in diesem Artikel beschriebene Installation abweichend angepaßt werden, worauf ich hier nicht weiter eingehe.

 

owshell

OWFS beinhaltet die Programme owdir, owread, owwrite und owget die als sogenannte owshell Befehle bezeichnet werden. Mittels diesen Befehlen kann sehr einfach in z.B. Scripten über den owserver auf den 1-Wire Bus zugegriffen werden. Im Unterschied zu owserver, owhttpd, owftpd und ofws besteht keine persistente Verbindung zum 1-Wire Bus. Bei jedem Aufruf wird die Abfrage ad-hoc vorgenommen. Dabei wird kein Caching oder Multithreading unterstützt.

 

owdir

owdir ist ein Äquivalent von "ls <Verzeichnis>". Bei Eingabe von owdir ohne weitere Pfadangabe wird der 1-Wire Bus ausgegeben:

owdir
/28.F14015020000
/81.A7C02F000000
/bus.0
/uncached
/settings
/system
/statistics
/structure
/simultaneous
/alarm

Bei Angabe eines Pfades (z.B. owdir /28.F14015020000) werden die im virtuellen Verzeichnis des Temperatursensor vorhandenen Dateien wie z.B. address, family, temperature, temphigh, etc. (um nur einige zu nennen) angezeigt.

 

owread

owread ist ein Äquivalent von "cat <Datei>". Dabei können owread diverse Parementer übergeben werden, die z.B. den Wert einer Temperatur in Celsius, Klevin, Fahrenheit oder Rankine umgerechnet auszugeben. Weitere Parameter sind dem entsprechenden Manual (man owread) zu entnehmen. Ein Beispiel:

owread /28.F14015020000/temperature
     19.6875
owread -F /28.F14015020000/temperature
     67.4375

Die erste Abfrage liest die Temperature eines Temperatursensors DS18B20 in Celsius aus. Die zweite Abfrage gibt die Temperatur des gleichen Sensors in Fahrenheit aus.

 

owwrite

owwrite ist ein Äquivalent von "echo "Wert" >Datei". Mit owwrite können Eigenschaften eines 1-Wire Devices geändert werden. Ein Beispiel:

owwrite /28.F14015020000/temphigh 60

Verändert die Warnschwelle des Temperatursensor bei zu hoher Temperatur. Mittels owwrite kann auch ein Speicherbereich (sofern von 1-Wire Slave unterstützt) oder aber ein LCD beschrieben werden.

 

owget

owget kombiniert die Funktion von owdir und owread. owget versucht zuerst das angegebene Argument als Verzeichnis zu lesen und wenn das fehlschlägt wird das Argument wie bei einem owread angewendet. An dieser Stelle verweise ich auf das entsprechende Manual (man owget).

 

owhttpd

Der in OWFS enthaltene Webserver owhttpd ermöglicht den Zugriff auf den 1-Wire Bus über einen Webbrowser. Die Hauptansicht zeigt die gefundenen Geräte und man hat die Möglichkeit innerhalb des 1-Wire Busses zu navigieren, Werte anzusehen und zu verändern. owhttpd verwendet bei der URL die gleichen Namenskonventionen wie ofws (z.B. http://localhost:3001/28.F14015020000 zeigt die Informationen eines DS18B20). owhttpd greift dabei auf keinerlei Dateien zu, da diese lediglich virtuell durch den owserver bereitgestellt werden. Der Zugriff erfolgt also direkt auf den 1-Wire Bus.

owhttpd Rootpfadowhttpd Rootpfad owhttpd DS18B20owhttpd DS18B20 

 

owftpd

Neben dem Webserver beinhaltet OWFS auch einen FTP-Server Namens owftpd. Hierbei gelten die gleichen Angaben wie für den Webserver. Die Kommunikation wird über das File Transfer Protokol ermöglicht. Ein Beispiel:

martin@kubuntu:~$ ftp 192.168.1.59 2121
Connected to 192.168.1.59.
220-owftpd 1-wire ftp server -- Paul H Alfille
220-Version: 2.8p14 see http://www.owfs.org
220 Service ready for new user.
Name (192.168.1.59:martin): 
331 Force Anonymous. Send e-mail address as password.
Password:
230 User logged in, proceed.
Remote system type is UNIX.
ftp> ls
200 Command okay.
150 About to send name list.
drwxrwxrwx   1 0        0               8 May 15 22:47 28.F14015020000/
drwxrwxrwx   1 0        0               8 May 15 22:47 81.A7C02F000000/
dr-xr-xr-x   1 0        0               8 May 15 21:54 bus.0/
dr-xr-xr-x   1 0        0               8 May 15 21:54 uncached/
dr-xr-xr-x   1 0        0               8 May 15 21:54 settings/
dr-xr-xr-x   1 0        0               8 May 15 21:54 system/
dr-xr-xr-x   1 0        0               8 May 15 21:54 statistics/
dr-xr-xr-x   1 0        0              32 May 15 21:54 structure/
drwxrwxrwx   1 0        0               8 May 15 22:47 simultaneous/
dr-xr-xr-x   1 0        0               8 May 15 21:54 alarm/
226 Transfer complete.
ftp>

 

owfs

Der Dateisystem-Client owfs bindet den kompletten 1-Wire Bus im Filesystem ein. Dazu wird das Kernelmodul und die Bibliothek von FUSE benötigt. In der Regel ist FUSE in allen gängigen Distributionen enthalten. Durch die Einbindung in das Filesystem sind alle Standard-Datei-Operationen wie Lesen, Schreiben, Verzeichnis-Liste auf den 1-Wire Bus möglich. Da es sich bei den Dateien um vom owserver virtuell bereitgestellte Dateien handelt werden nicht alle Funktionen unterstützt. Dazu gehört zum Beispiel das Erstellen, Löschen oder Umbenennen von Dateien innerhalb des 1-Wire Filesystems. Allerdings kann auf eine virtuelle Datei von ausserhalb mittels Symlink verlingt werden. Die Verwendung von owfs eignet sich besonders für den Einsatz von Scripten. Beispiele:

ls /mnt/1wire/
28.F14015020000  81.A7C02F000000  alarm  bus.0  settings  simultaneous  statistics  structure  system  uncached
cat /mnt/1wire/28.F14015020000/type 
DS18B20

 

Programmiersprachen 

Wie Eingangs beschrieben bringt OWFS Unterstützung für diverse Programmiersprachen mit sich. An dieser Stelle möchte ich nur kurz auf das Perl-Modul OWNet exemplarisch eingehen. Für die Unterstützung von weiteren Programmiersprachen verweise ich auf die entsprechenden Informationen auf der Homepage von OWFS.

 

OWNet 

Das Perl-Modul OWNet.pm bietet einen sehr einfachen Zugang zum owserver. Über das Modul kann der 1-Wire Bus ausgelesen und auf deren Devices lesend sowie schreibend zugegriffen werden. Ein einfaches Beispiel zum Auslesen einer Temperatur:

#!/usr/bin/perl
use OWNet;
print OWNet::read( "localhost:4304" , "/28.F14015020000/temperature" ) ."\n";

Neben dem OWNet.pm kann auch das owperl Modul verwendet werden, sofern dieses bei der Übersetzung der Quellen berücksichtigt wurde. Dieses bietet ein vollständiges Interface zu OWFS. Die Hausautomationssoftware FHEM wird zum Beispiel komplett in Perl umgesetzt. Daher bot es sich für mich an, die Anbindung meines 1-Wire Busses an FHEM in Perl zu realisieren. Die entsprechenden Module sind Bestandteil von FHEM. Siehe dazu auch: http://fhem.de/commandref.html#OWFS

 

Vorbereitung

Da OWFS nicht Bestandteil der Distribution ist, muß das Softwarepaket erst aus den Quellen übersetzt werden. Um eine problemlose Einbindung in das Paketsystem zur sauberen Installation sowie Deinstallation zu ermöglichen, kommt das Softwarepaket checkinstall zum Einsatz. Doch zuvor müssen die notwendigen Pakete zum Übersetzen installiert werden. Dabei beschränke ich mich auf die Unterstützung der Programmiersprache Perl um in einem weiteren Artikel die Nutzung von OWFS in Verbindung mit der Hausautomationssoftware FHEM zu beschreiben. Wenn weitere Programmiersprachen wie z.B. python oder tcl unterstützt werden sollen, müssen die entsprechenden Pakete ebenfalls installiert und bei der Konfiguration ggf. als Parameter eingebunden werden.

 

Benötigte Pakete installieren und Umgebung einrichten

sudo apt-get install build-essential checkinstall automake autoconf autotools-dev libtool fuse-utils libfuse-dev swig libusb-dev

Im nächsten Schritt wird eine Entwicklungsumgebung (am Besten im Home-Verzeichnis) eingerichtet, sowie das Quellpaket heruntergeladen und entpackt:

mkdir -p src/build/owfs
cd src/build/owfs
wget http://downloads.sourceforge.net/project/owfs/owfs/2.8p14/owfs-2.8p14.tar.gz
tar xzf owfs-2.8p14.tar.gz
cd owfs-2.8p14/

 

OWFS konfigurieren und Übersetzen

Nun wird OWFS für die Übersetzung konfiguriert. Weitere Parameter können über ./configure --help eingesehen werden.

./configure --prefix=/usr --with-perl5 --enable-debug=no

Nachdem die vorbereitende Konfiguration durchlaufen ist, wird als nächstes die Software gebaut

make

und anschließend ein Paket zur Installation mittels checkinstall erzeugt

sudo checkinstall -D --install=no --pkgname=owfs --pkgversion=2.8p14 --pkgrelease=1.0 --requires=fuse-utils --pkggroup=electronics --pkgsource=owfs-2.8p14 --pakdir=../ -y

Je nach eingesetztem Rechner dauert der Durchlauf der obigen Befehle ein wenig.

 

OWFS installieren

Als Ergebnis der vorherigen Schritte sollte nun im übergeordneten Verzeichnis das Paket owfs_2.8p14-1.0_i386.deb vorliegen, welches nun installiert wird.

cd ../
sudo dpkg -i owfs_2.8p14-1.0_i386.deb

 

Kerneltreiber entladen

Wie Eingangs und im Teil 1 bereits erwähnt, sollten vor der Nutzung von OWFS die entsprechenden Kerneltreiber entladen sein. Hier noch mal als Wiederholung in einer etwas abgeänderten Version, falls der Busmaster (z.B. DS9490R) bereits an einem USB-Port angeschlossen ist:

sudo modprobe -r ds9490r
sudo modprobe -r ds2490
sudo modprobe -r wire

Um das Laden der Kernelmodule dauerhaft zu unterbinden wird eine entsprechende Blacklist-Regel erstellt (der Name ist abweichend von dem Beispiel in Teil 1, kann aber beliebig gewählt werden.):

sudo vi /etc/modprobe.d/blacklist-1wire.conf
# 1-wire busmaster
blacklist ds9490r
blacklist ds2490
blacklist wire

 

Berechtigungen für den Busmaster einrichten

Damit die entsprechenden Berechtigungen auf den Busmaster DS9490R beim Anschluß an einen USB-Port gesetzt werden, wird eine Regel unter UDev erstellt:

sudo vi /etc/udev/rules.d/60-owfs.rules
##########################################################
SUBSYSTEM!="usb_device", ACTION!="add", GOTO="owfs_rules_end"
# DS2490 1-Wire adapter
ATTR{idVendor}=="04fa", ATTR{idProduct}=="2490", MODE="0666"
LABEL="owfs_rules_end"
##########################################################

Da OWFS den Zugriff auf den 1-Wire Bus unter anderem auch über das Filesystem mittels FUSE ermöglicht, müssen hierzu auch die entsprechenden Berechtigungen gesetzt werden.

sudo vi /etc/fuse.conf

Wichtig ist dabei die Zeile user_allow_other. Diese ist per Default auskommentiert und muss wie folgt abgeändert werden.

# Set the maximum number of FUSE mounts allowed to non-root users.
# The default is 1000.
#
#mount_max = 1000
# Allow non-root users to specify the 'allow_other' or 'allow_root'
# mount options.
#
user_allow_other

 

Mountpoint für 1-Wire Bus einrichten

Damit OWFS über FUSE den 1-Wire Bus im Filesystem einbinden kann, muss natürlich ein entsprechender Mountpoint vorhanden sein. Dieser kann an einem beliebigen Ort im Filesystem liegen, vorzugsweise unter /mnt/1wire.

sudo mkdir /mnt/1wire

 

OWFS konfigurieren

OWFS beinhaltet wie bereits erwähnt die Dienste owserver, owhttpd, owftpd und owfs. Zwar können alle Dienste direkt über die Commandline mit entsprechenden Parametern gestartet werden, doch um diese Angaben nicht bei jedem Start angeben zu müssen wird eine Konfigurationsdatei angelegt:

sudo vi /etc/owfs.conf
# Sample configuration file for the OWFS suite for Debian GNU/Linux.
#
#
# This is the main OWFS configuration file. You should read the
# owfs.conf(5) manual page in order to understand the options listed
# here.
# setup owserver's port
server: port = 4304
# all programs BUT not owserver see this line
!server: server = localhost:4304
# setup owserver's device
# only owserver connects to the USB device
server: usb
# setup owhttpd's port
http: port = 3001
# setup owftpd's port
ftp: port = 2121
# fuseow
owfs: mountpoint = /mnt/1wire
owfs: allow_other
# random simulated device
#server: FAKE = DS2406,DS2413

Zur Erklärung:

# setup owserver's port
server: port = 4304
# all programs BUT not owserver see this line
!server: server = localhost:4304

Legt fest, das der owserver auf Port 4304 läuft und alle anderen Dienste ihn unter localhost:4304 ansprechen können.

# setup owserver's device
# only owserver connects to the USB device
server: usb

Der Busmaster wird über USB angeschlossen.

# setup owhttpd's port
http: port = 3001
# setup owftpd's port
ftp: port = 2121

Dem HTTP- und FTP-Dienst wird jeweils ein Port zugewiesen.

# fuseow
owfs: mountpoint = /mnt/1wire
owfs: allow_other

Der 1-Wire Bus wird unter dem zuvor angelegten Mountpoint eingebunden und FUSE bekommt die Anweisung, das auch andere Benutzer ausser root auf den Mountpoint zugreifen können.

# random simulated device
#server: FAKE = DS2406,DS2413

Die letzte Zeile ist in diesem Beispiel auskommentiert, jedoch sehr nützlich. Möchte man 1-Wire Slaves simulieren um z.B. ein Script zu entwickeln, dann können hier diverse Devices angegeben werden. In diesem Beispiel (sofern die Auskommentierung aufgehoben wird) würde OWFS einen DS2405 und DS2413 Slave simulieren. Dadurch kann man direkt auf diese Devices zugreifen, als wenn sie physikalisch im 1-Wire Bus hängen würden.

 

OWFS Dienste automatisch starten

Um die OWFS-Dienste nicht bei jedem Neustart des Rechners von Hand starten zu müssen, werden entsprechende Start-Scripte benötigt. Diese liegen alle unter /etc/init.d. Exemplarisch zeige ich hier den Aufbau des owserver Scriptes. Alle Scripte können hier heruntergeladen werden.

#!/bin/sh
### BEGIN INIT INFO
# Provides:          owserver
# Required-Start:    $remote_fs $syslog $network $named
# Required-Stop:     $remote_fs $syslog $network $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: 1-wire TCP server
# Description:       Start and stop a TCP server for 1-wire control.
### END INIT INFO
PATH=/sbin:/bin:/usr/sbin:/usr/bin
CONFFILE=/etc/owfs.conf
DESC="1-Wire TCP Server"
NAME="owserver"
DAEMON=/usr/bin/$NAME
PIDDIR=/var/run/owfs
PIDFILE=$PIDDIR/$NAME.pid
# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
. /lib/lsb/init-functions
d_start() {
    [ -d $PIDDIR ] || {
    mkdir -m 0775 -p $PIDDIR
    chown root:root $PIDDIR >/dev/null 2>&1
    }
    start-stop-daemon --start --quiet --oknodo --exec $DAEMON -- -c $CONFFILE \
        --pid-file $PIDFILE
    # ensure the daemon has been started 
    sleep 1
    pidofproc -p $PIDFILE $DAEMON >/dev/null
}
d_stop() {
    start-stop-daemon --stop --quiet --oknodo --exec $DAEMON
    sleep 1
    if [ -f $PIDFILE ] && ! ps h `cat $PIDFILE` > /dev/null
    then
        # Stale PID file (owserver was successfilly stoped),
        #remove it
        rm -f $PIDFILE
    fi
}
d_status() {
    pidofproc -p $PIDFILE $DAEMON > /dev/null
}
case "$1" in
    start)
        log_daemon_msg "Starting $DESC" "$NAME"
        d_start
        log_end_msg $?
        ;;
    stop)
        log_daemon_msg "Stopping $DESC" "$NAME"
        d_stop
        log_end_msg $?
        ;;
    restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        d_status && d_stop
        d_start
        log_end_msg $?
        ;;
    status)
        d_status
        if [ $? -eq 0 ];then
            log_success_msg "$NAME is running"
        else
            log_failure_msg "$NAME is not running"
        fi
        ;;
    *)
        echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload|status}" >&2
        exit 1
        ;;
esac
exit 0

Nachdem alle vier Dateien in /etc/init.d angelegt wurden, können diese abschliessend in den Boot- und Halt-Vorgang eingebunden werden:

sudo update-rc.d owserver defaults 90
sudo update-rc.d owhttpd defaults 91
sudo update-rc.d owftpd defaults 91
sudo update-rc.d owfs defaults 91

Natürlich können Dienste wie z.B. owftpd ausgelassen werden, die nicht benötigt werden. Ich nutze z.B. nur owserver und owhttpd.

Damit wären die Vorbereitungen abgeschlossen. Als Ergebnis liegt nun ein konfiguriertes OWFS 1-Wire Filesystem inkl. HTTP und FTP Zugriff vor. Da OWFS modular aufgebaut ist, kann z.B. owserver auf einem anderen System liegen als der owhttpd und / oder owftpd als auch der Zugriff über das von OWFS bereitgestellte Filesystem mittels owfs von einem weiteren System erfolgen.

Der Artikel 1-Wire Integration in FHEM beschreibt die Einbindung von OWFS in die Hausautomations-Software FHEM.

Powered by ...

 

 

reichelt elektronik – Elektronik und PC-Technik