Difference between revisions of "Nutzung in FHEM (Deutsch)"
m (→BMP085/BMP180 Luftdrucksensor) |
(→1-Wire Temperatursensoren) |
||
Line 21: | Line 21: | ||
== [[Onewire_(Deutsch) | 1-Wire Temperatursensoren]] == | == [[Onewire_(Deutsch) | 1-Wire Temperatursensoren]] == | ||
− | + | [[File:DS18B20.jpg|150px|thumb|right|DS18B20-Sensoren]] | |
+ | Die 1wire-Temperatursensoren DS18B20 oder DS18S20 werden im [[Onewire_(Deutsch)#Polling_Modus | Polling Modus]] abgefragt. Das macht die zyklische Abfrage aus FHEM heraus wesentlich einfacher. Eine Polling-Zeit von mindestens 30 Sekunden ist absolut ausreichend.Im Vorfeld sollte man sich die [[Onewire_(Deutsch)#Benennung_von_Sensoren | ROM-Codes der Sensoren]] notieren, da diese nachher benötigt werden. | ||
+ | |||
+ | 1w-temp.classdef erstellen: | ||
+ | <source lang="perl"> | ||
+ | # Uebergabeparameter Onewire Rom-Code | ||
+ | params devID | ||
+ | # Umsetzung in ECMD Befehle 1w get = Temperatur auslesen | ||
+ | get 1W cmd {"1w get %devID\n"} | ||
+ | get 1W expect "\d+.\d\n" | ||
+ | get 1W postproc {\ | ||
+ | s/\n//g;\ | ||
+ | my $hash = $defs{%NAME};\ | ||
+ | my $temperature = $_;\ | ||
+ | my $state = "T: $temperature";\ | ||
+ | \ | ||
+ | readingsSingleUpdate($hash, "temperature", $temperature, 1);\ | ||
+ | readingsSingleUpdate($hash, "state", $state, 1);\ | ||
+ | \ | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | Die classdef wird eingebunden: | ||
+ | <pre> | ||
+ | define NETIO_KU ECMD telnet 192.168.3.82:2701 | ||
+ | attr NETIO_KU classdefs 1W-TEMP=/opt/fhem/FHEM/1w-temp.classdef | ||
+ | </pre> | ||
+ | |||
+ | Die Sensoren werden anhand des ROM-Code definiert: | ||
+ | <pre> | ||
+ | define HZ_WW ECMDDevice 1W-TEMP 284c8820050003d4 | ||
+ | attr HZ_WW IODev NETIO_KU | ||
+ | define HZ_VL ECMDDevice 1W-TEMP 2890a520050003d7 | ||
+ | attr HZ_VL IODev NETIO_KU | ||
+ | </pre> | ||
+ | Eine zyklische Messung pro Minute lässt sich in dieser Form auslösen: | ||
+ | <pre> | ||
+ | define Messung_1w at +*00:01 get HZ_WW 1W;; get HZ_VL 1W | ||
+ | attr Messung_1w verbose 1 | ||
+ | </pre> | ||
== [[DHT|DHT22 Temperatur-/Feuchtesensoren]] == | == [[DHT|DHT22 Temperatur-/Feuchtesensoren]] == |
Revision as of 16:19, 17 August 2014
FHEM ist ein Hausautomations-Server von Rudolf Koenig et al. in Perl geschrieben, um diverse per Funk und Kabel angebundene Komponenten aus dem Bereich der Hausautomation zu steuern. Er ist lizensiert unter der GPL v2.
Das AVR-Net-IO von Pollin mit Ethersex dient als preisgünstiger Einstieg in die Hausautomatisierung. Verwendbar ist aber auch jede andere Hardware, die von Ethersex unterstützt wird (Arduino, eigene Entwicklungen, etc.). Über ECMD lassen sich dabei theoretisch alle in Ethersex vorhandenen Möglichkeiten nutzen, sofern in FHEM entsprechende ECMD-Devices definiert und eingebunden werden.
Contents
Grundlagen
Ausgehend von einem fertigen und per Telnet erreichbaren Ethersex muss in FHEM zuerst das entsprechende Device definiert werden.
define NETIO_WZ ECMD telnet 192.168.3.81:2701
Eine serielle Anbindung kann mit define <name> ECMD serial <SerialDevice>[<@BaudRate>] alternativ erfolgen.
Anschließend werden die erstellten .classdef-Konfigurationsdateien der einzelnen Funktionen dem System bekannt gemacht. In diesen .classdef-Dateien (Name und Endung sind frei wählbar!) wird die Schnittstelle zwischen FHEM und ECMD/Ethersex definiert. Dabei können mit perl übergebene Parameter und empfangene Daten bearbeitet sowie die in FHEM gebräuchlichen Readings erstellt werden.
attr NETIO_WZ classdefs RFM12_2272=/opt/fhem/FHEM/rfm12_2272.classdef:RFM12_IT=/opt/fhem/FHEM/rfm12_it.classdef:LCD=/opt/fhem/FHEM/lcd.classdef:DHT22=/opt/fhem/FHEM/dht22.classdef:1WIRE=/opt/fhem/FHEM/1wire.classdef
Die Definitionen für IC2272, Intertechno, HD44780-LCD, DHT22 und 1wire sind nun eingebunden. In den folgenden Abschnitten wird auf die einzelnen Devices näher eingegangen. Generell sind Pfade und IP-Adressen sowie übergebene Parameter noch entsprechend der eigenen Konfiguration anzupassen.
1-Wire Temperatursensoren
Die 1wire-Temperatursensoren DS18B20 oder DS18S20 werden im Polling Modus abgefragt. Das macht die zyklische Abfrage aus FHEM heraus wesentlich einfacher. Eine Polling-Zeit von mindestens 30 Sekunden ist absolut ausreichend.Im Vorfeld sollte man sich die ROM-Codes der Sensoren notieren, da diese nachher benötigt werden.
1w-temp.classdef erstellen:
# Uebergabeparameter Onewire Rom-Code
params devID
# Umsetzung in ECMD Befehle 1w get = Temperatur auslesen
get 1W cmd {"1w get %devID\n"}
get 1W expect "\d+.\d\n"
get 1W postproc {\
s/\n//g;\
my $hash = $defs{%NAME};\
my $temperature = $_;\
my $state = "T: $temperature";\
\
readingsSingleUpdate($hash, "temperature", $temperature, 1);\
readingsSingleUpdate($hash, "state", $state, 1);\
\
}
Die classdef wird eingebunden:
define NETIO_KU ECMD telnet 192.168.3.82:2701 attr NETIO_KU classdefs 1W-TEMP=/opt/fhem/FHEM/1w-temp.classdef
Die Sensoren werden anhand des ROM-Code definiert:
define HZ_WW ECMDDevice 1W-TEMP 284c8820050003d4 attr HZ_WW IODev NETIO_KU define HZ_VL ECMDDevice 1W-TEMP 2890a520050003d7 attr HZ_VL IODev NETIO_KU
Eine zyklische Messung pro Minute lässt sich in dieser Form auslösen:
define Messung_1w at +*00:01 get HZ_WW 1W;; get HZ_VL 1W attr Messung_1w verbose 1
DHT22 Temperatur-/Feuchtesensoren
Ethersex unterstützt die preiswerten Temperatur-/Feuchtesensoren DHT11 und DHT22, wobei letztere um einiges genauer sind.
Die Sensoren benötigen 5V Betriebsspannung und kommunizieren über je einen Pin mit dem Prozessor. Der Preis pro Stück liegt derzeit bei etwa 3.50 Euro (ebay/China). Wer die Trägheit und Ungenauigkeit der S300TH oder TX29DTH kennt, wünscht sich vermutlich Besseres; vor allem bei Berechnung von Taupunkt und absoluter Feuchte, welche von der Genauigkeit der gemessenen Eingangsgrößen sehr profitieren. Berechnungen von Hand kann man beim Wetterochs durchführen. Die automatische Berechnung der absoluten Feuchte in FHEM wird im Forum erklärt.
Einbindung in FHEM
dht22m.classdef erstellen:
# Uebergabeparameter DHT22 ID 0...n params devID # Umsetzung in ECMD Befehle fuer DHT22 get DHT cmd {"dht temp %devID\n\000dht humid %devID\n"} get DHT expect "\d+.\d\n" get DHT postproc {\ s/(.*)\n(.*)\n/T: $1 H: $2/; $_;\ my $hash = $defs{%NAME};\ my $temperature = $1;\ my $humidity = $2;\ my $state = $_;\ \ readingsSingleUpdate($hash, "temperature", $temperature, 1);\ readingsSingleUpdate($hash, "humidity", $humidity, 1);\ readingsSingleUpdate($hash, "state", $state, 1);\ \ }
Die classdef wird eingebunden:
define NETIO_TEST ECMD telnet 192.168.3.89:2701 attr NETIO_TEST classdefs DHT22M=/opt/fhem/FHEM/dht22m.classdef
Die Sensoren werden definiert:
define Test0 ECMDDevice DHT22M 0 attr Test0 IODev NETIO_TEST define Test1 ECMDDevice DHT22M 1 attr Test1 IODev NETIO_TEST define Test2 ECMDDevice DHT22M 2 attr Test2 IODev NETIO_TEST define Test3 ECMDDevice DHT22M 3 attr Test3 IODev NETIO_TEST
Eine zyklische Messung alle 4 Minuten könnte so aussehen:
define Messung_DHT at +*00:04 get Test0 DHT;; get Test1 DHT;; get Test2 DHT;; get Test3 DHT attr Messung_DHT verbose 0
Fünfzehn Messwerte pro Stunde genügen den allermeisten Anforderungen.
BMP085/BMP180 Luftdrucksensor
Ethersex unterstützt den BMP085 (bzw. den BMP180; der Code ist identisch) über das I2C-Interface. Da der Sensor für 3.3V Betriebsspannung ausgelegt ist, muss entweder der I2C-Pegel angepasst oder der ATMega auf 3.3V adaptiert werden. Weiterhin sollte die Höhe über Null bekannt sein. Beispiel: Eine Abfrage per ECMD mit bmp085 pressnn 59000 bedeutet, das ich 590m (59000cm) über NN wohne.
Die im Sensor verfügbare Temperatur wird parallel ausgelesen.
Einbindung in FHEM
bmp085.classdef erstellen:
get BMP cmd {"bmp085 temp\n\000bmp085 pressnn 59000\n"}
get BMP expect ".*"
get BMP postproc {\
s/(.*)\n(.*)\n/T: $1 P: $2/; $_;\
my $hash = $defs{%NAME};\
my $temperature = $1/10;\
my $pressure = sprintf("%.1f",$2/100);\
my $state = "T: $temperature P: $pressure";\
\
readingsSingleUpdate($hash, "temperature", $temperature, 1);\
readingsSingleUpdate($hash, "pressure", $pressure, 1);\
readingsSingleUpdate($hash, "state", $state, 1);\
\
}
Die Temperatur wird in °C mit einer Nachkommastelle gelesen, der Luftdruck in hPa bzw. mbar auf eine Nachkommastelle gerundet. Passende Readings werden erstellt. Das expect .* kann noch angepasst werden, um bei fehlerhaften Messwerten entsprechend zu reagieren.
Die classdef wird in FHEM eingebunden (mehrere .classdef mit Doppelpunkt trennen: siehe Grundlagen):
define NETIO_STK ECMD telnet 192.168.3.89:2701 attr NETIO_STK classdefs BMP=/opt/fhem/FHEM/bmp085.classdef
Der Sensor wird definiert:
define BMP180 ECMDDevice BMP attr BMP180 IODev NETIO_STK
Das STATE kann mit Maßeinheiten versehen werden:
attr BMP180 stateFormat { sprintf("%s°C %shPa", ReadingsVal("BMP180","temperature",0), ReadingsVal("BMP180","pressure",0)) ;; }
Eine zyklische Messung alle 4 Minuten könnte so aussehen:
define Messung_BMP at +*00:04 get BMP180 BMP attr Messung_BMP verbose 0
Dabei unterdrückt verbose 0 einen zusätzlichen (doppelten) Logeintrag des Messvorganges.
analoge Eingänge
todo
LTC1257 D/A-Wandler
todo
HD44780 Punktmatrixdisplays
todo
Intertechno schalten mit RFM12
todo
IC2272 schalten mit RFM12
todo