Initial commit, Json formatting, engine, user, producer und meter erstellt.

This commit is contained in:
2024-04-12 16:52:15 +02:00
commit 46f2083490
19 changed files with 1027 additions and 0 deletions

222
client/energyuser.py Normal file
View 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}