If you are the owner of a Sonnen battery in your house, there is a good chance that the battery will be connected to your home network, with a local IP, that can be used to obtain status info. The battery has a unauthenticated REST endpoint that can be used to determine the Usable state of charge (USOC).
This is a personal project, with a bespoke use case. I own a Tesla electric vehicle, and want to capatalise on charging my car with mostly free solar energy. This utililty will monitor the battery state of charge on my behalf, based on simplistic upward or downward trends, and notify me when a high or low threshold was crossed that will trigger a manual, human action, to start or stop the charge process of my Tesla to avoid running the risk using grid power (ie, paying for electricity).
- Clone this repo to a local directory
- Copy the template config
cp config.cfg.template config.cfg
- Change the config file, and add your shoutrrr url string (https://containrrr.dev/shoutrrr/)
- Run the daemon by either using a locally built docker container, or as GO service
4.1 Docker:
make docker
4.2 GO:go run cmd/daemon/main.go
Two HTTP API endpoints are available for default configured port 8881
(port value can be changed
via the confguration file). Default rate limit set to 1 per second request to sonnen batterie
http://host:8881/
<- Returns the json payload directly from the sonnen batteriehttp://host:8881/status
<- returns200 OK
when service up and accepting traffic
Instead of building custom / bespoke notification logic, using Shoutrrr allows more range of notification services to be used (example, slack, telegram, email, ms teams, etc)
- Investigate Tesla API's to authomatically start / stop charge
- Abstract Sonnenbatterie specifics to allow extension / addition of alternative battery systems
- Improve trend analysis
- Add support for multiple low and upper threshold notifications
- Add notification black out periods (ie, swallow notifications between 10pm-6am)
- Look at extracting the daemon so other GO developers can use a package approach