Last active
February 26, 2024 15:09
-
-
Save RustyDust/2dfdd9e9d0f3b5476b5e466203123f6f to your computer and use it in GitHub Desktop.
Test output from a SonnenBatterie
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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
commented
Feb 26, 2024
•
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment