VBus-Decoder/Adapter für den ESP8266
Dies ist ein Unterartikel von VBus-Decoder. Auf der Hauptseite gibt es weitere Informationen zum Thema.
Inhaltsverzeichnis
Motivation
Wenn Basteln und IoT aufeinandertreffen, kommt man fast nicht an den Mikrocontrollern von Espressif vorbei.
Genau aus diesem Grund hatte ich schon länger die Idee, ein Leiterkärtchen mit dem ESP8266 zu machen. Also warum nicht einfach den beliebten VBus ohne großes Strippenziehen ins Netzwerk bringen?
Schaltung
Die Schaltung für den VBus basiert auf der für den Raspi (v1.3), aufseiten des ESP habe ich mich von den verschiedenen Bastelboards inspirieren lassen und die Möglichkeit vorgesehen, sowohl die kleinen ESP01- als auch die etwas vielseitigeren ESP12-Module einzusetzen.
Die Versorgung findet über eine Stiftleiste (bzw. angelötete Drähte) oder über eine Micro-USB-Buchse statt. Diese dient nur der Stromversorgung - mehr zum Programmieren des ESP weiter unten.
Bei der Verwendung des ESP12-Moduls stehen zusätzlich zum VBus-Interface noch die GPIOs 12, 13, 14 und 16 sowie der ADC-Eingang und die 3,3V-Versorgung zur Verfügung. Hier kann weitere Peripherie wie Sensoren oder Displays angeschlossen werden.
Für den Aufbau gibt es mehrere Varianten, die unten aufgeführt sind. Diese können über die Tabs ausgewählt und müssen beim Besorgen der Bauteile und selbstverständlich beim Zusammenbau kombiniert werden.
Die theoretische Maximalbestückung sieht wie folgt aus:
BOM
Möglichkeiten schaffen Komplexität. Wie bei den anderen Plattformen lässt sich der Adapter in verschiedenen Varianten aufbauen, wobei ich (auch wenn es gerade bei dieser anbietet) noch immer empfehle, die Optoisolierte aufzubauen.
Decoder
Neben Optoisoliert und Direkt gibt es noch die Variante ohne ESP - dank der Stiftleiste rechts oben auf der Leiterkarte lässt sich der VBus-Anteil komplett unabhängig vom ESP-Anteil verwenden. Mit Säge und Fingerspitzengefühl lässt sich die Größe auch noch ein gutes Stück reduzieren.
Als ESP8266-Modul kann das ESP01 und ESP12(-F) verwendet werden. Getestet wurde bis jetzt nur das ESP12-F, wobei nichts gegen das 01 sprechen dürfte.
Empfohlene Bestückungsvariante.
Menge | Referenzen | Wert | Package | Reichelt Bestellcode |
---|---|---|---|---|
1 | J1 | JUMP | JUMPER 2,54 SW | |
1 | SV4 | MA05-2 | MPE 087-2-010 | |
1 | SV3 | MA07-1R | MPE 087-1-007 | |
1 | JMP1 | 0R-JUMPA | A0R-JMP | RND 0805 1 0 |
1 | C11 | 100n | C0603 | X7R-G0603 100N |
3 | C2, C8, C14 | 100n | C0805 | X7R-G0805 100N |
1 | C6 | 100p | C0805 | NPO-G0805 100P |
1 | C5 | 100u/16V | PANASONIC_D | VF 100/16 K-D |
4 | R18, R19, R22, R24 | 10k | R0805 | RND 0805 1 10K |
1 | R1 | 12k | R0805 | RND 1550805 DP |
3 | R2, R6, R8 | 15k | R0805 | RND 0805 1 15K |
1 | X1 | 1751248 | 1751248 | AKL 059-02 |
5 | R9, R20, R21, R25, R28 | 1k | R0805 | RND 0805 1 1,0K |
1 | C4 | 1n | C0805 | NPO-G0805 1,0N |
2 | R4, R7 | 2k2 | R0805 | RND 0805 1 2,2K |
1 | R12 | 330 | R0805 | RND 0805 1 330 |
1 | C10 | 47u/16V | PANASONIC_D | FK-V 47U 16 |
2 | R3, R5 | 4k7 | R0805 | RND 0805 1 4,7K |
1 | C3 | 4u7 | C0805 | KEM X5R0805 4,7U |
1 | OK1 | 6N136 | DIL08 | 6N 136 |
1 | S1 | 9305 | PHAP3301 | TASTER 9305 |
3 | D1, D2, D5 | BAV99 | SOT23 | BAV 99 NXP |
2 | T1, T2 | BC848 | SOT23 | BC 848B SMD |
1 | U2 | ESP01 | ESP01 | DEBO ESP8266 |
1 | U1 | ESP12 | ESP12-SMD | DEBO ESP8266-12F |
1 | IC4 | LM393D | SO08 | LM 393 D SMD |
1 | D3 | P6SMB 15A | SMBJ | P6SMB 15A SMD |
1 | IC1 | TS5205CX533 | SOT23-5 | TS 5205 CX533 |
1 | LED1 | or | CHIP-LED0805 | LED EL 0603 OR |
Menge | Referenzen | Wert | Package | Reichelt Bestellcode |
---|---|---|---|---|
1 | J1 | JUMP | JUMPER 2,54 SW | |
1 | SV4 | MA05-2 | MPE 087-2-010 | |
1 | SV3 | MA07-1R | MPE 087-1-007 | |
3 | R10, R11, R15 | 0 | R1206 | RND 0805 1 0 |
1 | JMP1 | 0R-JUMPA | A0R-JMP | RND 0805 1 0 |
1 | C11 | 100n | C0603 | X7R-G0603 100N |
3 | C2, C8, C14 | 100n | C0805 | X7R-G0805 100N |
1 | C6 | 100p | C0805 | NPO-G0805 100P |
1 | C5 | 100u/16V | PANASONIC_D | VF 100/16 K-D |
4 | R18, R19, R22, R24 | 10k | R0805 | RND 0805 1 10K |
5 | R2, R6, R8, R13, R14 | 15k | R0805 | RND 0805 1 15K |
1 | X1 | 1751248 | 1751248 | AKL 059-02 |
4 | R20, R21, R25, R28 | 1k | R0805 | RND 0805 1 1,0K |
1 | C4 | 1n | C0805 | NPO-G0805 1,0N |
2 | R4, R7 | 2k2 | R0805 | RND 0805 1 2,2K |
1 | R12 | 330 | R0805 | RND 0805 1 330 |
1 | C10 | 47u/16V | PANASONIC_D | FK-V 47U 16 |
2 | R3, R5 | 4k7 | R0805 | RND 0805 1 4,7K |
1 | C3 | 4u7 | C0805 | KEM X5R0805 4,7U |
1 | S1 | 9305 | PHAP3301 | TASTER 9305 |
3 | D1, D2, D5 | BAV99 | SOT23 | BAV 99 NXP |
2 | T1, T2 | BC848 | SOT23 | BC 848B SMD |
2 | Q2, Q3 | BSS138 | SOT23 | BSS 138 SMD |
1 | U2 | ESP01 | ESP01 | DEBO ESP8266 |
1 | U1 | ESP12 | ESP12-SMD | DEBO ESP8266-12F |
1 | IC4 | LM393D | SO08 | LM 393 D SMD |
1 | D3 | P6SMB 15A | SMBJ | P6SMB 15A SMD |
1 | IC1 | TS5205CX533 | SOT23-5 | TS 5205 CX533 |
1 | LED1 | or | CHIP-LED0805 | LED EL 0603 OR |
Wer keinen ESP8266 verwenden aber die Vorzüge der verbesserten Schaltung haben möchte, kann den ESP-Anteil vollständig weglassen.
Hierfür wird auf dieser Leiterkarte keine Stromversorgung benötigt, da diese vom jeweilig verwendeten Interface (z. B. SBC, USB-UART-Wandler, ...) bezogen werden kann.
Menge | Referenzen | Wert | Package | Reichelt Bestellcode |
---|---|---|---|---|
1 | J1 | JUMP | JUMPER 2,54 SW | |
1 | SV4 | MA05-2 | MPE 087-2-010 | |
1 | JMP1 | 0R-JUMPA | A0R-JMP | RND 0805 1 0 |
2 | C2, C8 | 100n | C0805 | X7R-G0805 100N |
1 | C6 | 100p | C0805 | NPO-G0805 100P |
1 | C5 | 100u/16V | PANASONIC_D | VF 100/16 K-D |
1 | R1 | 12k | R0805 | RND 1550805 DP |
3 | R2, R6, R8 | 15k | R0805 | RND 0805 1 15K |
1 | X1 | 1751248 | 1751248 | AKL 059-02 |
1 | R9 | 1k | R0805 | RND 0805 1 1,0K |
1 | C4 | 1n | C0805 | NPO-G0805 1,0N |
2 | R4, R7 | 2k2 | R0805 | RND 0805 1 2,2K |
1 | R12 | 330 | R0805 | RND 0805 1 330 |
2 | R3, R5 | 4k7 | R0805 | RND 0805 1 4,7K |
1 | C3 | 4u7 | C0805 | KEM X5R0805 4,7U |
1 | OK1 | 6N136 | DIL08 | 6N 136 |
3 | D1, D2, D5 | BAV99 | SOT23 | BAV 99 NXP |
1 | IC4 | LM393D | SO08 | LM 393 D SMD |
1 | D3 | P6SMB 15A | SMBJ | P6SMB 15A SMD |
1 | IC1 | TS5205CX533 | SOT23-5 | TS 5205 CX533 |
Egal welche Variante aufgebaut wird: bitte nicht vergessen, den Jumper (statt des 0R-Widerstandes kann auch eine Lötbrücke gesetzt werden) zu löten.
Stromversorgung
Für die Stromversorgung gibt es ebenfalls zwei Möglichkeiten: Entweder mit LDO oder Schaltwandler. Wer auf Nummer sicher gehen will, nimmt die billigere LDO-Variante, da ich noch keine Gelegenheit hatte letztere zu testen. Die etwas höhere Stromaufnahme dürfte wahrscheinlich nicht allzu sehr ins Gewicht fallen.
Empfohlene Bestückungsvariante.
Menge | Referenzen | Wert | Package | Reichelt Bestellcode |
---|---|---|---|---|
1 | J1 | JUMP | JUMPER 2,54 SW | |
1 | C15 | 100n | C0805 | X7R-G0805 100N |
1 | C13 | 47u/16V | PANASONIC_D | FK-V 47U 16 |
1 | SV2 | MA02-1R | MA02-1R | MPE 087-1-002 |
1 | X2 | MIUSB-F5M-BB-UHS | MIUSB-F5M-BB-U_HANDSOLDER | MIC USB BBU |
1 | IC3 | REG1117 | SOT223 | NCP 1117 ST33T3G |
Menge | Referenzen | Wert | Package | Reichelt Bestellcode |
---|---|---|---|---|
1 | C9 | 100n | C0603 | X7R-G0603 100N |
1 | C15 | 100n | C0805 | X7R-G0805 100N |
1 | C12 | 10p | C0603 | NPO-G0603 10P |
1 | R17 | 15k | R0603 | RND 0603 1 15K |
1 | L1 | 15u | 242408FPS | L-242408FPS 15µ |
1 | R16 | 47k | R0603 | RND 0603 1 47K |
1 | C13 | 47u/16V | PANASONIC_D | FK-V 47U 16 |
1 | D6 | BAT43WS | SOD323-W | BAT 43WS |
1 | SV2 | MA02-1R | MA02-1R | MPE 087-1-002 |
1 | IC2 | MCP16301 | SOT23-6 | MCP 16301T-I/CHY |
1 | X2 | MIUSB-F5M-BB-UHS | MIUSB-F5M-BB-U_HANDSOLDER | MIC USB BBU |
1 | D4 | SS13L | SUBSMA | SS 13L |
Inbetriebnahme/Benutzung
Flashing
Wird ein ESP8266 verwendet, muss natürlich erst einmal die Software auf den Mikrocontroller.
Das Problem: Der Softwaredownload findet über den selben UART statt, der auch für das VBus-Interface statt. Nun könnte man mit Multiplexern arbeiten, was im Idealfall nur einmal benutzt werden würde und somit mit Kanonen auf Spatzen geschossen wäre. Aus dem gleichen Grund gibt es keinen USB-UART-Konverter auf dem Board: Braucht nur Platz und kostet.
Deshalb wird für das erstmalige Flashen ein USB-UART-Adapter, der RTS/DTR anbietet, benötigt. Dieser sollte idealerweise mit 3,3 V arbeite, wobei der ESP wohl auch 5 V toleriert. Die beiden Transistoren für Reset und Bootloader nach WittyCloud/NodeMCU sind bereits vorhanden.
Die 5 V-Stromversorgung muss entweder über den USB-Port oder der Stiftleiste SV2 kommen, die Anschlussbelegung des UART an SV4 ist wie folgt:
Pin | Signal vom UART-Adapter |
---|---|
1 | DTR |
3 | TX |
7 | RX |
9 | RTS |
Liegt das Trägerboard eines WittyCloud herum, müssen DTR und RTS gefädelt werden.
Betrieb
Ist die Firmware auf dem Chip und es sollen Daten vom VBus decodiert werden, muss ein Jumper zwischen Pin 3 und 4 an SV4 oder ein Lötpunkt auf SJ1 gesetzt werden:
Firmware
Zugegebenermaßen: ich habe zwar seit Jahren ein paar ESP8266-Module herumliegen, mich aber nie so richtig damit auseinandergesetzt.
Tasmota
Aber das macht nichts: Tasmota unterstützt verschiedene Smart Metering-Anbindungen, für die die Firmware allerdings angepasst selbst kompiliert werden muss.
Michael hat sich (mit der Unterstützung aus der Tasmota-Community) daran gemacht und freundlicherweise die nötigen Anpassungen zur Verfügung gestellt:
Folgendes muss in der Datei tasmota/user_config_override.h
ergänzt werden:
#ifndef _USER_CONFIG_OVERRIDE_H_
#define _USER_CONFIG_OVERRIDE_H_
#ifndef USE_SCRIPT
#define USE_SCRIPT
#endif
#ifndef USE_SML_M
#define USE_SML_M
#endif
#ifdef USE_RULES
#undef USE_RULES
#endif
#ifndef SML_REPLACE_VARS
#define SML_REPLACE_VARS
#endif
#ifndef USE_SML_SCRIPT_CMD
#define USE_SML_SCRIPT_CMD
#endif
#ifndef SML_MAX_VARS
#define SML_MAX_VARS 20
#endif
#ifndef USE_SCRIPT_JSON_EXPORT
#define USE_SCRIPT_JSON_EXPORT
#endif
#ifndef USE_SCRIPT_WEB_DISPLAY
#define USE_SCRIPT_WEB_DISPLAY
#endif
Konfiguration
Nach dem Flashen des Mikrocontrollers, was für fertige Builds auch über den Tasmotizer erfolgen kann, kann unter Main-Menu -> Console -> Edit Script
das Script ergänzt werden.
Mit dem Befehl sensor53 d1
kann man den Header für die Meter Metrics ermitteln und im Script entsprechend anpassen.
Für die RemaSol B/2 sieht das wie folgt aus:
>D
r="1,aa10005d101000010a67"
coltemp=0
Byte1=0
Byte2=0
>S
coltemp=sml[1]
Byte1=coltemp>>8
Byte2=coltemp&0xff
if Byte1==0x00 {
coltemp=coltemp&0xff
}
if Byte1==0xff {
coltemp=(coltemp-0x10000)
}
coltemp=coltemp*0.1
>B
=>sensor53 r
>M 1
+1,3,v,0,9600,Solar
%r%vo0uw@1,KollektorBase,°C,kolbase,2
%r%vo0uw@10,KollektorOrg,°C,kolorg,2
%r%vo2uw@10,Speicher unten,°C,spu,1
%r%vo4uw@10,Speicher oben,°C,spo,1
%r%vo8ub@1,Pumpe,%%,pump,0
#
>J
,"Calculated":{"kol":%coltemp%}
>W
Kollektor berechnet: {m} %coltemp% °C
Anmerkung: Hierbei handelt es sich um einen direkten Copy & Paste aus Michaels Script. Je nach Konfiguration der Anlage kann es Abweichungen geben.
Um den Fragen zuvorzukommen - die Anpassung auf die Jeweilige Anlage beginnt in der ersten Zeile:
r="1,aa10005d101000010a67"
Die Farben entsprechen dem Beispiel von der Artikelhauptseite, kurzum:
- aa: Sync-Wort
- 1000: Zieladresse
- 5d10: Quelladresse
- 10: Protokollversion
- 0001: Befehl
- 0a: Anzahl Nutzdatenframes
- 67: Prüfsumme
Die Quelladresse kann in der VBus-Spezifikation nachgeschlagen werden. Zu beachten ist hier die Endianness: was in der Doku als 0x1234
geschrieben ist, muss hier als 3412
angegeben werden.
Anschließend muss man auf der oben genannten Seite nach dem Command 0x0100 für den entsprechenden Regler suchen. Dazu am besten oben nach 0x0100 filtern und dann mit Strg+F die Quelladresse finden.
Klickt man in der Zeile auf Bytes
bekommt man die Länge der Nachricht, wobei man 1 addieren muss, da es sich um Offsets handelt. Beim RemaSol 1/2 (bzw. DeDietrich Sol Plus ER 709) ist der größte Offset 39, also 40 Bytes. Mit dem Wissen, dass ein Frame 4 Byte enthält, ergibt sich eine Länge von 10 Frames, was einem Hexadezimalwert von 0x0A entspricht.
Nun muss man nur noch die Prüfsumme berechnen (oder durch Schnüffeln am UART ermitteln)
Für die Feldzuordnung lohnt sich ein scharfer Blick und Vergleich der Fields
-Seite für die DeltaSol BS Plus und dem Beispiel in der dieses Reglers in der Tasmota-Doku.
ESPHome
Auch ESPHome hat eine VBus-Komponente, die nicht unerwähnt bleiben soll.
Von Stephan habe ich den Bericht erhalten, dass er diese Kombination erfolgreich in Betrieb genommen hat - und dass es im Zusammenhang mit HomeAssistant auch für Einsteiger tauglich ist.
Eine Änderung hat er jedoch an der Hardware vorgenommen: Statt Rx von VBus auf GPIO3 zu verbinden, hat er GPIO5 gewählt, damit GPIO5 für Logging verwendet werden kann. Wird dann wohl eine Bestückungsoption für die nächste Version der Hardware :)
Leiterkarten
Es gibt noch unbestückte Leiterkärtchen. Wer eine will, kann sich gerne bei mir melden.
Achtung: Es handelt sich um Version 0.1, auf der sich 3 kleine Fehler befinden, die sich allerdings mit Fädeldraht korrigieren lassen:
Hotfix für v0.1
Um die Leiterkarte Version 0.1 korrekt nutzen zu können, sind bis zu 3 Fixes nötig:
Bootloader-Schaltung
Die Beschaltung der Transistoren ist teilweise falsch. Um dies zu korrigieren, müssen 3 Leiterbahnen aufgetrennt werden und die Verbindungen mit Fädeldraht neu hergestellt werden.
Das Auftrennen kann je nach Geschmack mit einem kleinen Trennschleifer (Vulgo Dremel) oder einem Messer erfolgen. Statt der zwei Drähte zum unteren der beiden Widerstände kann der Widerstand (im 0603-Gehäuse) auch zwischen die beiden Pads am Transistor gelegt werden und damit ein Schnitt und eine Drahtverbindung gespart werden.
Beschaltung GPIO15 am ESP12
Diese Korrektur ist nur relevant, wenn man ein ESP12-Modul einsetzt.
Der Mikrocontroller startet nur, wenn GPIO15 über einen Pull-down mit Masse verbunden ist.
Dazu sollte ein 10k-Widerstand zwischen diese beiden Pins, wie unten dargestellt, eingebaut werden:
Pull-up an Q3
Wird die Tx-Funktionalität verwendet, blockiert der als Pull-down eingesetzte R14 den Bus.
Um dies zu berichtigen muss das linke Pad getrennt und mit und mit VBUS_3V3 verbunden werden:
Bekannte Probleme
Fehlerhafter Datenempfang
Carsten hat eine interessante Entdeckung bei seinem Aufbau gemacht, untersucht und dann auch gleich eine Lösung gefunden:
Nachdem ich den VBus Dekoder programmiert hatte, ist mir aufgefallen, dass die gesamte Kommunikation sehr stark mit Bitfehlern behaft ist. Nur etwa ein Drittel der VBus Frames kamen unversehrt in der Software an; das Ende langer Pakete war so gut wie immer kaputt. Wenn ich einen FTDI USB Konverter hinter den Optokoppler gehängt habe, wurden die Daten fehlerfrei auf dem PC empfangen, also musste das Problem mit dem ESP zusammenhängen. Daher habe ich mir in den UART Treiber einen Debug-Pin eingebaut, der bei jedem Frame-Fehler mein DSO getriggert hat und das war dann zu sehen:
Irgendwie hat der ESP RX Eingang unter bestimmten Umständen den Pin so stark nach VCC gezogen, dass die Pegel kaputt gegangen sind. Warum er das scheinbar nur manchmal macht, ist mir allerdings noch immer ein Rätsel. Dann weiter im Sourcecode gesucht, wo die Pin-Konfiguration während der Initialisierung des UART gemacht wird. Hier bin ich dann in der Datei 'core_esp8266_wiring_digital.cpp' fündig geworden:
Seitdem ich die Zeile 42 unschädlich gemacht habe, läuft die Kommunikation wie geschnitten Brot :-) Der Debug-Trigger hat auch nach mehreren Stunden nicht mehr zugeschlagen. Ich muss jetzt noch dazu sagen, dass ich die Software mit PlatformIO entwickele uns ich die Version 4.0.1 des ESP8266 Platform Package aktuell verwende. Das kann gut sein, dass es mit anderen IDEs und anderen/älteren Packages nicht passiert, weil der Pullup dort nicht eingeschaltet wird.
Wer die Stelle im Repo sucht: hier ist sie.
Ich bin zwar kein großer Freund, tief in Libs zu patchen, konnte aber nach einem Abend Erstkontakt mit den Tasmota-Sourcen keinen besseren Ort für eine Anpassung finden.
Bleibt die Frage, warum der Pull-up aktiviert und deaktiviert wird - bei einer (kurzen) Suche ist mir im Code nichts aufgefallen. Kann natürlich sein, dass die CPU selbst das entsprechende Bit setzt/löscht, was aber merkwürdig wäre.
Bleiben zwei Optionen: entweder selber nochmal forschen oder einen Issue in Github erstellen.
Downloads
- Datei:Vbusesp 0.2.zip EAGLE-Dateien Adapter v0.2 für den ESP8266
Archiv
- Datei:Vbusesp 0.1.zip EAGLE-Dateien Adapter v0.1 für den ESP8266