Skip to content

Instantly share code, notes, and snippets.

@RustyDust
Last active February 26, 2024 15:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RustyDust/2dfdd9e9d0f3b5476b5e466203123f6f to your computer and use it in GitHub Desktop.
Save RustyDust/2dfdd9e9d0f3b5476b5e466203123f6f to your computer and use it in GitHub Desktop.
Test output from a SonnenBatterie
#!/usr/bin/env python3
import requests
import hashlib
from pprint import pprint
USERNAME = ''
PASSWORD = ''
HOSTADDR = ''
class sonnenbatterie:
def __init__(self,username,password,ipaddress):
self.username=username
self.password=password
self.ipaddress=ipaddress
self.baseurl='http://'+self.ipaddress+'/api/'
self._login()
def _login(self):
password_sha512 = hashlib.sha512(self.password.encode('utf-8')).hexdigest()
req_challenge=requests.get(self.baseurl+'challenge')
req_challenge.raise_for_status()
challenge=req_challenge.json()
response=hashlib.pbkdf2_hmac('sha512',password_sha512.encode('utf-8'),challenge.encode('utf-8'),7500,64).hex()
getsession=requests.post(self.baseurl+'session',{"user":self.username,"challenge":challenge,"response":response})
getsession.raise_for_status()
token=getsession.json()['authentication_token']
self.token=token
def _get(self,what,isretry=False):
response=requests.get(self.baseurl+what,
headers={'Auth-Token': self.token},
)
if not isretry and response.status_code==401:
self._login()
return self._get(what,True)
if response.status_code != 200:
response.raise_for_status()
return response.json()
def get_powermeter(self):
return self._get("powermeter")
def get_batterysystem(self):
return self._get("battery_system")
def get_inverter(self):
return self._get("inverter")
def get_systemdata(self):
return self._get("system_data")
def get_status(self):
return self._get("v1/status")
def get_battery(self):
return self._get("battery")
if (__name__ == '__main__'):
sb = sonnenbatterie(USERNAME, PASSWORD, HOSTADDR)
print("\nPower:\n")
pprint(sb.get_powermeter())
print("\nBattery System:\n")
pprint(sb.get_batterysystem())
print("\nInverter:\n")
pprint(sb.get_inverter())
print("\nSystem Data:\n")
pprint(sb.get_systemdata())
print("\nStatus:\n")
pprint(sb.get_status())
print("\nBattery:\n")
pprint(sb.get_battery())
@Niemeyer1978
Copy link

Niemeyer1978 commented Feb 26, 2024

using System;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;

class Sonnenbatterie
{
    private string username;
    private string password;
    private string ipaddress;
    private string baseurl;
    private string token;

    public Sonnenbatterie(string username, string password, string ipaddress)
    {
        this.username = username;
        this.password = password;
        this.ipaddress = ipaddress;
        this.baseurl = "http://" + this.ipaddress + "/api/";
        this.Login();
    }

    private async void Login()
    {
        string password_sha512 = BitConverter.ToString(new SHA512Managed().ComputeHash(Encoding.UTF8.GetBytes(this.password))).Replace("-", "");
        using (var httpClient = new HttpClient())
        {
            HttpResponseMessage req_challenge = await httpClient.GetAsync(this.baseurl + "challenge");
            req_challenge.EnsureSuccessStatusCode();
            string challenge = await req_challenge.Content.ReadAsStringAsync();

            byte[] responseBytes = new Rfc2898DeriveBytes(password_sha512, Encoding.UTF8.GetBytes(challenge), 7500).GetBytes(64);
            string response = BitConverter.ToString(responseBytes).Replace("-", "");

            HttpResponseMessage getsession = await httpClient.PostAsync(this.baseurl + "session",
                new StringContent($"{{\"user\":\"{this.username}\",\"challenge\":\"{challenge}\",\"response\":\"{response}\"}}", Encoding.UTF8, "application/json"));
            getsession.EnsureSuccessStatusCode();
            JObject responseJson = JObject.Parse(await getsession.Content.ReadAsStringAsync());
            this.token = (string)responseJson["authentication_token"];
        }
    }

    private async Task<JObject> Get(string what, bool isretry = false)
    {
        using (var httpClient = new HttpClient())
        {
            httpClient.DefaultRequestHeaders.Add("Auth-Token", this.token);
            HttpResponseMessage response = await httpClient.GetAsync(this.baseurl + what);
            if (!isretry && response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
            {
                await this.LoginAsync();
                return await this.Get(what, true);
            }
            response.EnsureSuccessStatusCode();
            string responseContent = await response.Content.ReadAsStringAsync();
            return JObject.Parse(responseContent);
        }
    }

    public async Task<JObject> GetPowerMeter()
    {
        return await this.Get("powermeter");
    }

    public async Task<JObject> GetBatterySystem()
    {
        return await this.Get("battery_system");
    }

    public async Task<JObject> GetInverter()
    {
        return await this.Get("inverter");
    }

    public async Task<JObject> GetSystemData()
    {
        return await this.Get("system_data");
    }

    public async Task<JObject> GetStatus()
    {
        return await this.Get("v1/status");
    }

    public async Task<JObject> GetBattery()
    {
        return await this.Get("battery");
    }
}

class Program
{
    static async Task Main(string[] args)
    {
        string USERNAME = "";
        string PASSWORD = "";
        string HOSTADDR = "";

        Sonnenbatterie sb = new Sonnenbatterie(USERNAME, PASSWORD, HOSTADDR);
        Console.WriteLine("\nPower:\n");
        Console.WriteLine(sb.GetPowerMeter().Result);
        Console.WriteLine("\nBattery System:\n");
        Console.WriteLine(sb.GetBatterySystem().Result);
        Console.WriteLine("\nInverter:\n");
        Console.WriteLine(sb.GetInverter().Result);
        Console.WriteLine("\nSystem Data:\n");
        Console.WriteLine(sb.GetSystemData().Result);
        Console.WriteLine("\nStatus:\n");
        Console.WriteLine(sb.GetStatus().Result);
        Console.WriteLine("\nBattery:\n");
        Console.WriteLine(sb.GetBattery().Result);
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment