Adding a Battery to My Balcony Solar and Reverse-Engineering Local Control

Slotting a Marstek B2500-D between my panels and inverter, expecting a cleaner local API, and ending up building two open-source Go services around its undocumented MQTT interface.