Skip to content

Commit 0791acc

Browse files
committed
fix ...
1 parent a40a349 commit 0791acc

File tree

7 files changed

+59
-68
lines changed

7 files changed

+59
-68
lines changed

core/conditions.py

+9-40
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,9 @@ def add_additional_discharging_conditions(self):
215215
def add_abort_conditions(self):
216216

217217
required_capacity = self._calculate_required_capacity_for_period()
218-
available_soc_wh, _, min_soc_wh = self._calculate_current_soc_wh()
218+
available_soc_wh = self.essunit.get_battery_current_wh()
219+
min_soc_wh = self.essunit.get_battery_min_wh()
220+
219221
available_soc_wh -= min_soc_wh
220222
additional_prices = self.items.get_lowest_prices(self.config.number_of_lowest_prices_for_charging)
221223

@@ -327,43 +329,9 @@ def _calculate_required_capacity(self, upcoming_hours):
327329
self.logger.log.debug(f"Required capacity: {required_capacity:.2f} Wh")
328330
return required_capacity
329331

330-
def _calculate_current_soc_wh(self):
331-
try:
332-
# Check if the relevant data is present and valid
333-
if self.solardata.soc is None or self.solardata.soc < 0:
334-
raise ValueError("SOC value is missing or invalid.")
335-
if self.solardata.battery_capacity is None or self.solardata.battery_capacity <= 0:
336-
raise ValueError("Battery capacity is missing or invalid.")
337-
if self.solardata.battery_minimum_soc_limit is None or self.solardata.battery_minimum_soc_limit < 0:
338-
raise ValueError("Minimum SOC limit is missing or invalid.")
339-
340-
efficiency = self.config.converter_efficiency[0]
341-
342-
# Calculate the full capacity
343-
full_capacity = (
344-
self.solardata.battery_capacity / self.solardata.soc) * 100 * efficiency if self.solardata.soc > 0 else 0.0
345-
battery_capacity_wh = full_capacity * 54.20 * efficiency # Battery capacity in Wh
346-
347-
# Calculate the current SOC in Wh
348-
current_soc_wh = ((self.solardata.soc or 0) / 100) * battery_capacity_wh
349-
350-
# Calculate the minimum SOC in Wh (including the minimum SOC limit)
351-
min_soc_wh = (self.solardata.battery_minimum_soc_limit / 100) * battery_capacity_wh
352-
353-
return current_soc_wh, battery_capacity_wh, min_soc_wh
354-
355-
except ZeroDivisionError:
356-
# Error handling for division by zero when SOC is 0
357-
self.logger.log.error("Division by zero during the calculation of full capacity.")
358-
return 0.0, 0.0, 0.0
359-
360-
except ValueError as e:
361-
# Error handling for invalid or missing inputs
362-
self.logger.log.error(f"Error during SOC calculation: {str(e)}")
363-
return 0.0, 0.0, 0.0
364-
365332
def _calculate_available_surplus(self, upcoming_high_prices):
366-
current_soc_wh, akkukapazitaet_wh, min_soc_wh = self._calculate_current_soc_wh()
333+
current_soc_wh = self.essunit.get_battery_current_wh()
334+
min_soc_wh = self.essunit.get_battery_min_wh()
367335

368336
required_capacity = self._calculate_required_capacity(len(upcoming_high_prices))
369337

@@ -497,7 +465,7 @@ def _calculate_required_capacity_for_period(self):
497465

498466
self.logger.log.info(f"Required capacity for period: {required_capacity:.2f} Wh {remaining_description} "
499467
f"/ current SOC {self.solardata.soc}% "
500-
f"({self._calculate_current_soc_wh()[0]:.2f} Wh)")
468+
f"({self.essunit.get_battery_current_wh():.2f} Wh)")
501469

502470
return required_capacity
503471

@@ -530,8 +498,9 @@ def _check_for_cheaper_hours(self, additional_prices):
530498
current_hour_start = now.replace(minute=0, second=0, microsecond=0)
531499

532500
current_soc = self.essunit.get_soc()
533-
if current_soc > 99.0:
534-
self.logger.log.debug(f"SoC is {current_soc:.2f}%, charging is unnecessary.")
501+
scheduler_soc = self.essunit.get_scheduler_soc()
502+
if current_soc >= scheduler_soc:
503+
self.logger.log.debug(f"SoC is {current_soc:.2f}%, Sheduler Soc is {scheduler_soc}, charging is unnecessary.")
535504
return True
536505

537506
# additional_prices = [

core/mqttclient.py

+9-7
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ def subscribe_multiple(self, subscribers_instance, query_topics):
346346
self.logger.log.error("Failed to connect to the MQTT broker.")
347347
return 1
348348

349-
self.client.loop_start()
349+
# self.client.loop_start()
350350

351351
# Abonnements für die angegebenen Themen einrichten
352352
for query_topic in query_topics:
@@ -390,7 +390,7 @@ def subscribe_multiple(self, subscribers_instance, query_topics):
390390
self.logger.log.debug("Finish subcribe ...")
391391
# Ressourcen freigeben
392392
self.client.unsubscribe("#")
393-
self.client.loop_stop()
393+
# self.client.loop_stop()
394394
# self.disconnect()
395395

396396
return result
@@ -408,7 +408,7 @@ def subscribe(self, mqtt_result, query_topic):
408408
if not self.connect():
409409
return 1
410410

411-
self.client.loop_start()
411+
# self.client.loop_start()
412412

413413
start_time = time.time()
414414
while not self.flag_connected:
@@ -443,7 +443,7 @@ def subscribe(self, mqtt_result, query_topic):
443443
finally:
444444
self.logger.log.debug("Finish subcribe ...")
445445
self.client.unsubscribe("#")
446-
self.client.loop_stop()
446+
# self.client.loop_stop()
447447
# self.disconnect()
448448

449449
return result
@@ -459,7 +459,7 @@ def publish(self, query_topic, query_message):
459459
if not self.connect():
460460
return 1
461461

462-
self.client.loop_start()
462+
# self.client.loop_start()
463463

464464
start_time = time.time()
465465

@@ -482,7 +482,7 @@ def publish(self, query_topic, query_message):
482482

483483
finally:
484484
self.logger.log.debug("Finish subcribe ...")
485-
self.client.loop_stop()
485+
# self.client.loop_stop()
486486
# self.disconnect()
487487

488488
return result
@@ -492,6 +492,7 @@ def connect(self):
492492
self.logger.log.debug(f"connect to: {self.mqtt_broker}:{self.mqtt_port}")
493493
if self.client.is_connected(): return True
494494
self.client.connect(self.mqtt_broker, self.mqtt_port, 60)
495+
self.client.loop_start()
495496
return True
496497
except ConnectionRefusedError:
497498
self.logger.log.error(
@@ -503,4 +504,5 @@ def connect(self):
503504

504505
def disconnect(self):
505506
if self.client:
506-
self.client.disconnect()
507+
self.client.loop_stop()
508+
self.client.disconnect()

essunit/abstract_classes/essunit.py

+6
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ def get_battery_current_voltage(self):
5757
def get_battery_current_wh(self):
5858
pass
5959

60+
def get_battery_full_wh(self):
61+
pass
62+
63+
def get_battery_min_wh(self):
64+
pass
65+
6066
def get_battery_minimum_soc_limit(self):
6167
pass
6268

essunit/victron.py

+32-18
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,25 @@ def get_battery_current_voltage(self):
104104
return currentvoltage
105105

106106
def get_battery_current_wh(self):
107-
soc = self.get_soc()
107+
soc = self.get_soc() or 0
108108
full_capacity = (self.get_battery_capacity() / soc) * 100 if soc > 0 else 0.0
109109
battery_capacity_wh = full_capacity * 55.20
110110
battery_current_wh = ((soc or 0) / 100) * battery_capacity_wh
111111
self.logger.log.debug(f"{self._name} Batterie Current wh: {battery_current_wh}Wh")
112112
return battery_current_wh
113113

114+
def get_battery_full_wh(self):
115+
soc = self.get_soc() or 0
116+
full_capacity = (self.get_battery_capacity() / soc) * 100 if soc > 0 else 0.0
117+
battery_capacity_wh = full_capacity * 55.20
118+
self.logger.log.debug(f"{self._name} Batterie Full wh: {battery_capacity_wh}Wh")
119+
return battery_capacity_wh
120+
121+
def get_battery_min_wh(self):
122+
min_soc_limit = self.get_battery_minimum_soc_limit() or 0
123+
battery_capacity_wh = self.get_battery_full_wh()
124+
return min_soc_limit / 100 * battery_capacity_wh
125+
114126
def get_battery_minimum_soc_limit(self):
115127
minimumsoclimit = self._process_result(self.subsribers.get('Battery', 'MinimumSocLimit'))
116128
self.logger.log.debug(f"{self._name} Batterie MinimumSocLimit: {minimumsoclimit}%")
@@ -128,12 +140,12 @@ def get_battery_installed_capacity(self):
128140

129141
def get_soc(self):
130142
soc = self._process_result(self.subsribers.get('Battery', 'Soc'))
131-
self.logger.log.info(f"{self._name} SOC: {soc}%")
143+
self.logger.log.debug(f"{self._name} SOC: {soc}%")
132144
return soc
133145

134146
def get_active_soc_limit(self):
135147
soc = self._process_result(self.subsribers.get('Control', 'ActiveSocLimit'))
136-
self.logger.log.info(f"{self._name} ActiveSocLimit: {soc}%")
148+
self.logger.log.debug(f"{self._name} ActiveSocLimit: {soc}%")
137149
return soc
138150

139151
def get_scheduler_soc(self):
@@ -190,19 +202,15 @@ def get_version(self):
190202
version = self._process_result(self.subsribers.get('Firmware', 'Version'))
191203
return version
192204

193-
def _gridmeters(self):
194-
with MqttClient(
195-
self.mqtt_config) as mqtt: # Hier wird die Verbindung hergestellt und im Anschluss automatisch geschlossen
196-
base_topic = f'N/{self.unit_id}/grid'
197-
discovery_topic = f"{base_topic}/#"
198-
mqtt.subscribe(self.gridmeters, discovery_topic)
205+
def _gridmeters(self, mqtt):
206+
base_topic = f'N/{self.unit_id}/grid'
207+
discovery_topic = f"{base_topic}/#"
208+
mqtt.subscribe(self.gridmeters, discovery_topic)
199209

200-
def _inverters(self):
201-
with MqttClient(
202-
self.mqtt_config) as mqtt: # Hier wird die Verbindung hergestellt und im Anschluss automatisch geschlossen
203-
base_topic = f'N/{self.unit_id}/pvinverter'
204-
discovery_topic = f"{base_topic}/#"
205-
mqtt.subscribe(self.inverters, discovery_topic)
210+
def _inverters(self, mqtt):
211+
base_topic = f'N/{self.unit_id}/pvinverter'
212+
discovery_topic = f"{base_topic}/#"
213+
mqtt.subscribe(self.inverters, discovery_topic)
206214

207215
def _get_battery_instance(self, mqtt):
208216
try:
@@ -269,10 +277,16 @@ def _get_vrm_broker_url(self):
269277
return "mqtt{}.victronenergy.com".format(broker_index)
270278

271279
def _get_data(self):
272-
self._inverters()
273-
self._gridmeters()
274280
with MqttClient(
275-
self.mqtt_config) as mqtt: # Hier wird die Verbindung hergestellt und im Anschluss automatisch geschlossen
281+
self.mqtt_config) as mqtt:
282+
self._gridmeters(mqtt)
283+
with MqttClient(
284+
self.mqtt_config) as mqtt:
285+
self._inverters(mqtt)
286+
287+
with MqttClient(
288+
self.mqtt_config) as mqtt:
289+
276290
instance = self._get_battery_instance(mqtt)
277291
topics_to_subscribe = [
278292
f"Schedule:N/{self.unit_id}/settings/0/Settings/CGwacs/BatteryLife/Schedule/Charge/0/Day",

powerconsumption/powerconsumptionmqtt.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def update_config(self, mqtt_config=None):
5858
self.data_topics = mqtt_config.get("topics")
5959

6060
# Initialize the new MQTT client
61-
self.client = mqtt.Client(client_id=f"seuss-power-consumption-{Utils.generate_random_hex(8)}", protocol=mqtt.MQTTv5)
61+
self.client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=f"seuss-power-consumption-{Utils.generate_random_hex(8)}", protocol=mqtt.MQTTv5)
6262
self.client.on_message = self.on_message
6363
self.client.on_disconnect = self.on_disconnect
6464
if port == 8883:

spotmarket/abstract_classes/item.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def __init__(self, starttime, endtime, price, fee_str, potency=14):
4141
self.logger = CustomLogger()
4242

4343
def is_expired(self, check_time=False):
44-
now = datetime.utcnow().replace(tzinfo=timezone.utc)
44+
now = datetime.now(timezone.utc)
4545
now_local = TimeUtilities.convert_utc_to_local(now, False)
4646
item_local = TimeUtilities.convert_utc_to_local(self.starttime, False)
4747

spotmarket/abstract_classes/itemlist.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ def get_price_hour_lists(item_list):
171171
return today_data, list(today_data.keys()), tomorrow_data, list(tomorrow_data.keys())
172172

173173
def get_current_price(self, convert=False):
174-
now = datetime.utcnow().replace(tzinfo=timezone.utc)
174+
now = datetime.now(timezone.utc)
175175

176176
for item in self._item_list:
177177
start_datetime = item.get_start_datetime().replace(tzinfo=timezone.utc)

0 commit comments

Comments
 (0)