Fixed some small bugs, added error handling
This commit is contained in:
parent
701562e9aa
commit
cb03e30928
@ -1,5 +1,6 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
|
||||||
import paho.mqtt.client as mqtt
|
import paho.mqtt.client as mqtt
|
||||||
import os
|
import os
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
@ -7,6 +8,7 @@ from time import time, sleep
|
|||||||
import json
|
import json
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
import requests
|
import requests
|
||||||
|
import urllib3 # only for exception handling
|
||||||
import math
|
import math
|
||||||
|
|
||||||
|
|
||||||
@ -101,12 +103,17 @@ def threaded_solar_power_limit_setting():
|
|||||||
last_time = time()
|
last_time = time()
|
||||||
while True:
|
while True:
|
||||||
# Get current openDTU current limit status
|
# Get current openDTU current limit status
|
||||||
status = requests.get(opendtu_address.strip("/") + "/api/limit/status", auth=(opendtu_user, opendtu_pwd)).json().copy()
|
try:
|
||||||
|
status = requests.get(opendtu_address.strip("/") + "/api/limit/status", auth=(opendtu_user, opendtu_pwd)).json().copy()
|
||||||
|
except (requests.exceptions.RequestException, urllib3.exceptions.HTTPError) as e:
|
||||||
|
print(f"{bcolors.ERROR}Some error occured while trying to reach out to OpenDTU to get latest data about the inverter limit status. Skipping for now.{bcolors.ENDC}\n==== START OF EXCEPTION ====\n{e}\n==== END OF EXCEPTION ====")
|
||||||
|
sleep(0.2) # wait some time (to avaid cpu overload on continuous unavailability of the service)
|
||||||
|
continue # skip this loop pass
|
||||||
|
|
||||||
while(time() - powers["timestamp"] > 1): # wait until recent data is available
|
while(time() - powers["timestamp"] > 1): # wait until recent data is available
|
||||||
sleep(0.2)
|
sleep(0.2)
|
||||||
|
|
||||||
if status[opendtu_inverter_sn]["limit_set_status"] == "Ok" and powers["total"] != None:
|
if status[opendtu_inverter_sn]["limit_set_status"] == "Ok" and powers["total"] != None and status[opendtu_inverter_sn]["max_power"] != 0:
|
||||||
# calculate percentage to set the limit to
|
# calculate percentage to set the limit to
|
||||||
new_ideal_limit = math.floor(((powers["total"]-power_target) / status[opendtu_inverter_sn]["max_power"]) * limit_correction_factor * 1000)/10 # * 100 because its a percentage
|
new_ideal_limit = math.floor(((powers["total"]-power_target) / status[opendtu_inverter_sn]["max_power"]) * limit_correction_factor * 1000)/10 # * 100 because its a percentage
|
||||||
if new_ideal_limit > power_target_max: new_ideal_limit = power_target_max
|
if new_ideal_limit > power_target_max: new_ideal_limit = power_target_max
|
||||||
@ -126,17 +133,29 @@ def threaded_solar_power_limit_setting():
|
|||||||
if new_dampened_limit > power_target_max: new_dampened_limit = power_target_max
|
if new_dampened_limit > power_target_max: new_dampened_limit = power_target_max
|
||||||
if new_dampened_limit < power_target_min: new_dampened_limit = power_target_min
|
if new_dampened_limit < power_target_min: new_dampened_limit = power_target_min
|
||||||
if not dry_run:
|
if not dry_run:
|
||||||
|
request_failed = False
|
||||||
data_to_send = 'data={"serial":"'+opendtu_inverter_sn+'","limit_type":'+str(power_limit_type)+',"limit_value":'+str(new_dampened_limit)+'}'
|
data_to_send = 'data={"serial":"'+opendtu_inverter_sn+'","limit_type":'+str(power_limit_type)+',"limit_value":'+str(new_dampened_limit)+'}'
|
||||||
r = requests.post(opendtu_address.strip("/") + "/api/limit/config", data=data_to_send, headers={'Content-Type':'text/plain'}, auth=(opendtu_user, opendtu_pwd))
|
print(f"Setting new limit via the API: {bcolors.OKBLUE}{bcolors.BOLD}{str(new_dampened_limit)}%{bcolors.ENDC} ({bcolors.OKGREEN}previously: {bcolors.BOLD}{cur_limit}%{bcolors.ENDC} | {bcolors.WARNING}currently targeting: {bcolors.BOLD}{new_ideal_limit}%{bcolors.ENDC})... ", end="")
|
||||||
print(f"Setting new limit over the API: {bcolors.OKBLUE}{bcolors.BOLD}{str(new_dampened_limit)}%{bcolors.ENDC} ({bcolors.OKGREEN}previously: {bcolors.BOLD}{cur_limit}%{bcolors.ENDC} | {bcolors.WARNING}currently targeting: {bcolors.BOLD}{new_ideal_limit}%{bcolors.ENDC})... ", end="")
|
try:
|
||||||
#print(f"Current limit: {cur_limit}, new ideal limit: {new_ideal_limit}, new dampened limit: {new_dampened_limit}")
|
r = requests.post(opendtu_address.strip("/") + "/api/limit/config", data=data_to_send, headers={'Content-Type':'text/plain'}, auth=(opendtu_user, opendtu_pwd))
|
||||||
if json.loads(r.text)["type"] == "success":
|
except BaseException as e:
|
||||||
print(bcolors.OKGREEN+"Success!"+bcolors.ENDC)
|
request_failed = True
|
||||||
else:
|
|
||||||
print(f"{bcolors.FAIL}Unsuccessful :( Code: {bcolors.BOLD}{json.loads(r.text)['code']} ({json.loads(r.text)['type']}){bcolors.ENDC}")
|
if request_failed:
|
||||||
print(r.text) # keep and uncomment for debug reasons
|
print(f"{bcolors.FAIL}Unsuccessful :( The http request failed somehow. Printing traceback.{bcolors.ENDC}\n{e}")
|
||||||
|
else:
|
||||||
|
if "type" in json.loads(r.text).keys() and "code" in json.loads(r.text).keys():
|
||||||
|
if json.loads(r.text)["type"] == "success":
|
||||||
|
print(f"{bcolors.OKGREEN}Success!{bcolors.ENDC}")
|
||||||
|
else:
|
||||||
|
print(f"{bcolors.FAIL}Unsuccessful :( Code: {bcolors.BOLD}{json.loads(r.text)['code']} ({json.loads(r.text)['type']}){bcolors.ENDC}")
|
||||||
|
print(r.text) # keep and uncomment for debug reasons
|
||||||
|
else:
|
||||||
|
print(f"{bcolors.FAIL}Failed. Got some weird response from OpenDTU while trying to set the new limit. Maybe the OpenDTU API has changed?{bcolors.ENDC}\nOpenDTUs response: (needs to be in JSON and contain the keys 'code' and 'type')\n{r.text}")
|
||||||
else:
|
else:
|
||||||
print(f"{bcolors.WARNING}Now the new limit would be set over the API (but DRY_RUN is either not specified or True): {str(new_limit)}%")
|
print(f"{bcolors.WARNING}Now the new limit would be set via the API (but DRY_RUN is either not specified or True): {str(new_limit)}%")
|
||||||
|
elif status[opendtu_inverter_sn]["max_power"] == 0:
|
||||||
|
print(f"{bcolors.ERROR}OpenDTU is reporting strange values for the inverter's maximum power output. Skipping it for now.{bcolors.ENDC}")
|
||||||
|
|
||||||
|
|
||||||
while (time() - last_time) < limit_update_interval:
|
while (time() - last_time) < limit_update_interval:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user