Initial commit, Json formatting, engine, user, producer und meter erstellt.
This commit is contained in:
222
client/energyuser.py
Normal file
222
client/energyuser.py
Normal file
@@ -0,0 +1,222 @@
|
||||
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}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user