AVR-NET-IO: Unterschied zwischen den Versionen
K (Kategorien ergänzt + einige kleinere Korrekturen) |
Keine Bearbeitungszusammenfassung |
||
(19 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[File:AVR-NET-IO.jpg|300px|thumb|AVR-NET-IO Ansicht fertig bestückte Platine (Bild Pollin GmbH)]] | [[File:AVR-NET-IO.jpg|300px|thumb|AVR-NET-IO Ansicht fertig bestückte Platine (Bild Pollin GmbH)]] | ||
== Beschreibung == | == Beschreibung == | ||
Das AVR-NET-IO ist eine kostengünstige Hardwareplattform mit einem AVR Microcontroller, den es als Bausatz oder als Fertiggerät beim Elektronik-Versender | Das AVR-NET-IO ist eine kostengünstige Hardwareplattform mit einem AVR Microcontroller, den es als Bausatz (ca. 20 €) oder als Fertiggerät (ca. 30 € ohne Gehäuse) beim Elektronik-Versender [http://www.pollin.de/ Pollin] zu erwerben gibt. Ausgestattet ist er mit einem Microcontroller ATMega32 und einem Netzwerkcontroller ENC28J60. Er bietet standardmäßig 8 digitale Ausgänge, 4 digitale und 4 analoge Eingänge, die sich über das Netzwerk abrufen bzw. schalten lassen. Das Board hat eine ISP-Schnittstelle integriert, über die der Microcontroller mit einer eigenen bzw. alternativen Software beschrieben werden kann. | ||
Es gibt im Netz diverse Anleitungen zur Verbesserung und Optimierung der Schaltung, zum Austausch des Controllers zu einem leistungsfähigeren ATmega644 oder ATmega1284p mit mehr internen Speicherplatz für die Firmware (z.B. [http://www.mikrocontroller.net/articles/AVR_Net-IO_Bausatz_von_Pollin hier]). Aber auch im originalen Auslieferungszustand bietet der AVR-NET-IO schon viel Potential für eigene Projekte. | Es gibt im Netz diverse Anleitungen zur Verbesserung und Optimierung der Schaltung, zum Austausch des Controllers zu einem leistungsfähigeren ATmega644 oder ATmega1284p mit mehr internen Speicherplatz für die Firmware (z.B. [http://www.mikrocontroller.net/articles/AVR_Net-IO_Bausatz_von_Pollin hier]). Aber auch im originalen Auslieferungszustand bietet der AVR-NET-IO schon viel Potential für eigene Projekte. | ||
Für den Einsatz mit FHEM wird der Microcontroller mit der konfigurierbaren Software aus dem Projekt | Für den Einsatz mit FHEM wird der Microcontroller mit der konfigurierbaren Software aus dem Projekt [http://old.ethersex.de/index.php/Ethersex Ethersex] betrieben. Diese alternative Software ist inzwischen zu einer sehr gut ausgebauten und stabil laufenden Firmware für diverse AVR Hardwareplattformen herangereift. Die Steuerung erfolgt über die eigene, integrierte Protokollsprache Ethersex Command (ECMD) | ||
Die notwendigen Module in FHEM zur Kommunikation mit ethersex haben die Bezeichnung | Die notwendigen Module in FHEM zur Kommunikation mit ethersex haben die Bezeichnung [http://neubert-volmar.de/Hausautomation/index.html ECMD]. | ||
== Konfiguration und Flashen von ethersex == | == Konfiguration und Flashen von ethersex == | ||
Die Möglichkeiten von ethersex sind vielfältig und bieten über die modulare Bauweise eine einfache Erweiterbarkeit durch die Community. Die Funktionen der Module können über eine Oberfläche im Konfigurationsmodus bequem an und ausgeschaltet werden, sodaß nur die gewünschten Funktionen in der zu erstellenden Firmware landen. Allen gemeinsam ist die einfache Steuerbarkeit über den ECMD Befehlsssatz | Die Möglichkeiten von ethersex sind vielfältig und bieten über die modulare Bauweise eine einfache Erweiterbarkeit durch die Community. Die Funktionen der Module können über eine Oberfläche im Konfigurationsmodus bequem an und ausgeschaltet werden, sodaß nur die gewünschten Funktionen in der zu erstellenden Firmware landen. Allen gemeinsam ist die einfache Steuerbarkeit über den ECMD Befehlsssatz | ||
Die Konfiguration von ethersex erfolgt in einer Unix/Linux Umgebung (unter Windows auch mit Cygwin möglich) und die compilierte Firmwaredatei wird mittels eines ISP Programmers auf den AVR Microcontroller geflasht. Grundlegende Anleitungen zu ethersex bekommt ihr | Die Konfiguration von ethersex erfolgt in einer Unix/Linux Umgebung (unter Windows auch mit Cygwin möglich) und die compilierte Firmwaredatei wird mittels eines ISP Programmers auf den AVR Microcontroller geflasht. Grundlegende Anleitungen zu ethersex bekommt ihr [http://www.gtkdb.de/index_18_1036.html hier]. | ||
Wenn alles erfolgreich geflasht ist, | Wenn alles erfolgreich geflasht ist, ist euer AVR-NET-IO unter der gewählten IP Adresse im Netzwerk erreichbar. Es zeigt dann auch eine Homepage mit einigen Funktionen an. | ||
''Hinweis: Wenn man an den Net-IO | '''Eine erweiterte Dokumentation zu vielen Devices ist im [http://ethersex.de/index.php/Nutzung_in_FHEM_%28Deutsch%29 Ethersex-Wiki] zu finden. Ebenso wird hier unter anderem [http://www.ethersex.de/index.php/Supported_Boards_%28Deutsch%29 Eigenbau-Hardware] vorgestellt, welche mit FHEM erprobt wurde.''' | ||
siehe auch: | |||
''Hinweis: Wenn man an den Net-IO noch ein LCD anschließen will (wenn DB-25 belegt ist bleibt dafür nur der Steckverbinder EXT), verbietet sich der Anschluss der 1-Wire-Sensoren am in Ethersex vorkonfigurierten Port PD6. Verzichtet man auf einen Analogeingang, lässt sich der 1-Wire-Bus auch an der Schraubklemme ADC1 aufschalten. Vorteil ist, dass man gleich alle passenden Spannungen (GND, +5V) an den beiden nebenliegenden Schraubklemmen hat. Das Pinning muss dann vor dem "Make" von Ethersex in der Datei pinning/hardware/netio.m4 von PD6 auf PA4 geändert werden.'' (siehe auch: [http://old.ethersex.de/index.php/Dallas_1-wire_Bus hier]). | |||
== Funktionen in Verbindung mit FHEM == | == Funktionen in Verbindung mit FHEM == | ||
Einige Modulfunktionen, die ich selbst mit FHEM zusammen im Einsatz habe, möchte ich in diesem Wiki näher beschreiben | Einige Modulfunktionen, die ich selbst mit FHEM zusammen im Einsatz habe, möchte ich in diesem Wiki näher beschreiben. | ||
Um das AVR-NET-IO im FHEM bekannt zu machen, müssen folgende Definitionen in der [[Konfiguration]] (fhem.cfg) gemacht werden: | Um das AVR-NET-IO im FHEM bekannt zu machen, müssen folgende Definitionen in der [[Konfiguration]] (fhem.cfg) gemacht werden: | ||
Zeile 29: | Zeile 29: | ||
/fhem/intertechno.classdef:RELAIS=/var/InternerSpeicher/fhem/relais.classdef | /fhem/intertechno.classdef:RELAIS=/var/InternerSpeicher/fhem/relais.classdef | ||
attr NETIO_01 room Interfaces</nowiki> | attr NETIO_01 room Interfaces</nowiki> | ||
Bitte beachten: Der Name (NETIO_01) und die IP (192.168.0.99) müssen euren eingestellten Werten aus der ethersex Konfiguration entsprechen. Die Classdef Konfigurationsdateien braucht ihr für meine Beispiele - legt sie einfach schon einmal leer an. Diese befinden sich bei mir im Verzeichnis einer Fritzbox 7390 - das kann bei euch individuell anders sein. Erklärungen und Inhalt zu den classdef-Dateien befinden sich in dem jeweiligen Komponenten Beispiel. Die | Bitte beachten: Der Name (NETIO_01) und die IP (192.168.0.99) müssen euren eingestellten Werten aus der ethersex Konfiguration entsprechen. Die Classdef Konfigurationsdateien braucht ihr für meine Beispiele - legt sie einfach schon einmal leer an. Diese befinden sich bei mir im Verzeichnis einer Fritzbox 7390 - das kann bei euch individuell anders sein. Erklärungen und Inhalt zu den classdef-Dateien befinden sich in dem jeweiligen Komponenten Beispiel. Die Raum-Zuweisung ist optional. | ||
[[Datei:TempSensorDS18S20.JPG|300px|right|thumb|Temperatursensor DS18S20 (Bild Pollin GmbH)]] | [[Datei:TempSensorDS18S20.JPG|300px|right|thumb|Temperatursensor DS18S20 (Bild Pollin GmbH)]] | ||
Zeile 37: | Zeile 36: | ||
Das [[1-Wire]] Bussystem wird klassisch für die Temperaturmessung mit den preiswerten, vorkalibrierten Dallas/Maxim Sensoren der Typen DS18S20/DS18B20 genutzt. Ich nutze zur Zeit sechs Temperatursensoren DS18S20 im parasitären Modus (nur zwei Drähte notwendig) an einer alten Telefonverkabelung und zwei verkapselte, wasserdichte DS18B20 in Edelstahlhülse für die Temperaturmessung in Aquarien. | Das [[1-Wire]] Bussystem wird klassisch für die Temperaturmessung mit den preiswerten, vorkalibrierten Dallas/Maxim Sensoren der Typen DS18S20/DS18B20 genutzt. Ich nutze zur Zeit sechs Temperatursensoren DS18S20 im parasitären Modus (nur zwei Drähte notwendig) an einer alten Telefonverkabelung und zwei verkapselte, wasserdichte DS18B20 in Edelstahlhülse für die Temperaturmessung in Aquarien. | ||
Die Konfiguration im ethersex und der Anschluss der 1-Wire Temperatursensoren am AVR-NET-IO sind | Die Konfiguration im ethersex und der Anschluss der 1-Wire Temperatursensoren am AVR-NET-IO sind [http://www.gtkdb.de/index_18_1040.html hier] beschrieben. | ||
Die Datei onewire.classdef hat folgenden Inhalt: | Die Datei onewire.classdef hat folgenden Inhalt: | ||
< | <syntaxhighlight lang="perl"> | ||
# Übergabeparameter Onewire Geräte ID | # Übergabeparameter Onewire Geräte ID | ||
params devID | params devID | ||
# Umsetzung in ECMD Befehle 1w convert = Messung auslösen, 1w get = Tempwert lesen | # Umsetzung in ECMD Befehle 1w convert = Messung auslösen, 1w get = Tempwert lesen | ||
set messen cmd {"1w convert\n"} | set messen cmd {"1w convert\n"} #ist überflüssig, wenn in Ethersex Polling eingeschaltet ist | ||
set messen expect "OK\n" | set messen expect "OK\n" #ist überflüssig, wenn in Ethersex Polling eingeschaltet ist | ||
get temp cmd {"1w get | get temp cmd {"1w get %devID\n"} | ||
get temp expect "\d+.\d\n" | get temp expect "\d+.\d+\n" | ||
</ | get temp postproc { s/\n//; $_ } | ||
Dann wird in der fhem.cfg z.B. das Device Temperatursensor Wohnzimmer wie folgt deklariert. Die bei jedem Sensor einzigartige 16-stellige Adresse | </syntaxhighlight> | ||
Dann wird in der fhem.cfg z.B. das Device Temperatursensor Wohnzimmer wie folgt deklariert. Die bei jedem Sensor einzigartige 16-stellige Adresse kann u.a. über die Weboberfläche von ethersex oder über Telnet und den Befehl 1w list ausgelesen werden. | |||
<nowiki>define WZ_Temp ECMDDevice ONEWIRE 28481f28020000fa</nowiki> | <nowiki>define WZ_Temp ECMDDevice ONEWIRE 28481f28020000fa</nowiki> | ||
Damit periodisch eine Messung stattfindet, | Damit periodisch eine Messung stattfindet, ist ein Timer z.B. alle 15min notwendig, der zuerst das Ereignis messen sendet und nach zwei Sekunden die Temperatur abfragt. | ||
<nowiki>define 1Wire_Temp at +*00:15 set WZ_Temp messen;; sleep 2;; get WZ_Temp temp</nowiki> | <nowiki>define 1Wire_Temp at +*00:15 set WZ_Temp messen;; sleep 2;; get WZ_Temp temp</nowiki> | ||
Ein Loggen der Temperatur in einem Textfile erreicht | Sofern Polling eingeschaltet ist (siehe [http://www.ethersex.de/index.php/Onewire_(Deutsch) hier)] verkürzt sich der Befehl: | ||
<nowiki>define 1Wire_Temp at +*00:15 get WZ_Temp temp</nowiki> | |||
Ein Loggen der Temperatur in einem Textfile wird erreicht durch: | |||
<nowiki>define Log_Temperatur FileLog /var/InternerSpeicher/fhem/log/Temperatur-%Y.log WZ_Temp:(temp).*</nowiki> | <nowiki>define Log_Temperatur FileLog /var/InternerSpeicher/fhem/log/Temperatur-%Y.log WZ_Temp:(temp).*</nowiki> | ||
Damit mit den Daten in der Temperaturdatei noch ein schöner Plot erzeugt wird, | Damit mit den Daten in der Temperaturdatei noch ein schöner Plot erzeugt wird, wird im FHEM-Verzeichnis unter /www/gplot/ die Datei 1wtemp.gplot mit folgendem Inhalt angelegt: | ||
<nowiki>set terminal png transparent size <SIZE> crop | <nowiki>set terminal png transparent size <SIZE> crop | ||
Zeile 74: | Zeile 77: | ||
"< egrep 'WZ_Temp' <IN>"\ | "< egrep 'WZ_Temp' <IN>"\ | ||
using 1:4 title 'Wohnzimmer' with lines lw2\</nowiki> | using 1:4 title 'Wohnzimmer' with lines lw2\</nowiki> | ||
..und danach in der fhem.cfg die Funktion dazu: | ...und danach in der fhem.cfg die Funktion dazu: | ||
<nowiki>define weblink_Temperatur weblink fileplot Log_Temperatur:1wtemp:CURRENT | <nowiki>define weblink_Temperatur weblink fileplot Log_Temperatur:1wtemp:CURRENT | ||
Zeile 81: | Zeile 84: | ||
=== 8-Kanal Relaiskarte K8IO === | === 8-Kanal Relaiskarte K8IO === | ||
Der ebenfalls bei Pollin erhältliche Bausatz einer 8-Kanal Relaiskarte passt optimal zum AVR-NET-IO, da sie mit der verbauten SUB-D Buchse direkt angeschlossen werden kann. Sie enthält 8 Schaltkanäle (PC0 bis PC7 des Atmega) und 4 Schalteingänge (PA0 bis PA3 des Atmega). Die verbauten Relais sind für eine Schaltlast von 24V/3A freigegeben und für die unterschiedlichsten Aufgaben einsetzbar, z.B. Gartenbewässerung mit Gardena 24V Ventilen, Schalten von Kleinspannungen oder als Treiberschalter für abgesetzte 230V Lastrelais. Der auf der Platine enthaltene 5V Spannungsregler kann auch das AVR-NET-IO über die SUB-D Verbindung mit Spannung versorgen (Jumper JP1 setzen). | Der ebenfalls bei Pollin erhältliche Bausatz einer 8-Kanal Relaiskarte (ca. 15 € Karte ohne Gehäuse) passt optimal zum AVR-NET-IO, da sie mit der verbauten SUB-D Buchse direkt angeschlossen werden kann. Sie enthält 8 Schaltkanäle (PC0 bis PC7 des Atmega) und 4 Schalteingänge (PA0 bis PA3 des Atmega). Die verbauten Relais sind für eine Schaltlast von 24V/3A freigegeben und für die unterschiedlichsten Aufgaben einsetzbar, z.B. Gartenbewässerung mit Gardena 24V Ventilen, Schalten von Kleinspannungen oder als Treiberschalter für abgesetzte 230V Lastrelais. Der auf der Platine enthaltene 5V Spannungsregler kann auch das AVR-NET-IO über die SUB-D Verbindung mit Spannung versorgen (Jumper JP1 setzen). | ||
Bei der ethersex Konfiguration müsst ihr den folgenden Punkt vor dem Compilieren einschalten bzw. prüfen: | Bei der ethersex Konfiguration müsst ihr den folgenden Punkt vor dem Compilieren einschalten bzw. prüfen: | ||
Zeile 102: | Zeile 105: | ||
Die Befehlsfolge ist zweiteilig: Erst wird der gesamte Port PC auf Ausgang gesetzt (io set ddr 2 ff), dann der betreffende Pin (hier PC1 = Relais 2) ein (io set port 2 02 02) oder aus (io set port 2 00 02) geschaltet. Die postproc Angaben sind optional und verwandeln die Rückgaben der beiden Befehle von ECMD OK;OK in ein besser lesbares "ok" bzw "error" bei Fehlern. | Die Befehlsfolge ist zweiteilig: Erst wird der gesamte Port PC auf Ausgang gesetzt (io set ddr 2 ff), dann der betreffende Pin (hier PC1 = Relais 2) ein (io set port 2 02 02) oder aus (io set port 2 00 02) geschaltet. Die postproc Angaben sind optional und verwandeln die Rückgaben der beiden Befehle von ECMD OK;OK in ein besser lesbares "ok" bzw "error" bei Fehlern. | ||
In der fhem.cfg wird nun ein neues Device für ein oder mehrere Relais angelegt und diese sind dann über die FHEM Oberfläche schaltbar | In der fhem.cfg wird nun ein neues Device für ein oder mehrere Relais angelegt und diese sind dann über die FHEM Oberfläche schaltbar (Achtung: der Parameter hinter RELAIS ist nicht die Nummer des Relais, sondern der HEX-Code zur Ansteuerung des Ports - siehe nachfolgende Tabelle): | ||
<nowiki>define Relais1 ECMDDevice RELAIS 01 | <nowiki>define Relais1 ECMDDevice RELAIS 01 | ||
Zeile 109: | Zeile 112: | ||
...... | ...... | ||
define Relais8 ECMDDevice RELAIS 80</nowiki> | define Relais8 ECMDDevice RELAIS 80</nowiki> | ||
Alle 8 Relais und der zugehörige Schaltpin in hex als Überblick (Umrechnung binär->hex z.b | Alle 8 Relais und der zugehörige Schaltpin in hex als Überblick (Umrechnung binär->hex z.b [http://home.snafu.de/sicpaul/midi/hexbin.htm hier] | ||
<table border="1" cellspacing="1" cellpadding="3" style="text-align: left; float:none"> | <table border="1" cellspacing="1" cellpadding="3" style="text-align: left; float:none"> | ||
Zeile 171: | Zeile 174: | ||
</table> | </table> | ||
=== Digitale Eingänge in FHEM einbinden === | |||
Zum Auslesen der vier Schalteingänge sind seitens Ethersex die selben Einstellungen vorzunehmen wie schon bei der [[AVR-NET-IO#8-Kanal Relaiskarte K8IO|8-Kanal Relaiskarte]] beschrieben. Im Gegensatz zu den analogen Eingängen werden die digitalen Eingänge nicht einzeln abgefragt, sondern es werden die Zustände des gesamten Ports A zurückgegeben. Davon interessieren uns die ersten vier: PA0-PA3. | |||
Die io.classdef | |||
<syntaxhighlight lang="perl"># keine Uebergabeparameter - Digital-IO Abfrage des Ports 0 | |||
# Umsetzung in ECMD Befehle | |||
get read cmd {"io get pin 0\n"} | |||
get read expect ".*" | |||
get read postproc {\ | |||
my $hex = "$_";\ | |||
$hex =~ s/port 0: //;\ | |||
$hex =~ s/\n//;\ | |||
my $dez = hex($hex);\ | |||
my $retval = $dez & 1;\ | |||
}</syntaxhighlight> | |||
Zur weiteren Verarbeitung in FHEM ist ein Zahlenwert besser geeignet, weshalb aus der Antwort "port :0 xx\n" das "port :0" und der Zeilenumbrich entfernt werden. Der hexadezimale Wert wird nun noch in dezimal gewandelt und in der letzten Zeile nur das erste Bit für PA0 zurückgegeben. Für PA1 ist 2, PA3 ist 4 und für PA4 8 zu verwenden. | |||
[[File:RFM12.JPG|300px|right|thumb|Funkmodul RFM12 (Bild Pollin GmbH)]] | [[File:RFM12.JPG|300px|right|thumb|Funkmodul RFM12 (Bild Pollin GmbH)]] | ||
=== RFM12 Funkmodul === | === RFM12 Funkmodul === | ||
Das Funkmodul RFM12, hier in der Ausführung für 433 Mhz, ist ein kostengünstiges und kompaktes Funk Sende-/Empfangsmodul, was auch über Pollin zu beziehen ist. Mit dem ethersex RFM12 ASK Modul kann man damit Funkschalter/-dimmer und Jalousie-/Rolladenschalter des Systems Intertechno über das ECMD Protokoll ansteuern. Auch günstige ELRO Funkschalter lassen sich nach Anpassung der Dipschalter mit dem Intertechno-Code belegen (siehe | Das Funkmodul RFM12, hier in der Ausführung für 433 Mhz, ist ein kostengünstiges und kompaktes Funk Sende-/Empfangsmodul, was auch über Pollin zu beziehen ist. Mit dem ethersex RFM12 ASK Modul kann man damit Funkschalter/-dimmer und Jalousie-/Rolladenschalter des Systems Intertechno über das ECMD Protokoll ansteuern. Auch günstige ELRO Funkschalter lassen sich nach Anpassung der Dipschalter mit dem Intertechno-Code belegen (siehe [[Intertechno Code Berechnung]]). | ||
Je nach Ausrichtung der Antenne, den räumlichen Gegebenheiten und dem "Funkverkehr" der Nachbarn funktioniert das System im 433 MHz Frequenzbereich recht zuverlässig. Es kann jedoch in seltenen Fällen mal dazu kommen, | Je nach Ausrichtung der Antenne, den räumlichen Gegebenheiten und dem "Funkverkehr" der Nachbarn funktioniert das System im 433 MHz Frequenzbereich recht zuverlässig. Es kann jedoch in seltenen Fällen mal dazu kommen, dass ein Funkbefehl nicht ankommt und z.B. ein Rolladen nicht schließt oder ein Licht an bleibt. Solche nicht rückkanalfähigen Funksysteme (wie auch FS20) sollten deshalb besser nicht für sehr kritische Anwendungen verbaut werden. | ||
Der Anschluss am AVR-NET-IO kann | Der Anschluss am AVR-NET-IO kann [http://old.ethersex.de/index.php/BitfehlerASK hier] entnommen werden. Das Modul ist klein und das Löten entsprechend frickelig. Bewährt hat sich bei mir das anlöten einer jeweils 7 poligen beidseitigen Stiftleiste auf einer separaten Lochrasterplatine als Basis. Als Antenne am Anschluss ANT ist ein Draht der Länge λ / 4 (bei 433 MHz entspricht das 17 cm) einzusetzen. | ||
Bei der ethersex Konfiguration müsst ihr die folgenden Punkte einschalten bzw. prüfen: | Bei der ethersex Konfiguration müsst ihr die folgenden Punkte einschalten bzw. prüfen: | ||
Zeile 186: | Zeile 204: | ||
I/O -> RFM12 ASK aktivieren -> RFM12 ASK send aktivieren -> Intertechno aktivieren | I/O -> RFM12 ASK aktivieren -> RFM12 ASK send aktivieren -> Intertechno aktivieren | ||
General Setup -> VFS support -> VFS File Inlining -> Inline RFM12</nowiki> | General Setup -> VFS support -> VFS File Inlining -> Inline RFM12</nowiki> | ||
Nach erfolgreichem Compilieren und | Nach erfolgreichem Compilieren und Flashen des Atmega muss nun der Punkt RFM12 auf der ethersex Homepage erscheinen, über den ihr schon einmal testen könnt. Familiencode (A bis P möglich) am Funkschalter einstellen und Kanal wählen z.B. A1 und auf der Webseite dann Familie A, Gruppe 1, Geraet 1. | ||
Die Datei intertechno.classdef hat folgenden Inhalt: | Die Datei intertechno.classdef hat folgenden Inhalt: | ||
Zeile 193: | Zeile 211: | ||
params it_fam it_group it_dev | params it_fam it_group it_dev | ||
# Umsetzung in ECMD Befehle | # Umsetzung in ECMD Befehle | ||
set on cmd {" | set on cmd {"ask intertechno %it_fam %it_group %it_dev 1\n"} | ||
set on expect "OK\n" | set on expect "OK\n" | ||
set off cmd {" | set off cmd {"ask intertechno %it_fam %it_group %it_dev 0\n"} | ||
set off expect "OK\n"</nowiki> | set off expect "OK\n"</nowiki> | ||
In der fhem.cfg wird nun ein neues Device für z.B. FunkschalterA1 angelegt, welches dann über die FHEM Oberfläche schaltbar ist: | In der fhem.cfg wird nun ein neues Device für z.B. FunkschalterA1 angelegt, welches dann über die FHEM Oberfläche schaltbar ist: | ||
Zeile 202: | Zeile 220: | ||
Die Parameter sind immer in Reihenfolge Familie (A=1 bis P=16) Gruppe (1-4) Gerät (1-4) anzugeben | Die Parameter sind immer in Reihenfolge Familie (A=1 bis P=16) Gruppe (1-4) Gerät (1-4) anzugeben | ||
also z.B. A1 -> 1 1 1 / F6 -> 6 2 2 / D11 -> 4 3 3 | also z.B. A1 -> 1 1 1 / F6 -> 6 2 2 / D11 -> 4 3 3 | ||
Ein Beispiel für IC2272 mit Integration des Schaltbefehles in den Gerätecode: | |||
<nowiki># Uebergabeparameter IC2272 Coding: 5/5/2 umgeschrieben in 4/4/4 | |||
params byte1 byte2 byte3 | |||
# Umsetzung in ECMD Befehle | |||
set on cmd {"ask 2272 %byte1,%byte2,".sprintf(1+%byte3)." 76 10\n"} | |||
set on expect "OK\n" | |||
set off cmd {"ask 2272 %byte1,%byte2,".sprintf(0+%byte3)." 76 10\n"} | |||
set off expect "OK\n"</nowiki> | |||
Die drei Bytes für den Haus- und Gerätecode müssen von 5 Stellen Hauscode + 5 Stellen Gerätecode + 2 Stellen Befehl in 4+4+4 umgerechnet werden (s. [http://old.ethersex.de/index.php/HowToRFM12_ASK#Senden_3 hier]). | |||
=== Analoge Eingänge in FHEM einbinden === | === Analoge Eingänge in FHEM einbinden === | ||
Dieser Abschnitt beschäftigt sich mit der Integration der 4 Analogeingänge, die auf dem AVR-NET-IO per blauer Schraubklemme erreichbar sind. Beschriftet sind Sie mit ADC1 bis ADC4, technisch gesehen sind das aber die ADC Ports 4 bis 7. | |||
In meinem Beispiel verwende ich 3 analoge Bodenfeuchtesensoren von [http://www.vegetronix.com/Products/VH400/ Vegetronix]. | In meinem Beispiel verwende ich 3 analoge Bodenfeuchtesensoren von [http://www.vegetronix.com/Products/VH400/ Vegetronix] (je ca. 85 €). | ||
[[File:Analoger_Bodenfeuchtesensor_Vegetronix-VH400.jpg|133px|right|thumb|Bodenfeuchtesensor VH400 (Bild: Vegetronix.com)]] | [[File:Analoger_Bodenfeuchtesensor_Vegetronix-VH400.jpg|133px|right|thumb|Bodenfeuchtesensor VH400 (Bild: Vegetronix.com)]] | ||
Damit die anlogen Ports von Ethersex unterstützt werden, müssen diese in die Firmware mit einkompiliert werden. Dazu im "make menuconfig" unter "I/O" den Unterpunkt "ADC support" aktivieren. Siehe dazu im Abschnitt "Konfiguration von Ethersex". | Damit die anlogen Ports von Ethersex unterstützt werden, müssen diese in die Firmware mit einkompiliert werden. Dazu im "make menuconfig" unter "I/O" den Unterpunkt "ADC support" aktivieren. Siehe dazu im Abschnitt "Konfiguration von Ethersex". | ||
Auf dem NET-IO selbst muss der "AREF"-Jumper auf "intern" gestellt sein. | Auf dem NET-IO selbst muss der "AREF"-Jumper auf "intern" gestellt sein. | ||
Da Ethersex selbst den Portstatus nur in hexadezimaler Form zurückliefert, und aufgrund des 10bit A/D-Wandlers nur 1024 Zustände unterschieden werden, müssen später noch ein paar Berechnungen integriert werden | Da Ethersex selbst den Portstatus nur in hexadezimaler Form zurückliefert, und aufgrund des 10bit A/D-Wandlers nur 1024 Zustände unterschieden werden, müssen später noch ein paar Berechnungen integriert werden deren Korrektheit per Attribute gesteuert werden. Es sind also in FHEM weitere globale Attribute anzulegen. Benötigt werden: | ||
Es sind also in FHEM weitere globale Attribute anzulegen. | |||
Benötigt werden: | |||
* | * Referenz | ||
* | * Schwellwert | ||
Der zugehörige FHEM Aufruf muss an das eigene System angepasst werden damit man sich nicht eigene globale Attribute zerschießt: | Der zugehörige FHEM Aufruf muss an das eigene System angepasst werden damit man sich nicht eigene globale Attribute zerschießt: | ||
Zeile 253: | Zeile 280: | ||
get portvalue expect ".*" | get portvalue expect ".*" | ||
get portvalue postproc {hex(trim("$_"))}</pre> | get portvalue postproc {hex(trim("$_"))}</pre> | ||
Damit das funktioniert, muss FHEM noch die trim- | Damit das funktioniert, muss FHEM noch die trim-Funktion bekannt gemacht werden. Siehe [[TRIM-Funktion-Anfangs/EndLeerzeichen aus Strings entfernen]] | ||
Danach kann | Danach kann das NET-IO als ECMD Device in FHEM angelegt werden: | ||
<nowiki>define avrnetio ECMD telnet 192.168.10.11:2701 | <nowiki>define avrnetio ECMD telnet 192.168.10.11:2701 | ||
Zeile 264: | Zeile 291: | ||
<nowiki>define Bodenfeuchte_3 ECMDDevice adc 7 | <nowiki>define Bodenfeuchte_3 ECMDDevice adc 7 | ||
attr Bodenfeuchte_3 room AVR-Net-IO</nowiki> | attr Bodenfeuchte_3 room AVR-Net-IO</nowiki> | ||
Jetzt muss ermittelt werden, welcher Wert dem 100% Status entspricht. Im Fall meines Bodenfeuchtesensors bedeutet dies, welcher Wert zurückgegeben wird im Falle einer Überschwemmung. Dazu tauche ich den Sensor komplett in ein Wasserglas und | Jetzt muss ermittelt werden, welcher Wert dem 100% Status entspricht. Im Fall meines Bodenfeuchtesensors bedeutet dies, welcher Wert zurückgegeben wird im Falle einer Überschwemmung. Dazu tauche ich den Sensor komplett in ein Wasserglas und frage den Status im FHEM-Inputfeld auf der Weboberfläche ab: | ||
<nowiki>get Bodenfeuchte_3 portvalue</nowiki> | <nowiki>get Bodenfeuchte_3 portvalue</nowiki> | ||
Zeile 270: | Zeile 297: | ||
<nowiki>attr Bodenfeuchte_3 referenz 625</nowiki> | <nowiki>attr Bodenfeuchte_3 referenz 625</nowiki> | ||
Damit wird ab sofort ein annähernd korrekter Prozentwert der aktuellen Bodenfeuchte ausgegeben. Bitte | Damit wird ab sofort ein annähernd korrekter Prozentwert der aktuellen Bodenfeuchte ausgegeben. Bitte beachten, dass gelöste Salze im Erdreich eine andere Leitfähigkeit besitzen als Trinkwasser. Ebenso kommt es auf die Beschaffenheit des Erdreiches an, ob Sand-, Lehm- oder Tonerde macht schon einen Unterschied. Deshalb kann oder sollte man nach einer gewissen Einsatzzeit den Referenzwert daraufhin anpassen. | ||
Damit wir später aufgrund der prozentualen Bodenfeuchte einen Einschaltbefehl, | Damit wir später aufgrund der prozentualen Bodenfeuchte einen Einschaltbefehl, z.B. an ein Gardena Magnetventil, absetzen können, muss man wissen, ab wieviel Prozent Bodenfeuchte man bewässern möchte. Das kann von Bewässerungskreis zu Bewässerungskreis unterschiedlich sein. Somit auch abhängig vom jeweiligen Sensor. Rhododendren möchten schließlich anders bewässert werden als z.B. Rasen oder Kartoffeln. | ||
Dazu wird ein neues Attribut | Dazu wird dem Sensor ein neues Attribut zugewiesen: | ||
<nowiki>attr Bodenfeuchte_3 schwellwert 30</nowiki> | <nowiki>attr Bodenfeuchte_3 schwellwert 30</nowiki> | ||
Hier wird festgelegt, | Hier wird festgelegt, dass ab einer Bodenfeuchte von kleiner 30% bewässert werden soll. Abhängig von diesem Schwellwert enthält das Reading "status" entweder "on" oder "off". Wie dieses Attribut ausgewertet wird, obliegt allerdings der Prozedur zum Steuern der Magnetventile (Beispiel: [[Bewässerungssteuerung]]). | ||
Wie dieses Attribut ausgewertet wird obliegt allerdings der Prozedur zum Steuern der Magnetventile (Beispiel: [[Bewässerungssteuerung]]) | |||
Jetzt noch einen Timer definieren der die Sensoren minütlich abfragt: | Jetzt noch einen Timer definieren der die Sensoren minütlich abfragt: | ||
Zeile 287: | Zeile 313: | ||
Hat man nun entsprechende Plots definiert, so sieht das folgendermaßen aus: | Hat man nun entsprechende Plots definiert, so sieht das folgendermaßen aus: | ||
[[File:Plot_Bodenfeuchtesensor_Vegetronix-VH400.jpg|center|alt=Plot Bodenfeuchtesensor Vegetronix-VH400.jpg]] | [[File:Plot_Bodenfeuchtesensor_Vegetronix-VH400.jpg|center|alt=Plot Bodenfeuchtesensor Vegetronix-VH400.jpg]] | ||
Hier ist erkenbar, | Hier ist erkenbar, dass nach einem Starkregen (mittlerer Chart, grüne Linie - ca 5 l/m² innerhalb 2h) die Bodenfeuchte auf knapp 100% gestiegen ist, danach gleich wieder abfallend aufgrund Feuchteverteilung. Ein sich anschließender Regenschauer hat die Bodenfeuchte sofort wieder Richtung 100% gebracht. Auch hier ist anschließend der Normalisierungsprozess erkenbar. | ||
''Hinweis: die rote Linie der Bodenfeuchte ändert sich nicht. Das Areal des Bodenfeuchtefeuchtesensors der Tomaten ist vor Regen geschützt.'' | ''Hinweis: die rote Linie der Bodenfeuchte ändert sich nicht. Das Areal des Bodenfeuchtefeuchtesensors der Tomaten ist vor Regen geschützt.'' | ||
===Analoge Ausgänge 0-32V=== | ===Analoge Ausgänge 0-32V=== | ||
Die leicht nachzubauende Schaltung besteht aus einem DAC (LTC1257) und einem Operationsverstärker (LM358). | Die leicht nachzubauende Schaltung besteht aus einem DAC (LTC1257) und einem Operationsverstärker (LM358). | ||
Zeile 305: | Zeile 329: | ||
[[Datei:AVR NET IO MIT DAC LTC1257 Prototyp2.jpg|350px|thumb|right|DAC LTC1257 mit Verstärkerschaltung (Grüne Markierungen sind nicht im Schaltplan enthalten)]] | [[Datei:AVR NET IO MIT DAC LTC1257 Prototyp2.jpg|350px|thumb|right|DAC LTC1257 mit Verstärkerschaltung (Grüne Markierungen sind nicht im Schaltplan enthalten)]] | ||
In diesem Fall hat VCC_Therme eine Spannung von 24V. Der LM358 kann bis 32V arbeiten, dann muss jedoch VCC_Therme auf 32V angehoben werden und der Widerstandswert von R4 auf ca. 150k Ohm erhöht werden. An dem Steuersignal_Therme liegt je nach dem welchen Wert der LTC1257 gerade in einen anlogen Wert umsetzt eine Spannung von 0-24V. Diese Schaltung kann eingesetzt werden um Junkers-Thermen mit „Stetigeingang“ anzusteuern. Die grünen Markierungen sind nicht im Schaltplan enthalten. | In diesem Fall hat VCC_Therme eine Spannung von 24V. Der LM358 kann bis 32V arbeiten, dann muss jedoch VCC_Therme auf 32V angehoben werden und der Widerstandswert von R4 auf ca. 150k Ohm erhöht werden. An dem Steuersignal_Therme liegt je nach dem welchen Wert der LTC1257 gerade in einen anlogen Wert umsetzt eine Spannung von 0-24V. Diese Schaltung kann eingesetzt werden, um Junkers-Thermen mit „Stetigeingang“ anzusteuern. Die grünen Markierungen sind nicht im Schaltplan enthalten. | ||
Der Aufbau des leicht erweiterten Prototypen erfolgte auf einer Punkt-Streifenrasterplatine (Immer drei Punkte einer Reihe sind miteinander verbunden (s. blaue Markierungen)). Um die Schaltung nachzubauen sind keine besonderen Lötkenntnisse erforderlich. Da nur wenige Brücken eingelötet werden müssen, lohnt sich eine fertige Platine nicht. Die Widerstände R4 (und (erweiterte Schaltung) R6) sind jeweils als zwei Widerstände ausgeführt. | Der Aufbau des leicht erweiterten Prototypen erfolgte auf einer Punkt-Streifenrasterplatine (Immer drei Punkte einer Reihe sind miteinander verbunden (s. blaue Markierungen)). Um die Schaltung nachzubauen sind keine besonderen Lötkenntnisse erforderlich. Da nur wenige Brücken eingelötet werden müssen, lohnt sich eine fertige Platine nicht. Die Widerstände R4 (und (erweiterte Schaltung) R6) sind jeweils als zwei Widerstände ausgeführt. | ||
Zeile 315: | Zeile 337: | ||
Der LTC1257 bekommt den Soll Wert mittels des Befehls ltc1257_set SOLLWERT (0 <= SOLLWERT <= 4095) zugewiesen. Hierfür wird eine classdef Datei erstellt, z.B.: | Der LTC1257 bekommt den Soll Wert mittels des Befehls ltc1257_set SOLLWERT (0 <= SOLLWERT <= 4095) zugewiesen. Hierfür wird eine classdef Datei erstellt, z.B.: | ||
<nowiki> | <nowiki># Umsetzung in ECMD Befehle | ||
# Umsetzung in ECMD Befehle | |||
# Ein Uebergabeparameter -> Sollwert | # Ein Uebergabeparameter -> Sollwert | ||
set setDacValue params dacValue | set setDacValue params dacValue | ||
Zeile 327: | Zeile 348: | ||
Danach kann der LTC1257 als ECMD Device in FHEM (fhem.cfg) angelegt werden. Hierfür wird eine möglicherweise bestehende „NETIO classdefs“ erweitert: | Danach kann der LTC1257 als ECMD Device in FHEM (fhem.cfg) angelegt werden. Hierfür wird eine möglicherweise bestehende „NETIO classdefs“ erweitert: | ||
:<code>attr NETIO_01 classdefs [Andere ECMD Geräte]:LTC1257=/fhem/ltc1257.classdef</code> | |||
attr NETIO_01 classdefs [Andere ECMD Geräte]:LTC1257=/fhem/ltc1257.classdef | |||
</ | |||
Anschließend den | Anschließend den DAC(/LTC1257) als ECMDDevice definieren: | ||
:<code>define MEINDAC ECMDDevice LTC1257 </code> | |||
:<code>attr MEINDAC room MEINRAUM </code> | |||
define | |||
attr | |||
</ | |||
Der Befehl zum Setzen eines neuen Spannungswertes lautet: | Der Befehl zum Setzen eines neuen Spannungswertes lautet: | ||
<syntaxhighlight lang="perl"> | |||
my $dacValue = 1345;;\ | |||
fhem("set MEINDAC setDacValue ".$dacValue);;\ | |||
</syntaxhighlight> | |||
Dazu kann/sollte die folgende adc.classdef verwendet werden: | |||
my $ | <syntaxhighlight lang="perl"> | ||
get value cmd {"adc get %PortID\n"} | |||
</ | params PortID | ||
get value expect ".*" | |||
get value postproc {\ | |||
my $hexval = hex(trim("$_"));\ | |||
my $hash = $defs{%NAME};\ | |||
readingsSingleUpdate($hash, "state", $hexval, 1);\ | |||
readingsSingleUpdate($hexval, 1);\ | |||
}</syntaxhighlight> | |||
=== LCD-Modul anschließen === | === LCD-Modul anschließen === | ||
In diesem Beispiel wird ein LCD-Modul mit HD44780 kompatiblen Controller angeschlossen. Diesen Controller nutzen fast alle Module. Dazu gehören auch Module die einen KSxxx Chip verbaut haben. Angeschlossen wird das Modul an die EXT-Pfostensteckerleiste. Somit hat man den großen SUBD25 Anschluss für die Erweiterungplatine weiterhin frei. | In diesem Beispiel wird ein LCD-Modul mit HD44780 kompatiblen Controller angeschlossen. Diesen Controller nutzen fast alle Module. Dazu gehören auch Module die einen KSxxx Chip verbaut haben. Angeschlossen wird das Modul an die EXT-Pfostensteckerleiste. Somit hat man den großen SUBD25 Anschluss für die Erweiterungplatine weiterhin frei. | ||
[[File:LCD_4x20.jpg|250px|right|thumb|LCD Modul 4x20 (Bild: Pollin.de)]] | [[File:LCD_4x20.jpg|250px|right|thumb|LCD Modul 4x20 (Bild: Pollin.de)]] | ||
Damit man das LCD ansprechen kann, muss dieses in der Ethersex Firmware aktiviert werden. Dazu im "make menuconfig" unter "I/O" den Unterpunkt "LCD" aktivieren und gegebenefalls den Controllertyp noch einstellen. Beim Einstellen des Controllertyps muss man ev. etwas ausprobieren, wenn man später auf dem LCD eine verschobene Zeilenausgabe hat. | Damit man das LCD ansprechen kann, muss dieses in der Ethersex Firmware aktiviert werden. Dazu im "make menuconfig" unter "I/O" den Unterpunkt "LCD" aktivieren und gegebenefalls den Controllertyp noch einstellen. Beim Einstellen des Controllertyps muss man ev. etwas ausprobieren, wenn man später auf dem LCD eine verschobene Zeilenausgabe hat. | ||
Verdrahtet wird das LCD im 4-Bit Modus gemäß u.a. Tabelle. Falls man kein altes 10poliges Flachbandkabel mit Pfostenstecker zur Hand hat, kann man auch ein ausgedientes COM-Port Flachbandkabel benutzen, muss dann allerdings die 5V Vcc über ein extra Kabel von einer der blauen 5V Anschlussleisten holen. | |||
<table border="1" cellspacing="1" cellpadding="3" style="text-align: left; float:none"> | <table border="1" cellspacing="1" cellpadding="3" style="text-align: left; float:none"> | ||
Zeile 499: | Zeile 524: | ||
<nowiki>define Temp2LCD notify WZ_Temp:temp.* {\ | <nowiki>define Temp2LCD notify WZ_Temp:temp.* {\ | ||
my $value = " | my $value = "$EVTPART1";; \ | ||
fhem "set avrnetio_lcd clear_all";;\ | fhem "set avrnetio_lcd clear_all";;\ | ||
fhem "set avrnetio_lcd write 0 0 Temperatur:$value";;\ | fhem "set avrnetio_lcd write 0 0 Temperatur:$value";;\ | ||
Zeile 511: | Zeile 536: | ||
=== Reduktion Stromverbrauch Tipp 1 === | === Reduktion Stromverbrauch Tipp 1 === | ||
Der AVR-NET-IO braucht in der | Der AVR-NET-IO braucht in der Standardausführung je nach Eingangsspannung relativ viel Strom (bei 12V Gleichstrom ca. 180 mA). Ein Großteil der Leistung wird an den Festspannungsreglern verheizt. | ||
Abhilfe schaffen ein pinkompatibler DC/DC-Wandler für den 7805 und ggf. ein entsprechender Ersatz des LM317 oder gleich ein Umstellen des gesamten Boards auf 3,3 Volt. Bei letzterem muss man den Systemtakt des AVR aber reduzieren (ein guter Wert sind 8 MHz), da der AVR sonst | Abhilfe schaffen ein pinkompatibler DC/DC-Wandler für den 7805 und ggf. ein entsprechender Ersatz des LM317 oder gleich ein Umstellen des gesamten Boards auf 3,3 Volt. Bei letzterem muss man den Systemtakt des AVR aber reduzieren (ein guter Wert sind 8 MHz), da der AVR sonst außerhalb der Spezifikation läuft. Bei Änderungen des Systemtaktes und Nutzung des 1-Wire Bus bitte Fuse-Einstellungen entsprechend anpassen (siehe "Hinweise für 1-Wire" weiter unten). | ||
=== Reduktion Stromverbrauch Tipp 2 === | === Reduktion Stromverbrauch Tipp 2 === | ||
Um mit einfachen Mitteln den Stromverbrauch des NET-IO zu reduzieren, und somit auch die Wärmeentwicklung, muss man einfach nur ein SchaltNetzteil mit 5V DC einbauen (GND an Pin2 und +5V an Pin3 vom 7805). | Um mit einfachen Mitteln den Stromverbrauch des NET-IO zu reduzieren, und somit auch die Wärmeentwicklung, muss man einfach nur ein SchaltNetzteil mit 5V DC einbauen (GND an Pin2 und +5V an Pin3 vom 7805). | ||
Z.B. dieses: [http://www.reichelt.de/Universalnetzteile/MW-3N06GS/3//index.html?ACTION=3&GROUPID=4945&ARTICLE=87338&SHOW=1&START=0&OFFSET=500& EcoFriendly Stecker-Schaltnetzteil MW 3N06GS, 600mA + USB ] | |||
Dazu muss man noch nichtmal große Löterfahrung mitbringen. Es gibt Berichte, die mit der Änderung von ca. 4,5-4,8 W auf nur noch 0,3-0,4 W herunterkommen; beide Werte sind jedoch unglaubwürdig. Der erste ist vermutlich auf ein sehr schlechtes Netzteil und der zweite auf einen Messfehler zurückzuführen. | |||
Der Net-IO nimmt im Normalbetrieb bei 9V= ca. 180mA auf, das sind ca. 1,6W. Durch den Umbau bleibt der Strom konstant, die Spannung sinkt jedoch auf 5V. Das ergibt bei 5V und 180mA ca. 0,9 W. Durch gute oder schlechte Netzteile geht der Gesamtverbrauch nochmal wenig oder viel in die Höhe. | |||
=== Hinweise für 1-Wire === | === Hinweise für 1-Wire === | ||
Bei Nutzung von 1-Wire ist zu beachten, dass die Einstellungen des Systemtaktes in der Ethersex-Konfiguration und die Fuse-Einstellungen des jeweiligen µC (z.B. | Bei Nutzung von 1-Wire ist zu beachten, dass die Einstellungen des Systemtaktes in der Ethersex-Konfiguration und die Fuse-Einstellungen des jeweiligen µC (z.B. ATmega644P) miteinander harmonieren. Bei falschen Werten funktioniert der 1-Wire-Bus (da das Timing vom Takt gebildet wird) nicht! Ggf. also Fusebits für den Takt neu berechnen und Fuses neu setzen. | ||
== Links == | == Links == |
Aktuelle Version vom 26. Juli 2017, 18:54 Uhr
Beschreibung
Das AVR-NET-IO ist eine kostengünstige Hardwareplattform mit einem AVR Microcontroller, den es als Bausatz (ca. 20 €) oder als Fertiggerät (ca. 30 € ohne Gehäuse) beim Elektronik-Versender Pollin zu erwerben gibt. Ausgestattet ist er mit einem Microcontroller ATMega32 und einem Netzwerkcontroller ENC28J60. Er bietet standardmäßig 8 digitale Ausgänge, 4 digitale und 4 analoge Eingänge, die sich über das Netzwerk abrufen bzw. schalten lassen. Das Board hat eine ISP-Schnittstelle integriert, über die der Microcontroller mit einer eigenen bzw. alternativen Software beschrieben werden kann.
Es gibt im Netz diverse Anleitungen zur Verbesserung und Optimierung der Schaltung, zum Austausch des Controllers zu einem leistungsfähigeren ATmega644 oder ATmega1284p mit mehr internen Speicherplatz für die Firmware (z.B. hier). Aber auch im originalen Auslieferungszustand bietet der AVR-NET-IO schon viel Potential für eigene Projekte.
Für den Einsatz mit FHEM wird der Microcontroller mit der konfigurierbaren Software aus dem Projekt Ethersex betrieben. Diese alternative Software ist inzwischen zu einer sehr gut ausgebauten und stabil laufenden Firmware für diverse AVR Hardwareplattformen herangereift. Die Steuerung erfolgt über die eigene, integrierte Protokollsprache Ethersex Command (ECMD)
Die notwendigen Module in FHEM zur Kommunikation mit ethersex haben die Bezeichnung ECMD.
Konfiguration und Flashen von ethersex
Die Möglichkeiten von ethersex sind vielfältig und bieten über die modulare Bauweise eine einfache Erweiterbarkeit durch die Community. Die Funktionen der Module können über eine Oberfläche im Konfigurationsmodus bequem an und ausgeschaltet werden, sodaß nur die gewünschten Funktionen in der zu erstellenden Firmware landen. Allen gemeinsam ist die einfache Steuerbarkeit über den ECMD Befehlsssatz
Die Konfiguration von ethersex erfolgt in einer Unix/Linux Umgebung (unter Windows auch mit Cygwin möglich) und die compilierte Firmwaredatei wird mittels eines ISP Programmers auf den AVR Microcontroller geflasht. Grundlegende Anleitungen zu ethersex bekommt ihr hier. Wenn alles erfolgreich geflasht ist, ist euer AVR-NET-IO unter der gewählten IP Adresse im Netzwerk erreichbar. Es zeigt dann auch eine Homepage mit einigen Funktionen an.
Eine erweiterte Dokumentation zu vielen Devices ist im Ethersex-Wiki zu finden. Ebenso wird hier unter anderem Eigenbau-Hardware vorgestellt, welche mit FHEM erprobt wurde.
Hinweis: Wenn man an den Net-IO noch ein LCD anschließen will (wenn DB-25 belegt ist bleibt dafür nur der Steckverbinder EXT), verbietet sich der Anschluss der 1-Wire-Sensoren am in Ethersex vorkonfigurierten Port PD6. Verzichtet man auf einen Analogeingang, lässt sich der 1-Wire-Bus auch an der Schraubklemme ADC1 aufschalten. Vorteil ist, dass man gleich alle passenden Spannungen (GND, +5V) an den beiden nebenliegenden Schraubklemmen hat. Das Pinning muss dann vor dem "Make" von Ethersex in der Datei pinning/hardware/netio.m4 von PD6 auf PA4 geändert werden. (siehe auch: hier).
Funktionen in Verbindung mit FHEM
Einige Modulfunktionen, die ich selbst mit FHEM zusammen im Einsatz habe, möchte ich in diesem Wiki näher beschreiben.
Um das AVR-NET-IO im FHEM bekannt zu machen, müssen folgende Definitionen in der Konfiguration (fhem.cfg) gemacht werden:
define NETIO_01 ECMD telnet 192.168.0.99:2701 attr NETIO_01 classdefs ONEWIRE=/var/InternerSpeicher/fhem/onewire.classdef:RFM12=/var/InternerSpeicher_ /fhem/intertechno.classdef:RELAIS=/var/InternerSpeicher/fhem/relais.classdef attr NETIO_01 room Interfaces
Bitte beachten: Der Name (NETIO_01) und die IP (192.168.0.99) müssen euren eingestellten Werten aus der ethersex Konfiguration entsprechen. Die Classdef Konfigurationsdateien braucht ihr für meine Beispiele - legt sie einfach schon einmal leer an. Diese befinden sich bei mir im Verzeichnis einer Fritzbox 7390 - das kann bei euch individuell anders sein. Erklärungen und Inhalt zu den classdef-Dateien befinden sich in dem jeweiligen Komponenten Beispiel. Die Raum-Zuweisung ist optional.
1-Wire Temperatursensoren
Das 1-Wire Bussystem wird klassisch für die Temperaturmessung mit den preiswerten, vorkalibrierten Dallas/Maxim Sensoren der Typen DS18S20/DS18B20 genutzt. Ich nutze zur Zeit sechs Temperatursensoren DS18S20 im parasitären Modus (nur zwei Drähte notwendig) an einer alten Telefonverkabelung und zwei verkapselte, wasserdichte DS18B20 in Edelstahlhülse für die Temperaturmessung in Aquarien.
Die Konfiguration im ethersex und der Anschluss der 1-Wire Temperatursensoren am AVR-NET-IO sind hier beschrieben.
Die Datei onewire.classdef hat folgenden Inhalt:
# Übergabeparameter Onewire Geräte ID
params devID
# Umsetzung in ECMD Befehle 1w convert = Messung auslösen, 1w get = Tempwert lesen
set messen cmd {"1w convert\n"} #ist überflüssig, wenn in Ethersex Polling eingeschaltet ist
set messen expect "OK\n" #ist überflüssig, wenn in Ethersex Polling eingeschaltet ist
get temp cmd {"1w get %devID\n"}
get temp expect "\d+.\d+\n"
get temp postproc { s/\n//; $_ }
Dann wird in der fhem.cfg z.B. das Device Temperatursensor Wohnzimmer wie folgt deklariert. Die bei jedem Sensor einzigartige 16-stellige Adresse kann u.a. über die Weboberfläche von ethersex oder über Telnet und den Befehl 1w list ausgelesen werden.
define WZ_Temp ECMDDevice ONEWIRE 28481f28020000fa
Damit periodisch eine Messung stattfindet, ist ein Timer z.B. alle 15min notwendig, der zuerst das Ereignis messen sendet und nach zwei Sekunden die Temperatur abfragt.
define 1Wire_Temp at +*00:15 set WZ_Temp messen;; sleep 2;; get WZ_Temp temp
Sofern Polling eingeschaltet ist (siehe hier) verkürzt sich der Befehl:
define 1Wire_Temp at +*00:15 get WZ_Temp temp
Ein Loggen der Temperatur in einem Textfile wird erreicht durch:
define Log_Temperatur FileLog /var/InternerSpeicher/fhem/log/Temperatur-%Y.log WZ_Temp:(temp).*
Damit mit den Daten in der Temperaturdatei noch ein schöner Plot erzeugt wird, wird im FHEM-Verzeichnis unter /www/gplot/ die Datei 1wtemp.gplot mit folgendem Inhalt angelegt:
set terminal png transparent size <SIZE> crop set output '<OUT>.png' set xdata time set timefmt "%Y-%m-%d_%H:%M:%S" set xlabel " " set y2tics set title '<L1>' set grid xtics y2tics set y2label "Temperatur in C" #FileLog 4:WZ_Temp:0: plot \ "< egrep 'WZ_Temp' <IN>"\ using 1:4 title 'Wohnzimmer' with lines lw2\
...und danach in der fhem.cfg die Funktion dazu:
define weblink_Temperatur weblink fileplot Log_Temperatur:1wtemp:CURRENT attr weblink_Temperatur label "Temperatur Min $data{min1}, Max $data{max1}, Last $data{currval1}"
8-Kanal Relaiskarte K8IO
Der ebenfalls bei Pollin erhältliche Bausatz einer 8-Kanal Relaiskarte (ca. 15 € Karte ohne Gehäuse) passt optimal zum AVR-NET-IO, da sie mit der verbauten SUB-D Buchse direkt angeschlossen werden kann. Sie enthält 8 Schaltkanäle (PC0 bis PC7 des Atmega) und 4 Schalteingänge (PA0 bis PA3 des Atmega). Die verbauten Relais sind für eine Schaltlast von 24V/3A freigegeben und für die unterschiedlichsten Aufgaben einsetzbar, z.B. Gartenbewässerung mit Gardena 24V Ventilen, Schalten von Kleinspannungen oder als Treiberschalter für abgesetzte 230V Lastrelais. Der auf der Platine enthaltene 5V Spannungsregler kann auch das AVR-NET-IO über die SUB-D Verbindung mit Spannung versorgen (Jumper JP1 setzen).
Bei der ethersex Konfiguration müsst ihr den folgenden Punkt vor dem Compilieren einschalten bzw. prüfen:
General Setup ---> [*] VFS (Virtual File System) support ---> [*] VFS File Inlining ---> [*] Inline IO
Die Datei relais.classdef enthält die folgenden Einträge:
# Uebergabeparameter HEX Adresse Port params RelaisPort # erst alle Ports PC.. auf Ausgang setzen und dann per Hexcode schalten set on cmd {"io set ddr 2 ff\n\000io set port 2 %RelaisPort %RelaisPort\n"} set on expect "OK\n" set on postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";} set off cmd {"io set ddr 2 ff\n\000io set port 2 00 %RelaisPort\n"} set off expect "OK\n" set off postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";}
Die Befehlsfolge ist zweiteilig: Erst wird der gesamte Port PC auf Ausgang gesetzt (io set ddr 2 ff), dann der betreffende Pin (hier PC1 = Relais 2) ein (io set port 2 02 02) oder aus (io set port 2 00 02) geschaltet. Die postproc Angaben sind optional und verwandeln die Rückgaben der beiden Befehle von ECMD OK;OK in ein besser lesbares "ok" bzw "error" bei Fehlern.
In der fhem.cfg wird nun ein neues Device für ein oder mehrere Relais angelegt und diese sind dann über die FHEM Oberfläche schaltbar (Achtung: der Parameter hinter RELAIS ist nicht die Nummer des Relais, sondern der HEX-Code zur Ansteuerung des Ports - siehe nachfolgende Tabelle):
define Relais1 ECMDDevice RELAIS 01 define Relais2 ECMDDevice RELAIS 02 define Relais3 ECMDDevice RELAIS 04 ...... define Relais8 ECMDDevice RELAIS 80
Alle 8 Relais und der zugehörige Schaltpin in hex als Überblick (Umrechnung binär->hex z.b hier
Relais | Platinenaufdruck | hex-Code für Device |
---|---|---|
1 | K1 | 01 |
2 | K2 | 02 |
3 | K3 | 04 |
4 | K4 | 08 |
5 | K5 | 10 |
6 | K6 | 20 |
7 | K7 | 40 |
8 | K8 | 80 |
alle Relais | AN | FF |
alle Relais | AUS | 00 |
Digitale Eingänge in FHEM einbinden
Zum Auslesen der vier Schalteingänge sind seitens Ethersex die selben Einstellungen vorzunehmen wie schon bei der 8-Kanal Relaiskarte beschrieben. Im Gegensatz zu den analogen Eingängen werden die digitalen Eingänge nicht einzeln abgefragt, sondern es werden die Zustände des gesamten Ports A zurückgegeben. Davon interessieren uns die ersten vier: PA0-PA3.
Die io.classdef
# keine Uebergabeparameter - Digital-IO Abfrage des Ports 0
# Umsetzung in ECMD Befehle
get read cmd {"io get pin 0\n"}
get read expect ".*"
get read postproc {\
my $hex = "$_";\
$hex =~ s/port 0: //;\
$hex =~ s/\n//;\
my $dez = hex($hex);\
my $retval = $dez & 1;\
}
Zur weiteren Verarbeitung in FHEM ist ein Zahlenwert besser geeignet, weshalb aus der Antwort "port :0 xx\n" das "port :0" und der Zeilenumbrich entfernt werden. Der hexadezimale Wert wird nun noch in dezimal gewandelt und in der letzten Zeile nur das erste Bit für PA0 zurückgegeben. Für PA1 ist 2, PA3 ist 4 und für PA4 8 zu verwenden.
RFM12 Funkmodul
Das Funkmodul RFM12, hier in der Ausführung für 433 Mhz, ist ein kostengünstiges und kompaktes Funk Sende-/Empfangsmodul, was auch über Pollin zu beziehen ist. Mit dem ethersex RFM12 ASK Modul kann man damit Funkschalter/-dimmer und Jalousie-/Rolladenschalter des Systems Intertechno über das ECMD Protokoll ansteuern. Auch günstige ELRO Funkschalter lassen sich nach Anpassung der Dipschalter mit dem Intertechno-Code belegen (siehe Intertechno Code Berechnung). Je nach Ausrichtung der Antenne, den räumlichen Gegebenheiten und dem "Funkverkehr" der Nachbarn funktioniert das System im 433 MHz Frequenzbereich recht zuverlässig. Es kann jedoch in seltenen Fällen mal dazu kommen, dass ein Funkbefehl nicht ankommt und z.B. ein Rolladen nicht schließt oder ein Licht an bleibt. Solche nicht rückkanalfähigen Funksysteme (wie auch FS20) sollten deshalb besser nicht für sehr kritische Anwendungen verbaut werden.
Der Anschluss am AVR-NET-IO kann hier entnommen werden. Das Modul ist klein und das Löten entsprechend frickelig. Bewährt hat sich bei mir das anlöten einer jeweils 7 poligen beidseitigen Stiftleiste auf einer separaten Lochrasterplatine als Basis. Als Antenne am Anschluss ANT ist ein Draht der Länge λ / 4 (bei 433 MHz entspricht das 17 cm) einzusetzen.
Bei der ethersex Konfiguration müsst ihr die folgenden Punkte einschalten bzw. prüfen:
Network -> IP over RFM12 (FSK transmitter support) (aktivieren, keine weiteren Einstellungen im Untermenü) I/O -> RFM12 ASK aktivieren -> RFM12 ASK send aktivieren -> Intertechno aktivieren General Setup -> VFS support -> VFS File Inlining -> Inline RFM12
Nach erfolgreichem Compilieren und Flashen des Atmega muss nun der Punkt RFM12 auf der ethersex Homepage erscheinen, über den ihr schon einmal testen könnt. Familiencode (A bis P möglich) am Funkschalter einstellen und Kanal wählen z.B. A1 und auf der Webseite dann Familie A, Gruppe 1, Geraet 1.
Die Datei intertechno.classdef hat folgenden Inhalt:
# Uebergabeparameter Intertechno Coding: Familie + Gruppe + Geraet params it_fam it_group it_dev # Umsetzung in ECMD Befehle set on cmd {"ask intertechno %it_fam %it_group %it_dev 1\n"} set on expect "OK\n" set off cmd {"ask intertechno %it_fam %it_group %it_dev 0\n"} set off expect "OK\n"
In der fhem.cfg wird nun ein neues Device für z.B. FunkschalterA1 angelegt, welches dann über die FHEM Oberfläche schaltbar ist:
define FunkschalterA1 ECMDDevice RFM12 1 1 1
Die Parameter sind immer in Reihenfolge Familie (A=1 bis P=16) Gruppe (1-4) Gerät (1-4) anzugeben also z.B. A1 -> 1 1 1 / F6 -> 6 2 2 / D11 -> 4 3 3
Ein Beispiel für IC2272 mit Integration des Schaltbefehles in den Gerätecode:
# Uebergabeparameter IC2272 Coding: 5/5/2 umgeschrieben in 4/4/4 params byte1 byte2 byte3 # Umsetzung in ECMD Befehle set on cmd {"ask 2272 %byte1,%byte2,".sprintf(1+%byte3)." 76 10\n"} set on expect "OK\n" set off cmd {"ask 2272 %byte1,%byte2,".sprintf(0+%byte3)." 76 10\n"} set off expect "OK\n"
Die drei Bytes für den Haus- und Gerätecode müssen von 5 Stellen Hauscode + 5 Stellen Gerätecode + 2 Stellen Befehl in 4+4+4 umgerechnet werden (s. hier).
Analoge Eingänge in FHEM einbinden
Dieser Abschnitt beschäftigt sich mit der Integration der 4 Analogeingänge, die auf dem AVR-NET-IO per blauer Schraubklemme erreichbar sind. Beschriftet sind Sie mit ADC1 bis ADC4, technisch gesehen sind das aber die ADC Ports 4 bis 7. In meinem Beispiel verwende ich 3 analoge Bodenfeuchtesensoren von Vegetronix (je ca. 85 €).
Damit die anlogen Ports von Ethersex unterstützt werden, müssen diese in die Firmware mit einkompiliert werden. Dazu im "make menuconfig" unter "I/O" den Unterpunkt "ADC support" aktivieren. Siehe dazu im Abschnitt "Konfiguration von Ethersex". Auf dem NET-IO selbst muss der "AREF"-Jumper auf "intern" gestellt sein.
Da Ethersex selbst den Portstatus nur in hexadezimaler Form zurückliefert, und aufgrund des 10bit A/D-Wandlers nur 1024 Zustände unterschieden werden, müssen später noch ein paar Berechnungen integriert werden deren Korrektheit per Attribute gesteuert werden. Es sind also in FHEM weitere globale Attribute anzulegen. Benötigt werden:
- Referenz
- Schwellwert
Der zugehörige FHEM Aufruf muss an das eigene System angepasst werden damit man sich nicht eigene globale Attribute zerschießt:
attr global userattr icon referenz schwellwert sensor status webCmd
Jetzt wird die classdef Datei erstellt, zb. /etc/fhem.classdef.netio.adc
# Uebergabeparameter Portnummer des internen Analogeingangs params PortID # Umsetzung in ECMD Befehle # value = Rückgabewert in 0-100%, je nach eingestelltem Referenzwert im Attribut "Referenz" # Gleichzeitig wird das Reading "status" gesetzt, je nach eingestelltem Schwellwert # status = on => gemessener Wert liegt unter dem Schwellwert # status = off => gemessener Wert liegt über dem Schwellwert # portvalue = originaler Rückgabewert des NET-IO in Dec umgerechnet um einen Referenzwert ermitteln zu können get value cmd {"adc get %PortID\n"} get value expect ".*" get value postproc {\ my $hexval = hex(trim("$_"));\ my $refval = trim(AttrVal("%NAME","referenz",1024));\ my $retval = $hexval*100/$refval;\ my $hash = $defs{%NAME};\ my $status = "off";\ my $schwellwert = trim(AttrVal("%NAME","schwellwert",30));\ \ $status = "on" if ($retval < $schwellwert);\ \ readingsSingleUpdate($hash, "status", $status, 1);\ \ $retval;\ } get portvalue cmd {"adc get %PortID\n"} get portvalue expect ".*" get portvalue postproc {hex(trim("$_"))}
Damit das funktioniert, muss FHEM noch die trim-Funktion bekannt gemacht werden. Siehe TRIM-Funktion-Anfangs/EndLeerzeichen aus Strings entfernen
Danach kann das NET-IO als ECMD Device in FHEM angelegt werden:
define avrnetio ECMD telnet 192.168.10.11:2701 attr avrnetio classdefs adc=/etc/fhem.classdef.netio.adc attr avrnetio room AVR-Net-IO
Anschließend der Bodenfeuchtesensor als ECMDDevice mit übergabe der internen Portnummer, bei mir die Schraubklemme ADC4 -> also der ADC-Port 7:
define Bodenfeuchte_3 ECMDDevice adc 7 attr Bodenfeuchte_3 room AVR-Net-IO
Jetzt muss ermittelt werden, welcher Wert dem 100% Status entspricht. Im Fall meines Bodenfeuchtesensors bedeutet dies, welcher Wert zurückgegeben wird im Falle einer Überschwemmung. Dazu tauche ich den Sensor komplett in ein Wasserglas und frage den Status im FHEM-Inputfeld auf der Weboberfläche ab:
get Bodenfeuchte_3 portvalue
Bei mir wird 625 zurückgegeben. Also wird als Referenzwert dieses Sensors folgendes eingetragen:
attr Bodenfeuchte_3 referenz 625
Damit wird ab sofort ein annähernd korrekter Prozentwert der aktuellen Bodenfeuchte ausgegeben. Bitte beachten, dass gelöste Salze im Erdreich eine andere Leitfähigkeit besitzen als Trinkwasser. Ebenso kommt es auf die Beschaffenheit des Erdreiches an, ob Sand-, Lehm- oder Tonerde macht schon einen Unterschied. Deshalb kann oder sollte man nach einer gewissen Einsatzzeit den Referenzwert daraufhin anpassen.
Damit wir später aufgrund der prozentualen Bodenfeuchte einen Einschaltbefehl, z.B. an ein Gardena Magnetventil, absetzen können, muss man wissen, ab wieviel Prozent Bodenfeuchte man bewässern möchte. Das kann von Bewässerungskreis zu Bewässerungskreis unterschiedlich sein. Somit auch abhängig vom jeweiligen Sensor. Rhododendren möchten schließlich anders bewässert werden als z.B. Rasen oder Kartoffeln.
Dazu wird dem Sensor ein neues Attribut zugewiesen:
attr Bodenfeuchte_3 schwellwert 30
Hier wird festgelegt, dass ab einer Bodenfeuchte von kleiner 30% bewässert werden soll. Abhängig von diesem Schwellwert enthält das Reading "status" entweder "on" oder "off". Wie dieses Attribut ausgewertet wird, obliegt allerdings der Prozedur zum Steuern der Magnetventile (Beispiel: Bewässerungssteuerung).
Jetzt noch einen Timer definieren der die Sensoren minütlich abfragt:
define Bodenfeuchtemessung at +*00:01 get Bodenfeuchte_3 value attr Bodenfeuchtemessung room AVR-Net-IO
und Fertig!!
Hat man nun entsprechende Plots definiert, so sieht das folgendermaßen aus:
Hier ist erkenbar, dass nach einem Starkregen (mittlerer Chart, grüne Linie - ca 5 l/m² innerhalb 2h) die Bodenfeuchte auf knapp 100% gestiegen ist, danach gleich wieder abfallend aufgrund Feuchteverteilung. Ein sich anschließender Regenschauer hat die Bodenfeuchte sofort wieder Richtung 100% gebracht. Auch hier ist anschließend der Normalisierungsprozess erkenbar.
Hinweis: die rote Linie der Bodenfeuchte ändert sich nicht. Das Areal des Bodenfeuchtefeuchtesensors der Tomaten ist vor Regen geschützt.
Analoge Ausgänge 0-32V
Die leicht nachzubauende Schaltung besteht aus einem DAC (LTC1257) und einem Operationsverstärker (LM358).
Der LTC1257 wandelt (bei interner Referenzspannung) einen digital übermittelten Wert (über die Eingänge CLK, DIN und LOAD) in eine Spannung von 0-2,048V. Diese Spannung wird anschließend von dem LM358 erhöht. Die Elemente R1,R2, C1 und C2 gehören zur Grundbeschaltung des LTC1257. Mittels der Widerstände R3 und R4 wird der Verstärkungsfaktor der Operationsverstärkerschaltung eingestellt. Der OP ist als nicht invertierender Verstärker ausgeführt. Mit zwei Widerständen könnte aus dem LM358 eine doppelte invertierende Verstärkerschaltung (in Reihe geschaltete) aufgebaut werden. Das würde die Genauigkeit erhöhen. Die Schaltung funktioniert jedoch einwandfrei und eine höhere Genauigkeit wird vermutlich nur selten einen Vorteil bieten.
In diesem Fall hat VCC_Therme eine Spannung von 24V. Der LM358 kann bis 32V arbeiten, dann muss jedoch VCC_Therme auf 32V angehoben werden und der Widerstandswert von R4 auf ca. 150k Ohm erhöht werden. An dem Steuersignal_Therme liegt je nach dem welchen Wert der LTC1257 gerade in einen anlogen Wert umsetzt eine Spannung von 0-24V. Diese Schaltung kann eingesetzt werden, um Junkers-Thermen mit „Stetigeingang“ anzusteuern. Die grünen Markierungen sind nicht im Schaltplan enthalten.
Der Aufbau des leicht erweiterten Prototypen erfolgte auf einer Punkt-Streifenrasterplatine (Immer drei Punkte einer Reihe sind miteinander verbunden (s. blaue Markierungen)). Um die Schaltung nachzubauen sind keine besonderen Lötkenntnisse erforderlich. Da nur wenige Brücken eingelötet werden müssen, lohnt sich eine fertige Platine nicht. Die Widerstände R4 (und (erweiterte Schaltung) R6) sind jeweils als zwei Widerstände ausgeführt.
Die PIN-Zuordnungen erfolgt in dem Ethersexprojekt in der Datei pinning/hardware/netio.m4 (nach LTC suchen).
Der LTC1257 bekommt den Soll Wert mittels des Befehls ltc1257_set SOLLWERT (0 <= SOLLWERT <= 4095) zugewiesen. Hierfür wird eine classdef Datei erstellt, z.B.:
# Umsetzung in ECMD Befehle # Ein Uebergabeparameter -> Sollwert set setDacValue params dacValue set setDacValue cmd {"ltc1257_set %dacValue\n"} set setDacValue expect "OK\n" # Keine Uebergabeparameter set init cmd {"ltc1257_init\n"} set init expect "OK\n"
Danach kann der LTC1257 als ECMD Device in FHEM (fhem.cfg) angelegt werden. Hierfür wird eine möglicherweise bestehende „NETIO classdefs“ erweitert:
attr NETIO_01 classdefs [Andere ECMD Geräte]:LTC1257=/fhem/ltc1257.classdef
Anschließend den DAC(/LTC1257) als ECMDDevice definieren:
define MEINDAC ECMDDevice LTC1257
attr MEINDAC room MEINRAUM
Der Befehl zum Setzen eines neuen Spannungswertes lautet:
my $dacValue = 1345;;\
fhem("set MEINDAC setDacValue ".$dacValue);;\
Dazu kann/sollte die folgende adc.classdef verwendet werden:
get value cmd {"adc get %PortID\n"}
params PortID
get value expect ".*"
get value postproc {\
my $hexval = hex(trim("$_"));\
my $hash = $defs{%NAME};\
readingsSingleUpdate($hash, "state", $hexval, 1);\
readingsSingleUpdate($hexval, 1);\
}
LCD-Modul anschließen
In diesem Beispiel wird ein LCD-Modul mit HD44780 kompatiblen Controller angeschlossen. Diesen Controller nutzen fast alle Module. Dazu gehören auch Module die einen KSxxx Chip verbaut haben. Angeschlossen wird das Modul an die EXT-Pfostensteckerleiste. Somit hat man den großen SUBD25 Anschluss für die Erweiterungplatine weiterhin frei.
Damit man das LCD ansprechen kann, muss dieses in der Ethersex Firmware aktiviert werden. Dazu im "make menuconfig" unter "I/O" den Unterpunkt "LCD" aktivieren und gegebenefalls den Controllertyp noch einstellen. Beim Einstellen des Controllertyps muss man ev. etwas ausprobieren, wenn man später auf dem LCD eine verschobene Zeilenausgabe hat.
Verdrahtet wird das LCD im 4-Bit Modus gemäß u.a. Tabelle. Falls man kein altes 10poliges Flachbandkabel mit Pfostenstecker zur Hand hat, kann man auch ein ausgedientes COM-Port Flachbandkabel benutzen, muss dann allerdings die 5V Vcc über ein extra Kabel von einer der blauen 5V Anschlussleisten holen.
LCD-Pin | EXT-Pin | Funktion | Beschreibung |
---|---|---|---|
1 | 9 | GND | Masse |
2 | 10 | Vcc | +5V |
3 | 9 | GND | Kontrast gegen GND |
4 | 2 | PD3 | RS |
5 | 1 | PD2 | R/W |
6 | 7 | PB0 | EN1 |
7 | - | ||
8 | - | ||
9 | - | ||
10 | - | ||
11 | 3 | PD4 | D4 |
12 | 4 | PD5 | D5 |
13 | 5 | PD6 | D6 |
14 | 6 | PD7 | D7 |
15 | 8 | HG+ | Hintergrundbeleuchtung (mit Vorwiderstand 200Ohm) |
16 | 9 | HG- | Hintergrundbeleuchtung |
Jetzt wird die classdef Datei erstellt, zb. /etc/fhem.classdef.netio.adc
# Umsetzung der ECMD Befehle set write params line col text set write cmd {"lcd goto %line %col\n\000lcd write %text\n"} set write expect "OK\n" set write postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";} set clear params col set clear cmd {"lcd clear %col\n"} set clear expect "OK\n" set clear postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";} set clear_all cmd {"lcd clear\n"} set clear_all expect "OK\n" set clear_all postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";} set lcd_bl params state set lcd_bl cmd {"lcd backlight %state\n"} set lcd_bl expect "OK\n" set lcd_bl postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";}
Danach kann dar NET-IO als ECMD Device in FHEM angelegt werden:
define avrnetio ECMD telnet 192.168.5.12:2701 attr avrnetio classdefs lcd=/usr/share/fhem/fhem.classdef.netio.lcd attr avrnetio room AVR-Net-IO
Anschließend das LCD als ECMDDevice anlegen:
define avrnetio_lcd ECMDDevice lcd attr avrnetio_lcd room AVR-Net-IO
Um jetzt etwas auf dem LCD auszugeben muss man folgendes eingeben:
set avrnetio_lcd clear_all set avrnetio_lcd write 0 0 Hallo_Welt
Es wird als in Zeile 0, Spalte 0 der Text "Hallo_Welt" ausgegeben.
Hat man vorher einen Temperatursensor (wie schon beschrieben) angelegt, so kann man mit einem notify immer bei einer Temperaturmessung den Wert automatisch aufs LCD ausgeben:
define Temp2LCD notify WZ_Temp:temp.* {\ my $value = "$EVTPART1";; \ fhem "set avrnetio_lcd clear_all";;\ fhem "set avrnetio_lcd write 0 0 Temperatur:$value";;\ undef\ } attr Temp2LCD room AVR-Net-IO
Bekannte Probleme
Netzwerkausfallsicherheit
Entgegen den Vorgaben von Microchip sind keine Abblockkondensatoren an den Versorgungsspannungsanschlüssen des ENC28J60. Es kann insbesondere bei hoher Netzlast dazu kommen, dass sich der Ethernet Controller aufhängt. Es ist daher empfehlenswert, Kondensatoren am ENC28J60 und am 3,3V Spannungsregler nachzurüsten.
Reduktion Stromverbrauch Tipp 1
Der AVR-NET-IO braucht in der Standardausführung je nach Eingangsspannung relativ viel Strom (bei 12V Gleichstrom ca. 180 mA). Ein Großteil der Leistung wird an den Festspannungsreglern verheizt. Abhilfe schaffen ein pinkompatibler DC/DC-Wandler für den 7805 und ggf. ein entsprechender Ersatz des LM317 oder gleich ein Umstellen des gesamten Boards auf 3,3 Volt. Bei letzterem muss man den Systemtakt des AVR aber reduzieren (ein guter Wert sind 8 MHz), da der AVR sonst außerhalb der Spezifikation läuft. Bei Änderungen des Systemtaktes und Nutzung des 1-Wire Bus bitte Fuse-Einstellungen entsprechend anpassen (siehe "Hinweise für 1-Wire" weiter unten).
Reduktion Stromverbrauch Tipp 2
Um mit einfachen Mitteln den Stromverbrauch des NET-IO zu reduzieren, und somit auch die Wärmeentwicklung, muss man einfach nur ein SchaltNetzteil mit 5V DC einbauen (GND an Pin2 und +5V an Pin3 vom 7805). Z.B. dieses: EcoFriendly Stecker-Schaltnetzteil MW 3N06GS, 600mA + USB
Dazu muss man noch nichtmal große Löterfahrung mitbringen. Es gibt Berichte, die mit der Änderung von ca. 4,5-4,8 W auf nur noch 0,3-0,4 W herunterkommen; beide Werte sind jedoch unglaubwürdig. Der erste ist vermutlich auf ein sehr schlechtes Netzteil und der zweite auf einen Messfehler zurückzuführen.
Der Net-IO nimmt im Normalbetrieb bei 9V= ca. 180mA auf, das sind ca. 1,6W. Durch den Umbau bleibt der Strom konstant, die Spannung sinkt jedoch auf 5V. Das ergibt bei 5V und 180mA ca. 0,9 W. Durch gute oder schlechte Netzteile geht der Gesamtverbrauch nochmal wenig oder viel in die Höhe.
Hinweise für 1-Wire
Bei Nutzung von 1-Wire ist zu beachten, dass die Einstellungen des Systemtaktes in der Ethersex-Konfiguration und die Fuse-Einstellungen des jeweiligen µC (z.B. ATmega644P) miteinander harmonieren. Bei falschen Werten funktioniert der 1-Wire-Bus (da das Timing vom Takt gebildet wird) nicht! Ggf. also Fusebits für den Takt neu berechnen und Fuses neu setzen.