Vorstellung der Boards
Der Wemos D1 mini, sowie Node MCU sind Entwicklerboards mit einem ESP8266 Wlan-Chip.
Im Iot sind diese Boards sehr nützlich, denn dank Wlan sind sie, natürlich in entsprechender Reichweite, beliebig platzierbar und können die Werte gleich mehrerer Sensoren auswerten und an Fhem weitergeben. Des Weiteren ist der sehr günstige Preis einen näheren Blick wert.
Wie man anhand der Pins sehen kann, bieten beide Boards viele Anschlussmöglichkeiten und haben so einen entsprechend hohen Wirkungskreis. Die serielle Schnittstelle macht es möglich z.B. einen RFID-Reader zu betreiben (mehr dazu im Kapitel „RFID“), dank normal zu schaltender GPIOs ist es auch möglich z.B. ein Relais zu betreiben. Den I2C-Bus bieten diese Boards ebenfalls. Wer also z.B. ein Display 16×2 oder 20×4 Display betreiben möchte – kann ebenfalls auf so ein Board zurückgreifen.
Die oben genannte Firmware ESPEasy bietet die Möglichkeit das Board über ein Webinterface ziemlich komfortabel zu verwalten.
ESPEasy flashen und einrichten
Um ESPEasy auf das Board zu bekommen, benötigt man
- Ein entsprechendes Board (sollte klar sein)
- ESPEasy als Zip File
- USB Datenkabel (es wird kein FTDI Adapter benötigt)
Vor dem Flashen sollte man wissen, wie viel Flash-Speicher das Board hat. Im Fall vom Wemos D1 mini wären das 4Mbit – meist steht das aber in der entsprechenden Artikelbeschreibung mit dabei oder Google hilft.
Das Board kann nun per USB Datenkabel angeschlossen werden und das ESPEasy Zip File sollte entpackt werden.
Uns interessiert hier das „FlashESP8266“, dieses wird einfach per Doppelklick geöffnet.
Unter dem „COM-Port“ taucht in der Regel von selbst das Board auf (wer auf Nummer sicher gehen möchte kann auch im Gerätemanager nachsehen). Unter „Firmware“ wählt man nun die für das Board passende Datei aus. Im Fall des hier angeschlossenen Wemos D1 mini mit ESP8266 Chip und 4Mbit Flash-Speicher also das blau hinterlegte File.
Nachdem man auf „Flash“ geklickt hat öffnet sich selbständig ein Kommandozeilen-Fenster und beginnt den Flash-Vorgang. Das Flashen dauert etwa 30 Sekunden und wird mit einem kleinen Fenster „Flash complete“ beendet.
Das USB Kabel kann nun vom Computer getrennt und stattdessen zur Stromversorgung des Boards in ein entsprechendes Netzteil gesteckt werden. Das Board erstellt nun ein eigenen Wlan Hotspot mit dem Namen „ESP_Easy-0“ an das man sich mit dem Passwort „configesp“ anmelden kann.
Nun öffnet man den Browser und tippt „192.168.4.1“ ein. Es öffnet sich die Konfigurationsseite, wo das Board mit dem heimischem Wlan verbunden werden kann.
Nach der Eingabe des Passworts wird die Verbindung hergestellt.
Wenn die Verbindung erfolgreich hergestellt wurde, zeigt ESPEasy für einen kurzen Moment noch die neue lokale IP-Adresse an, über die man das Board nun erreichen und konfigurieren kann – das alles geschieht im Browser.
In den Menüs können diverse Einstellungen vorgenommen werden.
Unter „Config“ kann der Hostname, hier „Unit Name“, geändert werden und eine „Unit Number“ vergeben werden. Diese sollte bei der Verwendung mehrerer Boards entsprechend angepasst werden (Board 1; Unit Number 1, Board 2; Unit Number 2 und so weiter). Des Weitern kann man noch ein Passwort für den Benutzeroberfläche von ESPEasy setzen (zu empfehlen).
Unter „Hardware“ finden sich Einstellungen zu den GPIOs des Boards mit entsprechender Nummerierung, die dem Aufdruck des Boards entsprechen (sehr praktisch).
Die Status LED auf den meisten Boards ist in der Grundeinstellung abgeschaltet – so ist es natürlich nicht immer ersichtlich, ob das Board derzeit in Betrieb ist. Unter „Wifi Status LED“ lässt sich das ändern. Bei den dort vorgeschlagenen Änderungen leuchtet die LED (beim Wemos D1 Mini) durchgehend (zu Lasten des Energiebedarfs – dies ist inbesondere bei Batteriebetrieb zu beachten).
Die Einstellung „I2C Interface“, „SPI Interface“ oder „GPIO boot states“ sind soweit selbst erklärend. Je nach Verwendungszweck können der Bus bzw. die Pins gewählt oder als Ein- oder Ausgang (hier mit den Zuständen High und Low) gesetzt werden.
Für die Nutzung in Fhem ist der Reiter „Controllers“ interessant. Hier wird folgende Einstellung vorgenommen
Unter Controller IP wird selbstverständlich die IP-Adresse des Fhem Servers eingetragen und das Häkchen bei „Enabled“ gesetzt. Nach einem Klick auf Submit, kann ESPEasy nun mit Fhem kommunizieren.
Damit Fhem selbst auch versteht was der Wemos da sagt, benötigen wir wieder eine Brücke, die ESPEasy Bridge. Diese wird mit
define Name der Bridge ESPEasy bridge 8383
angelegt.
Am Board betriebene Devices werden meist per Autocreate in Fhem angelegt und sind sofort betriebsbereit.
RFID Reader
Es gibt verschiedene Typen von RFID-Readern, die sich über ESPEasy sehr einfach mit Fhem verbinden lassen.
So können dann ausgelesene Tags an Fhem gesendet werden, diese können dann z.B. über ein Notify eine Aktion auslösen.
Hier möchte die beiden Reader P040 „RDM6300“, sowie P017 „PN532“ vorstellen.
Das ist ein Reader, der über die serielle Schnittstelle (Tx /Rx) kommuniziert und Transponder im Frequenzbereich von 125 KHz auslesen kann.
Da der Reader mit einer Spannung von 5V betrieben wird, müssen die beiden Datenleitungen der seriellen Schnittstelle (Rx/Tx) mit einem Level-Konverter betrieben werden.
Angeschlossen wird das Ganze wie folgt:
- Node MCU „VU“ -> RDM6300 „P1 / 5„
- Node MCU „G“ -> RDM6300 „P1 / 4„
- Antenne -> RDM6300 „P2„
Serielle Schnittstelle:
- RDM6300 „P1 / 1“ (Tx) -> Level-Konverter „HV1„
- Level-Konverter „LV1“ -> Node MCU „Rx„
- RDM6300 „P1 /2“ (Rx) -> Level-Konverter „HV2„
- Level-Konverter „LV2“ -> Node MCU „Tx„
Unter ESPEasy wird dann ein neues Device angelegt
Hat man alles korrekt angeklemmt und angelegt, kann man zum testen einen Transponder an die Antenne halten, der Tag wird dann unter ESPEasy angezeigt. Zeitgleich wird ein Device in Fhem erzeugt, welches ebenfalls den ausgelesenen Tag anzeigt
Die ausgelesenen Tags können jetzt z.B. in einem Notify weiterverarbeitet werden – damit könnte man eine Alarmanlage scharf schalten, eine Tür freigeben – oder ganz was anderes anstellen.
Anders als der RDM6300 arbeitet der PN532 mit einer Frequenz von 13,56 MHz. Bei der Wahl der Transponder muss darauf geachtet werden, die 125 KHz Transponder können mit diesem Reader nicht ausgelesen werden – dafür allerdings NFC Tags von Smartphones.
Weitere Unterscheidungsmerkmale sind, dass der PN532 keine externe Antenne hat und mit einer anderen Schnittstelle kommuniziert – dem I2C Bus.
Man kann den Reader auch über die SPI Schnittstelle betrieben – für die Anbindung an ESPEasy ist allerdings der I2C Bus vorgesehen. Dafür sind die Pins „GND, VCC, SDA und SCL“ zu verwenden.
Um zwischen den Schnittstellen zu wechseln, sind zwei DIP Schalter auf der Platine vorhanden, die gemäß der Legende, die unterhalb abgedruckt ist, in Position gebracht werden müssen. (Oben auf dem Bild ist die Einstellung für den I2C Bus ausgewählt).
Der Reader arbeitet mit 3,3V, daher ist kein Level-Konverter nötig.
Wer meine anderen Tutorials gelesen hat, der hat gesehen, dass ich die I2C-Schnittstelle einst deaktiviert habe – das mache ich zunächst Rückgängig, dazu wird in der ESPEasy Oberfläche unter „Hardware“ und „I2C-Interface“ jeweils wieder ein GPIO für SDA und SCL gesetzt.
Danach kann der Reader angeklemmt werden:
- PN532 „GND“ -> Node MCU „G„
- PN532 „VCC“ -> Node MCU „3V„
- PN 532 „SDA“ -> Node MCU „D7„
- PN 532 „SCL“ -> Node MCU „D8„
Der Node MCU sollte jetzt einmal neu gestartet werden, danach kann man unter „Tools“ -> „I2C Scan“ nachschauen, ob der Reader erkannt wurde.
Unter „Devices“ kann nun eine neues Device angelegt werden
Nach einem Klick auf Submit kann, wie auch beim RDM6300, ein Transponder an den Reader gehalten werden. Der ausgelesene Tag wird in ESPEasy angezeigt und in Fhem ein neues Gerät angelegt.
Im Grunde ist die Einrichtung an dieser Stelle beendet. Allerdings wäre das ja auch wieder zu einfach.
[Optional aber empfohlen]
Wer sich die „Task Settings“ oben im Device noch einmal genauer ansieht, der stellt fest, dass ein „Reset Pin“ angeschlossen werden kann. Das sollte man auch tun, da der Reader hin und wieder dazu neigt seinen Dienst einfach einzustellen. Abhilfe schafft da nur ein Neustart.
Dazu muss
- PN532 „RSTPDN“ -> Node MCU „D6„
verbunden werden und die Angabe noch in den Task Settings ergänzt werden. ESPEasy sollte nun in der Lage sein den Reader selbständig neu zu starten.
Wenn man den Event-Monitor beim übertragen von Tags beobachtet, stellt man mitunter fest, dass der Tag dort mehrfach übertragen wird. Lässt man nun ein Notify eine Aktion auslösen, findet diese Aktion teilweise gleich mehrfach statt – das muss nicht sein, daher empfehle ich
attr RFID-READER event-on-change-reading Tag
damit der übermittelte Tag auch nur einmal im Event-Monitor auftaucht und eine Aktion auch nur einmal ausgelöst wird.
Um einen Tag dann auch mehrmals hintereinander nutzen zu können
attr RFID-READER event-min-interval Tag:20 Tag1,Tag2,Tag3
setzen. So ist der Tag nach X-Sekunden (z.B. 20) wieder „Frei“ und kann die selbe Aktion erneut auslösen.
Ich habe für ein paar Transponder jeweils ein Notify angelegt, dass bei erscheinen des jeweiligen Tags eine Aktion auslöst.
Relais
Ein Relais ist ein elektronischer Baustein, der mit zwei Stromkreisen arbeitet.
Im Inneren Befindet sich eine Spule mit Eisenkern, Arbeitskontakte und ein Anker. Die Spule mit Eisenkern befindet sich im sog. Steuer-Stromkreis. Hier genügen kleine Spannungen um an der Spule mit Eisenkern ein Magnetfeld zu erzeugen, dass den sog. Anker anzieht um im Last-Stromkreis die Arbeitskontakte zu schliessen. Die Spannung im Last-Stromkreis kann dabei wesentlich höher sein, es besteht kein unmittelbarer Kontakt zum Steuer-Stromkreis – und genau darin liegt der Vorteil.
Man also hergehen und mit einer Spannung von 3,3V oder 5V z.B. ein 230V Gerät am normalen Stromnetz einschalten.
Am Node MCU V3 mit ESPEasy kann man recht Problemlos mehrere Relais einrichten und anschließend am Ort seiner Wahl arbeiten lassen.
Was man dazu benötigt sind:
- einen mit ESPEasy geflashten und für Fhem eingerichteten Node MCU V3
- ein, oder mehrere Relais
- und Female-Female Jumperkabel
Der Anschluss ist hier ziemlich einfach. Davon ausgehend, dass der Node gegenwärtig an einem Mikro-USB Netzteil hängt, wird das Relais vom Node mit Spannung versorgt – hier genügen 3,3V.
- Relais „VCC“ -> Node MCU „3V„
- Relais „GND„ -> Node „G„
- Relais „IN„ -> Node „D1„ (in der Regel kann jeder mit „D“ gekennzeichnete Pin genommen werden, der in ESPEasy nicht anderweitig genutzt wird)
Weiter geht’s in der Oberfläche von ESPEasy unter dem Reiter „Hardware“. Je nach dem welcher GPIO gewählt wurde, muss der entsprechende Modus gewählt werden. Nutzt ihr, wie ich, den GPIO „D1“ und habt kein I2C Device in Benutzung, müssen die beiden I2C Pins auf „None“ gesetzt werden. Der Modus für den „D1“ kann dann auf „Output Low/High“ gesetzt werden. Ein Klick auf Submit übernimmt die Änderungen.
Als nächstes muss unter dem Reiter „Devices“ ein Gerät angelegt werden. Falls noch Keins da sein sollte, klickt man unter „1“ auf „Edit“ und wählt im Dropdown ein Gerät vom Typ P001 – Switch Input.
Der Name kann natürlich frei gewählt werden. Der Haken bei „Enabled“ aktiviert das Gerät.
Der Haken bei „Inversed Logic“ kann bei Bedarf gesetzt werden. Bei dem von mir verwendeten Relais handelt es sich um ein Wechsler-Relais. An diesem Relais befinden sich drei Kontakte – abhängig vom Schaltzustand ist zwischen je zwei Kontakten Durchgang. Wer die Kontakte am Relais so verwendet, dass die grüne LED auf der Relaisplatine bei Durchgang leuchtet, der sollte unter „Hardware“ den Pin Modus auf „Output High“ setzen und „Inversed Logic“ aktivieren – so steht in Fhem „off“ wenn die grüne LED aus ist und „on“ wenn sie leuchtet.
Unter 1st GPIO wird der Pin ausgewählt, an dem der IN Kontakt des Relais mit dem Node verbunden ist – „Send to Controller“ sollte aktiviert werden.
Bei einem Klick auf Submit wird kurze Zeit später ein Gerät in Fhem erzeugt.
Wie man sieht, wird der vergebene Device-Name aus ESPEasy ebenfalls an Fhem übergeben.
Um das Relais zu schalten, muss nicht mehr gemacht werden, als der jeweilige Status des GPIO Pins über den Set-Befehl zu ändern.
set Devicename gpio D1 0
schaltet das Relais bzw. die grüne LED ein und
set Devicename gpio D1 1
schaltet das Relais bzw. die grüne LED wieder aus.
Selbes könnte man z.B. auch als webCmd eintragen:
attr Devicename webCmd gpio D1 0:gpio D1 1
und so direkt aus dem Webinterface heraus schalten.
Viel Spaß damit.
20×4 I2C Info-Display
Mit einem Display am Node MCU kann man sich sämtliche Daten, die das Board verarbeitet darstellen lassen.
Hier nutze ich ein 20×4 Display mit einem I2C Adapter. Ein 16×2 Display kann man auf die selbe Art und Weise betreiben.
Der I2C Adapter muss zunächst mit dem Display verbunden werden. Ich habe dazu eine Buchsenleiste an den Display gelötet und kann den Adapter so leicht an und abstecken.
Das Display selbst arbeitet mit einer Spannung von 5V – in dem Fall wäre eigentlich ein Level-Konverter notwendig, hier muss man probieren – natürlich erst mit Konverter, um das Board nicht zu beschädigen.
In meinem Fall wurde das Display mit Konverter vom Node MCU nicht erkannt – ohne Konverter funktioniert es einwandfrei. Dies hängt vom I2C-Controller und ggf. verbauten Pull-Up Widerständen ab.
Im nächsten Schritt ist wieder interessant, welche Pins vom Node MCU für den I2C Bus genutzt werden. Dazu wird im Webinterface unter Hardware nachgesehen
Folglich wird das Display wie folgt angeschlossen
- Display, I2C-Controller „GND“ -> Node MCU „G„
- Display I2C-Controller „VCC“ -> Node MCU „VU„
- Display I2C-Controller „SDA“ -> Node MCU „D7„
- Display I2C-Controller „SCL“ -> Node MCU „D8„
Im Webinterface unter Tools -> I2C Scan sollte man nun den I2C-Controller finden
Die Adresse „0x3f“ muss unter den Device-Angaben übernommen werden, desweiteren können unter den Task Settings im Device auch direkt die Ausgaben gesetzt werden.
Als Device wird „P012 – Display – LCD2004“ ausgewählt und zwar auch, wenn man ein 16×2 Display verwendet. Die entsprechende Angabe über die Größe wird dann unter „Display Size“ gesetzt.
In das I2C-Adressfeld wird die vorher im I2C Scan ausgelesene Adresse eingetragen. „Display Button“ kann, auch auf „None“ gesetzt werden.
„Display Timeout“ gibt an nach wie vielen Sekunden das Display abschaltet – 0 hält das Display immer „an“. Unter „Delay“ wird angegeben nach wie viel Sekunden eine Wertänderung an das Display weitergegeben wird.
Die Angaben unter „Line 1 – 4“ setzen die entsprechenden Ausgaben direkt auf dem Display. Ich habe dort in den Zeilen 1,2 und 4 die Angaben aus dem Let’s Controll It Wiki übernommen.
In der 3. Zeile habe ich angegeben, dass ich den ausgelesenen Tag von einem RDM6300 RFID Reader ausgegeben haben möchte.
Selbstverständlich könnte man sich jeden X-Beliebigen Wert eines angeschlossenen Devices anzeigen lassen (z.B. Temperatur und Luftfeuchtigkeit eines entsprechenden Sensors usw. usw.).
Das Vorgehen dazu und weitere Variablen lassen sich bei Let’s Controll it nachlesen.
Zur Nutzung der „System time“ in Zeile 2, muss unter „Tools“ -> „Advanced“ ein NTP Server eingetragen werden.
Ich habe dort „de.pool.ntp.org“ verwendet und das „Timezone Offset“ auf „120“ Minuten gesetzt, da erst 11, statt 13 Uhr gezeigt wurde.
Das Display an sich, wird über die ESPEasy Bridge nicht in Fhem als Device angelegt – das liegt daran, dass das Display selbst keine Daten sendet.
Um etwas an das Display zu senden wird Device benötigt, dass durch die ESPBride erzeugt wurde – beispielsweise ein Switch Input, wie er beim Steuern eines Relais angelegt wird.
Als erstes kann man nun in der Weboberfläche des Node MCU die Angaben in den Displayzeilen entfernen.
Das Display ist nun nackt – und zeigt nach einem Klick auf Submit nur
an.
Über den, in Fhem angelegten, Input-Switch kann man jetzt Nachrichten auf dem Display darstellen, dazu verwendet man folgende Syntax
set Name des Input-Switch lcd Reihe Zeichen Nachricht
Wir schreiben nun mal in Zeile 1, ab Zeichen 1 Tinkerblog.net auf das Display
So könnte man z.B. auch ein Reading auf das Display senden.
DLCD
ist ein inoffizielles Fhem Modul zur Steuerung von I2C Displays.
Zur Installation muss die Datei 39_DLCD.pm aus diesem Forumsbeitrag in das Verzeichnis /opt/fhem/FHEM eingefügt werden. Das kann man z.B. mit Filezilla erledigen.
Danach startet man Fhem mit
shutdown restart
neu und führt mit
update all
ein Update durch, nach einem weitern Neustart ist das Modul dann einsatzbereit.
Um ein Display mit DLCD zu steuern muss dann erstmal ein Device angelegt werden
define LCD DLCD
Das neue Device kann erstmal rein gar nichts, da es nicht weiß, wie es das Display anspricht. Daher muss erstmal ein Attribut gesetzt werden, dass das Kommando enthält
attr LCD dlcdTriggerCmd set ESPEasy-Input-Switch lcd %L% 1 %T%
Nun weiß das DLCD Device, dass es mit dem Befehl set ESPEasy-Input-Switch lcd %L% 1 %T% eine Nachricht an das Display senden kann. Die beiden Buchstaben zwischen den Prozentzeichen stehen dabei für die variable Linie und den variablen Text – und sind somit Variablen 😉
Als nächstes müssen die tatsächlichen Zeilen des Displays angegeben werden, dazu setzt man
attr LCD dlcdPhysicalRows 4
Man kann allerdings mehr als die vier echten Zeilen nutzen, in dem man
attr LCD dlcdRows 8
eingibt und gleichzeitig das Attribut
attr LCD dlcdScrolling 1
setzt. So kann man 8 Zeilen an das Display senden und das Modul scrollt ständig durch die insgesamt 8 Zeilen.
Um einen Inhalt an die Zeilen zu senden kann man nun mit
attr LCD dlcdLineZeile Text
etwas an eine Zeile senden. Statt Zeile kann man sich entsprechend der Nummern 1-8 bedienen.
Man kann nun mit der Kombination verschiedene Zeilen-Attribute jedes Reading aus Fhem heraus an das Display senden, Informationen dazu finden sich u.A. im Fhem-Wiki.
Um ein Reading einzulesen erfordert es zunächst ein dlcdVal, z.B. die gemessene Temperatur eines Sensors
attr LCD dlcdVal1 Device:Reading
Das Reading muss auch immer Formatiert werden, dazu nutzt man das Attribut dlcdVal1formatnum, dieses bietet eine Vielzahl an Formatierungen für ein Reading – meist kann man 2+1 nutzen.
attr LCD dlcdVal1formatnum 2+1
Das eingelesene und formatierte Reading kann nun an das Display, an eine Beliebige Zeile gesendet werden. Hier nehmen wir einfach Zeile 1
attr LCD dlcdLine1 Name: %1%
die %1% steht dabei für das dlcdVal1.
Eines neues Reading bekommt also immer auch ein neues dlcdVal, an das Display wird das eingelesene Reading dann immer mit %X% gesendet.
Ich habe zur Veranschaulichung mal vier dlcdVal gesetzt und die eingelesenen Readings an das Display gesendet.
- Val1: Temperatur eines Temperatursensors
- Val2: Status meiner Xbox
- Val3: Status eines Fensters
- Val4: Status einer Sonoff S20
Jedes Val wird nun an die entsprechende Zeile gesendet
- Line1 – stellt Val %1% dar
- Line 2 – stellt Val %2% dar
- Line 3 – stellt Val %3% dar
- Line 4 – stellt Val %4% dar
Natürlich kann Line 3 auch Val %1% darstellen – aus Gründen der Übersicht habe ich es aber mal ordentlich gemacht.
Hier das Ergebnis
Fairer Weise muss ich dabei sagen, dass mein Display, obwohl es 20 Zeichen pro Zeile darstellen kann, immer 16 Zeichen begrenzt, daher musste ich etwas improvisieren.
Es gibt auch eine MQTT-Lösung für die ganze Geschichte mit dem Display – aktuell habe ich allerdings noch keine ausgearbeitet. Vielleicht teste ich das ganze dann mal mit einem OLED-Display und MQTT.