Overnight — 67% down, 667 Ah out, and half a volt of warning

Overnight battery

Full at midday. Empty-ish by dawn. Here is what the pack actually did while I slept….

  • Started: 100.0% at 13:25
  • Bottomed: 32.8% at 06:10
  • Depth of discharge: 67 points — roughly 667 Ah (~35.9 kWh), integrated from the shunt’s own current, not estimated
  • Peak draw: -144 A at 17:55
  • Voltage band: 52.03 V to 55.62 V

The part worth staring at

Look at the amber line. The pack gave up 67 points of state of charge overnight — and the voltage moved 3.59 volts doing it. That is the LiFePO4 curve. Flat as a table through the whole usable middle.

Which is exactly why you cannot look at a lithium pack’s voltage and tell me how full it is. At 3am this bank read 52.3 V. At 8pm it read 52.8 V. Half a volt apart, and a third of the battery gone between them. A lead-acid brain will get this wrong every single time. That is the whole reason there is a shunt counting coulombs in the first place.

Low voltage cutoff is set at 45 V. We got nowhere near it. The overnight draw tapered from about 100 A right after sundown to the mid 20s by 3am as the house went quiet, then the morning load stepped it back up before the sun took over.

Victron SmartShunt, 15 minute buckets, pulled from VRM. Posted by my claude instance.

Solar Day — 2026-09-23 — 103.0 kWh, 16.6 kW peak

PV 2026-09-23

  • Harvested: 103.0 kWh
  • Peak: 16.6 kW at 12:35
  • Consumed: 99.5 kWh
  • Into the battery: 28.5 kWh

Four MPPT strings across two EG4 12000XPs in parallel, combined. Sampled at the inverters’ native 5 minute resolution — the EG4 portal has no whole-day endpoint, so this is stitched from its per-window drill-down.

Posted automatically by my claude instance.

Your Victron VRM Data is 105 Seconds Old…. Here is the Real-Time Channel

Short version for the impatient…. The Victron VRM web API lies to you about how fresh your data is. Not on purpose. It just hands you the LOGGED database and never mentions there is a second channel running at 2 seconds.

I found this the annoying way. My phone app felt slow and crusty. VictronConnect on the same phone was showing me numbers that moved. Mine were not moving. GRRR.

First…. MEASURE it. Do not guess.

I had my claude instance poll the VRM diagnostics endpoint every 10 seconds and watch the timestamp on the sample itself — not the time we fetched it. The sample carries its own age. That is the number that matters.

14:26:54  age  48s   V 53.72  I 16.3
14:27:05  age  59s   V 53.72  I 16.3   <- same sample
14:27:15  age  69s   V 53.72  I 16.3   <- same sample
14:27:26  age  80s   V 53.72  I 16.3   <- same sample
14:27:37  age  91s   V 53.72  I 16.3   <- same sample
14:27:48  age 102s   V 53.72  I 16.3   <- same sample
14:27:59  age  56s   V 53.73  I 17.6   <- FINALLY a new one

There it is. A new sample about every 105 seconds. We were polling every 30. So we re-downloaded the identical record three or four times before it ever changed.

Polling faster does NOTHING. It is not a rate problem. It is the wrong pipe.

There are TWO channels. Nobody tells you this.

Straight out of Victron’s own VRM manual, buried where you will never look:

“The VRM dashboard can show real-time data, with data updates sent straight from the installation to your browser every two seconds, rather than pulled from the database where information is stored at the interval configured in Settings → VRM Portal → Interval.”

  • The database — what /v2/installations/<id>/diagnostics gives you. Logged at your GX logging interval. Mine is 1 minute, so ~105 s in practice.
  • The real-time feed — dbus-MQTT, pushed from your GX. About 2 seconds.

VictronConnect’s remote view uses the second one. That is the whole reason it felt alive and mine felt dead. When that channel breaks, VictronConnect pops a DBUS-MQTT error — which is the tell that it was using it all along.

The actual recipe

No library. Hand-rolled MQTT 3.1.1 over TLS. Here is everything you need, because I could not find it written down in one place anywhere:

  • Broker — mqtt<N>.victronenergy.com:8883 where N = sum(chars of your portal ID) % 128. Mine: portal c0619abc6d7f → sums to 912 → mqtt16.
  • TLS — the broker presents a cert signed by Victron’s own private “CCGX Certificate Authority”. Your OS will NOT trust it. Pin their CA or you go nowhere. (It is valid until 2114. Sure.)
  • Auth — username is your VRM account email. Password is the literal string "Token " + your personal access token. Miss that space-after-Token prefix and you get rc=5 NOT AUTHORIZED with zero explanation. Ask me how I know.
  • Subscribe — N/<portalId>/battery/#
  • Keepalive — publish to R/<portalId>/keepalive. The GX stops publishing ~60 s after your last one.

S*** I got wrong. Learn from me.

I had this working and it STILL looked slow. Two self-inflicted wounds….

1. Do not subscribe to the whole tree. I used N/<portalId>/# because why not. The GX then has to serialize and shove 234+ topics at you before anything settles.

  • Whole tree → first data in 71 to 149 seconds
  • Narrow (battery only) → first data in 15.9 seconds

2. Do not send a bare keepalive on repeat. An empty keepalive forces a FULL REPUBLISH of every topic the GX owns. I sent that every 5 seconds. For about ten minutes.

Result: I loaded my own Cerbo into the ground. VictronConnect went to a crawl, took almost a minute to open, and my SmartShunt stopped showing up in the device list entirely. I thought I had broken the shunt. I had not — I had just DDoS’d my own gateway with the world’s most polite protocol.

Use this instead and it streams deltas like a civilized thing:

{"keepalive-options":["suppress-republish"]}

Send it every ~25 seconds. Narrow subscription. Done.

What you get

+  87.5s  dt=   -    Power   1193.47   <- GX wakes up
+  89.7s  dt=  2.1s  Power   1182.72
+  89.9s  dt=  2.4s  Current 22.0
+ 204.0s  dt=  1.1s  Power   1080.58

min 1.1s   median 2.4s

1 to 2 seconds. Versus 105. Call it fifty times fresher, from anywhere in the world, on the same token you already have.

Two things that will bite you

  • The GX wakes up lazily. It connects to the broker on demand. Expect 15 to 90 seconds before the first value lands. Paint your last known value immediately and swap to live when it arrives — do not stare at a blank screen.
  • Real-time is only as good as your GX’s network. Logged telemetry tolerates a lousy link — small, periodic, retried. A persistent stream does not. My Cerbo lives in an aluminum battery box (yes, a Faraday cage, I KNOW) and the stream stalls whenever the WiFi gets marginal. Ethernet is the real fix.

Why bother

Because “the battery is at 53 volts” is a different statement from “the battery WAS at 53 volts, a minute and a half ago, probably.” When you are chasing a 17 kW PV burst or watching a load step, 105 seconds is not monitoring. It is history.

My app now shows the age of the data on every screen, counting up by the second. If the feed stalls, the number climbs and goes amber. It cannot pretend to be live when it is not. That, more than the speed, is the part I actually wanted.

O N W A R D


Hardware: 2x EG4 12000XP in parallel, Victron Cerbo GX MK2, 600A SmartShunt, off-grid in Scotts Valley CA. The app is a hand-rolled native Android APK — no Gradle, no dependencies. More on that another time.

Setting up a Host

You’re not going to be able to do any of this from the phone app… They are all garbage.

  • Get a computer
  • do what I stated below
  • instruct Claude to set up the computer so it never turns off but it does turn the screen off
  • start start up a remote session

-methods

HOW TO…. Claude-Code

The following posts will be mostly generated by my claude instance. To get started

  • Find a computer, Windows, Ubuntu, doesn’t matter
  • Ask Google how to install Claude via CMD or terminal
  • Get it working… When it works it will come up with an ASCII terminal art screen
  • Command Claude to start on “Dangerous Mode” – You will know you are there when there is a red banner along the bottom warning you
  • Only store passwords and tokens locally, not in the prompt
  • $20/mo will work, works faster at $200/mo

We are going to start with a bunch of exercises which I have already started and overviewed on YouTube. We’re going to be generating APK Android tools.

Don’t swing for the fence… Start by just getting basic hello world programs going. You want an icon on your desktop that can launch a program that runs clean.

We we are going to go above and beyond what you can do with a basic web app… But we are making one of those as well.

We’re are going to start off by just scraping EG4 Connect and Victron web portals. Those are slow and Jenky but simple and fast.

I already have a bunch of basic s*** working that I got going last night, late

I have access to all the eg4 data and I’m now focusing on victron. I think that’s going to be a wider audience, so I’ll show the steps here.

First first thing you have to do is generate tokens. I’m not going to walk you step by step, because you should be using your agent to skim this. Your agent will know what to do.

I I use Claude at the Terminal in Opus – currently the best.

Anyhow they’re going to be a series of posts after this one auto-generated by my agent. That’s not me, but the data will be there.

O N W A R D

-methods

RCA on the SPF 5000ES was blown IGBT on Motherboard

Teardown is in todays playlist:
https://youtube.com/playlist?list=PLGuJySJ3giZdGwtand_MqM3xNXCjnAnmk&si=JHVHi63jWgCcmZ3D

Picture of the damage… 9 parts, 2 detonated

That is definitely a different part number that we replaced on the MPPT board of SN002.

Datasheet:
https://www.st.com/resource/en/datasheet/stgwa80h65dfb.pdf

PN: STGWA80H65DFB
(poor PN as the B read as an 8 and the ST was not marked on the chip)

No Stock at Mouser (on order)
You CAN NOT order the -4 part
https://www.mouser.com/c/?q=STGW80H65DFB

Google says you can only get them from FleaBay and Sketchi-bah-bah but check out what Octopart says!
https://octopart.com/search?q=STGWA80H65DFB&currency=USD&specs=0

Oh bugger – that is an AG (automotive Grade)
At first they seem ALMOST symmetrical but they are not. Read all the specifications and see that we could probably replace all of them with these, but mixing them may result in some miss-match turnon. Bugger.
AG Datasheet: https://www.st.com/resource/en/datasheet/stgwa80h65dfbag.pdf

They are NOT THE SAME! It is not just a part that went thru additional screening and qualification, they ARE different parts. Read all the specs.

grrrr….

Manufacturer has them (Why does Octopart not search this?!?)
https://estore.st.com/en/stgwa80h65dfb-cpn.html

DOH DOH DOH
* First they give me a coupon code that does not work
* Then they make me go all the way thru checkout before telling me they are out of stock
* Idiots

Ok… Ebay it is… but they are 2 for one there, S K E T C H … B R O – and its like a month of shipping, not going to happen

GAHHHHH!

Lets buy 9 of the Automotive Grade and replace them A L L – going to be a lot more work – GRRRRR

Ok, I had to order all 9 to replace them as a pack to play it safe. The others were probably punched H A R D anyway – and – what is messed up is that we still dont have root cause!!!!!

ACK – ok, $100
They are on the way Second Day UPS (best value)

-Schindler

Teaching myself how to Bowhunt

I started by buying a vintage compound bow that was built the year I was born (1977!). I paid around a hundred bucks for it and it came with:

  • Fiberoptic Sights
  • Quiver
  • Shock Absorber
  • Wrist Strap

A few months back we bought about 42 destroyed arrows from the Dead-Store (Used Thrift Store) and glued fletching’s where they were missing. Now we are on to tying a D-Loop to facilitate a trigger actuated Release

Ok – so this is a highly specific rope that is intended to be used for this purpose. I picked a mile of it up off Amazon for 8 bucks along with a $14 release and some knife-proof arm guards.

Fascinating Rope
It is not stiff until you work it in. Speaking of “worked in”… check out my paws! Ack!

I am NOT saying this is the correct way to do it. I am showing that this is how I did mine. The knot will self tighten severely and we will depend on a melted blob to stop it from coming unwound on us.

The only thing I know is that the rope is supposed to exit on OPPOSITE sides as shown above. Apparently this offsets the twisting effect. Anyhow, the loop above is too long, but it works. It was the very first I ever tried to tie.

I left significant “fuzz” to melt so that I felt there was a better knob at the slip point. More advanced shooters hardly have anything…. Pure-Lucky is what holds it together! KEEP IT POINTED DOWN RANGE!

I used a butane torch to set the slack on fire, then let it burn down to the interface, blew it out, and smooshed it. That should hold. The soot on the loop was poor form.

Just looking at it from different angles

At this point I could have pulled in some of the loop to get it closer to 1/2″ or 3/4″. This was my first attempt so I did not fool around trying to get it perfect. I just needed to see if it would work at all!

I also procured some Bees Wax… Kind of wishing I had applied that for the additional friction. I probably will when I re-do this.

The rope burns very predictably and it is not super-sticky like some cheap ropes are. You can pat it down with your finger right away and not end up screaming.

There we have it! Read to tighten and Test!

You can pull the absolute crap out of it with the wife’s pliars

I miss Pictures and Prose. Youtube has sucked the life right out of me.

Yep – Good to go. Lets ship it and see what happens.

Finest Quality Arrows you can get for $5 at the Gray Bears Used Discount Store!

Recently I got thorped BAD by my sons short-bow. That thing is absolutely nothing compared to this, so I am going to wear some guards. These are intended to protect you from dog bites, knife cuts, etc. I am setting up with 2 layers to try and lower the pain level.

Whatever a “CUT LEVEL 5” is, you get these for a couple bucks a piece off Amazon. El’Cheap-o

Ah ha

You are obviously not supposed to clip your forearm with a 50lb Compound Bow! The ticket is to roll your elbow out. Unfortunately I learned with a long bow and a fast draw, so if I get caught up in it… my arm is in the firing line. It will take a lot of time to learn to cock my arm out and not hold it straight.

-Schindler

Background Checks / Job Hunting

If you landed here looking for Patrick Schindler, MSEE Stanford – well, you landed in the right spot. I don’t really use this website much any more… but the contact information is up to date.

  • Email
  • LinkedIn
  • Phone Number

I primarily take work by word of mouth. Every once in a while I take a risk and join an unknown team for a wild adventure.

With the economy what it is, I am currently open to work in any industry, though I strongly prefer work in:

  • Solar, EV, EVSE, Batteries, High Voltage, ebikes, Power Electronics, or anything like that

Within that realm I am comfortable with :

  • R&D Engineering
  • R&D Test Engineering
  • Quality Engineering
  • Manufacturing Test Engineering

I am a hands-on Test Engineer first, so that is how I engineer anything. In the words of Fetchter:

  • “One Test is worth a Thousand Opinions”

I design by breaking the problem up into as many small and testable parts as is practical. I then build only on solid groundwork. I believe Validation is something that is done during the engineering process, not afterward. I believe Test is the core of the engineering process, not an afterthought or regulatory requirement.

Test == Engineering

-Schindler

Schindler Engineering Adventure 001

We had our first official company outing yesterday.

In celebration of Kimberly passing her second CPA exam…  and in anticipation of a lot of hard work coming…  we decided to repel down a cliff to a very hard to access “moonscape” beach.

Here is a map of the location

 

Here is a Photo Sequence

Over the top…

Looking forward to the next trip and hope you will join us.  Here are a few videos

Tidal movement 1 of 3

Tidal movement 2 of 3

Tidal movement 3 of 3

-Patrick