AVR-NET-IO: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
 
(46 dazwischenliegende Versionen von 7 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)]]


= AVR-NET-IO =
== 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 Pollin [http://www.pollin.de/ [1]] zu erwerben gibt. Ausgestattet ist er mit einem Microcontroller ATMega32 und einem Netzwerkcontroller ENC25J60. 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.
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 ethersex [http://old.ethersex.de/index.php/Ethersex [2]] 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)
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 [[http://neubert-volmar.de/Hausautomation/index.html [3]] . Vielen Dank dafür !!
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 [[http://www.gtkdb.de/index_18_1036.html hier]].
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, so ist euer AVR-NET-IO unter der gewählten IP Adresse im Netzwerk erreichbar. Es zeigt dann auch eine Homepage-Seite mit einigen Funktionen an.
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 vieleicht 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 vorkonfiguriertem Port PD6. Verzichtet man auf einen Analogeingang, lässt sich der 1-Wire-Bus auch an der Schraubklemme ADC1 ganz gut 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.""''
'''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: [[http://old.ethersex.de/index.php/Dallas_1-wire_Bus [4]]]
 
--<a href="/w/index.php?title=Benutzer:Mick&amp;action=edit&amp;redlink=1" class="new" title="Benutzer:Mick (Seite nicht vorhanden)">Mick</a> 23:34, 27. Mär. 2012 (CEST)
''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 Einträge in die fhem.cfg:
Um das AVR-NET-IO im FHEM bekannt zu machen, müssen folgende Definitionen in der [[Konfiguration]] (fhem.cfg) gemacht werden:


  <nowiki>define NETIO_01 ECMD telnet 192.168.0.99:2701
  <nowiki>define NETIO_01 ECMD telnet 192.168.0.99:2701
Zeile 30: 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 room-Zuweisung ist optional
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)]]


=== 1-Wire Temperatursensoren ===
=== 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. Weiterführende Informationen zum 1-Wire Bussystem befinden sich in einem anderen [[http://fhemwiki.de/wiki/Kategorie:1-Wire Wiki-Beitrag]]. Ich nutze zur Zeit 6 Stück Temperatursensoren DS18S20 im parasitären Modus (nur 2 Drähte notwendig) an einer alten Telefonverkabelung und 2 Stück 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 können [[http://www.gtkdb.de/index_18_1040.html hier]] entnommen werden.
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:


<pre style="margin-right:330px;">
<syntaxhighlight lang="perl">
# Uebergabeparameter 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"}
set messen cmd {"1w convert\n"} #ist überflüssig, wenn in Ethersex Polling eingeschaltet ist
get temp cmd {"1w get&#160;%devID"}
set messen expect "OK\n"        #ist überflüssig, wenn in Ethersex Polling eingeschaltet ist
</pre>
get temp cmd {"1w get %devID\n"}
Dann wird in der fhem.cfg z.B. das Device Temperatursensor Wohnzimmer wie folgt deklariert. Die bei jedem Sensor einzigartige 16-stellige Adresse bekommt ihr u.a. über die Weboberfläche von ethersex oder über Telnet und den Befehl 1w list
get temp expect "\d+.\d+\n"
get temp postproc { s/\n//; $_ }
</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, braucht ihr einen Timer z.B. alle 15min, der zuerst das Ereignis messen sendet und nach 2 sek. die Temperatur abfragt
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 ihr mit:
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, müsst ihr im FHEM Haupt-Verzeichnis die Datei 1wtemp.gplot mit folgendem Inhalt anlegen
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 &lt;SIZE&gt; crop
  <nowiki>set terminal png transparent size &lt;SIZE&gt; crop
Zeile 73: Zeile 77:
  "&lt; egrep 'WZ_Temp' &lt;IN&gt;"\
  "&lt; egrep 'WZ_Temp' &lt;IN&gt;"\
   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 80: 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 93: Zeile 97:
params RelaisPort
params RelaisPort
# erst alle Ports PC.. auf Ausgang setzen und dann per Hexcode schalten
# erst alle Ports PC.. auf Ausgang setzen und dann per Hexcode schalten
set on cmd {"io set ddr 2 ff\nio set port 2&#160;%RelaisPort&#160;%RelaisPort"}
set on cmd {"io set ddr 2 ff\n\000io set port 2&#160;%RelaisPort&#160;%RelaisPort\n"}
set on postproc {s/([OK|;]*)/success/; "$_" eq "success"&#160;? "ok"&#160;: "error";}
set on expect "OK\n"
set off cmd {"io set ddr 2 ff\nio set port 2 00&#160;%RelaisPort"}
set on postproc {s/([OK\n|;]*)/success/; "$_" eq "success"&#160;? "ok"&#160;: "error";}
set off postproc {s/([OK|;]*)/success/; "$_" eq "success"&#160;? "ok"&#160;: "error";}</nowiki>
set off cmd {"io set ddr 2 ff\n\000io set port 2 00&#160;%RelaisPort\n"}
set off expect "OK\n"
set off postproc {s/([OK\n|;]*)/success/; "$_" eq "success"&#160;? "ok"&#160;: "error";}</nowiki>
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. (&#160;!!Achtung!! - der Parameter hinter RELAIS ist nicht die Nummer des Relais, sondern der HEX-Code zur Ansteuerung des Ports - siehe nachfolgende Tabelle):
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 106: 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-&gt;hex z.b [[http://home.snafu.de/sicpaul/midi/hexbin.htm hier]]
Alle 8 Relais und der zugehörige Schaltpin in hex als Überblick (Umrechnung binär-&gt;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 168: 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 Wiki [[http://fhemwiki.de/wiki/Intertechno_Code_Berechnung Intertechno]] ).
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, das 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 deshalb besser nicht für sehr kritische Anwendungen verbauen.
Je nach Ausrichtung der Antenne, den räumlichen Gegebenheiten und dem "Funkverkehr" der Nachbarn funktioniert das System im 433&nbsp;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 [[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.
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&nbsp;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 183: Zeile 204:
I/O -&gt; RFM12 ASK aktivieren -&gt; RFM12 ASK send aktivieren -&gt; Intertechno aktivieren
I/O -&gt; RFM12 ASK aktivieren -&gt; RFM12 ASK send aktivieren -&gt; Intertechno aktivieren
General Setup -&gt; VFS support -&gt; VFS File Inlining -&gt; Inline RFM12</nowiki>
General Setup -&gt; VFS support -&gt; VFS File Inlining -&gt; Inline RFM12</nowiki>
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.
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:


  <nowiki># Uebergabeparameter Intertechno Coding: Familie + Gruppe + Gerät
  <nowiki># Uebergabeparameter Intertechno Coding: Familie + Gruppe + Geraet
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 {"rfm12 intertechno&#160;%it_fam&#160;%it_group&#160;%it_dev 1"}
set on cmd {"ask intertechno&#160;%it_fam&#160;%it_group&#160;%it_dev 1\n"}
set off cmd {"rfm12 intertechno&#160;%it_fam&#160;%it_group&#160;%it_dev 0"}</nowiki>
set on expect "OK\n"
set off cmd {"ask intertechno&#160;%it_fam&#160;%it_group&#160;%it_dev 0\n"}
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 197: 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 -&gt; 1 1 1 / F6 -&gt; 6 2 2 / D11 -&gt; 4 3 3
also z.B. A1 -&gt; 1 1 1 / F6 -&gt; 6 2 2 / D11 -&gt; 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 ===
Dieses 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.
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 dessen Korrektheit per Attribute gesteuert 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
* Referenz
* schwellwert
* 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 229: Zeile 261:
#  status = off =&gt; gemessener Wert liegt über dem Schwellwert
#  status = off =&gt; gemessener Wert liegt über dem Schwellwert
# portvalue = originaler Rückgabewert des NET-IO in Dec umgerechnet um einen Referenzwert ermitteln zu können  
# portvalue = originaler Rückgabewert des NET-IO in Dec umgerechnet um einen Referenzwert ermitteln zu können  
get value cmd {"adc get&#160;%PortID"}
get value cmd {"adc get&#160;%PortID\n"}
get value expect ".*"
get value postproc {\
get value postproc {\
  my $hexval = hex(trim("$_"));\
  my $hexval = hex(trim("$_"));\
Zeile 244: Zeile 277:
  $retval;\
  $retval;\
}
}
get portvalue cmd {"adc get&#160;%PortID"}
get portvalue cmd {"adc get&#160;%PortID\n"}
get portvalue expect ".*"
get portvalue postproc {hex(trim("$_"))}</pre>
get portvalue postproc {hex(trim("$_"))}</pre>
Damit das funktioniert, muss FHEM noch die trim-Funktionbekannt gemacht werden. Siehe [[TRIM-Funktion-Anfangs/EndLeerzeichen aus Strings entfernen]]
Damit das funktioniert, muss FHEM noch die trim-Funktion bekannt gemacht werden. Siehe [[TRIM-Funktion-Anfangs/EndLeerzeichen aus Strings entfernen]]


Danach kann dar NET-IO als ECMD Device in FHEM angelegt werden:
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 257: 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 Frage den Status im FHEM-Inputfeld auf der Weboberfläche ab:
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 263: 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 zur Beachtung, das 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 sollten man nach einer gewissen Einsatzzeit den Referenzwert daraufhin anpassen.
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, zb. 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. Rhodedendren möchten schließlich anders bewässert werden als Rasen oder Kartoffeln etc.
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 dem Sensor zugewiesen:
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, das ab einer Bodenfeuchte von kleiner 30% bewässert werden soll. Abhängig von diesem Schwellwert enthält das Reading "status" entweder "on" oder "off".  
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 280: 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, das 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.
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-24V===
===Analoge Ausgänge 0-32V===
 
Die leicht nachzubauende Schaltung besteht aus einem DAC (LTC1257) und einem Operationsverstärker (LM358).
Die Schaltung besteht aus einem DAC (LTC1257) und einem Operationsverstärker (LM358).


[[Datei:AVR_NET_IO_MIT_DAC_LTC1257.png|700px|thumb|left|DAC LTC1257 mit Verstärkerschaltung]]
[[Datei:AVR_NET_IO_MIT_DAC_LTC1257.png|700px|thumb|left|DAC LTC1257 mit Verstärkerschaltung]]
Zeile 296: Zeile 327:
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.
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 ist hat VCC_Therme eine Spannung von 24V. Der LM358 kann bis 32V arbeiten, dann muss jedoch der Widerstandswert von R4 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.
[[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.
 
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.: 
 
<nowiki># 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"</nowiki>
 
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>
 
Anschließend den DAC(/LTC1257) als ECMDDevice definieren:
:<code>define MEINDAC ECMDDevice LTC1257 </code>
:<code>attr MEINDAC room MEINRAUM </code>
 
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:
<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.


Verdratet 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.
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 420: Zeile 492:
  <nowiki># Umsetzung der ECMD Befehle
  <nowiki># Umsetzung der ECMD Befehle
set write params line col text   
set write params line col text   
set write cmd {"lcd goto&#160;%line&#160;%col\nlcd write&#160;%text"}
set write cmd {"lcd goto %line %col\n\000lcd write %text\n"}
set write postproc {s/([OK|;]*)/success/; "$_" eq "success"&#160;? "ok"&#160;: "error";}
set write expect "OK\n"
set write postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";}
set clear params col
set clear params col
set clear cmd {"lcd clear&#160;%col"}
set clear cmd {"lcd clear %col\n"}
set clear postproc {s/([OK|;]*)/success/; "$_" eq "success"&#160;? "ok"&#160;: "error";}
set clear expect "OK\n"
set clear_all cmd {"lcd clear"}  
set clear postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";}
set clear_all postproc {s/([OK|;]*)/success/; "$_" eq "success"&#160;? "ok"&#160;: "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 params state
set lcd_bl cmd {"lcd backlight&#160;%state"}
set lcd_bl cmd {"lcd backlight %state\n"}
set lcd_bl postproc {s/([OK|;]*)/success/; "$_" eq "success"&#160;? "ok"&#160;: "error";}</nowiki>
set lcd_bl expect "OK\n"
set lcd_bl postproc {s/([OK\n|;]*)/success/; "$_" eq "success" ? "ok" : "error";}</nowiki>
Danach kann dar NET-IO als ECMD Device in FHEM angelegt werden:
Danach kann dar NET-IO als ECMD Device in FHEM angelegt werden:


Zeile 448: Zeile 524:


  <nowiki>define Temp2LCD notify WZ_Temp:temp.* {\
  <nowiki>define Temp2LCD notify WZ_Temp:temp.* {\
  my $value = "%EVTPART1";; \
  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 458: Zeile 534:
=== Netzwerkausfallsicherheit ===
=== 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.
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.
--[[Benutzer:MichaS]] 23:30, 27. Mär. 2012 (CET)


=== Reduktion Stromverbrauch Tipp 1 ===
=== Reduktion Stromverbrauch Tipp 1 ===
Der AVR-NET-IO braucht in der Standardausfürung je nach Eingangsspannung relativ viel Strom (bei 12V Gleichstrom ca. 180 mA). Ein Großteil der Leistung wird an den Festspannungsreglern verheizt.
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ßer Spezifikation läuft. Bei Änderungen des Systemtaktes und Nutzung des 1-Wire Bus bitte Fuse-Einstellungen entsprechend anpassen (s. "Hinweise für 1-Wire" weiter unten).
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).
 
--<a href="/w/index.php?title=Benutzer:Mick&amp;action=edit&amp;redlink=1" class="new" title="Benutzer:Mick (Seite nicht vorhanden)">Mick</a> (<a href="/w/index.php?title=Benutzer_Diskussion:Mick&amp;action=edit&amp;redlink=1" class="new" title="Benutzer Diskussion:Mick (Seite nicht vorhanden)">Diskussion</a>) 16:02, 14. Nov. 2012 (CET)


=== 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).
Zb. dieses: [http://www.reichelt.de/Universalnetzteile/MW-3N06GS/3//index.html?ACTION=3&amp;GROUPID=4945&amp;ARTICLE=87338&amp;SHOW=1&amp;START=0&amp;OFFSET=500&amp; EcoFriendly Stecker-Schaltnetzteil MW 3N06GS, 600mA + USB ]
Z.B. dieses: [http://www.reichelt.de/Universalnetzteile/MW-3N06GS/3//index.html?ACTION=3&amp;GROUPID=4945&amp;ARTICLE=87338&amp;SHOW=1&amp;START=0&amp;OFFSET=500&amp; EcoFriendly Stecker-Schaltnetzteil MW 3N06GS, 600mA + USB ]


Dazu muss man noch nichtmal große Löterfahrung mitbringen. Eine Leistungsmessung hat folgendes gezeigt: Vorher wurde bei 9V~ ca. 4,5 - 4,8 W verbraucht. Mit der Änderung wird jetzt nur noch 0,3 - 0,4 W benötigt.
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.


--[[Benutzer:Tobias.faust]] 14:00, 14. Jun. 2012 (CEST)
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. AT664p) 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.
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.
 
[http://www.gtkdb.de/index_18_1039.html AVR-NET-IO: Umbau vom ATmega32 zum ATmega644P] und
[http://www.mikrocontroller.net/topic/221867#2252416 Ethersex erkennt keine One-Wire Sensoren mit 644p]


--[[Benutzer:Tobias.faust]] 14:15, 18. Jun. 2012 (CEST)
== Links ==
angepasst: -- <a href="/w/index.php?title=Benutzer:Mick&amp;action=edit&amp;redlink=1" class="new" title="Benutzer:Mick (Seite nicht vorhanden)">Mick</a> (<a href="/w/index.php?title=Benutzer_Diskussion:Mick&amp;action=edit&amp;redlink=1" class="new" title="Benutzer Diskussion:Mick (Seite nicht vorhanden)">Diskussion</a>) 16:02, 14. Nov. 2012 (CET)
* [http://www.gtkdb.de/index_18_1039.html AVR-NET-IO: Umbau vom ATmega32 zum ATmega644P]
* [http://www.mikrocontroller.net/topic/221867#2252416 Ethersex erkennt keine One-Wire Sensoren mit 644p]


[[Kategorie:Other Components]]
[[Kategorie:1-Wire]]
[[Kategorie:IP Components]]
[[Kategorie:Interfaces]]
[[Kategorie:HOWTOS]]
[[Kategorie:HOWTOS]]
[[Kategorie:Glossary]]

Aktuelle Version vom 26. Juli 2017, 19:54 Uhr

AVR-NET-IO Ansicht fertig bestückte Platine (Bild Pollin GmbH)

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.

Temperatursensor DS18S20 (Bild Pollin GmbH)

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}"
Relaiskarte K8IO (Bild Pollin GmbH)

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.

Funkmodul RFM12 (Bild Pollin GmbH)

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 €).

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". 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:

Plot Bodenfeuchtesensor Vegetronix-VH400.jpg

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).

DAC LTC1257 mit Verstärkerschaltung

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.

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.

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.

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.

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.

Links