Initial commit, Json formatting, engine, user, producer und meter erstellt.
This commit is contained in:
116
client/energymeter.py
Normal file
116
client/energymeter.py
Normal file
@@ -0,0 +1,116 @@
|
||||
import sys
|
||||
import json
|
||||
import requests
|
||||
|
||||
class EnergyMeter:
|
||||
def __init__(self, config):
|
||||
self.ID = config.get("ID")
|
||||
self.IP = config.get("IP")
|
||||
self.Adr = config.get("Adr")
|
||||
|
||||
|
||||
def get_current_value(self):
|
||||
raise NotImplementedError("Subclasses must implement use_energy method")
|
||||
|
||||
|
||||
|
||||
@staticmethod
|
||||
def create_meterlist_from_json(json_data):
|
||||
subclasses = [cls for cls in sys.modules[__name__].__dict__.values() if isinstance(cls, type) and issubclass(cls, EnergyMeter) and cls != EnergyMeter]
|
||||
|
||||
energy_meters = []
|
||||
data = json.loads(json_data)
|
||||
|
||||
for user_data in data["meters"]:
|
||||
user_type = user_data["type"]
|
||||
user_config = user_data["config"]
|
||||
for subclass in subclasses:
|
||||
if user_type in subclass.__name__:
|
||||
energy_meters.append(subclass(user_config))
|
||||
|
||||
return energy_meters
|
||||
|
||||
@staticmethod
|
||||
def get_all_current_values(meters):
|
||||
data = {"Meter_Sum": {"success": True, "Current_AC_Phase_1": 0, "Current_AC_Phase_2": 0, "Current_AC_Phase_3": 0, "PowerReal_P_Sum": 0}}
|
||||
for meter in meters:
|
||||
if isinstance(meter, EnergyMeter):
|
||||
current_value = meter.get_current_value()
|
||||
meter_data = {
|
||||
"success": current_value["success"],
|
||||
"Current_AC_Phase_1": current_value.get("Current_AC_Phase_1", 0),
|
||||
"Current_AC_Phase_2": current_value.get("Current_AC_Phase_2", 0),
|
||||
"Current_AC_Phase_3": current_value.get("Current_AC_Phase_3", 0),
|
||||
"PowerReal_P_Sum": current_value.get("PowerReal_P_Sum", 0)
|
||||
}
|
||||
data[meter.ID] = meter_data
|
||||
if current_value["success"]:
|
||||
data["Meter_Sum"]["success"] &= True
|
||||
data["Meter_Sum"]["Current_AC_Phase_1"] += meter_data["Current_AC_Phase_1"]
|
||||
data["Meter_Sum"]["Current_AC_Phase_2"] += meter_data["Current_AC_Phase_2"]
|
||||
data["Meter_Sum"]["Current_AC_Phase_3"] += meter_data["Current_AC_Phase_3"]
|
||||
data["Meter_Sum"]["PowerReal_P_Sum"] += meter_data["PowerReal_P_Sum"]
|
||||
else:
|
||||
data["Meter_Sum"]["success"] &= False
|
||||
return data
|
||||
|
||||
|
||||
|
||||
class Meter1(EnergyMeter):
|
||||
|
||||
def __init__(self, config):
|
||||
self.ID = config.get("ID")
|
||||
self.IP = config.get("IP")
|
||||
self.Adr = config.get("Adr")
|
||||
|
||||
|
||||
def get_current_value(self):
|
||||
raise NotImplementedError("Subclasses must implement use_energy method")
|
||||
|
||||
class Meter2(EnergyMeter):
|
||||
|
||||
def __init__(self, config):
|
||||
self.ID = config.get("ID")
|
||||
self.IP = config.get("IP")
|
||||
self.Adr = config.get("Adr")
|
||||
|
||||
|
||||
|
||||
def get_current_value(self):
|
||||
|
||||
raise NotImplementedError("Subclasses must implement use_energy method")
|
||||
|
||||
|
||||
class Fronius(EnergyMeter):
|
||||
|
||||
def __init__(self, config):
|
||||
self.ID = config.get("ID")
|
||||
self.IP = config.get("IP")
|
||||
self.Adr = config.get("Adr")
|
||||
|
||||
|
||||
def get_current_value(self):
|
||||
url = f"http://{self.IP}/solar_api/v1/GetMeterRealtimeData.cgi?Scope=System"
|
||||
try:
|
||||
response = requests.get(url)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
if "Body" in data and "Data" in data["Body"]:
|
||||
meter_data = data["Body"]["Data"]
|
||||
if str(self.Adr) in meter_data:
|
||||
meter_values = meter_data[str(self.Adr)]
|
||||
current_ac_phase_1 = meter_values.get("Current_AC_Phase_1", 0)
|
||||
current_ac_phase_2 = meter_values.get("Current_AC_Phase_2", 0)
|
||||
current_ac_phase_3 = meter_values.get("Current_AC_Phase_3", 0)
|
||||
power_real_p_sum = meter_values.get("PowerReal_P_Sum", 0)
|
||||
return {"success": True,
|
||||
"Current_AC_Phase_1": current_ac_phase_1,
|
||||
"Current_AC_Phase_2": current_ac_phase_2,
|
||||
"Current_AC_Phase_3": current_ac_phase_3,
|
||||
"PowerReal_P_Sum": power_real_p_sum}
|
||||
return {"success": False}
|
||||
else:
|
||||
return {"success": False}
|
||||
except Exception as e:
|
||||
print(f"An error occurred: {str(e)}")
|
||||
return {"success": False}
|
||||
Reference in New Issue
Block a user