FHEM – serielle Geräte über WiFi anbinden
Manchmal möchte man vielleicht ein serielles Gerät (device) statt über USB oder RS232 entfernt vom FHEM Server betreiben. Zum Beispiel einen FhemDuino oder SignalDuino oder RFXCOM. Dies ist nun mit einem ESP-01 oder einem anderen ESP Modul basierend auf dem ESP-8266 einfach möglich.
Der ESP-8266 bietet WLAN Anbindung, zwei oder mehr GPIO Ein- und Ausgänge und eine serielle Schnittstelle. Mit Hilfe geeigneter Software kann man einen ESP-8266 als WiFi-Serial Bridge einsetzen. Das heisst, alles was seriell rein oder raus geht wird über WiFi und ein geeignetes Protokol zum oder vom FHEM Server übertragen.
In meinem Beispiel betreibe ich einen Arduino Nano mit der SignalDuino Software und einem ESP-01 mit der JeeLink Software esp-link an meinem FHEM Server.
Die Schaltung besteht im wesentlichen aus
- einem Spannungsteiler zwischen TX/Nano und RX/ESP-01, damit der 5V Signalausgang zu dem 3V3 Eingang des ESP-01 kompatibel ist
- einem Spannungsregler, der 3,3V mit mindestens 200mA für den ESP-01 zur Verfügung stellt. Hier Glättungskondensatoren vorsehen. Der ESP zieht sehr wechselhaft zwischen ein paar mA bis zu 200mA und mehr.
- zwei Tastern, einmal für den Reset des ESP-01 und einmal, um den ESP-01 in den Programmiermodus zu setzen
- je eine LED an GPIO0 und GPIO2 zur Anzeige des esp-link Status und von serieller Aktivität
- einem Entstörkondensator von ca 10-100nF direkt an VCC und GND des ESP Moduls
Der Reset-Taster sollte unbedingt mit einem parallel geschaltetem Elko entprellt werden. Der Reset-Eingang des ESP-01 wird über einen Widerstand von 3,3k auf high Potential gezogen.
Zur Beschaltung der LED an GPIO2 ist folgendes zu bemerken: Es finden sich einige Schaltungen im Internet, bei denen GPIO2 über einen Vorwiderstand oder sogar ohne einen an die LED und dann gegen Minus geschaltet ist. Diese Schaltungen werden nicht funktionieren, da der ESP-8266 Bootloader in den Flash Modus wechselt, wenn GPIO2 LOW ist. Dies ist aber über die LED gegen Minus gegeben und das im ESP liegende Programm wird nicht starten. Deshalb ist hier die LED über einen Vorwiderstand gegen Plus 3,3V verbunden und über einen Taster gegen Minus. Im Normalfall hat der GPIO Anschluss daher High Pegel.
Wenn man den ESP-8266 flashen möchte, drückt man die Prog-Taste (an GPIO2) und dann die Reset-Taste und lässt die Reset Taste und dann die Prog-Taste los. Anschließend beschickt man den ESP-8266 über das esptool mit den Flash-Daten.
Nachdem man die esp-link Firmware in den ESP-8266 geladen hat, muß man noch die Funk Netzwerkverbindung herstellen. Dazu sucht man am PC die verfügbaren Funknetze und sollte ein ungesichertes Funknetz mit dem Namen ESP_hexhex oder Thinker_hexhex finden. Hexhex sind die letzten Stellen der Mac-Adresse des ESP Moduls.
Wenn die Verbindung hergestellt ist, bekommt der PC eine IP-Adresse von 192.168.4.2. Auf dem PC muss DHCP aktiviert sein. Der ESP selbst hat die IP-Adresse 192.168.4.1. Nun öffnet man im Web Browser seiner Wahl die Webseite unter http://192.168.4.1.
Auf der Hauptseite legt man die Anschlussbelegung des ESP fest. Im Beispiel ist das: “jn-esp-v2: reset:gpio12 isp:gpio13 conn_led:gpio0 ser_led:gpio2 swap_uart:no”.
Ausserdem sieht man einige Informationen zum Netzwerk.
Nachdem man dann links open auf WiFi klickt, erscheint die WiFi Seite.
Hier werden die gefundenen WLAN Netzwerke angezeigt und man kann die Verbindung des ESP mit dem eigenen Netzwerk festlegen. Dazu das Netzwerk auswählen, das Passwort bzw. den Verbindungs-Schlüssel eingeben und [Connect] anklicken.
Die esp.link Software wechselt automatisch in den Stationsmodus (STA) und bietet dann keinen WLAN Zuganspunkt mehr an (es sei denn, der ESP kann als STA keine Verbindung zum Netzwerk aufbauen). Nun muss man den PC wieder mit seinem normalen Netzwerk verbinden. Der ESP sollte sich mit dem Netzwerk verbunden haben und ist evetuell über http://esp-link.local erreichbar. Ansonsten muss man die IP-Adresse des ESP über den DHCP Server oder einen IP Netzwerkscan ermitteln. In meinem Beispiel habe ich auf der WiFi Webseite von esp-link eine statische IP Adresse vergeben, da mein DHCP Server dem ESP unterschiedliche IP Adressen zugewiesen hatte.
Auf der uC Consolen Seite kann man die seriellen Daten verfolgen (hier mit SignalDuino Daten):
… und dann gibt es noch die Debug Seite von esp-link:
In FHEM kann man nach efolgreicher Einrichtung von esp-link statt dem seriellen USB Anschluss die IP-Adresse des ESP Moduls und den Port 23 eintragen. Zum Beispiel für ein neues FHEM device:
define sduinoIP SIGNALDuino 192.168.0.99:23
In FHEM erscheint dann zum Beipiel folgendes:
Hier noch die komplette Schaltung:
Remote flashen des arduino geht auch nach einer Schaltungsänderung. Dazu GPIO0 von der LED trennen und an RST vom Arduino hängen.
Geflasht habe ich dann mit
avrdude -carduino -DV -p ATmega328P -Pnet:192.168.0.99:23 -b75600 -U flash:w:SIGNALduino_nano328.hex:i
funktioniert bis auf ioctl Warnungen
:
hgode@aoa150:/opt/fhem/FHEM/firmware$ avrdude -carduino -DV -p ATmega328P -Pnet:192.168.0.99:23 -b75600 -U flash:w:SIGNALduino_nano328.hex:i
ioctl(“TIOCMGET”): Inappropriate ioctl for device
ioctl(“TIOCMGET”): Inappropriate ioctl for device
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.06s
avrdude: Device signature = 0x1e950f
avrdude: reading input file “SIGNALduino_nano328.hex”
avrdude: writing flash (19230 bytes):
Writing | ################################################## | 100% 21.84s
avrdude: 19230 bytes of flash written
avrdude: safemode: Fuses OK (E:00, H:00, L:00)
ioctl(“TIOCMGET”): Inappropriate ioctl for device
avrdude done. Thank you.
avrflash script funktioniert bei mir nicht:
hgode@aoa150:/opt/fhem/FHEM/firmware$ /opt/esp-link/avrflash -v 192.168.0.99 SIGNALduino_nano328.hex
Resetting AVR with http://192.168.0.99/pgm/sync
* Hostname was NOT found in DNS cache
* Trying 192.168.0.99…
* Connected to 192.168.0.99 (192.168.0.99) port 80 (#0)
> POST /pgm/sync HTTP/1.1
> User-Agent: curl/7.38.0
> Host: 192.168.0.99
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 404 Not Found < Server: esp8266-httpd/0.3 < Connection: close < Content-Type: text/plain < Content-Length: 12 < { [data not shown] * Closing connection 0 Error resetting AVR
Hi Josef,
versuche mich gerade an Deiner Schaltung. Bin Anfänger 😉
Sind die Pin-Nrn. am Arduino nur frei durchgezählt?
Üblich ist Pin 27 = 5V, 1= TX, 2 = RX, 4 & 29 = GND.
Oder nutzt Du die icsp Pins ?
Hast Du vielleicht ein paar Bilder Deines Aufbaus?
Dank und Gruß,
Michael
Hallo Michael
NEIN, die Verbindung zum Nano habe ich über einen 6-poligen Steckverbinder hergestellt. Die Nummern beziehen sich auf die Nummerierung des Steckverbinders! und habe nichts mit den Arduino PIN Nummern zu tun.
Gruss
Josef
Danke für die schnelle Antwort.
Michael
Wieso nutzt du denn für den ESP nicht den 3.3V Ausgang des Arduinos? Da könnte man sich doch einiges an Bauteilen sparen?
Hallo Tim
Weil der 3,3V Ausgang zu schwach ist. Der ESP zieht bis zu 200mA Strom, da würde der verbaute Spannungsregler (max 150mA) einbrechen und der ESP fängt an zu spinnen.
siehe auch http://electronics.stackexchange.com/questions/67092/how-much-current-can-i-draw-from-the-arduinos-pins
~josef
Hallo josef,
ich versuche mich gerade daran, die Schaltung mit einem Fhemduino und anstatt des ESP01 mit dem NodeMCU Devkit 1.0 nachzubauen.
Dadurch brauche ich ja den Spannungsregler, die Taster, die LEDs und den Entstörkondensator eigentlich nicht.
Arduino & ModeMCU sind beide erstmal per USB mit Strom versorgt.
Esp-link 2.17 ist auf dem NodeMCU drauf und läuft auch soweit.
RX vom Arduino direkt an TX am NodeMCU.
TX vom Arduino mit Spannungsteiler 10k & 22k an GND an RX vom NodeMCU.
Aber irgendwie hapert es an der Übergabe der Daten vom Fhemduino.
Auf der uC Console kommen keine Daten.
Hast du zufällig einen Tipp für mich, warum ich keine Daten bekomme?
Gruß
Stefan
Hallo Stefan
soweit ich den Schaltplan richtg deute, hängt der USB-Seriell chip (CH340 oder so) über 470Ohm Widerstände an TX und RX. Der Chip kann natürlich die direkte Kommunikation mit dem ESP-12 stören.
Teste erstmal mit einer USB Verbindung zum PC und einem Terminal Programm ohne Fhemduino, also nur das NodeMCU Dev Kit Board. Die Zeichen, die Du über den PC an den NodeMCU übergibst, sollten dann über WiFi in der esplink uC Console erscheinen (richtige Baudrate etc. vorrausgesetzt). Wenn das auch nicht geht stört eventuell die Beschaltung des ESP mit RTS/DTS etc zum USB-Seriall Baustein. Obwohl, du sagst ja das die ESP-Link Software läuft und Du eine Verbindung zum ESP aufbauen kannst.
Auch auf dem Arduino Uno oder Nano sind die TX/RX Anschlüsse mit dem USB TX/RX chip verbunden. Allerdings über 1KOhm Widerstände entkoppelt.
Das mit dem USB Chip hat man natürlich auch bei einem Nano an ESP wie hier in der Schaltung. Wenn dann aber 2 USB chips an den TX/RX Leitungen hängen…?
Eventuell kann man die Entkopplungswiderstände auf dem NodeMCU mal testweise entfernen, damit TX/RX vom ESP von der USB Anbindung ‘frei’ ist.
~Josef
Hallo zusammen,
hab’ das heute Abend mit einem Arduino Nano und einem ESP-201 nachgebaut und es hat auf Anhieb funktioniert. Absolute Klasse!
Eine Frage bleibt aber noch offen: Die Verbindung vom ESP-GPIO12 auf den ARDUINO-RESET-PIN ist klar. Aber was der ISP-PIN beim Arduino (also das, was mit dem GPIO13 vom ESP verbunden werden soll)?
Ich nutze einen Arduino Nano (als JeeLink-Clone). Der hat zwar einen 6-poligen ISP-Connector, dort jedoch keine Pins, welche irgendwie passen könnten.
Viele Grüße
Timo
Hallo Timo
bei einem Arduino wird ISP nicht verwendet, siehe https://github.com/jeelabs/esp-link#hardware-configuration
“GPIO13: connect to ISP of LPC/ARM microcontroller or to GPIO0 of esp8266 being programmed (not used with Arduino/AVR)”.
Gruss
~Josef
Hi Stefan und josef,
die Überlegung mit dem NodeMCU hatte ich auch schon, bin aber momentan noch nicht zum Austesten gekommen. Wäre ja viel einfacher und weniger zu basteln, super für nen Lötkolbenlegastheniker wie mich 😉 Wäre es denn möglich, den NodeMCU einfach mit 5V und GND des Arduinos mit Strom zu speisen? Oder geht das intern auch über den USB Chip und somit über die 470Ohm Widerstände?
Und wäre dieses “470Ohm” Problem damit gelöst, das man doch noch einen Spannungsregler zwischenbaut und dann an die 3.3V des NodeMCUs geht?
josef, wo hast du denn den Schaltplan gefunden, den du da analysiert hast?
Gruß,
Tim
Hallo Tim
die Schaltpläne zu den Arduinos gibt’s auf arduino.cc: https://www.arduino.cc/en/uploads/Main/ArduinoNano30Schematic.pdf
~Josef
Hi josef,
ach ich hatte verstanden, das du die NodeMCU Schaltpläne analysiert hättest.
Zu meiner anderen Frage: Würde folgendes funktionieren https://picload.org/image/wcaogrl/2016-02-25_081850.png
Andernfalls könnte man mit einem Spannungsregler direkt auf den 3.3V des NodeMCU gehen? https://picload.org/image/wcaogri/2016-02-25_081941.png
Gruß,
Tim
Hallo Tim
beide Schaltungen sind soweit OK. Aber statt dem 7805 U3 musst Du was anderes nehmen, damit Du von 5V auf 3.3V kommst (zB einen LM2940 3.3V, low-drop!).
Stattdessen kannst Du auch 5V vom Arduino auf 5V vom nodeMCU verbinden. Der 5V Regler des Arduino sollte die ca. 200mA verkraften. Dann soll der nodeMCU sich die 3.3V selber machen.
~Josef
Hi josef,
ups, da war mir gar nicht klar, das das Bauteil einen Namen hatte. Wollte eigentlich nur einen Spannungsregler dort visualisieren. Klar, sollte dann schon der richtige sein. Für alle Leute, die sich den Schaltplan angucken, hier nochmal in richtig https://picload.org/image/wcoawwc/2016-02-25_081941.png
Hallo Josef.
Schon eine coole Nummer, das Gerät über WLAN anzubinden. Ich wollte mir einen neuen Signalduino (CC1101) und nem WEMOS D1 mini zusammen bauen.
Habe mir gedacht, dass ich den Nano über den 3,3V (am Nano) mit 3,3V vom WEMOS versorge (WEMOS -> Nano), oder umgekehrt (3,3V Nano -> WEMOS 3,3V).
Dann sollte die Signalanpassung passe sein, oder ?
Nachdem ich hier die Kommentare durchgelesen habe, weiß ich jetzt nicht ob der Spannungsregler des WEMOS packt den Nano zu versorgen oder halt umgekehrt.
Das CC1101 Modul wird ja vom nano versorgt.
Hast du einen link zur fertig kompilierten Datei vom ESP-Link ?
Gruß
Sascha
Hallo Sascha
der Spannungsregler auf dem Wemos D1 mini (RT9013) schafft wohl 500mA. Damit sollter er ausreichen den Nano mit 3,3V zu versorgen. Der CC1101 braucht nicht soviel Strom (max 30mA), im Gegensatz zum ESP8266, der sich schon mal bis zu 200mA gönnt.
ESP-Link (jeelabs) Binaries kann ich nicht anbieten. Die kompilierten Builds unterscheiden sich nach dem verwendeten ESP Board. Es gibt solche mit 512KBit, 1MBit (ESP-01 black board), 4MBit (Wemos D1 mini), usw. Unter https://github.com/jeelabs/esp-link/releases findest Du vorkompilierte Dateien (zB als tgz für die Version 2.2.3). Flashen geht dann gemäß https://github.com/jeelabs/esp-link/blob/master/FLASHING.md.
Das Aufsetzen einer Umgebung zum Kompilieren war seinerzeit etwas aufwending. Mittlerweile gibt es dazu Docker Container. Allerdings habe ich selbst noch nicht mit Docker gearbeitet.
Da beide Module, also der Nano und der Wemos D1 mini, mit 3,3V arbeiten, brauchst Du keine Pegelanpassung.
Viel Erfolg
Josef
Hallo josef.
danke für deine Antwort. Habe den “WLANsuino” soweit am laufe. Habe beide Module mit den 5V verbunden. Es habe ja beide Module einen 3,3V regler drauf. Habe den RX/TX des WEMOS mit dem TX/RX Nano verbunden.
Habe zuvor jedes Modul einzeln geflasht. Habe noch etwas suchen müssen, um ESP-LINK zu flashen. Insbesondere die 3 Dateien mit dem OffSet´s. Habe diese auf den WEMOS D1 mini dann mit dem ESP-Flasher geflasht.
Den Nano habe ich einzeln am RasPi über fhem Geflasht.
Beides miteinander verlötet (5V und GND, sowie RX/TX und TX/RX verbunden), Baudrate im eSP-LINK auf 57600 eingestellt und es lief.
Das einzige was ich jetzt noch versuche, ist den Arduino über OTA direkt zu flashen mit neuer Firmware. Hat bis jetzt aber noch nicht hin gehauen.
Hast du da noch eine Idee welche Pins ich von/mit welchem Modul verbinden muss ? (Reset ?)
Gruß und Danke
Sascha
Hallo Sascha
ich habe auf der esp-link Hauptseite die Option
esp-01(AVR): reset:gpio0 isp:n/a conn_led:gpio2 ser_led:n/a swap_uart:no
ausgewählt. Dann wird GPIO0 vom ESP mit dem Reset Anschluss des Nano verbunden.
Um aus FHEM über OTA zu flashen, steht bei mir im sduinoIP
flashCommand avrdude -c arduino -b 57600 -P net:192.168.0.99:23 -p atmega328p -vv -U flash:w:[HEXFILE] 2>[LOGFILE]
wobei 192.168.0.99 die Adresse des ESP-01 ist an dem der Nano hängt.
Beim Flashen erkennt esp-link an den Daten das es sich um einen Flashvorgang handelt und flasht dann den Nano.
~Josef
Danke.
Das war die Info die mir fehlte. Lao ein Pin des WEMOS aussuchen und dann mit dem Reset des Arduino verbinden und entsprechend im PIN aasignment eintragen !?!
Gruß
Sascha
Hallo Sascha
wohl eher anders herum. Das passende (Prozessor) Assigment aus der Liste wählen und dann mit dem Nano verdrahten. Da bleibt nur esp-01, Reset (Nano) and GPIO0 vom ESP.
Bei einem Wemos D1 Mini Pro ist D3<=>IO, 10k Pull-up<=>GPIO0 und, wegen dem Nano mit dem AVR Atmega drauf, die Option “esp-01(AVR):” zu wählen.
Die Flash-Umschaltung innerhalb von esp-link erfolgt auch anhand des angeschlossenen, ausgewählten Prozessors (nehme ich jetz mal so an).
Also Reset vom Nano mit D3 vom Wemos D1 Mini Pro verbinden und in der esp-link Webseite die Option esp-01(AVR) wählen.
~Josef
Also noch nen 10k Widerstand and D3 und Vcc?
Nö, ein weiterer Pullup-Widerstand ist nicht notwendig. Der Wemos Mini Pro hat schon einen von GPIO0 nach Plus von 10k und der Nano am Reset hat einen Pullup von 1k. Sieh Dir ruhig die Schaltpläne mal an.
~josef
Hallo Josef,
ich bin Anfänger mit FHEM, habe mich aber getraut nach den Anleitungen einen SignalDuino aus einem Arduino Nano und einem CC1101 zu löten, um damit eine Wetterstation WH1080 zu empfangen. Wetterstation ist noch nicht vorhanden, wollte erst mal den SD aufbauen, ob er funktioniert.
Die USB Version des SignalDuiono funktioniert wohl in FHEM, sie liefert open, wenn ich sie vom USB abziehe closed.
Weiter habe ich mir einen WeMos Clone besorgt, diesen mit esp-link V2.2.3 geflashed und ins WLAN gebracht.
In FHEM eingebunden liefert mir espbridge initialized – ich sehe aber auch noch den state initialized, wenn ich den WeMos aus dem Netz nehme (abstecke)???
Hier ist wohl schon was nicht i.O., oder?!
Nun habe ich den WeMos an den SignalDuino angeschlossen und mittels define SignalDuino SIGNALDuino 192.168.xxx.xx:23 in FHEM eingebunden.
Der SD geht auf open, wechselt nach kurzer Zeit aber wieder auf closed.
In FHEM log finde ich den folgenden Eintrag
2018.08.25 20:39:05 3: sduinoIP device opened
2018.08.25 20:39:07 3: sduinoIP/init: disable receiver (XQ)
2018.08.25 20:39:07 3: sduinoIP/init: get version, retry = 0
2018.08.25 20:39:17 3: sduinoIP/init: get version, retry = 1
2018.08.25 20:39:27 3: sduinoIP/init: get version, retry = 2
2018.08.25 20:39:37 3: sduinoIP/init: get version, retry = 3
2018.08.25 20:39:37 2: sduinoIP/init retry count reached. Closed
2018.08.25 20:39:37 2: sduinoIP closed
Ich durchforste jetzt schon fast eine Woche das FHEM Forum, WIKI, aller möglichen weiteren Internetseiten… und habe absolut keine Idee mehr, warum das so ist. 🙁
Kannst Du mir bitte einen Tip geben wo ggf. mein Fehler liegt bzw. wonach ich noch suchen kann. Gibt es evtl ein “Kochrezept” mit dem ich den SignalDuino über ESP ans Laufen bekomme? Weiß gerade absolut nicht mehr weiter…
Wäre für jede Hilfe sehr dankbar.
Viele Grüße, Rainer
Hallo Rainer
ich gehe davon aus, das Du esp-link auf dem ESP (Wemos) über seine Website erreichen kannst. Dort findest Du auch eine µC Console. Dort erscheint alles, was der ESP über die serielle Schnittstelle empfängt oder sendet.
Damit der Wemos ESP mit dem Arduino Nano kommunizieren kann, muss RX and TX und TX and RX und Masse (GND) korrekt verbunden sein. Auf der Pin Assignments Webseite von esp-link kann man die Pin Zuordnung festelegen. Mit esp-link Version 1.0.4 habe ich dort “esp-01 (AVR)” (reset:gpio0 isp:n/a conn_led:gpio2 ser_led:n/a swap_uart:no) ausgewählt. Das bedeutet, das ich Reset des Nano mit GPIO0 des ESP verbunden habe. Beim D1 mini von Wemos ist GPIO mit D3 bezeichnet: https://wiki.wemos.cc/products:d1:d1_mini.
Du musst als erstes sicherstellen, dass Dein Wemos mit dem Nano kommuniziert. Also TX, RX und GND korrekt verbinden und auf der esp-link Webseite das PIN Assignment korrekt auswählen und die richtige Baudrate einstellen (sollte 38400 sein für einen Nano mit CC1101 und cul-fw sein).
Eeventuell versuch es mal mit der älteren esp-link v1.0.4 (oder 1.0.0, https://github.com/jeelabs/esp-link/releases?after=v2.1.beta2). Denn MQTT etc wirst Du erst mal nicht brauchen.
Wenns dann in der esp-link Console klappt, kannst Du das Ding in FHEM einbinden. Wenn Du eine CUL Software auf dem Nano verwendest, kannst Du in der esp-link µC auch Befehle an den Nano senden und die Antworten sehen. Solange das nicht funktioniert, kommst Du nicht weiter.
Gruss
Josef