Balboa Hot Tub/Spa Automation and Power Savings

I would be interested in one of the PCBs if you still have them. My board uses an RJ45 connection so I believe the communication is the same as the GS series.

Looking at this now - JZ6013X1 board
The Elfin EW11A can be powered directly from the molex port ?
What is then required ?
i have MQTT set up for Solar Assistant and Glow CAD
HAOS running on thin client
I can’t find a step by step tutorial unfortunately
Regards Jeff

Hi,
Did you manage to get it all working?

I’m in a similar situation. WiFi is working but the addon is not working. Either not getting data or not updating MQTT as nothing is showing up:

These are my logs:


[13:21:37] INFO: Starting BWALink addon...
[13:21:38] INFO: Setting addon timezone to Europe/London based on the system timezone.
[13:21:38] INFO: Starting mqtt bridge connecting tcp://192.168.0.134:8899/ to mqtt://core-mosquitto:1883
/usr/lib/ruby/gems/3.4.0/gems/mqtt-homie-homeassistant-1.2.1/lib/mqtt/homie/home_assistant/device.rb:48:in 'MQTT::Homie::HomeAssistant::Device#base_hass_config': uninitialized constant MQTT::Homie::HomeAssistant::VERSION (NameError)
          config[:origin][:sw_version] ||= MQTT::Homie::HomeAssistant::VERSION
                                                                     ^^^^^^^^^
	from /usr/lib/ruby/gems/3.4.0/gems/mqtt-homie-homeassistant-1.2.1/lib/mqtt/homie/home_assistant/property.rb:183:in 'MQTT::Homie::HomeAssistant::Property#publish_hass_component'
	from /usr/lib/ruby/gems/3.4.0/gems/mqtt-homie-homeassistant-1.2.1/lib/mqtt/homie/home_assistant/property.rb:50:in 'MQTT::Homie::HomeAssistant::Property#hass_button'
	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:164:in 'block in MQTTBridge#publish_basic_attributes'
	from /usr/lib/ruby/gems/3.4.0/gems/homie-mqtt-1.8.0/lib/mqtt/homie/device.rb:60:in 'block in MQTT::Homie::Device#node'
	from /usr/lib/ruby/gems/3.4.0/gems/homie-mqtt-1.8.0/lib/mqtt/homie/device.rb:158:in 'MQTT::Homie::Device#init'
	from /usr/lib/ruby/gems/3.4.0/gems/homie-mqtt-1.8.0/lib/mqtt/homie/device.rb:56:in 'MQTT::Homie::Device#node'
	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:155:in 'MQTTBridge#publish_basic_attributes'
	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:51:in 'MQTTBridge#initialize'
	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:447:in 'Class#new'
	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:447:in '<top (required)>'
	from /usr/bin/bwa_mqtt_bridge:25:in 'Kernel#load'
	from /usr/bin/bwa_mqtt_bridge:25:in '<main>'
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped

Any ideas?
Thanks

Blockquote

Hi,

Did you get it working? I’m at the same stage. Addon installed but no data (nothing in MQTT).

Bit stuck at this point.

Been using this for a while now and works great on ESPHOME:

Hi,

What do you have as your MQTT URI?

Your log shows
INFO: Starting mqtt bridge connecting tcp://192.168.0.134:8899/ to mqtt://core-mosquitto:1883

My log has an IP address where yours has core-masquitto, maybe try using your HA IP address.

I have these settings in yaml and it works.

bridge_ip: 192.168.200.221
bridge_port: 8899
socat: false
log_level: WARN
mqtt_uri: mqtt://bwalink:[email protected]:1883

Where …221 is the Elfin EW11, …139 is home assistant and I’ve create a user called bwalink with password bwalink on HA.

Thanks for posting back…

I tried changing the options in the config.ymal to what you suggested (using my ip ect) but still not playing ball. It got a little closer I think. The MQTT connection was made looking at the logs but still errors.

```[17:30:17] INFO: e[32mStarting BWALink addon…e[0m [17:30:17] INFO: e[32mSetting addon timezone to Europe/London based on the system timezone.e[0m [17:30:18] INFO: e[32mUsing bridge script: /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridgee[0m [17:30:18] INFO: e[32mStarting mqtt bridge connecting tcp://192.168.0.134:8899/ to mqtt://core-mosquitto:1883e[0m I, to spa: #BWA::Messages::ConfigurationRequest I, from spa: #<BWA::Messages::FilterCycles cycle1 6:00@23:30 cycle2(enabled) 1:00@12:00> I, from spa: #<BWA::Messages::ControlConfiguration BP6013G1 V65.0> I, from spa: #<BWA::Messages::FilterCycles cycle1 6:00@23:30 cycle2(enabled) 1:00@12:00> I, from spa: #<BWA::Messages::FilterCycles cycle1 6:00@23:30 cycle2(enabled) 1:00@12:00> I, from spa: #<BWA::Messages::ControlConfiguration BP6013G1 V65.0> I, from spa: #<BWA::Messages::ControlConfiguration2 pumps=[2, 1, 0, 0, 0, 0] lights=[true, false] circulation_pump aux=[false, false]> E, {“event”:“bwa_mqtt_bridge_retry”,“error_class”:“NameError”,“error_message”:“uninitialized constant MQTT::Homie::HomeAssistant::VERSION”,“attempt”:1,“base_delay”:1,“max_delay”:60,“capped_delay”:1,“delay”:0.8426118231741748,“jitter”:true} I, to spa: #BWA::Messages::ConfigurationRequest I, from spa: #<BWA::Messages::ControlConfiguration2 pumps=[2, 1, 0, 0, 0, 0] lights=[true, false] circulation_pump aux=[false, false]> I, from spa: #<BWA::Messages::FilterCycles cycle1 6:00@23:30 cycle2(enabled) 1:00@12:00> I, from spa: #<BWA::Messages::ControlConfiguration BP6013G1 V65.0> E, {“event”:“bwa_mqtt_bridge_retry”,“error_class”:“NameError”,“error_message”:“uninitialized constant MQTT::Homie::HomeAssistant::VERSION”,“attempt”:1,“base_delay”:1,“max_delay”:60,“capped_delay”:1,“delay”:0.7371807867357767,“jitter”:true} I, to spa: #BWA::Messages::ConfigurationRequest I, from spa: #<BWA::Messages::FilterCycles cycle1 6:00@23:30 cycle2(enabled) 1:00@12:00> I, from spa: #<BWA::Messages::ControlConfiguration BP6013G1 V65.0> I, from spa: #<BWA::Messages::FilterCycles cycle1 6:00@23:30 cycle2(enabled) 1:00@12:00> I, from spa: #<BWA::Messages::ControlConfiguration BP6013G1 V65.0> I, from spa: #<BWA::Messages::ControlConfiguration2 pumps=[2, 1, 0, 0, 0, 0] lights=[true, false] circulation_pump aux=[false, false]> E, {“event”:“bwa_mqtt_bridge_retry”,“error_class”:“NameError”,“error_message”:“uninitialized constant MQTT::Homie::HomeAssistant::VERSION”,“attempt”:1,“base_delay”:1,“max_delay”:60,“capped_delay”:1,“delay”:0.6067847466824488,“jitter”:true} I, to spa: #BWA::Messages::ConfigurationRequest E, {“event”:“bwa_mqtt_bridge_retry”,“error_class”:“EOFError”,“error_message”:“end of file reached”,“attempt”:1,“base_delay”:1,“max_delay”:60,“capped_delay”:1,“delay”:0.5279781149180319,“jitter”:true} I, to spa: #BWA::Messages::ConfigurationRequest`

Mmm. Those error messages don’t mean anything to me, sorry, but I have just discovered something that may, or may not help.

I just updated Bwalink and it stopped working with this in the log.

> [09:18:24] INFO: e[32mStarting BWALink addon...e[0m
> [09:18:24] INFO: e[32mSetting addon timezone to Europe/London based on the system timezone.e[0m
> [09:18:24] INFO: e[32mStarting mqtt bridge connecting tcp://192.168.200.221:8899/ to mqtt://192.168.200.139:1883e[0m
> /usr/lib/ruby/gems/3.4.0/gems/mqtt-homie-homeassistant-1.2.1/lib/mqtt/homie/home_assistant/device.rb:48:in 'MQTT::Homie::HomeAssistant::Device#base_hass_config': uninitialized constant MQTT::Homie::HomeAssistant::VERSION (NameError)
> 
>           config[:origin][:sw_version] ||= MQTT::Homie::HomeAssistant::VERSION
>                                                                      ^^^^^^^^^
> 	from /usr/lib/ruby/gems/3.4.0/gems/mqtt-homie-homeassistant-1.2.1/lib/mqtt/homie/home_assistant/property.rb:183:in 'MQTT::Homie::HomeAssistant::Property#publish_hass_component'
> 	from /usr/lib/ruby/gems/3.4.0/gems/mqtt-homie-homeassistant-1.2.1/lib/mqtt/homie/home_assistant/property.rb:50:in 'MQTT::Homie::HomeAssistant::Property#hass_button'
> 	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:164:in 'block in MQTTBridge#publish_basic_attributes'
> 	from /usr/lib/ruby/gems/3.4.0/gems/homie-mqtt-1.8.1/lib/mqtt/homie/device.rb:60:in 'block in MQTT::Homie::Device#node'
> 	from /usr/lib/ruby/gems/3.4.0/gems/homie-mqtt-1.8.1/lib/mqtt/homie/device.rb:166:in 'MQTT::Homie::Device#init'
> 	from /usr/lib/ruby/gems/3.4.0/gems/homie-mqtt-1.8.1/lib/mqtt/homie/device.rb:56:in 'MQTT::Homie::Device#node'
> 	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:155:in 'MQTTBridge#publish_basic_attributes'
> 	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:51:in 'MQTTBridge#initialize'
> 	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:447:in 'Class#new'
> 	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:447:in '<top (required)>'
> 	from /usr/bin/bwa_mqtt_bridge:25:in 'Kernel#load'
> 	from /usr/bin/bwa_mqtt_bridge:25:in '<main>'
> s6-rc: info: service legacy-services: stopping
> s6-rc: info: service legacy-services successfully stopped
> s6-rc: info: service legacy-cont-init: stopping
> s6-rc: info: service legacy-cont-init successfully stopped
> s6-rc: info: service fix-attrs: stopping
> s6-rc: info: service fix-attrs successfully stopped
> s6-rc: info: service s6rc-oneshot-runner: stopping
> s6-rc: info: service s6rc-oneshot-runner successfully stopped

If I roll back to my backup, it works.

[09:19:06] INFO: e[32mStarting BWALink addon...e[0m
[09:19:06] INFO: e[32mSetting addon timezone to Europe/London based on the system timezone.e[0m
[09:19:06] INFO: e[32mStarting mqtt bridge connecting tcp://192.168.200.221:8899/ to mqtt://192.168.200.139:1883e[0m
W, Balboa MQTT Bridge running (version 2.3.2)

First thing to add, I’m not 100% certain I updated correctly, I just overwrote the contents of the addons folder and clicked rebuild in HA but whatever that does, it breaks it.

I just set up a new instance of HA and are trying to get BWALink to work. Got it working on two other instances without issues, but here I’m getting similar issues as listed above.

[18:16:13] INFO: Starting mqtt bridge connecting tcp://192.168.1.251:8899/ to mqtt://core-mosquitto:1883
/usr/lib/ruby/gems/3.4.0/gems/mqtt-homie-homeassistant-1.2.0/lib/mqtt/homie/home_assistant/property.rb:39:in 'MQTT::Homie::HomeAssistant::Property#hass_button': Property must have one valid enum value (ArgumentError)
          raise ArgumentError, "Property must have one valid enum value" unless range.length == 1
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:164:in 'block in MQTTBridge#publish_basic_attributes'
	from /usr/lib/ruby/gems/3.4.0/gems/homie-mqtt-1.8.0/lib/mqtt/homie/device.rb:60:in 'block in MQTT::Homie::Device#node'
	from /usr/lib/ruby/gems/3.4.0/gems/homie-mqtt-1.8.0/lib/mqtt/homie/device.rb:158:in 'MQTT::Homie::Device#init'
	from /usr/lib/ruby/gems/3.4.0/gems/homie-mqtt-1.8.0/lib/mqtt/homie/device.rb:56:in 'MQTT::Homie::Device#node'
	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:155:in 'MQTTBridge#publish_basic_attributes'
	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:51:in 'MQTTBridge#initialize'
	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:447:in 'Class#new'
	from /usr/lib/ruby/gems/3.4.0/gems/balboa_worldwide_app-2.3.2/exe/bwa_mqtt_bridge:447:in '<top (required)>'
	from /usr/bin/bwa_mqtt_bridge:25:in 'Kernel#load'
	from /usr/bin/bwa_mqtt_bridge:25:in '<main>'
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped

Is it possible you can share the files you are using to build the add-on so i can try them my end?

Does anyone here know if this would work with the Balboa RS101 controller?

Attemping install on HAOS 2026.4.2 with ELFIN-EW11 on a Balboa BW6013X1 (2016) controller.

Configured EW11 and can see messages through TCP connection but wasn’t able to install bwalink addon.

Hey santiniuk.

So you connected this your diy board between VL801D And GS523DZ?

Why didint you make diyboard with one rj45 port and connect it to J2 port of GS523DZ board and use it that way? Is it going to freeze or mess with VL801 touch board if both J1 and J2 ports are used or am i missing now something? Im trying to make this to GS510DZ and asking help from gemini to this project.

Hi.

Honest answer is I just followed online guides.
I'm not sure if it works using the other port on its own.

Ok thanks for answer

I can confirm that this works with 510dz and 801vl. Just follow instructions. Here is my Ui.

First of all I want to thank jshank for the great work, the inspiration of using EW11 devices and of course the HA add-on, which ran for years now in my set-up.

I own a so called “SwimSpa”, which has two seperate zones: one Whirlpool and one “Swim zone”. These are also two different water cycles with two differen Balboa systems. So I needed the solution from jshank for two devices. Unfortunatelly this is not possible, because the balboa_worldwide_app creates a hard coded MQTT topic with a sepcific name. Adding a second bwalink addon leads to the same MQTT topic and doesn’t work therefore.

The second problem was (at least at my configuration, but I read this also somewhere else), that the system got stuck after some time. I could not send any new commands anymore. Maybe due to connection issues and not a proper reconnect or something else. Therefore I wrote an HA automation, which restarted the addons every hour to get get rid of this topic.

So for myself and there was also a request in jshanks github repo, I tried to find a solution to get two devices into HA. In first place I coded a very dirty workaround, but this worked for quite some time. The problem is, if the underlaying repos update, I need to manually merge the updates. The solution was also not very nice in total.

So I wanted to make a clean solution. Going away from HA add-ons (docker container) and creating a fully integrated HACS addon with support for Balboa WiFi and also all custom devices (EW11, ESP, etc.). And of course the clean solution to add 2 or more devices to your system. Everthing set-up with a clean UI flow.

So if everyone else has the same request or wants to have a integrated HACS solution:

Here is a new thread:
https://community.home-assistant.io/t/spacentral-for-balboa-whirlpools-pools-hacs-integration-for-wi-fi-module-and-rs-485-ew11-esp-gateways-multiple-devices-no-mqtt-broker/

Here is the github repo:

If you find any bugs, please report to the git repo.
If you have any feature requests, please also open q request to the git repo. I will try to add everything which is possible and makes sense.

Sorry for advertising other solutions in the thread of jshank. But I think this helps people with the same need. So I hope you understand. And as said: thanks again for your great work.

Just to say I never quite got this working with my spa - It would appear my Balboa is a little older so the Status packets are slightly shorter but your work set me on a path with the EW11a that initially got me working with a Windows Python App (no good remote without VPN’s) and from there I made a rudimentary custom addin with Claudes help to simply send two temps that I alter between when using or setting idle and to read the current temp and target temp.

Now I’m using this one from Github mel9320107 · GitHub as he went down a similar road to me but he’s a lot further down it and its working perfectly for me after lowering the minimum status message character length in protocol.py

So thanks for all the work on the information on the plugs, the EW11A and the pointers to information on the spa’s “language”. And thanks for setting me down the road of even seeing it as possible in the first instance. With some initial dumping with Python to logs while hitting buttons and changing temps etc I got a long way.

If others like me have issues where it just doesn’t quite talk I’d recommend just connecting to the elfin with python and dumping to a text file (A simple claude request for “python code to connect to a telnet session and dump the output to a file in raw hex”) will give you what you need to start seeing whats happening. If this addin doesn’t work JShanks information on the plugs required, the Elfin etc is very nicely put together and will set you on the right path.

@mobiusnz I’d like to further expand the compatibility of my integration (SPAcentral) and eventually cover the entire Balboa product family. That’s why I’d like to know which device (board) you have and what exactly the problem is with the jshank integration. If you have a message dump from your device, that would of course be helpful as well.

If you’re interested in helping me, please feel free to create an issue on my GitHub repo (see above your post) and provide me with the information there. Alternatively, you can also post it in my thread.

I’d appreciate your support so we can make this better for everyone. Thank you.

The board is a balboa SIBP2P running software version M100_215 V5

Here is a typical status message

7E 1C FF AF 13 00 00 4C 14 08 00 00 3C 03 05 0C 08 00 02 00 00 00 00 00 00 4C 00 00 F1 7E

I just tried yours now and during the startup wizard it asks for the IP address and port and it gives an error that its not getting any data.

I then re-enable the one I’m using now and its working and running fine.

These are the commands I have in a spreadsheet while I was testing with my own windows python app that initally just logged everything as hex to a txt file while I changed settings and hit buttons.

Set Temp to 40 (50 hex is 80 x 0.5=40)
7E 06 10 BF 20 50 5E 7E

Set Temp to 38 (4C Hec is 76 x 0.5=38)
7E 06 10 BF 20 4C 0A 7E

Light Button Push (Alternate)
7E 07 10 BF 11 11 00 7C 7E

Pump 2 Button Push (Alternate)
7E 07 10 BF 11 05 00 7F 7E

The main difference I’ve run into is the packet length for status messages - Some are 28 (Excluding the 7E start/stop) and some are 29. I think I saw that version M100_220 was 29 bytes.