OneWire-Daten auf einem ARM-Rechner mit OpenHAB

Bei mir geht’s um Temperaturen, aber die sind beispielhaft für jede Art von analogen Daten. Wie schon in meinem ersten Artikel zum Thema Heizungssteuerung beschrieben lese ich die analogen Daten allerdings digital aufbereitet ein: Die Digitalisierung übernimmt der Temperatursensor, der die Daten dann über das OneWire -Protokoll zur Verfügung stellt.

Theoretisch kann mein Olinuxino-Micro-Board das OneWire-Protokoll verstehen (und sprechen), allerdings muss dazu ein GPIO-Pin per Software in recht hoher Frequenz angesteuert werden, so dass der Prozessor viel zu tun kriegt und die Ansprüche in Richtung Echtzeit-System gehen. Daher setze ich lieber einen kleinen, günstigen Chip ein, der OneWire in I2C übersetzt (es gibt aber alternativ auch OneWire-USB-Sticks).

I2C kann der ARM nebenher erledigen. Die gängigen Linux-Systeme stellen die I2C-Busse des Boards als Devices unter /dev zur Verfügung:

ls -al /dev/i2*
crw-rw---- 1 root i2c 89, 0 May 22 16:54 /dev/i2c-0
crw-rw---- 1 root i2c 89, 1 May 22 16:54 /dev/i2c-1
crw-rw---- 1 root i2c 89, 2 May 22 16:54 /dev/i2c-2

Mein Armbian -Linux bietet mir also drei I2C-Busse, von denen ich den ersten nutze. Aber immer der Reihe nach! Ich will ja eigentlich OneWire, I2C brauche ich nur als Mittel zum Zweck. Wie kann ich unter Linux denn OneWire einbinden, so dass OpenHAB darauf zugreifen kann? Ein Blick in die OpenHAB-Wiki verrät uns:

Ganz einfach, wir installieren uns den owserver, Bestandteil des owfs . Wie fast immer geht das mit einem Einzeiler:

apt-get install owfs

owfs stellt den OneWire-Bus unter anderem ins Netz über IP-Adresse:2121 zur Verfügung. Du kannst also jetzt nach der Installation einfach mal in die Adressleiste deines Browsers 192.168.1.19:2121 eingegben (du musst natürlich die IP-Adresse deines ARM-Rechners nehmen), dann sollte dort in etwa erscheinen:

OWHHTPD-Screenshot

Ich habe jetzt meinen OneWire-I2C-Übersetzer an den I2C-0 angeschlossen (GPIO-2 Pin 5 und Pin 7) und die Datei /etc/owfs.conf entsprechend konfiguriert. Also nano /etc/owfs.conf eingeben, dann folgende Einträge vornehmen:

######################### OWFS ##########################
#
mountpoint = /mnt/1wire
allow_other
device = /dev/i2c-0
Celsius
error_print = 0
error_level = 0
#
####################### OWHTTPD #########################

Also nur in der Sektion OWFS die auskommentierten Zeilen hereinnehmen und das Device und drei Einstellungen hinzufügen.
Ein service owserver restart liest die neue Konfiguration ein. Ein erneuter Aufruf der Website des ow-servers auf Port 2121 zeigt meine Temperatursensoren (zusätzlich zu den beispielhaften fake-Sensoren von vorher):

OWHHTPD mit Sensoren

Ein Klick auf einen der Sensoren bringt folgendes zu Tage:

Sensordaten

Hier handelt es sich um einen der Sensoren am Speicher, daher die recht hohe Temperatur von fast 59°C.

Also gut, das OneWire-Protokoll funktioniert, das I2C-Protokoll auch, wir können die Sensordaten auf einer Webseite anschauen, aber was ist jetzt mit OpenHAB? Genau wie neulich für die GPIOs braucht OpenHAB ein Binding-Modul, um OneWire zu verstehen. Dieses wird uns glücklicherweise als Paket bereitgestellt:

apt-get install openhab-addon-binding-onewire

und schon ist es installiert! Die Konfiguration nehmen wir in der Datei /etc/openhab/configurations/openhab.cfg vor. Dort gibt es bereits einen Abschnitt “OneWire”, in dem wir nur noch bei der IP-Adresse das # entfernen müssen, so dass dort steht:

onewire:ip=127.0.0.1

Um mit OneWire zu arbeiten, muss OpenHAB neu gestartet werden, aber davor wollen wir schonmal unsere OneWire-Sensoren in die Items-Datei eintragen. Da wir ja vor ein paar Tagen den OpenHAB-Designer kennengelernt haben, sollten wir ihn auch benutzen. Ich füge also in der default.items-Datei folgende Zeile hinzu:

Number  Temperature_Wohnzimmer  "Wohnzimmer [%.1f °C]"  <temperature>  { onewire="deviceId=28.D8C1AD020000EF;propertyName=temperature" }

Number sagt OpenHAB, dass es sich um eine Zahl handelt, die ich hinzufügen will. Ich nenne diese Zahl Temperature_Wohnzimmer und gebe ihr die Beschriftung (label) "Wohnzimmer [%.1f °C]". <temperature> sorgt für ein passendes Icon (kleines Thermometer, dieser Ausdruck ist optional). Jetzt folgt der entscheidende Teil in den geschwungenen Klammern: Die Number wird verbunden mit dem OneWire-Sensor mit der angegebenen (weltweit einmaligen einzigartigen) ID des Sensors. Wer gut aufgepasst hat, erkennt diese ID auf dem Screenshot oben wieder! Das anschließende propertyName=temperature sorgt dafür, dass vom Sensor das Datum “temperature” verwendet wird (und nicht “family”, “id”, “locator” oder sonstwas, denn auch diese Daten kann der Sensor ausspucken). Im OpenHAB-Wiki ist beschrieben, was für weitere Parameter zulässig sind, aber die lasse ich hier weg.

In meine Sitemap trage ich jetzt noch folgende Zeile ein, und zwar zwischen die Klammern und an der Stelle, an der auf der Seite die Temperatur angezeigt werden soll:

Text item= Temperature_Livingroom

Nun der Neustart von OpenHAB:

service openhab restart

Und das war’s für heute. Unser OpenHAB kann jetzt OneWire! Die nächsten Tage schreibe ich dann, wie diese Daten in eine dafür geeignete Datenbank gelangen.

2 Kommentare on "OneWire-Daten auf einem ARM-Rechner mit OpenHAB"


  1. Hallo,

    ich habe das Problem, dass die Sensoren, die ich dem Bus hinzugefügt habe nicht auf der Internetseite erscheinen aber im Dateipfad schon. Was habe och noch falsch gemacht?

    Antworten

    1. Mmh, das lässt sich so einfach nicht sagen. Zuerst mal eine Gegenfrage: Wie lautet der Dateipfad bzw. die (virtuelle) Datei, die dir den Sensor zu erkennen gibt? Zweitens: Benutzt du auch I2C, um auf OneWire zuzugreifen? Falls nicht, muss deine owfs.conf natürlich anders lauten als bei mir.

      Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.