223 lines
6.9 KiB
Python
223 lines
6.9 KiB
Python
import random
|
|
import sys
|
|
import json
|
|
import requests
|
|
class EnergyUser:
|
|
def __init__(self, config):
|
|
self.ID = config.get("ID")
|
|
self.user_prio = config.get("user_prio", 0)
|
|
self.lock_prio = config.get("lock_prio", 0)
|
|
self.idle = True
|
|
self.used_energy = 0
|
|
self.current_power = 0
|
|
self.current_delta_power = 0
|
|
|
|
self.modular = False
|
|
self.powersteps = []
|
|
|
|
def calc_used_power(self):
|
|
raise NotImplementedError("Subclasses must implement use_energy method")
|
|
|
|
|
|
|
|
def use_energy(self, amount):
|
|
raise NotImplementedError("Subclasses must implement use_energy method")
|
|
|
|
|
|
|
|
|
|
def get_current_values(self):
|
|
raise NotImplementedError("Subclasses must implement use_energy method")
|
|
|
|
|
|
def get_requested_power(self):
|
|
|
|
max_power = max(self.powersteps)
|
|
return max_power if random.choice([True, False]) else max_power
|
|
return 0
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
def create_userlist_from_json(json_data):
|
|
subclasses = [cls for cls in sys.modules[__name__].__dict__.values() if isinstance(cls, type) and issubclass(cls, EnergyUser) and cls != EnergyUser]
|
|
|
|
energy_users = []
|
|
data = json.loads(json_data)
|
|
|
|
for user_data in data["users"]:
|
|
user_type = user_data["type"]
|
|
user_config = user_data["config"]
|
|
for subclass in subclasses:
|
|
if user_type in subclass.__name__:
|
|
energy_users.append(subclass(user_config))
|
|
|
|
return energy_users
|
|
|
|
|
|
|
|
@staticmethod
|
|
def get_all_current_values(users):
|
|
data = {"User_data": { "Current_Power": 0, "Used_Energy": 0, "Current_Prio": 0, "Current_deltaPower": 0, "measured_Temp": 0}}
|
|
for user in users:
|
|
current_value = user.get_current_value()
|
|
userdata = {
|
|
"Current_Power": current_value.get("Current_Power", 0),
|
|
"Used_Energy": current_value.get("Used_Energy", 0),
|
|
"Current_Prio": current_value.get("Current_Prio", 0),
|
|
"Current_deltaPower": current_value.get("Current_deltaPower", 0),
|
|
"measured_Temp": current_value.get("measured_Temp", 0)
|
|
}
|
|
|
|
data[user.ID] = userdata
|
|
return data
|
|
|
|
|
|
|
|
class User1(EnergyUser):
|
|
|
|
def __init__(self, config):
|
|
self.ID = config.get("ID")
|
|
self.user_prio = config.get("user_prio", 0)
|
|
self.lock_prio = config.get("lock_prio", 0)
|
|
self.idle = True
|
|
self.used_energy = 6
|
|
self.current_power = 0
|
|
self.current_delta_power = 0
|
|
|
|
self.modular = False
|
|
self.powersteps = [100, 600]
|
|
|
|
|
|
def calc_used_power(self):
|
|
pass
|
|
|
|
|
|
def use_energy(self, amount):
|
|
print(f"Using energy as {self.ID} with amount {amount}")
|
|
# Hier kannst du die spezifische Logik für User 1 implementieren
|
|
|
|
def get_current_value(self):
|
|
return {"Current_Power": self.current_power,
|
|
"Used_Energy": self.used_energy,
|
|
"Current_Prio": self.user_prio,
|
|
"Idle": self.idle,
|
|
"Current_deltaPower": self.current_delta_power}
|
|
|
|
|
|
|
|
|
|
|
|
class User2(EnergyUser):
|
|
modular = False
|
|
powersteps = [200, 400]
|
|
|
|
def __init__(self, config):
|
|
self.ID = config.get("ID")
|
|
self.user_prio = config.get("user_prio", 0)
|
|
self.lock_prio = config.get("lock_prio", 0)
|
|
self.idle = True
|
|
self.used_energy = 4
|
|
self.current_power = 0
|
|
self.current_delta_power = 0
|
|
|
|
self.modular = False
|
|
self.powersteps = [0]
|
|
|
|
|
|
def calc_used_power(self):
|
|
pass
|
|
|
|
|
|
def use_energy(self, amount):
|
|
print(f"Using energy as {self.ID} with amount {amount}")
|
|
# Hier kannst du die spezifische Logik für User 2 implementieren
|
|
|
|
def get_current_value(self):
|
|
return {"Current_Power": self.current_power,
|
|
"Used_Energy": self.used_energy,
|
|
"Current_Prio": self.user_prio,
|
|
"Current_deltaPower": self.current_delta_power}
|
|
|
|
|
|
|
|
|
|
class Boiler_1Stufig_Shelly(EnergyUser):
|
|
|
|
def __init__(self, config):
|
|
self.ID = config.get("ID")
|
|
self.user_prio = config.get("user_prio", 0)
|
|
self.lock_prio = config.get("lock_prio", 0)
|
|
self.idle = True
|
|
self.used_energy = 0
|
|
self.current_power = 0
|
|
self.current_delta_power = 0
|
|
|
|
self.modular = False
|
|
self.powersteps = [0]
|
|
|
|
self.measured_Temp =0
|
|
# userdefinierte Variablen
|
|
self.boilerleistung = config.get("boilerpower", 0)
|
|
self.temperatur = config.get("temperatur", 0)
|
|
self.shelly_ip = config.get("shelly_ip")
|
|
|
|
|
|
def get_shelly_temperature(self):
|
|
try:
|
|
url = f"http://{self.shelly_ip}/status"
|
|
response = requests.get(url)
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
temperature = data.get("ext_temperature", {}).get("0", {}).get("tC")
|
|
self.measured_Temp =temperature
|
|
|
|
return temperature
|
|
else:
|
|
print("Failed to get temperature from Shelly.")
|
|
self.measured_Temp = 0
|
|
|
|
return None
|
|
except Exception as e:
|
|
print(f"Error occurred while getting temperature from Shelly: {e}")
|
|
return None
|
|
|
|
def set_shelly_output(self, state):
|
|
try:
|
|
url = f"http://{self.shelly_ip}/relay/0?turn={'on' if state else 'off'}"
|
|
response = requests.get(url)
|
|
if response.status_code != 200:
|
|
print("Failed to set Shelly output state.")
|
|
except Exception as e:
|
|
print(f"Error occurred while setting Shelly output state: {e}")
|
|
|
|
def calc_used_power(self):
|
|
|
|
temperature = self.get_shelly_temperature()
|
|
if temperature is not None and temperature < self.temperatur:
|
|
self.powersteps[0] = self.boilerleistung
|
|
else:
|
|
self.current_power = 0
|
|
|
|
def use_energy(self, amount):
|
|
if amount == self.boilerleistung:
|
|
self.set_shelly_output(True)
|
|
else:
|
|
self.set_shelly_output(False)
|
|
print(f"Using energy as {self.ID} with amount {amount}")
|
|
|
|
def get_current_value(self):
|
|
return {"Current_Power": self.current_power,
|
|
"Used_Energy": self.used_energy,
|
|
"Current_Prio": self.user_prio,
|
|
"measured_Temp": self.measured_Temp,
|
|
|
|
"Idle": self.idle,
|
|
"Current_deltaPower": self.current_delta_power}
|
|
|
|
|
|
|
|
|
|
|