Alright - I played with my Nexus 3000 power station a bit yesterday. For those who don't know, this thing used to be able to connect via WiFi and BTLE to a "Ego Power+" app. You could see the load in Watts, turn on / off individual 120V outlets and monitor time left for discharging / charging. It would use BTLE to configure the WiFi connection that would then stick.
It would also show you state of charge of the batteries and I noticed back then that some of my old batteries would stop charging and show less that 100%.
When I say "used to be able" is because Ego dropped support for the app. It was pulled from the App Store. If you still had the app on your phone, it wouldn't connect (it has a login screen at first)... so even if you don't care about WiFi, BTLE wouldn't even be possible because the login screen prevents you from getting to the controls.
I was curious about how the Nexus shows degradation so I decided to try to reverse engineer the protocol between the Nexus and the app.
I noticed that it was still showing the WiFi icon on the UI so I did a TCP dump on the accesspoint and it looks like it's trying to connect to a static IP on AWS over port 9000. This IP is dead now. Decided to do a Destination NAT to redirect that to a small Linux box I have running "nc" and got some packets... but they looked encrypted

. Did a few tests and the key seems to change so it was a dead end. The device hostname is "espressif"... which is the default name of a ESP device, probably a ESP8266...Figured I could dump the firmware's flash if they didn't use secureboot w/flash encryption (which was likely since they didn't bother to change the name of the device). This required me to open the unit up and so one... which I didn't feel like doing. So I turned to BT LE
Poked around on my phone using nRF connect and found the device with some suspiciously familiar.
Looks like UART over BLE on a ESP32!
When connecting to it, the setting button on the unit would flash blue for a few seconds and I would be able to poke stuff but would get disconnected. Figured there was probably a secret handshake going on. My first instinct was to use the phone's dev setting to snoop on the BTLE traffic but I wasn't able to go past the login screen on the latest version (2.2.3). Found an old version of the APP (1.1.0) which was listed as "now support control of nexus station" in the release notes. Loaded that on Android emulator (not installing random APK from the web on my real phone lol) but it was still blocked on login... CRAP.
Then it became super obvious : I could just decompile the bytecode from the apps and try to see if I would be able to figure it out.
Decompiled version 1.1.0. Unsurprisingly the Java code was obfuscated but Claude Code took less than 10min to figure out the handshake. Then built a small python based CLI to interact with the Nexus and it worked! The 1.1.0 app was very limited it seems though - I could turn off and on outlets and get some stats but almost none of what I remembered from the later versions.
So I decompiled version 2.2.3. Surprise Surprise, it's a Xamarin based web app. Found the actual HTML for the Nexus and it's exactly how I remembered it. So I extracted the .NET DLLs (you read that right) from the .so file then use a C# decompiler to get the source code. This one wasn't obfuscated. Snooped around then launched Claude code on it too. It confirmed a few unknowns we had before + how to fully decode the protocol.
Here's the output of the Nexus with 1x5Ah (old and very used), 1x7Ah(also old and very used) + 1x10Ah (2yo, used infrequently in my snow blower)
Code:
09:16:51 INFO nexus.client :: connecting to [REDACTED]
Nexus PSID: [REDACTED]
State: charging (WiFi=on, BT=on, low_power=False)
Output: 0W / 0W (0s to full)
Clock: 2026-03-21 12:06:00
Outlets:
AC1: off 0W
AC2: off 0W
AC3: off 0W
USB: off
Batteries:
B1: loaded 86% 4.3Ah/5.0Ah 56.69V 0.00A T= 0
ID: 00000000000023D02A06
B2: loaded 100% 9.9Ah/10.0Ah 58.13V 0.00A T= 0
ID: 000000000000AB592369
B3: loaded 77% 5.7Ah/7.5Ah 55.12V 0.00A T= 0
ID: 00000000000023F82A79
B4: (not connected)
This is after a night of charging and sitting idle with the screenshowing "Charging complete"
As you can see the Nexus exposes a few interesting tidbits on the batteries :
- SoC %
- "Remaining Capacity"
- "Label Capacity"
- Actual voltage
- Current going in / out during charging / discharging
- Temperature (only when charging / discharging so 0 right now)
- ID of the battery
It also matches exactly what I remembered - Fully charged, older batteries, are
showing less than 100% SoC and Remaining Capacity.
I'm not exactly sure how the Nexus does this but I can guess. I sniffed the packets between the tool and the Battery and nothing new showed up.. No new messages. Also remember that the battery's BMS controls the charging. It tells the charger when to stop so the BMS is telling the nexus "I'm full, please stop charging".
Also, look at the Battery voltage. The 7.5Ah which is, in my experience, my most abused one, is sitting at 55.12V
Plugging this into my Nexus 400 and turning it on to sniff I get this :
As you can see the cells are all around 3.95V... and the packed stopped charging.
At first I thought "degradation".. but it's an odd way to deal with it. My experience with degraded Lithium cells is that their internal resistance goes up so you get less Ah out of them but you can still fully charge them up to 4.2V.
Confirmed with a multimeter - battery is sitting at around 55.1-55.2 V so it's not the BMS fudging the numbers to appear degraded.
2 theories right now :
- Pack needs to "trickle charge" past the "charging complete" like my other pack on a regular charger did. Need to drain it a bit and put it on a charger instead of the Nexus station. Will do that right now
- The IR is so high that the cells see 4.2V for a while during charging
edit : oh, and before anyone asks, I'm
NOT going to publish that code on GitHub. While there's an argument that can be made that I bought the tool and the functionality was lost when EGO abandoned the App... and lost functionality meaning even the local BLE... decompiling code isn't as clear cut, legally, vs sniffing traffic on a digital line...