Skip to content

Commit

Permalink
Update sunsynkapi.py
Browse files Browse the repository at this point in the history
  • Loading branch information
MorneSaunders360 committed Apr 3, 2024
1 parent e6114be commit f38fc25
Showing 1 changed file with 39 additions and 48 deletions.
87 changes: 39 additions & 48 deletions custom_components/solar_sunsynk/sunsynkapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ async def request(self, method, path, body, autoAuth):
if not self.token or self.token_expires <= datetime.now():
responseAuth = await self.authenticate(self.username, self.password)
self.token = responseAuth["data"]["access_token"]
# Assuming the token expires in 1 hour
self.token_expires = datetime.now() + timedelta(hours=1)
expires_in_seconds = responseAuth["data"]["expires_in"]
self.token_expires = datetime.now() + timedelta(seconds=expires_in_seconds)
headers = {
'Content-Type': 'application/json',
"Authorization": f"Bearer {self.token}"
Expand All @@ -38,8 +38,6 @@ async def request(self, method, path, body, autoAuth):
elif self.region == SunsynkApiNames.Region2:
host = 'https://api.sunsynk.net/'
url = host + path
#_LOGGER.error("body: %s", body)
#_LOGGER.error("headers: %s", headers)
response = await self.hass.async_add_executor_job(
partial(self._send_request, method, url, headers, body)
)
Expand Down Expand Up @@ -86,72 +84,66 @@ async def get_inverter_output_data(self,id):
# async def get_inverter_load_data(self,id):
# now = datetime.today().strftime('%Y-%m-%d')
# return await self.request('GET', f'api/v1/inverter/grid/{id}/day?lan=en&date={now}&column=pac', None,True)

async def get_plant_data(self):
return await self.request('GET', f'api/v1/plants?page=1&limit=10&name=&status=', None,True)
return await self.request('GET', f'api/v1/plants?page=1&limit=10', None,True)
async def get_energy_flow_data(self,id):
return await self.request('GET', f'api/v1/plant/energy/{id}/flow', None,True)
async def get_realtime_data(self,id):
return await self.request('GET', f'api/v1/plant/{id}/realtime?id={id}', None,True)
async def safe_fetch(self, coroutine, *args, error_message="Error"):
"""Safely fetch data using the provided coroutine function and arguments."""
try:
data = await coroutine(*args)
return data
except Exception as e:
_LOGGER.error(f"Calling {coroutine.__name__} with args: {args}")
_LOGGER.error(f"{error_message}: {e}")
return None

async def get_all_data(self):
all_data = {}

# Get plant data
try:
plant_data = await self.get_plant_data()
if plant_data is None or "data" not in plant_data or "infos" not in plant_data["data"]:
_LOGGER.error("Unable to fetch or parse plant data")
return None
except Exception as e:
_LOGGER.error(f"Error while getting plant data: {e}")
# Attempt to fetch plant data
plant_data = await self.safe_fetch(self.get_plant_data, error_message="Error while getting plant data")
if plant_data is None or "data" not in plant_data or "infos" not in plant_data["data"]:
return None

# Assuming that plant_data is a JSON object with a key "plants" that contains a list of plants
# Each plant is assumed to be a JSON object with a key "id" that contains the plant ID

for plant in plant_data["data"]["infos"]:
plant_id = plant["id"]
try:
inverterdata = await self.get_inverters_data(plant_id)
if inverterdata is None or "data" not in inverterdata or "infos" not in inverterdata["data"]:
_LOGGER.error("Unable to fetch or parse inverter data")
continue
except Exception as e:
_LOGGER.error(f"Error while getting inverter data: {e}")
inverterdata = await self.safe_fetch(self.get_inverters_data, plant_id, error_message="Error while getting inverter data")
if inverterdata is None or "data" not in inverterdata or "infos" not in inverterdata["data"]:
continue

for inverter in inverterdata["data"]["infos"]:
inverterId = inverter["sn"]
# Get energy flow data for this plant
try:
inverter_data = await self.get_inverter_data(inverterId)
inverter_load_data = await self.get_inverter_load_data(inverterId)
inverter_grid_data = await self.get_inverter_grid_data(inverterId)
inverter_battery_data = await self.get_inverter_battery_data(inverterId)
inverter_input_data = await self.get_inverter_input_data(inverterId)
inverter_output_data = await self.get_inverter_output_data(inverterId)
inverter_settings = await self.get_settings(inverterId)
except Exception as e:
_LOGGER.error(f"Error while getting inverter related data: {e}")
continue

inverter_data = await self.safe_fetch(self.get_inverter_data, inverterId, error_message="Error while getting inverter data")
inverter_load_data = await self.safe_fetch(self.get_inverter_load_data, inverterId, error_message="Error while getting inverter load data")
inverter_grid_data = await self.safe_fetch(self.get_inverter_grid_data, inverterId, error_message="Error while getting inverter grid data")
inverter_battery_data = await self.safe_fetch(self.get_inverter_battery_data, inverterId, error_message="Error while getting inverter battery data")
inverter_input_data = await self.safe_fetch(self.get_inverter_input_data, inverterId, error_message="Error while getting inverter input data")
inverter_output_data = await self.safe_fetch(self.get_inverter_output_data, inverterId, error_message="Error while getting inverter output data")
inverter_settings = await self.safe_fetch(self.get_settings, inverterId, error_message="Error while getting inverter settings")

plant_sn_id = f"sunsynk_{plant_id}_{inverterId}"
# Add data to all_data
all_data[plant_sn_id] = {
"inverter_data": inverter_data["data"],
"inverter_load_data": inverter_load_data["data"],
"inverter_grid_data": inverter_grid_data["data"],
"inverter_battery_data": inverter_battery_data["data"],
"inverter_input_data": inverter_input_data["data"],
"inverter_output_data": inverter_output_data["data"],
"inverter_settings_data": inverter_settings["data"],
"inverter_data": inverter_data["data"] if inverter_data else None,
"inverter_load_data": inverter_load_data["data"] if inverter_load_data else None,
"inverter_grid_data": inverter_grid_data["data"] if inverter_grid_data else None,
"inverter_battery_data": inverter_battery_data["data"] if inverter_battery_data else None,
"inverter_input_data": inverter_input_data["data"] if inverter_input_data else None,
"inverter_output_data": inverter_output_data["data"] if inverter_output_data else None,
"inverter_settings_data": inverter_settings["data"] if inverter_settings else None,
}
return all_data


return all_data


async def get_settings(self,sn):
return await self.request('GET', f'api/v1/common/setting/{sn}/read', None,True)
async def set_settings(self, sn,setting_data):
return await self.request('POST', f'api/v1/common/setting/{sn}/set', setting_data,True)

def authenticate(self, username, password):
pool_data = {
"username": username,
Expand All @@ -165,4 +157,3 @@ def authenticate(self, username, password):
_LOGGER.error(f"Error during authentication: {e}")
return None


0 comments on commit f38fc25

Please sign in to comment.