Initial commit, Json formatting, engine, user, producer und meter erstellt.
This commit is contained in:
164
client/main.py
Normal file
164
client/main.py
Normal file
@@ -0,0 +1,164 @@
|
||||
import json
|
||||
import sys
|
||||
import random
|
||||
import JsonHandling as JsonHandling
|
||||
from collections import defaultdict
|
||||
import energyuser as energyuser
|
||||
import random
|
||||
|
||||
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
|
||||
|
||||
def use_energy(self, amount):
|
||||
raise NotImplementedError("Subclasses must implement use_energy method")
|
||||
|
||||
modular = False
|
||||
powersteps = []
|
||||
|
||||
def get_requested_power(self):
|
||||
|
||||
max_power = max(self.powersteps)
|
||||
return max_power if random.choice([True, False]) else max_power
|
||||
return 0
|
||||
|
||||
class User1(EnergyUser):
|
||||
modular = True
|
||||
powersteps = [100, 600]
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
||||
class EnergyUserFactory:
|
||||
@staticmethod
|
||||
def create_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_current_available_power():
|
||||
a = random.randint(0,3000)
|
||||
print(a)
|
||||
return a
|
||||
|
||||
@staticmethod
|
||||
def distribute_energy(energy_users, current_power):
|
||||
remaining_power = current_power - sum(user.current_delta_power for user in energy_users)
|
||||
print(remaining_power)
|
||||
# Filtere Benutzer mit idle = True
|
||||
idle_energy_users = [user for user in energy_users if user.idle]
|
||||
|
||||
# Erweitere die Schritte für modulare Benutzer
|
||||
for user in idle_energy_users:
|
||||
if user.modular:
|
||||
user.powersteps = list(range(min(user.powersteps), max(user.powersteps) + 1))
|
||||
|
||||
# Sortiere die Benutzer nach ihrer Priorität und dann nach ihrer ID
|
||||
idle_energy_users.sort(key=lambda x: (x.user_prio, x.used_energy))
|
||||
|
||||
# Schleife durch alle Prioritäten
|
||||
priorities = set(user.user_prio for user in idle_energy_users)
|
||||
for priority in priorities:
|
||||
# Benutzer mit gleicher Priorität sammeln
|
||||
same_priority_users = [u for u in idle_energy_users if u.user_prio == priority]
|
||||
if not same_priority_users:
|
||||
continue
|
||||
|
||||
# Sammle alle Schritte der Benutzer in einem Array
|
||||
all_steps = []
|
||||
for user in same_priority_users:
|
||||
all_steps.extend([(user, step) for step in user.powersteps])
|
||||
|
||||
# Sortiere die Schritte nach Größe
|
||||
all_steps.sort(key=lambda x: x[1])
|
||||
|
||||
# Variable zur Verfolgung der bereitgestellten Energie für jeden Benutzer
|
||||
user_energy_prov = {user: 0 for user in same_priority_users}
|
||||
|
||||
# Iteriere durch alle Schritte
|
||||
for user, powerstep in all_steps:
|
||||
# Überprüfe, ob noch genügend verbleibende Energie für den nächsten Schritt vorhanden ist
|
||||
if remaining_power >= powerstep - user_energy_prov[user]:
|
||||
# Aktualisiere die verbleibende Energie und die bereitgestellte Energie für den Benutzer
|
||||
remaining_power -= (powerstep - user_energy_prov[user])
|
||||
user_energy_prov[user] = powerstep
|
||||
|
||||
# Verteile die bereitgestellte Energie auf die Benutzer
|
||||
for user in same_priority_users:
|
||||
user.use_energy(user_energy_prov[user])
|
||||
|
||||
print("Final state after distributing power:")
|
||||
for user in energy_users:
|
||||
print(f"{user.ID}: {user.used_energy}")
|
||||
|
||||
# Beispielverwendung
|
||||
json_data = '''
|
||||
{
|
||||
"metadata":{"config_has_changed" : "0"},
|
||||
"users": [
|
||||
{"type": "User1", "config": {"ID":"Umod1","user_prio":1,"lock_prio":2}},
|
||||
{"type": "User1", "config": {"ID":"Umod3","user_prio":3,"lock_prio":4}},
|
||||
{"type": "User1", "config": {"ID":"Umod2","user_prio":2,"lock_prio":3}},
|
||||
{"type": "User1", "config": {"ID":"Umod2","user_prio":2,"lock_prio":3}},
|
||||
{"type": "User1", "config": {"ID":"Umod2","user_prio":2,"lock_prio":3}},
|
||||
{"type": "User1", "config": {"ID":"Umod2","user_prio":2,"lock_prio":3}},
|
||||
{"type": "User2", "config": {"ID":"Usta2","user_prio":2,"lock_prio":6}},
|
||||
{"type": "User2", "config": {"ID":"Usta2","user_prio":2,"lock_prio":6}}
|
||||
]
|
||||
}
|
||||
|
||||
'''
|
||||
|
||||
#
|
||||
Reference in New Issue
Block a user