mirror of
				https://github.com/Akkudoktor-EOS/EOS.git
				synced 2025-10-30 22:36:21 +00:00 
			
		
		
		
	[BUG]: class_ems nd_array not JSON serializable
Big Bugfix - not sure if everything works
This commit is contained in:
		| @@ -58,15 +58,15 @@ class EnergieManagementSystem: | ||||
|         total_hours = ende - start_stunde | ||||
|  | ||||
|         # Pre-allocate arrays for the results, optimized for speed | ||||
|         last_wh_pro_stunde = np.zeros(total_hours) | ||||
|         netzeinspeisung_wh_pro_stunde = np.zeros(total_hours) | ||||
|         netzbezug_wh_pro_stunde = np.zeros(total_hours) | ||||
|         kosten_euro_pro_stunde = np.zeros(total_hours) | ||||
|         einnahmen_euro_pro_stunde = np.zeros(total_hours) | ||||
|         akku_soc_pro_stunde = np.zeros(total_hours) | ||||
|         eauto_soc_pro_stunde = np.zeros(total_hours) | ||||
|         verluste_wh_pro_stunde = np.zeros(total_hours) | ||||
|         haushaltsgeraet_wh_pro_stunde = np.zeros(total_hours) | ||||
|         last_wh_pro_stunde = np.full((total_hours), np.nan) | ||||
|         netzeinspeisung_wh_pro_stunde = np.full((total_hours), np.nan) | ||||
|         netzbezug_wh_pro_stunde = np.full((total_hours), np.nan) | ||||
|         kosten_euro_pro_stunde = np.full((total_hours), np.nan) | ||||
|         einnahmen_euro_pro_stunde = np.full((total_hours), np.nan) | ||||
|         akku_soc_pro_stunde = np.full((total_hours), np.nan) | ||||
|         eauto_soc_pro_stunde = np.full((total_hours), np.nan) | ||||
|         verluste_wh_pro_stunde = np.full((total_hours), np.nan) | ||||
|         haushaltsgeraet_wh_pro_stunde = np.full((total_hours), np.nan) | ||||
|  | ||||
|         # Set initial state | ||||
|         akku_soc_pro_stunde[0] = self.akku.ladezustand_in_prozent() | ||||
| @@ -78,7 +78,7 @@ class EnergieManagementSystem: | ||||
|  | ||||
|             # Accumulate loads and PV generation | ||||
|             verbrauch = self.gesamtlast[stunde] | ||||
|  | ||||
|             verluste_wh_pro_stunde[stunde_since_now] = 0.0 | ||||
|             if self.haushaltsgeraet: | ||||
|                 ha_load = self.haushaltsgeraet.get_last_fuer_stunde(stunde) | ||||
|                 verbrauch += ha_load | ||||
| @@ -117,7 +117,7 @@ class EnergieManagementSystem: | ||||
|             akku_soc_pro_stunde[stunde_since_now] = self.akku.ladezustand_in_prozent() | ||||
|  | ||||
|         # Total cost and return | ||||
|         gesamtkosten_euro = np.sum(kosten_euro_pro_stunde) - np.sum( | ||||
|         gesamtkosten_euro = np.nansum(kosten_euro_pro_stunde) - np.nansum( | ||||
|             einnahmen_euro_pro_stunde | ||||
|         ) | ||||
|  | ||||
| @@ -131,35 +131,10 @@ class EnergieManagementSystem: | ||||
|             "Einnahmen_Euro_pro_Stunde": einnahmen_euro_pro_stunde, | ||||
|             "Gesamtbilanz_Euro": gesamtkosten_euro, | ||||
|             "E-Auto_SoC_pro_Stunde": eauto_soc_pro_stunde, | ||||
|             "Gesamteinnahmen_Euro": np.sum(einnahmen_euro_pro_stunde), | ||||
|             "Gesamtkosten_Euro": np.sum(kosten_euro_pro_stunde), | ||||
|             "Gesamteinnahmen_Euro": np.nansum(einnahmen_euro_pro_stunde), | ||||
|             "Gesamtkosten_Euro": np.nansum(kosten_euro_pro_stunde), | ||||
|             "Verluste_Pro_Stunde": verluste_wh_pro_stunde, | ||||
|             "Gesamt_Verluste": np.sum(verluste_wh_pro_stunde), | ||||
|             "Gesamt_Verluste": np.nansum(verluste_wh_pro_stunde), | ||||
|             "Haushaltsgeraet_wh_pro_stunde": haushaltsgeraet_wh_pro_stunde, | ||||
|         } | ||||
|  | ||||
|         # List output keys where the first element needs to be changed to None | ||||
|         keys_to_modify = [ | ||||
|             "Last_Wh_pro_Stunde", | ||||
|             "Netzeinspeisung_Wh_pro_Stunde", | ||||
|             "akku_soc_pro_stunde", | ||||
|             "Netzbezug_Wh_pro_Stunde", | ||||
|             "Kosten_Euro_pro_Stunde", | ||||
|             "Einnahmen_Euro_pro_Stunde", | ||||
|             "E-Auto_SoC_pro_Stunde", | ||||
|             "Verluste_Pro_Stunde", | ||||
|             "Haushaltsgeraet_wh_pro_stunde" | ||||
|         ] | ||||
|  | ||||
|         # Loop through each key in the list | ||||
|         for key in keys_to_modify: | ||||
|             # Convert the NumPy array to a list | ||||
|             element_list = out[key].tolist() | ||||
|  | ||||
|             # Change the first value to None | ||||
|             element_list[0] = None | ||||
|  | ||||
|             # Assign the modified list back to the dictionary | ||||
|             out[key] = element_list | ||||
|  | ||||
|         return out | ||||
|   | ||||
| @@ -16,7 +16,6 @@ class Haushaltsgeraet: | ||||
|         :param start_hour: The hour at which the device should start. | ||||
|         """ | ||||
|         self.reset() | ||||
|  | ||||
|         # Check if the duration of use is within the available time frame | ||||
|         if start_hour + self.dauer_h > self.hours: | ||||
|             raise ValueError("The duration of use exceeds the available time frame.") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ from akkudoktoreos.visualize import visualisiere_ergebnisse | ||||
| class optimization_problem: | ||||
|     def __init__( | ||||
|         self, | ||||
|         prediction_hours: int = 24, | ||||
|         prediction_hours: int = 48, | ||||
|         strafe: float = 10, | ||||
|         optimization_hours: int = 24, | ||||
|         verbose: bool = False, | ||||
| @@ -138,7 +138,7 @@ class optimization_problem: | ||||
|         """ | ||||
|         try: | ||||
|             o = self.evaluate_inner(individual, ems, start_hour) | ||||
|         except Exception: | ||||
|         except Exception as e: | ||||
|             return (100000.0,)  # Return a high penalty in case of an exception | ||||
|  | ||||
|         gesamtbilanz = o["Gesamtbilanz_Euro"] * (-1.0 if worst_case else 1.0) | ||||
| @@ -326,6 +326,35 @@ class optimization_problem: | ||||
|             extra_data=extra_data, | ||||
|         ) | ||||
|  | ||||
|         # List output keys where the first element needs to be changed to None | ||||
|         keys_to_modify = [ | ||||
|             "Last_Wh_pro_Stunde", | ||||
|             "Netzeinspeisung_Wh_pro_Stunde", | ||||
|             "akku_soc_pro_stunde", | ||||
|             "Netzbezug_Wh_pro_Stunde", | ||||
|             "Kosten_Euro_pro_Stunde", | ||||
|             "Einnahmen_Euro_pro_Stunde", | ||||
|             "E-Auto_SoC_pro_Stunde", | ||||
|             "Verluste_Pro_Stunde", | ||||
|             "Haushaltsgeraet_wh_pro_stunde", | ||||
|         ] | ||||
|  | ||||
|         # Loop through each key in the list | ||||
|         for key in keys_to_modify: | ||||
|             # Convert the NumPy array to a list | ||||
|             element_list = o[key].tolist() | ||||
|  | ||||
|             # Change the first value to None | ||||
|             element_list[0] = None | ||||
|             # Change the NaN to None (JSON) | ||||
|             element_list = [ | ||||
|                 None if isinstance(x, (int, float)) and np.isnan(x) else x | ||||
|                 for x in element_list | ||||
|             ] | ||||
|  | ||||
|             # Assign the modified list back to the dictionary | ||||
|             o[key] = element_list | ||||
|  | ||||
|         # Return final results as a dictionary | ||||
|         return { | ||||
|             "discharge_hours_bin": discharge_hours_bin, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user