AVR-NET-IO

Aus FHEMWiki
Zur Navigation springen Zur Suche springen
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