What would be the easiest way to build the hardware. Is it possible to just order the pcb at jlcpcb for example? I tried uploading it there with the parts but it is asking for a cpl file and i cannot find that in the pcb folder. Or would you just grap a prototyping pcb and solder some wires myself? And where do i buy the parts for the netherlands. on aliexpress or somewhere else?
Or would you maybe have an spare board laying around that you are willing to ship?
Subject : Findings on GS501Z R2B – confirmed non-RS-485 bus & partial RS-485 output (J18)
Hi everyone 👋
I’ve been working for the past weeks on a Balboa GS501Z R2B (paired with a VL403 panel), trying to integrate it into Home Assistant through an Elfin EW11A Wi-Fi → RS-485 bridge.
After many captures and hardware tests, here’s a clear summary of what we’ve confirmed on this board revision — it might help others working on GS501Z/GS510SZ units.
🧩 Hardware revision
Mainboard marking: GS501Z R2B
Firmware label on ROM: GS501Z R2B v43
Same hardware family as GS510SZ, very likely identical bus design.
🔍 Observed behaviour
Port | Physical Layer | Observations | Notes
-- | -- | -- | --
J1 (VL-series keypad) | ⚠️ Not RS-485 | Bus has 0-5 V signals, one line clock (~38 kHz) + one line data. Captures look SPI-like. | Matches the description in this issue: synchronous, proprietary protocol.
J2 | Same story | No measurable differential signal. Probably diagnostic or TTL RX only. |
J18 | ✅ RS-485 TX only | Emits clean [64 3F 2B…] frames at ~1 Hz (same as BWA MLD protocol). But the line is transmit-only: we can read but not inject commands. | Likely the internal telemetry/debug output from the MCU.
⚙️ What this means
The GS501Z R2B no longer exposes a bidirectional RS-485 bus.
The clavier/panel bus (J1) is proprietary TTL synchronous (SPI-like), not asynchronous UART.
The only readable RS-485 output is on J18, but it’s TX only — perfect for passive reading, useless for control.
This explains why the BWA Wi-Fi v1 module (RS-485 based) doesn’t work, while the BWA Wi-Fi v2 (with its own MCU) does.
🧠 Current working state
Using EW11A on J18, we can reliably read:
Water temperature
Setpoint temperature
Mode (ST/ECO/SL)
Heater state
All from the 27-byte [64 3F 2B…] frames — read-only telemetry confirmed.
Injection tests on J18 produce no effect (no RX path to MCU).
Identify on the board where the real RS-485 transceiver sits (likely U22/U34), to see if bidirectional pads are still exposed.
Confirm if GS501Z/GS510SZ share the exact same SPI-like “BL-bus” between MCU ↔ panel.
Determine whether the BWA v2 module bridges this bus to MLD over TCP 4257 (would make reverse-engineering feasible).
💡 Next steps / ideas
Probe the J1 bus with a 5 V logic analyzer in SPI mode (CLK, MOSI, MISO).
Compare captures with those from GS510SZ units.
Try to locate any test pads labeled RS+, RS-, A, B, U22, RO/DI on the PCB — they might expose the internal RS-485 lines.
If anyone here has a working BWA v2 on a GS501Z R2B / GS510SZ, it would be great to sniff its lines and confirm whether it’s doing a protocol conversion internally.
Thanks to the previous work here (MagnusPer, Jonas M., etc.), we now have solid confirmation that:
GS501Z R2B ≠ RS-485 Balboa MLD — it’s a synchronous 5 V bus.
Only J18 still mirrors MLD frames (TX-only).
Happy to share scope traces or the EW11A setup if it helps the investigation.
Hello @santiniuk, i have ordered the pcb and wemos and am in the proces of uploading your Balboa_GS_MQTT.ino to the wemos. Turns out you were right
I have downloaded the zip files from the github links and put them in the library folder and unzipped them.
When compiling i get the following errors. Do you have some pointers as to where to look in order to make it compile correctly?
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o:(.text._Z8callbackPcPhj+0xc): undefined reference to `_ZN15BalboaInterface16writeDisplayDataE'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o:(.text._Z8callbackPcPhj+0x10): undefined reference to `_ZN15BalboaInterface11writeTempUpE'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o:(.text._Z8callbackPcPhj+0x18): undefined reference to `_ZN15BalboaInterface13writeTempDownE'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o:(.text._Z8callbackPcPhj+0x20): undefined reference to `_ZN15BalboaInterface10writeLightE'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o:(.text._Z8callbackPcPhj+0x28): undefined reference to `_ZN15BalboaInterface10writePump1E'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o:(.text._Z8callbackPcPhj+0x30): undefined reference to `_ZN15BalboaInterface10writePump2E'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o:(.text._Z8callbackPcPhj+0x38): undefined reference to `_ZN15BalboaInterface11writeBloberE'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o:(.text._Z8callbackPcPhj+0x40): undefined reference to `_ZN15BalboaInterface9writeModeE'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o:(.text._Z8callbackPcPhj+0x58): undefined reference to `_ZN15BalboaInterface4stopEv'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o:(.text._Z8callbackPcPhj+0x5c): undefined reference to `_ZN15BalboaInterface17updateTemperatureEf'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o: in function `_ZNK6StringeqEPKc':
C:\Users\User\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\cores\esp8266/WString.h:228: undefined reference to `_ZN15BalboaInterface4stopEv'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o: in function `_Z8callbackPcPhj':
C:\Users\User\Downloads\Balboa_GS_MQTT/Balboa_GS_MQTT.ino:303: undefined reference to `_ZN15BalboaInterface17updateTemperatureEf'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o:(.text.setup+0x34): undefined reference to `_ZN15BalboaInterface5beginEv'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o:(.text.setup+0xb1): undefined reference to `_ZN15BalboaInterface5beginEv'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o: in function `_ZNSt17_Function_handlerIFvR6StringS1_RKS0_iiiiEN16esp8266webserver15storeArgHandlerI10WiFiServerEEE9_M_invokeERKSt9_Any_dataS1_S1_S3_OiSD_SD_SD_':
C:\Users\User\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266WebServer\src/Parsing-impl.h:254: undefined reference to `_ZN15BalboaInterfaceC1Ehhh'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o: in function `__static_initialization_and_destruction_0':
C:\Users\User\Downloads\Balboa_GS_MQTT/Balboa_GS_MQTT.ino:33: undefined reference to `_ZN15BalboaInterfaceC1Ehhh'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o:(.text.loop+0xc4): undefined reference to `_ZN15BalboaInterface4loopEv'
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\User\AppData\Local\arduino\sketches\BDA848F87201E9A5ED4FC0EB36EBC4CB\sketch\Balboa_GS_MQTT.ino.cpp.o:(.text.loop+0xda): undefined reference to `_ZN15BalboaInterface4loopEv'
collect2.exe: error: ld returned 1 exit status
exit status 1
Compilation error: exit status 1
I have already tried to update the boards, update the libraries, update the arduino ide and tried multiple boards. I now use the “ESP8266 board 3.1.2” → “lolin(wemos) d1 mini (clone)” and when i upload a blink scetch this does compile and upload and the led starts blinking.
Hi Albertoo, just saw this. I thought the Arduino side would be fun. I remember having a few challenges getting the libraries to compile.
To save this thread I’d recommend going via direct message and I will try and help if I can.
”This release includes a fundamental change in how ESP32 Arduino builds work - Arduino is now integrated as an ESP-IDF component rather than a separate framework. This is the biggest architectural change for ESP32 in ESPHome’s history.”
Thanks for the reply. I actually initially tried to message you directly but i cannot find this feature. I am assuming that since i am quite a new member this feature is not yet unlocked for me. I neither can find how to level up…
However i think i have solved it quite ashamed to say but using chatgpt. It compiled so i will now have to plug it into the balboa to see if it works.
I was however wondering why "balboa_GS_Interface.h is included in both line 1 and 15 in the “Balboa_GS_MQTT.ino” on github. Is the first include there by mistake and can i just remove that?
When you add 4 m3x25 and 4 m3 nuts you can assemble it. I also added (not in the picture yet) a heatsink so the wemos can loose its heat a little since the case is not very well breathing.
Unfortunately i cannot add a stl or zip file here but if you are interested, let me know.
Furthermore, since you can only order by magnitudes of 5 at jlcpcb i still have 4 pcb’s laying around so if someone is interested in one, let me know.
I trying to get my spa connected to my home assistamt.
I bouget the ew11 and installed it and i can access it via my network, and filled in the correct parameters. I tried the BWAlink Docker setup. I downloaded the docker-compose.ymal and modified it to mysetup :
'version: “3”
services:
bwalink:
image: Package bwalink · GitHub
container_name: bwalink
restart: unless-stopped
environment:
# See Using URIs to connect to a MQTT server - IoTbyHVM for MQTT_URI format
# MQTT_URI must be properly URI encoded, e.g. mqtt://useename:pa##word@10.1.10.2 would
# be mqtt://username:pa%23%[email protected]
# BRIDGE_IP and BRIDGE_PORT are the address and port for your serial to IP device or
# host running ser2net, socat or ESPEasy serial server
MQTT_URI: mqtt://admin:[email protected]
BRIDGE_IP: 192.168.1.197
BRIDGE_PORT: 8899
TZ: America/Los_Angeles
LOG_LEVEL: WARN # Any of FATAL, ERROR, WARN, INFO or DEBUG
After that i am stuck how to continue with Docker. I installed desktop Docker, but i don’t know how to continue. I looked many video’s and read a lot, but unfortunatlly without luck. I can’t not get to let Docker do its magic’
After that i tried to Run BWALink as a Home Aassistant Addon.
I get the BWAlink in the local add-ons, but when i want to install it, I get a error Failed to install add-on Unkonwn error, see supervisor.
I am trying for 4 days to get this working but I am giving up. What is going wrong ?
Finally I got a connection with my spa. With the help of copilot I was able to set up everything. A have bwalink with the dashboards. The connection is not 100% stable yet. I also see that the time is not in european time, so i have to find out where to change that.
Hello @santiniuk, I just installed the device into my hot tub. Althought some things are kind of working i am having some trouble. The hottub thinks that the temperature up button is continuously pressed which results in a set temperature of 40°C. Next to that the set temperature does not always correspond to what is shown on the display. for example i sometimes get values below 26 while this is not possible on the display and i even got down to 0,5 while the display displayed something else. Where should i search for the solution? Would it be on the pcb or something else?
Further on i wanted to suggest a function for the arduino sketch. When testing i think it is nice if you are able to lower the interval of the data without having to upload the sketch over and over again. Therefor i wanted to suggest to add another topic where you are able to change the variable “ReportTimerMillis”. When the board is reset this ofcourse resets to the default. If i am correct this would need the following lines of code:
I plugged an elfin adapter directly into one of these main panel connectors. The elfin powers up and I’ve got it connected to my wifi. For the life of me I can’t get the BWALink addon to work. I’m wondering if it has anything to do with my MQTT configuration but I’ve been reconfiguring every setting I can imagine and still nothing. These are the logs from the add-on
I believe I followed the github instructions. Any ideas from anyone out there? Not great at MQTT but also could have misread the requirements. From my understanding, this setup only requires the elfin connected directly to the hot tub control board, right? No other hardware needed?
Here’s a pic with my Amazon molex connector plugged in:
Probably screaming into the wind here as this thread seems near dead but I think I got everything hooked up properly. The hot tub seems to be sending data through the Elfin and the add-on logs show data coming in but it looks like the add-on can’t decipher the data.
It looks like the BWA Addon is trying to connect to a few different IP addresses- perhaps from your testing?
Are any of these IPs 192.168.68.77, 192.168.68.80 or 192.168.68.53 the IP address if your elfin adapter??
It looks like you’re getting some data back from a device when it connects to 192.168.68.53 but its not recognized. It could also be some other smart device…
Did you set up the elfin device with these settings for baud rate and etc.:
Good eye on the IP addresses. I didn’t set up the elfin to have a static IP so I’ve had to update it every time the address changes. 192.168.68.53 is the address of the IP. So I’ve got the add-on pointed at the right device, and it looks like the elfin is sending data to the add-on, but the add-on can’t decipher it. It took a lot of work to get it to this point so I’m bummed I can’t get it over the hump. It looks so close! I must be missing something. Grok thinks the data the elfin is sending is the hot tub data, but who knows?
So I’ve learned that my hot tub, since it is a Sundance brand, runs a specific brand of the balboa control board. Apparently it is a Jacuzzi brand balboa board and so the data it outputs is encrypted? I’ve been messing with it for hours and am close to giving up now. I’ve tried different repositories that claim to support my specific board but still can’t get HA to decipher the data coming from my elfin adapter. I’ve been so close so many times and every time I get an error of some kind or another. Pulling my hair out here!
Hello. I have a 2021 J-245 and I would also like to control remotely without paying a subscription. I found this repository that might help. They did mention something about encryption starting in 2023 (see the github page)
They noted these differences and that may be why the data is not parsed correctly.
# Differences between Balboa and Jacuzzi systems:
# The Balboa BMTR_STATUS_UPDATE msg type field is 0x13 instead of 0x16
# The Balboa BMTR_FILTER_INFO_RESP msg type field is 0x27 instead of 0x23
# The Balboa BMTS_PANEL_REQ msg type field is 0x22 instead of 0x19
# The Balboa BMTR_SYS_INFO_REQ msg type field is 0x24 instead of
# 0x1C (PLNK_SECONDARY_FILTER_RESP)
# There is no PRIMARY_FILTER_RESP msg type or similar in Balboa systems
# There is no PUMP_STATE_RESP msg type or similar in Balboa systems
# The Balboa BMTR_SETUP_PARAMS_RESP msg type field is 0x25 instead of 0x1E
What serial to wifi adapter did you use? I am looking to buy one
Hey, I used your whole process with the adapter from Alibaba on my Viking brand tub with Balboa board. Worked with no issue! This rocks.
My only question is that I appear to get a slider to set temp and a sensor for current temp. I also see this thermostat thing that appears to show when the heater is on, but I don’t think setting that thermostat temp works how it should. I can only set it to 110F at lowest if I mess with it.