VBus-Decoder/Adapter für den ESP8266

Aus Hobbyelektronik.org
Aufgebauter Leiterkarte (v0.1)

Dies ist ein Unterartikel von VBus-Decoder. Auf der Hauptseite gibt es weitere Informationen zum Thema.

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

Archiv