From 79ecf71353f60fc0f8b5aa239ba6218a8308c62e Mon Sep 17 00:00:00 2001 From: Dominique Lasserre Date: Mon, 16 Dec 2024 13:37:16 +0100 Subject: [PATCH 01/47] Optimize states (#256) * optimization states for AC, DC and IDLE now similar probab. Also AC states taken from config. Maybe a single config option for AC and E-Auto States is sensefull. * Ruff * test_class_optimize: Update testdata * Write pdf and json to test/testdata/new.... so it can be analyzed manually or just copied as new expected result. * workflow: Upload pytest optimization result artifacts (pdf, json) --------- Co-authored-by: Andreas --- .github/workflows/pytest.yml | 6 + .gitignore | 1 + docs/akkudoktoreos/openapi.json | 40 +- src/akkudoktoreos/optimization/genetic.py | 185 +++--- tests/test_class_optimize.py | 49 +- tests/testdata/optimize_result_1.json | 364 ++++++------ tests/testdata/optimize_result_2.json | 620 ++++++++++----------- tests/testdata/optimize_result_2_full.json | 448 +++++++-------- 8 files changed, 842 insertions(+), 871 deletions(-) diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml index dcabffc..5f2254a 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yml @@ -27,3 +27,9 @@ jobs: run: | pip install -e . python -m pytest --full-run -vs --cov src --cov-report term-missing + + - name: Upload test artifacts + uses: actions/upload-artifact@v4 + with: + name: optimize-results + path: tests/testdata/new_optimize_result* diff --git a/.gitignore b/.gitignore index 338a6ae..849981f 100644 --- a/.gitignore +++ b/.gitignore @@ -259,3 +259,4 @@ visualize_output_*.pdf # Test files openapi-new.json +tests/testdata/new_optimize_result* diff --git a/docs/akkudoktoreos/openapi.json b/docs/akkudoktoreos/openapi.json index 0c82ce9..29299bb 100644 --- a/docs/akkudoktoreos/openapi.json +++ b/docs/akkudoktoreos/openapi.json @@ -307,7 +307,9 @@ } }, "type": "object", - "required": ["kapazitaet_wh"], + "required": [ + "kapazitaet_wh" + ], "title": "EAutoParameters" }, "EAutoResult": { @@ -453,7 +455,10 @@ } }, "type": "object", - "required": ["temperature", "pvpower"], + "required": [ + "temperature", + "pvpower" + ], "title": "ForecastResponse" }, "GesamtlastRequest": { @@ -475,7 +480,11 @@ } }, "type": "object", - "required": ["year_energy", "measured_data", "hours"], + "required": [ + "year_energy", + "measured_data", + "hours" + ], "title": "GesamtlastRequest" }, "HTTPValidationError": { @@ -507,7 +516,10 @@ } }, "type": "object", - "required": ["consumption_wh", "duration_h"], + "required": [ + "consumption_wh", + "duration_h" + ], "title": "HomeApplianceParameters" }, "OptimizationParameters": { @@ -576,7 +588,11 @@ } }, "type": "object", - "required": ["ems", "pv_akku", "eauto"], + "required": [ + "ems", + "pv_akku", + "eauto" + ], "title": "OptimizationParameters" }, "OptimizeResponse": { @@ -671,7 +687,7 @@ "eauto_obj" ], "title": "OptimizeResponse", - "description": "**Note**: The first value of \"Last_Wh_pro_Stunde\", \"Netzeinspeisung_Wh_pro_Stunde\" and \"Netzbezug_Wh_pro_Stunde\", will be set to null in the JSON output and represented as NaN or None in the corresponding classes' data returns. This approach is adopted to ensure that the current hour's processing remains unchanged." + "description": "**Note**: The first value of \"Last_Wh_per_hour\", \"Netzeinspeisung_Wh_per_hour\", and \"Netzbezug_Wh_per_hour\", will be set to null in the JSON output and represented as NaN or None in the corresponding classes' data returns. This approach is adopted to ensure that the current hour's processing remains unchanged." }, "PVAkkuParameters": { "properties": { @@ -735,7 +751,9 @@ } }, "type": "object", - "required": ["kapazitaet_wh"], + "required": [ + "kapazitaet_wh" + ], "title": "PVAkkuParameters" }, "SimulationResult": { @@ -941,7 +959,11 @@ } }, "type": "object", - "required": ["loc", "msg", "type"], + "required": [ + "loc", + "msg", + "type" + ], "title": "ValidationError" }, "WechselrichterParameters": { @@ -958,4 +980,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index 5ab16b8..028cc0f 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -42,7 +42,7 @@ class OptimizationParameters(BaseModel): def validate_list_length(self) -> Self: arr_length = len(self.ems.pv_prognose_wh) if self.temperature_forecast is not None and arr_length != len(self.temperature_forecast): - raise ValueError("Input lists have different lenghts") + raise ValueError("Input lists have different lengths") return self @field_validator("start_solution") @@ -55,7 +55,7 @@ class OptimizationParameters(BaseModel): class OptimizeResponse(BaseModel): - """**Note**: The first value of "Last_Wh_pro_Stunde", "Netzeinspeisung_Wh_pro_Stunde" and "Netzbezug_Wh_pro_Stunde", will be set to null in the JSON output and represented as NaN or None in the corresponding classes' data returns. This approach is adopted to ensure that the current hour's processing remains unchanged.""" + """**Note**: The first value of "Last_Wh_per_hour", "Netzeinspeisung_Wh_per_hour", and "Netzbezug_Wh_per_hour", will be set to null in the JSON output and represented as NaN or None in the corresponding classes' data returns. This approach is adopted to ensure that the current hour's processing remains unchanged.""" ac_charge: list[float] = Field( description="Array with AC charging values as relative power (0-1), other values set to 0." @@ -123,110 +123,78 @@ class optimization_problem: def decode_charge_discharge( self, discharge_hours_bin: list[int] ) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: - """Decode the input array `discharge_hours_bin` into three separate arrays for AC charging, DC charging, and discharge. - - The function maps AC and DC charging values to relative power levels (0 to 1), while the discharge remains binary (0 or 1). - - Parameters: - - discharge_hours_bin (np.ndarray): Input array with integer values representing the different states. - The states are: - 0: No action ("idle") - 1: Discharge ("discharge") - 2-6: AC charging with different power levels ("ac_charge") - 7-8: DC charging Dissallowed/allowed ("dc_charge") - - Returns: - - ac_charge (np.ndarray): Array with AC charging values as relative power (0-1), other values set to 0. - - dc_charge (np.ndarray): Array with DC charging values as relative power (0-1), other values set to 0. - - discharge (np.ndarray): Array with discharge values (1 for discharge, 0 otherwise). - """ - # Convert the input list to a NumPy array, if it's not already + """Decode the input array into ac_charge, dc_charge, and discharge arrays.""" discharge_hours_bin_np = np.array(discharge_hours_bin) + len_ac = len(self._config.eos.available_charging_rates_in_percentage) - # Create ac_charge array: Only consider values between 2 and 6 (AC charging power levels), set the rest to 0 - ac_charge = np.where( - (discharge_hours_bin_np >= 2) & (discharge_hours_bin_np <= 6), - discharge_hours_bin_np - 1, - 0, - ) - ac_charge = ac_charge / 5.0 # Normalize AC charge to range between 0 and 1 + # Categorization: + # Idle: 0 .. len_ac-1 + # Discharge: len_ac .. 2*len_ac - 1 + # AC Charge: 2*len_ac .. 3*len_ac - 1 + # DC optional: 3*len_ac (not allowed), 3*len_ac + 1 (allowed) - # Create dc_charge array: 7 = Not allowed (mapped to 0), 8 = Allowed (mapped to 1) - # Create dc_charge array: Only if DC charge optimization is enabled + # Idle has no charge, Discharge has binary 1, AC Charge has corresponding values + # Idle states + idle_mask = (discharge_hours_bin_np >= 0) & (discharge_hours_bin_np < len_ac) + + # Discharge states + discharge_mask = (discharge_hours_bin_np >= len_ac) & (discharge_hours_bin_np < 2 * len_ac) + + # AC states + ac_mask = (discharge_hours_bin_np >= 2 * len_ac) & (discharge_hours_bin_np < 3 * len_ac) + ac_indices = discharge_hours_bin_np[ac_mask] - 2 * len_ac + + # DC states (if enabled) if self.optimize_dc_charge: - dc_charge = np.where(discharge_hours_bin_np == 8, 1, 0) + dc_not_allowed_state = 3 * len_ac + dc_allowed_state = 3 * len_ac + 1 + dc_charge = np.where(discharge_hours_bin_np == dc_allowed_state, 1, 0) else: - dc_charge = np.ones_like( - discharge_hours_bin_np - ) # Set DC charge to 0 if optimization is disabled + dc_charge = np.ones_like(discharge_hours_bin_np, dtype=float) - # Create discharge array: Only consider value 1 (Discharge), set the rest to 0 (binary output) - discharge = np.where(discharge_hours_bin_np == 1, 1, 0) + # Generate the result arrays + discharge = np.zeros_like(discharge_hours_bin_np, dtype=int) + discharge[discharge_mask] = 1 # Set Discharge states to 1 + + ac_charge = np.zeros_like(discharge_hours_bin_np, dtype=float) + ac_charge[ac_mask] = [ + self._config.eos.available_charging_rates_in_percentage[i] for i in ac_indices + ] + + # Idle is just 0, already default. return ac_charge, dc_charge, discharge - # Custom mutation function that applies type-specific mutations def mutate(self, individual: list[int]) -> tuple[list[int]]: - """Custom mutation function for the individual. + """Custom mutation function for the individual.""" + # Calculate the number of states + len_ac = len(self._config.eos.available_charging_rates_in_percentage) + if self.optimize_dc_charge: + total_states = 3 * len_ac + 2 + else: + total_states = 3 * len_ac - This function mutates different parts of the individual: - - Mutates the discharge and charge states (AC, DC, idle) using the split_charge_discharge method. - - Mutates the EV charging schedule if EV optimization is enabled. - - Mutates appliance start times if household appliances are part of the optimization. - - Parameters: - - individual (list): The individual being mutated, which includes different optimization parameters. - - Returns: - - (tuple): The mutated individual as a tuple (required by DEAP). - """ - # Step 1: Mutate the charge/discharge states (idle, discharge, AC charge, DC charge) - # Extract the relevant part of the individual for prediction hours, which represents the charge/discharge behavior. + # 1. Mutating the charge_discharge part charge_discharge_part = individual[: self.prediction_hours] - - # Apply the mutation to the charge/discharge part (charge_discharge_mutated,) = self.toolbox.mutate_charge_discharge(charge_discharge_part) - # Ensure that no invalid states are introduced during mutation (valid values: 0-8) - if self.optimize_dc_charge: - charge_discharge_mutated = np.clip(charge_discharge_mutated, 0, 8) - else: - charge_discharge_mutated = np.clip(charge_discharge_mutated, 0, 6) - - # Use split_charge_discharge to split the mutated array into AC charge, DC charge, and discharge components - # ac_charge, dc_charge, discharge = self.split_charge_discharge(charge_discharge_mutated) - - # Optionally: You can process the split arrays further if needed, for example, - # applying additional constraints or penalties, or keeping track of charging limits. - - # Reassign the mutated values back to the individual + # Instead of a fixed clamping to 0..8 or 0..6 dynamically: + charge_discharge_mutated = np.clip(charge_discharge_mutated, 0, total_states - 1) individual[: self.prediction_hours] = charge_discharge_mutated - # Step 2: Mutate EV charging schedule if enabled + # 2. Mutating the EV charge part, if active if self.optimize_ev: - # Extract the relevant part for EV charging schedule ev_charge_part = individual[self.prediction_hours : self.prediction_hours * 2] - - # Apply mutation on the EV charging schedule (ev_charge_part_mutated,) = self.toolbox.mutate_ev_charge_index(ev_charge_part) - - # Ensure the EV does not charge during fixed hours (set those hours to 0) ev_charge_part_mutated[self.prediction_hours - self.fixed_eauto_hours :] = [ 0 ] * self.fixed_eauto_hours - - # Reassign the mutated EV charging part back to the individual individual[self.prediction_hours : self.prediction_hours * 2] = ev_charge_part_mutated - # Step 3: Mutate appliance start times if household appliances are part of the optimization + # 3. Mutating the appliance start time, if applicable if self.opti_param["home_appliance"] > 0: - # Extract the appliance part (typically a single value for the start hour) appliance_part = [individual[-1]] - - # Apply mutation on the appliance start hour (appliance_part_mutated,) = self.toolbox.mutate_hour(appliance_part) - - # Reassign the mutated appliance part back to the individual individual[-1] = appliance_part_mutated[0] return (individual,) @@ -278,62 +246,67 @@ class optimization_problem: """Set up the DEAP environment with fitness and individual creation rules.""" self.opti_param = opti_param - # Remove existing FitnessMin and Individual classes from creator if present + # Remove existing definitions if any for attr in ["FitnessMin", "Individual"]: if attr in creator.__dict__: del creator.__dict__[attr] - # Create new FitnessMin and Individual classes creator.create("FitnessMin", base.Fitness, weights=(-1.0,)) creator.create("Individual", list, fitness=creator.FitnessMin) - # Initialize toolbox with attributes and operations self.toolbox = base.Toolbox() - if self.optimize_dc_charge: - self.toolbox.register("attr_discharge_state", random.randint, 0, 8) - else: - self.toolbox.register("attr_discharge_state", random.randint, 0, 6) + len_ac = len(self._config.eos.available_charging_rates_in_percentage) + # Total number of states without DC: + # Idle: len_ac states + # Discharge: len_ac states + # AC-Charge: len_ac states + # Total without DC: 3 * len_ac + + # With DC: + 2 states + if self.optimize_dc_charge: + total_states = 3 * len_ac + 2 + else: + total_states = 3 * len_ac + + # State space: 0 .. (total_states - 1) + self.toolbox.register("attr_discharge_state", random.randint, 0, total_states - 1) + + # EV attributes if self.optimize_ev: self.toolbox.register( "attr_ev_charge_index", random.randint, 0, - len(self._config.eos.available_charging_rates_in_percentage) - 1, + len_ac - 1, ) + + # Household appliance start time self.toolbox.register("attr_int", random.randint, start_hour, 23) - # Register individual creation function self.toolbox.register("individual", self.create_individual) - - # Register population, mating, mutation, and selection functions self.toolbox.register("population", tools.initRepeat, list, self.toolbox.individual) self.toolbox.register("mate", tools.cxTwoPoint) - # self.toolbox.register("mutate", tools.mutFlipBit, indpb=0.1) - # Register separate mutation functions for each type of value: - # - Discharge state mutation (-5, 0, 1) - if self.optimize_dc_charge: - self.toolbox.register( - "mutate_charge_discharge", tools.mutUniformInt, low=0, up=8, indpb=0.2 - ) - else: - self.toolbox.register( - "mutate_charge_discharge", tools.mutUniformInt, low=0, up=6, indpb=0.2 - ) - # - Float mutation for EV charging values + + # Mutation operator for charge/discharge states + self.toolbox.register( + "mutate_charge_discharge", tools.mutUniformInt, low=0, up=total_states - 1, indpb=0.2 + ) + + # Mutation operator for EV states self.toolbox.register( "mutate_ev_charge_index", tools.mutUniformInt, low=0, - up=len(self._config.eos.available_charging_rates_in_percentage) - 1, + up=len_ac - 1, indpb=0.2, ) - # - Start hour mutation for household devices + + # Mutation for household appliance self.toolbox.register("mutate_hour", tools.mutUniformInt, low=start_hour, up=23, indpb=0.2) - # Register custom mutation function + # Custom mutate function remains unchanged self.toolbox.register("mutate", self.mutate) - self.toolbox.register("select", tools.selTournament, tournsize=3) def evaluate_inner( diff --git a/tests/test_class_optimize.py b/tests/test_class_optimize.py index 1c79580..5c907fd 100644 --- a/tests/test_class_optimize.py +++ b/tests/test_class_optimize.py @@ -37,9 +37,7 @@ def compare_dict(actual: dict[str, Any], expected: dict[str, Any]): ("optimize_input_2.json", "optimize_result_2_full.json", 400), ], ) -@patch("akkudoktoreos.optimization.genetic.visualisiere_ergebnisse") def test_optimize( - visualisiere_ergebnisse_patch, fn_in: str, fn_out: str, ngen: int, @@ -53,8 +51,12 @@ def test_optimize( input_data = OptimizationParameters(**json.load(f_in)) file = DIR_TESTDATA / fn_out - with file.open("r") as f_out: - expected_result = OptimizeResponse(**json.load(f_out)) + # In case a new test case is added, we don't want to fail here, so the new output is written to disk before + try: + with file.open("r") as f_out: + expected_result = OptimizeResponse(**json.load(f_out)) + except FileNotFoundError: + pass opt_class = optimization_problem(tmp_config, fixed_seed=42) start_hour = 10 @@ -62,15 +64,34 @@ def test_optimize( if ngen > 10 and not is_full_run: pytest.skip() - # Call the optimization function - ergebnis = opt_class.optimierung_ems(parameters=input_data, start_hour=start_hour, ngen=ngen) - # with open(f"new_{fn_out}", "w") as f_out: - # f_out.write(ergebnis.model_dump_json(indent=4, exclude_unset=True)) + visualize_filename = str((DIR_TESTDATA / f"new_{fn_out}").with_suffix(".pdf")) - # Assert that the output contains all expected entries. - # This does not assert that the optimization always gives the same result! - # Reproducibility and mathematical accuracy should be tested on the level of individual components. - compare_dict(ergebnis.model_dump(), expected_result.model_dump()) + def visualize_to_file(*args, **kwargs): + from akkudoktoreos.visualize import visualisiere_ergebnisse - # The function creates a visualization result PDF as a side-effect. - visualisiere_ergebnisse_patch.assert_called_once() + # Write test output pdf to file, so we can look at it manually + kwargs["filename"] = visualize_filename + return visualisiere_ergebnisse(*args, **kwargs) + + with patch( + "akkudoktoreos.optimization.genetic.visualisiere_ergebnisse", side_effect=visualize_to_file + ) as visualisiere_ergebnisse_patch: + # Call the optimization function + ergebnis = opt_class.optimierung_ems( + parameters=input_data, start_hour=start_hour, ngen=ngen + ) + # Write test output to file, so we can take it as new data on intended change + with open(DIR_TESTDATA / f"new_{fn_out}", "w") as f_out: + f_out.write(ergebnis.model_dump_json(indent=4, exclude_unset=True)) + + assert ergebnis.result.Gesamtbilanz_Euro == pytest.approx( + expected_result.result.Gesamtbilanz_Euro + ) + + # Assert that the output contains all expected entries. + # This does not assert that the optimization always gives the same result! + # Reproducibility and mathematical accuracy should be tested on the level of individual components. + compare_dict(ergebnis.model_dump(), expected_result.model_dump()) + + # The function creates a visualization result PDF as a side-effect. + visualisiere_ergebnisse_patch.assert_called_once() diff --git a/tests/testdata/optimize_result_1.json b/tests/testdata/optimize_result_1.json index dc1805f..fc823d0 100644 --- a/tests/testdata/optimize_result_1.json +++ b/tests/testdata/optimize_result_1.json @@ -1,5 +1,24 @@ { "ac_charge": [ + 0.75, + 0.75, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.75, 0.0, 0.0, 0.0, @@ -20,26 +39,7 @@ 0.0, 0.0, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, + 0.875, 0.0, 0.0, 0.0, @@ -100,30 +100,21 @@ 1.0 ], "discharge_allowed": [ - 1, - 1, - 1, - 1, + 0, 0, 1, - 0, + 1, 0, 1, 1, 1, 0, 1, - 0, + 1, 1, 0, 1, - 0, 1, - 0, - 1, - 0, - 1, - 0, 1, 0, 0, @@ -132,22 +123,31 @@ 0, 0, 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, 1, 0, 0, 0, 1, 0, - 1, 0, 1, - 0, 1, - 0, - 1, - 0, - 1, - 0 + 1 ], "eautocharge_hours_float": null, "result": { @@ -237,7 +237,7 @@ 0.0, 0.0, 0.0, - 0.19546715971074372, + 0.212927386983471, 0.19275619999999996, 0.1339926, 0.0569765, @@ -260,7 +260,7 @@ 0.0, 0.0, 0.0, - 0.19167938450413202, + 0.1512260012396691, 0.257789, 0.1516669, 0.09915009999999999, @@ -271,10 +271,10 @@ 0.0, 0.0 ], - "Gesamt_Verluste": 1859.6205371900821, - "Gesamtbilanz_Euro": 1.3505190567851246, - "Gesamteinnahmen_Euro": 1.3143154442148755, - "Gesamtkosten_Euro": 2.664834501, + "Gesamt_Verluste": 2071.900103305785, + "Gesamtbilanz_Euro": 0.9349588927768602, + "Gesamteinnahmen_Euro": 1.2913222882231399, + "Gesamtkosten_Euro": 2.226281181, "Home_appliance_wh_per_hour": [ null, null, @@ -317,8 +317,8 @@ ], "Kosten_Euro_pro_Stunde": [ 0.0, - 0.004569992000000018, 0.0, + 0.04475252599999999, 0.0, 0.0, 0.0, @@ -326,16 +326,16 @@ 0.0, 0.0, 0.05480703000000003, - 0.0, + 0.225316611, 0.291163892, - 0.0, + 0.26650619799999997, 0.19588158, + 0.174739608, + 0.0, 0.0, - 0.28801899, - 0.22802125600000003, 0.199865757, - 0.182970359, - 0.162995926, + 0.0, + 0.0, 0.16677339, 0.26411047, 0.0, @@ -350,15 +350,15 @@ 0.0, 0.0, 0.08231598, + 0.174597189, 0.0, - 0.293043269, 0.0, - 0.16484566 + 0.0 ], "Netzbezug_Wh_pro_Stunde": [ 0.0, - 20.660000000000082, 0.0, + 213.81999999999994, 0.0, 0.0, 0.0, @@ -366,16 +366,16 @@ 0.0, 0.0, 171.54000000000008, - 0.0, + 731.31, 980.68, - 0.0, + 912.38, 704.61, + 516.37, + 0.0, 0.0, - 868.05, - 694.34, 608.79, - 556.31, - 488.89, + 0.0, + 0.0, 506.91, 799.85, 0.0, @@ -390,10 +390,10 @@ 0.0, 0.0, 257.64, + 566.69, 0.0, - 987.01, 0.0, - 592.97 + 0.0 ], "Netzeinspeisung_Wh_pro_Stunde": [ 0.0, @@ -401,7 +401,7 @@ 0.0, 0.0, 0.0, - 2792.3879958677676, + 3041.819814049586, 2753.66, 1914.18, 813.95, @@ -424,7 +424,7 @@ 0.0, 0.0, 0.0, - 2738.2769214876007, + 2160.371446280987, 3682.7, 2166.67, 1416.43, @@ -437,20 +437,11 @@ ], "Verluste_Pro_Stunde": [ 16.744090909090914, + 2.817272727272737, 0.0, - 29.157272727272726, 3.5592000000000112, 582.6179999999995, - 185.98344049586785, - 0.0, - 0.0, - 0.0, - 0.0, - 99.72409090909093, - 0.0, - 124.41545454545451, - 0.0, - 70.41409090909087, + 156.0516223140496, 0.0, 0.0, 0.0, @@ -458,62 +449,71 @@ 0.0, 0.0, 0.0, + 0.0, + 0.0, + 118.37045454545455, + 94.68272727272722, + 0.0, + 75.86045454545456, + 66.66681818181814, + 0.0, + 0.0, 109.96227272727276, 0.0, 15.439199999999985, 53.855999999999995, 159.6443999999999, 21.032399999999996, - 209.70516942148788, + 279.0538264462814, 0.0, 0.0, 0.0, 0.0, 0.0, - 77.27590909090907, 0.0, + 134.59227272727276, 100.08954545454549, - 0.0 + 80.85954545454547 ], "akku_soc_pro_stunde": [ 79.4714617768595, - 79.4714617768595, - 78.55109331955923, - 78.6499599862259, - 94.83379331955922, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 96.85214359504131, - 96.85214359504131, - 92.92488808539943, - 92.92488808539943, - 90.70222107438015, - 90.70222107438015, - 90.70222107438015, - 90.70222107438015, - 90.70222107438015, - 90.70222107438015, - 90.70222107438015, - 90.70222107438015, - 87.231189738292, - 87.231189738292, - 87.66005640495867, - 89.15605640495866, - 93.59062307162533, - 94.17485640495867, + 79.38253271349862, + 79.38253271349862, + 79.48139938016529, + 95.66523271349861, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, - 97.56073519283747, - 97.56073519283747, - 94.40134297520663, - 94.40134297520663 + 100.0, + 100.0, + 100.0, + 100.0, + 96.26355888429752, + 93.27483643250687, + 93.27483643250687, + 90.88025137741046, + 88.7758694903581, + 88.7758694903581, + 88.7758694903581, + 85.30483815426996, + 85.30483815426996, + 85.73370482093662, + 87.22970482093662, + 91.66427148760329, + 92.24850482093663, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 95.75150654269973, + 92.59211432506888, + 90.0397296831956 ] }, "eauto_obj": { @@ -626,106 +626,54 @@ "start_soc_prozent": 54 }, "start_solution": [ - 1.0, - 1.0, - 1.0, - 1.0, + 18.0, + 18.0, + 9.0, + 13.0, + 4.0, + 7.0, + 9.0, + 8.0, 0.0, + 12.0, + 10.0, + 10.0, + 14.0, + 8.0, + 7.0, + 11.0, + 6.0, + 4.0, + 18.0, + 3.0, + 4.0, + 3.0, + 5.0, + 14.0, + 14.0, + 10.0, + 13.0, + 3.0, + 7.0, + 11.0, + 6.0, + 14.0, + 9.0, + 14.0, + 8.0, + 3.0, + 2.0, + 5.0, + 9.0, + 19.0, 1.0, - 0.0, - 0.0, - 1.0, - 1.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0, - 0.0, - 0.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 0.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0 + 6.0, + 10.0, + 4.0, + 2.0, + 7.0, + 11.0, + 10.0 ], "washingstart": null } \ No newline at end of file diff --git a/tests/testdata/optimize_result_2.json b/tests/testdata/optimize_result_2.json index 5be972a..4c3b3a8 100644 --- a/tests/testdata/optimize_result_2.json +++ b/tests/testdata/optimize_result_2.json @@ -2,50 +2,50 @@ "ac_charge": [ 0.0, 0.0, - 0.2, - 0.4, 0.0, - 0.4, + 0.625, 0.0, - 0.8, - 1.0, - 0.6, 0.0, - 0.8, - 1.0, - 0.6, - 1.0, 0.0, - 0.4, - 1.0, - 0.8, - 0.2, 0.0, - 1.0, - 0.8, - 0.8, - 0.4, - 0.6, - 0.2, - 0.6, - 0.2, - 0.8, - 0.2, + 0.625, + 0.0, + 0.375, + 0.0, + 0.0, + 0.75, + 0.0, + 0.75, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.75, + 0.0, 0.0, - 1.0, - 0.8, - 0.4, 0.0, - 1.0, - 1.0, - 0.2, 0.0, - 1.0, - 0.4, - 0.6, - 0.2, - 1.0, - 0.6, 0.0, 0.0 ], @@ -100,6 +100,42 @@ 1.0 ], "discharge_allowed": [ + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, 0, 0, 0, @@ -111,104 +147,68 @@ 0, 0, 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1 + 0 ], "eautocharge_hours_float": [ 0.0, + 0.5, + 0.0, + 0.5, 0.375, + 1.0, 0.875, 0.375, 0.5, - 0.75, - 1.0, 1.0, 0.875, - 0.0, - 1.0, - 0.375, + 0.875, + 0.875, 0.75, - 1.0, - 1.0, + 0.5, + 0.625, + 0.875, + 0.75, + 0.5, + 0.0, 0.625, 0.5, - 1.0, - 1.0, - 0.375, - 0.375, - 0.375, - 0.75, - 0.5, - 1.0, - 0.875, - 0.875, - 0.5, - 0.75, 0.0, - 0.875, - 0.875, - 0.5, - 0.75, - 0.75, - 0.375, - 0.75, - 0.375, - 1.0, 1.0, 0.625, - 0.75, - 0.5, + 0.0, + 1.0, + 0.625, + 0.875, + 0.375, + 1.0, 0.375, 0.625, + 0.75, + 0.75, 0.0, + 0.5, + 0.875, + 0.875, + 0.75, + 0.875, + 0.5, + 0.875, 0.0, - 0.0 + 0.375, + 0.875, + 1.0, + 0.5 ], "result": { "Last_Wh_pro_Stunde": [ - 11541.07, - 8996.91, - 14186.56, - 17120.03, - 14608.281570247937, - 7731.82, - 6460.22, - 3041.7799999999997, + 12105.07, + 10240.91, + 10497.56, + 12748.03, + 8907.67, + 13981.82, + 10393.22, + 1730.78, 1129.12, 1178.71, 1050.98, @@ -232,7 +232,7 @@ 1232.67, 871.26, 860.88, - 1158.03, + 4027.009545454555, 1222.72, 1221.04, 949.99, @@ -241,13 +241,13 @@ 592.97 ], "EAuto_SoC_pro_Stunde": [ - 22.48, - 29.035, - 42.144999999999996, - 59.62499999999999, - 77.105, - 88.03, - 96.77, + 20.294999999999998, + 35.589999999999996, + 50.885000000000005, + 63.995000000000005, + 72.735, + 83.66, + 98.955, 100.0, 100.0, 100.0, @@ -289,7 +289,6 @@ 0.0, 0.0, 0.0, - 0.0569765, 0.0, 0.0, 0.0, @@ -305,14 +304,15 @@ 0.0, 0.0, 0.0, - 0.009006199999999989, - 0.03141599999999999, - 0.0931259, - 0.012268899999999998, - 0.31400739999999994, - 0.257789, - 0.1516669, - 0.09915009999999999, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, 0.0348376, 0.0, 0.0, @@ -320,17 +320,17 @@ 0.0, 0.0 ], - "Gesamt_Verluste": 5357.560661157026, - "Gesamtbilanz_Euro": 13.87138792561157, - "Gesamteinnahmen_Euro": 1.0602444999999998, - "Gesamtkosten_Euro": 14.93163242561157, + "Gesamt_Verluste": 8823.859090909093, + "Gesamtbilanz_Euro": 12.348447740818184, + "Gesamteinnahmen_Euro": 0.0348376, + "Gesamtkosten_Euro": 12.383285340818183, "Home_appliance_wh_per_hour": [ 0.0, 0.0, 0.0, - 2500.0, - 2500.0, 0.0, + 2500.0, + 2500.0, 0.0, 0.0, 0.0, @@ -365,29 +365,29 @@ 0.0 ], "Kosten_Euro_pro_Stunde": [ - 1.2792601199999998, - 1.759349592, - 2.737606326, - 2.9985720859999994, - 1.5787430366115707, - 0.44343509999999997, - 0.547376732, - 0.005407139999999934, + 2.54785212, + 0.928522392, + 0.9189986259999999, + 2.1770732859999997, + 0.53097063, + 1.6959351, + 1.4118501319999999, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, 0.0, - 0.05480703000000003, - 0.225316611, - 0.291163892, - 0.26650619799999997, - 0.19588158, 0.174739608, - 0.28801899, - 0.22802125600000003, + 0.0, + 0.0, 0.199865757, 0.182970359, 0.162995926, - 0.16677339, - 0.26411047, - 0.24530383800000005, + 0.0, + 0.0, + 0.0, 0.08545095, 0.0, 0.0, @@ -396,38 +396,38 @@ 0.0, 0.0, 0.0, - 0.0, + 0.651258356818184, 0.0, 0.08231598, 0.174597189, 0.293043269, 0.0, - 0.0 + 0.16484566 ], "Netzbezug_Wh_pro_Stunde": [ - 5610.789999999999, - 7953.66, - 13079.82, - 15958.339999999998, - 8589.461570247937, - 2212.75, - 2490.34, - 23.81999999999971, + 11174.789999999999, + 4197.66, + 4390.82, + 11586.34, + 2888.8500000000004, + 8462.75, + 6423.339999999999, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, 0.0, - 171.54000000000008, - 731.31, - 980.68, - 912.38, - 704.61, 516.37, - 868.05, - 694.34, + 0.0, + 0.0, 608.79, 556.31, 488.89, - 506.91, - 799.85, - 806.3900000000001, + 0.0, + 0.0, + 0.0, 351.65, 0.0, 0.0, @@ -436,13 +436,13 @@ 0.0, 0.0, 0.0, - 0.0, + 2868.979545454555, 0.0, 257.64, 566.69, 987.01, 0.0, - 0.0 + 592.97 ], "Netzeinspeisung_Wh_pro_Stunde": [ 0.0, @@ -453,7 +453,6 @@ 0.0, 0.0, 0.0, - 813.95, 0.0, 0.0, 0.0, @@ -469,14 +468,15 @@ 0.0, 0.0, 0.0, - 128.65999999999985, - 448.79999999999995, - 1330.3700000000001, - 175.26999999999998, - 4485.82, - 3682.7, - 2166.67, - 1416.43, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, 497.68000000000006, 0.0, 0.0, @@ -485,84 +485,84 @@ 0.0 ], "Verluste_Pro_Stunde": [ - 1233.818181818182, - 687.0, - 1014.0, - 912.0, - 606.7933884297523, - 345.0, + 708.0, + 1164.818181818182, + 1164.818181818182, + 864.0, 276.0, - 102.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, + 795.0, + 483.0, + 187.4616000000001, + 97.67399999999998, + 23.391818181818195, + 99.72409090909093, + 133.72909090909081, + 124.41545454545451, + 96.08318181818186, + 0.0, + 118.37045454545455, + 94.68272727272722, 0.0, 0.0, 0.0, + 69.12409090909085, + 109.0704545454546, + 109.96227272727276, 0.0, + 15.439199999999985, + 53.855999999999995, + 159.6443999999999, + 21.032399999999996, + 538.2984000000001, + 441.924, + 260.0003999999999, + 514.2491454545468, 0.0, 0.0, 0.0, 0.0, 100.08954545454549, - 80.85954545454547 + 0.0 ], "akku_soc_pro_stunde": [ - 58.47796143250689, - 71.81129476584022, - 88.47796143250687, - 98.47796143250687, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, + 86.25, + 64.72796143250687, + 43.20592286501377, + 55.70592286501377, + 55.70592286501377, + 68.20592286501376, + 68.20592286501376, + 72.49652286501377, + 75.20968953168044, + 74.47131143250688, + 71.32345502754819, + 67.10220847107436, + 63.17495296143248, + 60.14202424242422, + 60.14202424242422, + 56.40558312672175, + 53.41686067493111, + 53.41686067493111, + 53.41686067493111, + 53.41686067493111, + 51.23491336088152, + 47.792032851239654, + 44.3210015151515, + 44.3210015151515, + 44.749868181818165, + 46.24586818181816, + 50.68043484848482, + 51.264668181818166, + 66.21740151515148, + 78.49306818181815, + 85.71530151515148, 100.0, 100.0, 100.0, 100.0, 100.0, 96.84060778236915, - 94.28822314049587 + 96.84060778236915 ] }, "eauto_obj": { @@ -676,102 +676,102 @@ }, "start_solution": [ 0.0, + 4.0, + 13.0, + 17.0, + 14.0, + 12.0, + 9.0, + 9.0, + 17.0, + 13.0, + 15.0, + 12.0, + 9.0, + 18.0, + 14.0, + 18.0, + 14.0, + 9.0, + 2.0, + 8.0, + 10.0, + 12.0, + 10.0, + 10.0, + 14.0, + 8.0, + 7.0, + 2.0, + 6.0, + 4.0, + 7.0, + 10.0, + 8.0, + 2.0, + 5.0, 0.0, 2.0, - 3.0, + 4.0, + 5.0, + 14.0, + 10.0, + 18.0, + 11.0, 1.0, - 3.0, + 0.0, + 5.0, + 13.0, 1.0, - 5.0, - 6.0, - 4.0, + 0.0, + 2.0, + 0.0, + 2.0, 1.0, - 5.0, - 6.0, - 4.0, - 6.0, - 0.0, - 3.0, 6.0, 5.0, + 1.0, 2.0, - 0.0, 6.0, 5.0, 5.0, - 3.0, + 5.0, 4.0, 2.0, + 3.0, + 5.0, 4.0, 2.0, - 5.0, - 2.0, 0.0, - 6.0, - 5.0, 3.0, - 0.0, - 6.0, - 6.0, 2.0, 0.0, 6.0, 3.0, - 4.0, - 2.0, - 6.0, - 4.0, - 1.0, - 1.0, 0.0, - 1.0, - 5.0, - 1.0, - 2.0, - 4.0, - 6.0, - 6.0, - 5.0, - 0.0, - 6.0, - 1.0, - 4.0, - 6.0, 6.0, 3.0, - 2.0, - 6.0, - 6.0, - 1.0, - 1.0, - 1.0, - 4.0, - 2.0, - 6.0, 5.0, - 5.0, - 2.0, - 4.0, - 0.0, - 5.0, - 5.0, - 2.0, - 4.0, - 4.0, - 1.0, - 4.0, 1.0, 6.0, - 6.0, + 1.0, 3.0, 4.0, + 4.0, + 0.0, 2.0, + 5.0, + 5.0, + 4.0, + 5.0, + 2.0, + 5.0, + 0.0, 1.0, - 3.0, - 0.0, - 0.0, - 0.0, - 13.0 + 5.0, + 6.0, + 2.0, + 14.0 ], - "washingstart": 13 + "washingstart": 14 } \ No newline at end of file diff --git a/tests/testdata/optimize_result_2_full.json b/tests/testdata/optimize_result_2_full.json index aa40314..ad0bef1 100644 --- a/tests/testdata/optimize_result_2_full.json +++ b/tests/testdata/optimize_result_2_full.json @@ -1,30 +1,34 @@ { "ac_charge": [ - 0.2, - 0.6, + 0.0, + 0.0, + 0.875, 0.0, 1.0, - 0.8, - 0.6, - 0.0, - 0.6, - 0.0, - 0.6, 0.0, 0.0, 0.0, - 0.2, - 1.0, - 0.4, - 0.4, - 0.4, - 0.8, - 1.0, - 0.6, - 0.8, - 0.8, - 0.6, - 0.4, + 0.0, + 0.875, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, 0.0, 0.0, 0.0, @@ -38,11 +42,7 @@ 0.0, 0.0, 0.0, - 0.6, 0.0, - 1.0, - 0.2, - 0.4, 0.0, 0.0, 0.0, @@ -100,6 +100,7 @@ 1.0 ], "discharge_allowed": [ + 1, 0, 0, 1, @@ -107,7 +108,6 @@ 0, 0, 1, - 0, 1, 0, 1, @@ -115,16 +115,12 @@ 0, 0, 0, + 1, 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, + 1, + 1, + 1, + 1, 1, 1, 1, @@ -141,39 +137,43 @@ 0, 1, 0, + 1, + 1, 0, + 1, 0, 1, 1, 1, 1, + 1, 1 ], "eautocharge_hours_float": [ - 0.625, - 0.875, - 1.0, - 0.0, - 0.875, - 0.375, - 0.875, - 1.0, - 0.375, - 1.0, - 0.0, - 0.0, - 1.0, - 1.0, - 1.0, - 1.0, 0.75, + 0.75, + 0.5, + 0.0, + 1.0, + 0.625, + 0.0, + 0.875, + 0.75, + 1.0, + 0.0, + 0.75, + 1.0, + 1.0, + 1.0, + 0.375, + 0.75, + 0.5, + 0.5, + 1.0, + 0.625, + 0.875, 0.625, 1.0, - 0.875, - 0.375, - 0.625, - 0.375, - 0.375, 0.0, 0.0, 0.0, @@ -202,13 +202,13 @@ "result": { "Last_Wh_pro_Stunde": [ 1053.07, - 1063.91, + 8929.91, 11808.56, - 15120.029999999999, - 19151.67, - 11823.38146694215, + 11620.03, + 14151.67, + 7609.82, 9082.22, - 7658.78, + 6347.78, 1756.12, 1178.71, 1050.98, @@ -229,7 +229,7 @@ 1155.99, 827.01, 1257.98, - 1999.9845041322394, + 1232.67, 871.26, 860.88, 1158.03, @@ -242,12 +242,12 @@ ], "EAuto_SoC_pro_Stunde": [ 5.0, - 5.0, - 22.48, - 39.96, - 57.440000000000005, - 74.92, - 88.03, + 18.11, + 35.589999999999996, + 53.06999999999999, + 70.55, + 77.105, + 90.215, 98.955, 100.0, 100.0, @@ -289,7 +289,6 @@ 0.0, 0.0, 0.0, - 0.013086500000000003, 0.0, 0.0, 0.0, @@ -310,27 +309,28 @@ 0.0, 0.0, 0.0, - 0.257789, - 0.1516669, - 0.09915009999999999, - 0.0348376, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], - "Gesamt_Verluste": 5838.775971074382, - "Gesamtbilanz_Euro": 11.51451054883471, - "Gesamteinnahmen_Euro": 0.5565300999999999, - "Gesamtkosten_Euro": 12.07104064883471, + "Gesamt_Verluste": 7248.648818181819, + "Gesamtbilanz_Euro": 8.568052366, + "Gesamteinnahmen_Euro": 0.0, + "Gesamtkosten_Euro": 8.568052366, "Home_appliance_wh_per_hour": [ 0.0, 0.0, 0.0, - 2500.0, - 2500.0, 0.0, + 2500.0, + 2500.0, 0.0, 0.0, 0.0, @@ -366,20 +366,12 @@ ], "Kosten_Euro_pro_Stunde": [ 0.0, - 0.004569992000000018, + 1.7445291920000001, 2.2398909259999997, - 2.6227720859999994, - 2.41381783, - 1.263384017975207, + 1.9651220859999998, + 1.4948178300000001, + 0.0, 1.1236923319999998, - 1.0534661399999998, - 0.0, - 0.05480703000000003, - 0.225316611, - 0.291163892, - 0.26650619799999997, - 0.19588158, - 0.174739608, 0.0, 0.0, 0.0, @@ -393,7 +385,15 @@ 0.0, 0.0, 0.0, - 0.14103240585950558, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, 0.0, 0.0, 0.0, @@ -406,20 +406,12 @@ ], "Netzbezug_Wh_pro_Stunde": [ 0.0, - 20.660000000000082, + 7886.66, 10701.82, - 13958.339999999998, - 13132.85, - 6304.31146694215, + 10458.34, + 8132.85, + 0.0, 5112.339999999999, - 4640.82, - 0.0, - 171.54000000000008, - 731.31, - 980.68, - 912.38, - 704.61, - 516.37, 0.0, 0.0, 0.0, @@ -433,7 +425,15 @@ 0.0, 0.0, 0.0, - 767.3145041322393, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, 0.0, 0.0, 0.0, @@ -453,7 +453,6 @@ 0.0, 0.0, 0.0, - 186.95000000000005, 0.0, 0.0, 0.0, @@ -474,10 +473,11 @@ 0.0, 0.0, 0.0, - 3682.7, - 2166.67, - 1416.43, - 497.68000000000006, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, 0.0, 0.0, 0.0, @@ -486,20 +486,20 @@ ], "Verluste_Pro_Stunde": [ 16.744090909090914, - 0.0, - 552.0, - 672.0, - 1152.0, - 571.027376033058, 414.0, - 345.0, - 33.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, + 552.0, + 552.0, + 552.0, + 492.1022727272725, + 414.0, + 730.0663636363638, + 55.434, + 23.391818181818195, + 99.72409090909093, + 133.72909090909081, + 124.41545454545451, + 96.08318181818186, + 70.41409090909087, 118.37045454545455, 94.68272727272722, 83.01681818181817, @@ -513,11 +513,11 @@ 53.855999999999995, 159.6443999999999, 21.032399999999996, - 630.3761404958689, - 0.0, - 0.0, - 0.0, - 0.0, + 538.2984000000001, + 441.924, + 260.0003999999999, + 169.97160000000008, + 59.721600000000024, 35.132727272727266, 77.27590909090907, 134.59227272727276, @@ -528,41 +528,41 @@ 79.4714617768595, 79.4714617768595, 79.4714617768595, - 82.80479511019283, - 99.4714617768595, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 96.26355888429752, - 93.27483643250687, - 90.65435606060605, - 88.25977100550962, - 86.15538911845726, - 83.97344180440768, - 80.5305612947658, - 77.05952995867766, - 75.54588498622586, - 75.97475165289252, - 77.47075165289253, - 81.9053183195592, - 82.48955165289253, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 98.89101239669421, - 96.45174758953168, - 92.20325413223141, - 89.04386191460057, - 86.4914772727273 + 79.4714617768595, + 79.4714617768595, + 70.47202134986226, + 70.47202134986226, + 56.13911845730028, + 56.76228512396694, + 56.02390702479339, + 52.876050619834714, + 48.654804063360885, + 44.72754855371902, + 41.69461983471075, + 39.47195282369147, + 35.73551170798899, + 32.746789256198355, + 30.126308884297526, + 27.731723829201112, + 25.627341942148767, + 23.445394628099184, + 20.002514118457306, + 16.531482782369153, + 15.017837809917364, + 15.446704476584031, + 16.94270447658403, + 21.377271143250695, + 21.961504476584032, + 36.91423780991737, + 49.189904476584026, + 56.41213780991736, + 61.133571143250684, + 62.79250447658402, + 61.68351687327823, + 59.2442520661157, + 54.99575860881543, + 51.836366391184576, + 49.28398174931129 ] }, "eauto_obj": { @@ -675,78 +675,78 @@ "start_soc_prozent": 5 }, "start_solution": [ - 2.0, + 12.0, 4.0, - 1.0, + 19.0, + 9.0, + 20.0, + 14.0, 6.0, + 9.0, + 8.0, + 19.0, + 7.0, + 2.0, + 2.0, + 1.0, + 3.0, + 8.0, + 14.0, + 11.0, + 10.0, + 9.0, + 10.0, + 12.0, + 11.0, + 13.0, + 11.0, + 8.0, + 10.0, + 10.0, + 9.0, + 11.0, + 13.0, + 7.0, + 8.0, + 7.0, + 1.0, + 7.0, + 2.0, + 11.0, + 11.0, + 14.0, + 11.0, + 5.0, + 10.0, + 9.0, + 13.0, + 10.0, + 9.0, + 8.0, + 4.0, + 4.0, + 2.0, + 0.0, + 6.0, + 3.0, + 0.0, 5.0, 4.0, + 6.0, + 0.0, + 4.0, + 6.0, + 6.0, + 6.0, 1.0, 4.0, - 1.0, - 4.0, - 1.0, - 0.0, - 0.0, + 2.0, 2.0, 6.0, 3.0, - 3.0, - 3.0, 5.0, - 6.0, - 4.0, - 5.0, - 5.0, - 4.0, - 3.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 4.0, - 1.0, - 6.0, - 2.0, - 3.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 3.0, - 5.0, - 6.0, - 0.0, - 5.0, - 1.0, - 5.0, - 6.0, - 1.0, - 6.0, - 0.0, - 0.0, - 6.0, - 6.0, - 6.0, - 6.0, - 4.0, 3.0, 6.0, - 5.0, - 1.0, - 3.0, - 1.0, - 1.0, 0.0, 0.0, 0.0, @@ -771,7 +771,7 @@ 0.0, 0.0, 0.0, - 13.0 + 14.0 ], - "washingstart": 13 + "washingstart": 14 } \ No newline at end of file From 653f4f8d9f8126a897c29040eb8c02a8271cfad3 Mon Sep 17 00:00:00 2001 From: Andreas Date: Thu, 19 Dec 2024 14:45:20 +0100 Subject: [PATCH 02/47] - discharge hour penalty from start_hour - Inverter: Frist try of small self consumption rate (fixed) for better discharge_hour results --- src/akkudoktoreos/devices/inverter.py | 46 +++++++++++++++-------- src/akkudoktoreos/optimization/genetic.py | 2 +- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/akkudoktoreos/devices/inverter.py b/src/akkudoktoreos/devices/inverter.py index 9c91ed1..ca572ea 100644 --- a/src/akkudoktoreos/devices/inverter.py +++ b/src/akkudoktoreos/devices/inverter.py @@ -31,25 +31,39 @@ class Wechselrichter: eigenverbrauch = self.max_leistung_wh else: # Remaining power after consumption - restleistung_nach_verbrauch = erzeugung - verbrauch + restleistung_nach_verbrauch = (erzeugung - verbrauch) * 0.95 # EVQ + # Remaining load Self Consumption not perfect + restlast_evq = (erzeugung - verbrauch) * (1.0 - 0.95) - # Load battery with excess energy - geladene_energie, verluste_laden_akku = self.akku.energie_laden( - restleistung_nach_verbrauch, hour - ) - rest_überschuss = restleistung_nach_verbrauch - ( - geladene_energie + verluste_laden_akku - ) + if restlast_evq > 0: + # Akku muss den Restverbrauch decken + aus_akku, akku_entladeverluste = self.akku.energie_abgeben(restlast_evq, hour) + restlast_evq -= aus_akku # Restverbrauch nach Akkuentladung + verluste += akku_entladeverluste - # Feed-in to the grid based on remaining capacity - if rest_überschuss > self.max_leistung_wh - verbrauch: - netzeinspeisung = self.max_leistung_wh - verbrauch - verluste += rest_überschuss - netzeinspeisung - else: - netzeinspeisung = rest_überschuss + # Wenn der Akku den Restverbrauch nicht vollständig decken kann, wird der Rest ins Netz gezogen + if restlast_evq > 0: + netzbezug += restlast_evq + restlast_evq = 0 - verluste += verluste_laden_akku - eigenverbrauch = verbrauch # Self-consumption is equal to the load + if restleistung_nach_verbrauch > 0: + # Load battery with excess energy + geladene_energie, verluste_laden_akku = self.akku.energie_laden( + restleistung_nach_verbrauch, hour + ) + rest_überschuss = restleistung_nach_verbrauch - ( + geladene_energie + verluste_laden_akku + ) + + # Feed-in to the grid based on remaining capacity + if rest_überschuss > self.max_leistung_wh - verbrauch: + netzeinspeisung = self.max_leistung_wh - verbrauch + verluste += rest_überschuss - netzeinspeisung + else: + netzeinspeisung = rest_überschuss + + verluste += verluste_laden_akku + eigenverbrauch = verbrauch + aus_akku # Self-consumption is equal to the load else: benötigte_energie = verbrauch - erzeugung # Energy needed from external sources diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index 028cc0f..730202f 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -361,7 +361,7 @@ class optimization_problem: # Small Penalty for not discharging gesamtbilanz += sum( - 0.01 for i in range(self.prediction_hours) if discharge_hours_bin[i] == 0.0 + 0.01 for i in range(start_hour, self.prediction_hours) if discharge_hours_bin[i] == 0.0 ) # Penalty for not meeting the minimum SOC (State of Charge) requirement From 1e6d11ba170b23d442876201d13e6ce771dfb6c5 Mon Sep 17 00:00:00 2001 From: Andreas Date: Thu, 19 Dec 2024 14:47:40 +0100 Subject: [PATCH 03/47] Penalty not neccessary anymore. Self Consumption rate is FIXED!!! TODO! --- src/akkudoktoreos/optimization/genetic.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index 730202f..96f01d3 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -360,9 +360,9 @@ class optimization_problem: discharge_hours_bin, eautocharge_hours_index, _ = self.split_individual(individual) # Small Penalty for not discharging - gesamtbilanz += sum( - 0.01 for i in range(start_hour, self.prediction_hours) if discharge_hours_bin[i] == 0.0 - ) + # gesamtbilanz += sum( + # 0.01 for i in range(start_hour, self.prediction_hours) if discharge_hours_bin[i] == 0.0 + # ) # Penalty for not meeting the minimum SOC (State of Charge) requirement # if parameters.eauto_min_soc_prozent - ems.eauto.ladezustand_in_prozent() <= 0.0 and self.optimize_ev: From c56d29f63df629d3c16062c92e87b265ccbea60f Mon Sep 17 00:00:00 2001 From: Andreas Date: Fri, 20 Dec 2024 12:19:31 +0100 Subject: [PATCH 04/47] Interpolator Self Consumption --- .../data/regular_grid_interpolator.pkl | Bin 0 -> 57706 bytes .../self_consumption_probability.py | 50 ++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 src/akkudoktoreos/data/regular_grid_interpolator.pkl create mode 100644 src/akkudoktoreos/prediction/self_consumption_probability.py diff --git a/src/akkudoktoreos/data/regular_grid_interpolator.pkl b/src/akkudoktoreos/data/regular_grid_interpolator.pkl new file mode 100644 index 0000000000000000000000000000000000000000..005b2ddd97291ae11ca15bd797f13c106ba267cf GIT binary patch literal 57706 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 bu&7i6c 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

ppU^yN|P$T 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 float: + """Calculate the PV self-consumption rate using RegularGridInterpolator. + + Args: + - last_1h_power: 1h power levels (W). + - pv_power: Current PV power output (W). + + Returns: + - Self-consumption rate as a float. + """ + # Generate the range of partial loads (0 to last_1h_power) + partial_loads = np.arange(0, 3500, 50) + + # Get probabilities for all partial loads + points = np.array([np.full_like(partial_loads, load_1h_power), partial_loads]).T + probabilities = interpolator(points) + probabilities = probabilities / probabilities.sum() + for i, w in enumerate(partial_loads): + print(w, ": ", probabilities[i]) + print(probabilities.sum()) + # Ensure probabilities are within [0, 1] + probabilities = np.clip(probabilities, 0, 1) + + # Mask: Only include probabilities where the load is <= PV power + mask = partial_loads <= pv_power + + # Calculate the cumulative probability for covered loads + self_consumption_rate = np.sum(probabilities[mask]) / np.sum(probabilities) + + return self_consumption_rate + + +# Test the function +# print(calculate_self_consumption(1000, 1200)) From 4e8e9bd0c0bcbcd87d9bddc8b60168c4b36f4342 Mon Sep 17 00:00:00 2001 From: Andreas Date: Fri, 20 Dec 2024 15:59:49 +0100 Subject: [PATCH 05/47] First self consumption predictor only PV > load --- src/akkudoktoreos/devices/inverter.py | 21 ++++++++++++--- src/akkudoktoreos/optimization/genetic.py | 27 ++++++++++++++----- .../self_consumption_probability.py | 16 ++++++----- src/akkudoktoreos/server/fastapi_server.py | 4 +-- 4 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/akkudoktoreos/devices/inverter.py b/src/akkudoktoreos/devices/inverter.py index ca572ea..eb0bf30 100644 --- a/src/akkudoktoreos/devices/inverter.py +++ b/src/akkudoktoreos/devices/inverter.py @@ -1,6 +1,9 @@ from pydantic import BaseModel, Field from akkudoktoreos.devices.battery import PVAkku +from akkudoktoreos.prediction.self_consumption_probability import ( + self_consumption_probability_interpolator, +) class WechselrichterParameters(BaseModel): @@ -8,11 +11,17 @@ class WechselrichterParameters(BaseModel): class Wechselrichter: - def __init__(self, parameters: WechselrichterParameters, akku: PVAkku): + def __init__( + self, + parameters: WechselrichterParameters, + akku: PVAkku, + self_consumption_predictor: self_consumption_probability_interpolator, + ): self.max_leistung_wh = ( parameters.max_leistung_wh # Maximum power that the inverter can handle ) self.akku = akku # Connection to a battery object + self.self_consumption_predictor = self_consumption_predictor def energie_verarbeiten( self, erzeugung: float, verbrauch: float, hour: int @@ -21,7 +30,7 @@ class Wechselrichter: netzeinspeisung = 0.0 # Grid feed-in netzbezug = 0.0 # Grid draw eigenverbrauch = 0.0 # Self-consumption - + aus_akku = 0.0 if erzeugung >= verbrauch: if verbrauch > self.max_leistung_wh: # If consumption exceeds maximum inverter power @@ -30,10 +39,14 @@ class Wechselrichter: netzbezug = -restleistung_nach_verbrauch # Negative indicates feeding into the grid eigenverbrauch = self.max_leistung_wh else: + scr = self.self_consumption_predictor.calculate_self_consumption( + verbrauch, erzeugung + ) + # Remaining power after consumption - restleistung_nach_verbrauch = (erzeugung - verbrauch) * 0.95 # EVQ + restleistung_nach_verbrauch = (erzeugung - verbrauch) * scr # EVQ # Remaining load Self Consumption not perfect - restlast_evq = (erzeugung - verbrauch) * (1.0 - 0.95) + restlast_evq = (erzeugung - verbrauch) * (1.0 - scr) if restlast_evq > 0: # Akku muss den Restverbrauch decken diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index 96f01d3..3544eda 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -5,6 +5,7 @@ import numpy as np from deap import algorithms, base, creator, tools from pydantic import BaseModel, Field, field_validator, model_validator from typing_extensions import Self +from pathlib import Path from akkudoktoreos.config import AppConfig from akkudoktoreos.devices.battery import ( @@ -13,6 +14,9 @@ from akkudoktoreos.devices.battery import ( PVAkku, PVAkkuParameters, ) +from akkudoktoreos.prediction.self_consumption_probability import ( + self_consumption_probability_interpolator, +) from akkudoktoreos.devices.generic import HomeAppliance, HomeApplianceParameters from akkudoktoreos.devices.inverter import Wechselrichter, WechselrichterParameters from akkudoktoreos.prediction.ems import ( @@ -142,7 +146,7 @@ class optimization_problem: # AC states ac_mask = (discharge_hours_bin_np >= 2 * len_ac) & (discharge_hours_bin_np < 3 * len_ac) - ac_indices = discharge_hours_bin_np[ac_mask] - 2 * len_ac + ac_indices = (discharge_hours_bin_np[ac_mask] - 2 * len_ac).astype(int) # DC states (if enabled) if self.optimize_dc_charge: @@ -350,10 +354,10 @@ class optimization_problem: worst_case: bool, ) -> Tuple[float]: """Evaluate the fitness of an individual solution based on the simulation results.""" - try: - o = self.evaluate_inner(individual, ems, start_hour) - except Exception as e: - return (100000.0,) # Return a high penalty in case of an exception + # try: + o = self.evaluate_inner(individual, ems, start_hour) + # 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) @@ -443,13 +447,18 @@ class optimization_problem: parameters: OptimizationParameters, start_hour: int, worst_case: bool = False, - ngen: int = 600, + ngen: int = 200, ) -> OptimizeResponse: """Perform EMS (Energy Management System) optimization and visualize results.""" einspeiseverguetung_euro_pro_wh = np.full( self.prediction_hours, parameters.ems.einspeiseverguetung_euro_pro_wh ) + # 1h Load to Sub 1h Load Distribution -> SelfConsumptionRate + sc = self_consumption_probability_interpolator( + Path(__file__).parent.resolve() / ".." / "data" / "regular_grid_interpolator.pkl" + ) + # Initialize PV and EV batteries akku = PVAkku( parameters.pv_akku, @@ -481,7 +490,11 @@ class optimization_problem: ) # Initialize the inverter and energy management system - wr = Wechselrichter(parameters.wechselrichter, akku) + wr = Wechselrichter( + parameters.wechselrichter, + akku, + self_consumption_predictor=sc, + ) ems = EnergieManagementSystem( self._config.eos, parameters.ems, diff --git a/src/akkudoktoreos/prediction/self_consumption_probability.py b/src/akkudoktoreos/prediction/self_consumption_probability.py index ac789ce..1865986 100644 --- a/src/akkudoktoreos/prediction/self_consumption_probability.py +++ b/src/akkudoktoreos/prediction/self_consumption_probability.py @@ -10,9 +10,11 @@ class self_consumption_probability_interpolator: def __init__(self, filepath: str | Path): self.filepath = filepath self.interpolator = None + print("OPEN") # Load the RegularGridInterpolator - with open("regular_grid_interpolator.pkl", "rb") as file: - interpolator = pickle.load(self.filepath) + with open(self.filepath, "rb") as file: + print("OPENED") + self.interpolator = pickle.load(file) def calculate_self_consumption(self, load_1h_power: float, pv_power: float) -> float: """Calculate the PV self-consumption rate using RegularGridInterpolator. @@ -29,11 +31,13 @@ class self_consumption_probability_interpolator: # Get probabilities for all partial loads points = np.array([np.full_like(partial_loads, load_1h_power), partial_loads]).T - probabilities = interpolator(points) + if self.interpolator == None: + return -1.0 + probabilities = self.interpolator(points) probabilities = probabilities / probabilities.sum() - for i, w in enumerate(partial_loads): - print(w, ": ", probabilities[i]) - print(probabilities.sum()) + # for i, w in enumerate(partial_loads): + # print(w, ": ", probabilities[i]) + # print(probabilities.sum()) # Ensure probabilities are within [0, 1] probabilities = np.clip(probabilities, 0, 1) diff --git a/src/akkudoktoreos/server/fastapi_server.py b/src/akkudoktoreos/server/fastapi_server.py index c3add8a..1019b2a 100755 --- a/src/akkudoktoreos/server/fastapi_server.py +++ b/src/akkudoktoreos/server/fastapi_server.py @@ -48,7 +48,7 @@ app = FastAPI( working_dir = get_working_dir() # copy config to working directory. Make this a CLI option later config = load_config(working_dir, True) -opt_class = optimization_problem(config) +opt_class = optimization_problem(config, verbose=False) server_dir = Path(__file__).parent.resolve() @@ -196,7 +196,7 @@ def fastapi_optimize( ] = None, ) -> OptimizeResponse: if start_hour is None: - start_hour = datetime.now().hour + start_hour = 10 # datetime.now().hour # Perform optimization simulation result = opt_class.optimierung_ems(parameters=parameters, start_hour=start_hour) From 9214d190e8abf045bb7359975106f5a6fee0299a Mon Sep 17 00:00:00 2001 From: Andreas Date: Fri, 20 Dec 2024 16:01:53 +0100 Subject: [PATCH 06/47] Bug --- src/akkudoktoreos/server/fastapi_server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/akkudoktoreos/server/fastapi_server.py b/src/akkudoktoreos/server/fastapi_server.py index 1019b2a..8b7f9e5 100755 --- a/src/akkudoktoreos/server/fastapi_server.py +++ b/src/akkudoktoreos/server/fastapi_server.py @@ -196,7 +196,7 @@ def fastapi_optimize( ] = None, ) -> OptimizeResponse: if start_hour is None: - start_hour = 10 # datetime.now().hour + start_hour = datetime.now().hour # Perform optimization simulation result = opt_class.optimierung_ems(parameters=parameters, start_hour=start_hour) From 83bfb1878b00f3115247658097d3bce81a67d9ea Mon Sep 17 00:00:00 2001 From: Andreas Date: Fri, 20 Dec 2024 16:34:51 +0100 Subject: [PATCH 07/47] Time stop in verbose + LRU Cache / Vectoriz. --- src/akkudoktoreos/optimization/genetic.py | 19 +++-- .../self_consumption_probability.py | 74 +++++++++++-------- 2 files changed, 58 insertions(+), 35 deletions(-) diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index 3544eda..590a18a 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -1,6 +1,7 @@ import random +from tabnanny import verbose from typing import Any, Optional, Tuple - +import time import numpy as np from deap import algorithms, base, creator, tools from pydantic import BaseModel, Field, field_validator, model_validator @@ -354,10 +355,11 @@ class optimization_problem: worst_case: bool, ) -> Tuple[float]: """Evaluate the fitness of an individual solution based on the simulation results.""" - # try: - o = self.evaluate_inner(individual, ems, start_hour) - # except Exception as e: - # return (100000.0,) # Return a high penalty in case of an exception + + try: + o = self.evaluate_inner(individual, ems, start_hour) + 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) @@ -509,8 +511,13 @@ class optimization_problem: "evaluate", lambda ind: self.evaluate(ind, ems, parameters, start_hour, worst_case), ) - start_solution, extra_data = self.optimize(parameters.start_solution, ngen=ngen) + if self.verbose == True: + start_time = time.time() + start_solution, extra_data = self.optimize(parameters.start_solution, ngen=ngen) + if self.verbose == True: + elapsed_time = time.time() - start_time + print(f"Time evaluate inner: {elapsed_time:.4f} sec.") # Perform final evaluation on the best solution o = self.evaluate_inner(start_solution, ems, start_hour) discharge_hours_bin, eautocharge_hours_index, washingstart_int = self.split_individual( diff --git a/src/akkudoktoreos/prediction/self_consumption_probability.py b/src/akkudoktoreos/prediction/self_consumption_probability.py index 1865986..65261dc 100644 --- a/src/akkudoktoreos/prediction/self_consumption_probability.py +++ b/src/akkudoktoreos/prediction/self_consumption_probability.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import numpy as np import pickle +from functools import lru_cache # from scipy.interpolate import RegularGridInterpolator from pathlib import Path @@ -10,44 +11,59 @@ class self_consumption_probability_interpolator: def __init__(self, filepath: str | Path): self.filepath = filepath self.interpolator = None - print("OPEN") # Load the RegularGridInterpolator with open(self.filepath, "rb") as file: - print("OPENED") self.interpolator = pickle.load(file) - def calculate_self_consumption(self, load_1h_power: float, pv_power: float) -> float: - """Calculate the PV self-consumption rate using RegularGridInterpolator. - - Args: - - last_1h_power: 1h power levels (W). - - pv_power: Current PV power output (W). - - Returns: - - Self-consumption rate as a float. - """ - # Generate the range of partial loads (0 to last_1h_power) - partial_loads = np.arange(0, 3500, 50) - - # Get probabilities for all partial loads + @lru_cache(maxsize=128) + def generate_points(self, load_1h_power: float, pv_power: float): + """Generate the grid points for interpolation.""" + partial_loads = np.arange(0, pv_power + 50, 50) points = np.array([np.full_like(partial_loads, load_1h_power), partial_loads]).T - if self.interpolator == None: - return -1.0 + return points, partial_loads + + def calculate_self_consumption(self, load_1h_power: float, pv_power: float) -> float: + points, partial_loads = self.generate_points(load_1h_power, pv_power) probabilities = self.interpolator(points) - probabilities = probabilities / probabilities.sum() - # for i, w in enumerate(partial_loads): - # print(w, ": ", probabilities[i]) - # print(probabilities.sum()) - # Ensure probabilities are within [0, 1] - probabilities = np.clip(probabilities, 0, 1) + return probabilities.sum() - # Mask: Only include probabilities where the load is <= PV power - mask = partial_loads <= pv_power + # def calculate_self_consumption(self, load_1h_power: float, pv_power: float) -> float: + # """Calculate the PV self-consumption rate using RegularGridInterpolator. - # Calculate the cumulative probability for covered loads - self_consumption_rate = np.sum(probabilities[mask]) / np.sum(probabilities) + # Args: + # - last_1h_power: 1h power levels (W). + # - pv_power: Current PV power output (W). - return self_consumption_rate + # Returns: + # - Self-consumption rate as a float. + # """ + # # Generate the range of partial loads (0 to last_1h_power) + # partial_loads = np.arange(0, pv_power + 50, 50) + + # # Get probabilities for all partial loads + # points = np.array([np.full_like(partial_loads, load_1h_power), partial_loads]).T + # if self.interpolator == None: + # return -1.0 + # probabilities = self.interpolator(points) + # self_consumption_rate = probabilities.sum() + + # # probabilities = probabilities / (np.sum(probabilities)) # / (pv_power / 3450)) + # # # for i, w in enumerate(partial_loads): + # # # print(w, ": ", probabilities[i]) + # # print(probabilities.sum()) + + # # # Ensure probabilities are within [0, 1] + # # probabilities = np.clip(probabilities, 0, 1) + + # # # Mask: Only include probabilities where the load is <= PV power + # # mask = partial_loads <= pv_power + + # # # Calculate the cumulative probability for covered loads + # # self_consumption_rate = np.sum(probabilities[mask]) / np.sum(probabilities) + # # print(self_consumption_rate) + # # sys.exit() + + # return self_consumption_rate # Test the function From 85395076be60dead8aec26ac05211332142fe190 Mon Sep 17 00:00:00 2001 From: Andreas Date: Fri, 20 Dec 2024 17:07:57 +0100 Subject: [PATCH 08/47] Small penalty when EV 100% and charge >0 --- src/akkudoktoreos/optimization/genetic.py | 14 ++++++++------ src/akkudoktoreos/server/fastapi_server.py | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index 590a18a..daea94d 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -7,7 +7,7 @@ from deap import algorithms, base, creator, tools from pydantic import BaseModel, Field, field_validator, model_validator from typing_extensions import Self from pathlib import Path - +import sys from akkudoktoreos.config import AppConfig from akkudoktoreos.devices.battery import ( EAutoParameters, @@ -344,6 +344,7 @@ class optimization_problem: ems.set_ev_charge_hours(np.array(eautocharge_hours_float)) else: ems.set_ev_charge_hours(np.full(self.prediction_hours, 0)) + return ems.simuliere(start_hour) def evaluate( @@ -370,11 +371,12 @@ class optimization_problem: # 0.01 for i in range(start_hour, self.prediction_hours) if discharge_hours_bin[i] == 0.0 # ) - # Penalty for not meeting the minimum SOC (State of Charge) requirement - # if parameters.eauto_min_soc_prozent - ems.eauto.ladezustand_in_prozent() <= 0.0 and self.optimize_ev: - # gesamtbilanz += sum( - # self.strafe for ladeleistung in eautocharge_hours_index if ladeleistung != 0.0 - # ) + # Penalty for charging EV, with battery full + len_soc = len(o["EAuto_SoC_pro_Stunde"]) + eautocharge_hours = np.array(eautocharge_hours_index) + relevant_indices = eautocharge_hours[-len_soc:] + mask = (o["EAuto_SoC_pro_Stunde"] == 100) & (relevant_indices != 0) + gesamtbilanz += np.sum(mask) * 0.01 individual.extra_data = ( # type: ignore[attr-defined] o["Gesamtbilanz_Euro"], diff --git a/src/akkudoktoreos/server/fastapi_server.py b/src/akkudoktoreos/server/fastapi_server.py index 8b7f9e5..c68967c 100755 --- a/src/akkudoktoreos/server/fastapi_server.py +++ b/src/akkudoktoreos/server/fastapi_server.py @@ -48,7 +48,7 @@ app = FastAPI( working_dir = get_working_dir() # copy config to working directory. Make this a CLI option later config = load_config(working_dir, True) -opt_class = optimization_problem(config, verbose=False) +opt_class = optimization_problem(config, verbose=True) server_dir = Path(__file__).parent.resolve() From b0cd91040303ce7e1b9ec953bd5fec90d659659b Mon Sep 17 00:00:00 2001 From: Andreas Date: Fri, 20 Dec 2024 17:39:40 +0100 Subject: [PATCH 09/47] Start solution Bug --- src/akkudoktoreos/optimization/genetic.py | 35 ++++++++++++++--------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index daea94d..ae0e27a 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -225,26 +225,32 @@ class optimization_problem: def split_individual( self, individual: list[int] - ) -> tuple[list[int], Optional[list[int]], Optional[int]]: - """Split the individual solution into its components. + ) -> Tuple[np.ndarray, Optional[np.ndarray], Optional[int]]: + """ + Split the individual solution into its components. Components: - 1. Discharge hours (binary), - 2. Electric vehicle charge hours (float), + 1. Discharge hours (binary as int NumPy array), + 2. Electric vehicle charge hours (float as int NumPy array, if applicable), 3. Dishwasher start time (integer if applicable). """ - discharge_hours_bin = individual[: self.prediction_hours] + # Discharge hours as a NumPy array of ints + discharge_hours_bin = np.array(individual[: self.prediction_hours], dtype=int) + + # EV charge hours as a NumPy array of ints (if optimize_ev is True) eautocharge_hours_index = ( - individual[self.prediction_hours : self.prediction_hours * 2] + np.array(individual[self.prediction_hours : self.prediction_hours * 2], dtype=int) if self.optimize_ev else None ) + # Washing machine start time as an integer (if applicable) washingstart_int = ( int(individual[-1]) if self.opti_param and self.opti_param.get("home_appliance", 0) > 0 else None ) + return discharge_hours_bin, eautocharge_hours_index, washingstart_int def setup_deap_environment(self, opti_param: dict[str, Any], start_hour: int) -> None: @@ -371,12 +377,13 @@ class optimization_problem: # 0.01 for i in range(start_hour, self.prediction_hours) if discharge_hours_bin[i] == 0.0 # ) - # Penalty for charging EV, with battery full - len_soc = len(o["EAuto_SoC_pro_Stunde"]) - eautocharge_hours = np.array(eautocharge_hours_index) - relevant_indices = eautocharge_hours[-len_soc:] - mask = (o["EAuto_SoC_pro_Stunde"] == 100) & (relevant_indices != 0) - gesamtbilanz += np.sum(mask) * 0.01 + # if self.optimize_ev: + # # Penalty for charging EV, with battery full + # len_soc = len(o["EAuto_SoC_pro_Stunde"]) + # eautocharge_hours = np.array(eautocharge_hours_index) + # relevant_indices = eautocharge_hours[-len_soc:] + # mask = (o["EAuto_SoC_pro_Stunde"] == 100) & (relevant_indices != 0) + # gesamtbilanz += np.sum(mask) * 0.1 individual.extra_data = ( # type: ignore[attr-defined] o["Gesamtbilanz_Euro"], @@ -419,7 +426,7 @@ class optimization_problem: # Insert the start solution into the population if provided if start_solution is not None: - for _ in range(3): + for _ in range(10): population.insert(0, creator.Individual(start_solution)) # Run the evolutionary algorithm @@ -451,7 +458,7 @@ class optimization_problem: parameters: OptimizationParameters, start_hour: int, worst_case: bool = False, - ngen: int = 200, + ngen: int = 400, ) -> OptimizeResponse: """Perform EMS (Energy Management System) optimization and visualize results.""" einspeiseverguetung_euro_pro_wh = np.full( From 155c116819df8de7abbe0ffc16ff0ba8dd2ddf62 Mon Sep 17 00:00:00 2001 From: Andreas Date: Fri, 20 Dec 2024 19:14:11 +0100 Subject: [PATCH 10/47] EV Charge Bug fixed --- src/akkudoktoreos/optimization/genetic.py | 93 +++++++++++++++++++---- 1 file changed, 78 insertions(+), 15 deletions(-) diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index ae0e27a..871bb2d 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -223,6 +223,42 @@ class optimization_problem: return creator.Individual(individual_components) + def merge_individual( + self, + discharge_hours_bin: np.ndarray, + eautocharge_hours_index: Optional[np.ndarray], + washingstart_int: Optional[int], + ) -> list[int]: + """ + Merge the individual components back into a single solution list. + + Parameters: + discharge_hours_bin (np.ndarray): Binary discharge hours. + eautocharge_hours_index (Optional[np.ndarray]): EV charge hours as integers, or None. + washingstart_int (Optional[int]): Dishwasher start time as integer, or None. + + Returns: + list[int]: The merged individual solution as a list of integers. + """ + # Start with the discharge hours + individual = discharge_hours_bin.tolist() + + # Add EV charge hours if applicable + if self.optimize_ev and eautocharge_hours_index is not None: + individual.extend(eautocharge_hours_index.tolist()) + elif self.optimize_ev: + # Falls optimize_ev aktiv ist, aber keine EV-Daten vorhanden sind, fügen wir Nullen hinzu + individual.extend([0] * self.prediction_hours) + + # Add dishwasher start time if applicable + if self.opti_param.get("home_appliance", 0) > 0 and washingstart_int is not None: + individual.append(washingstart_int) + elif self.opti_param.get("home_appliance", 0) > 0: + # Falls ein Haushaltsgerät optimiert wird, aber kein Startzeitpunkt vorhanden ist + individual.append(0) + + return individual + def split_individual( self, individual: list[int] ) -> Tuple[np.ndarray, Optional[np.ndarray], Optional[int]]: @@ -370,21 +406,46 @@ class optimization_problem: gesamtbilanz = o["Gesamtbilanz_Euro"] * (-1.0 if worst_case else 1.0) - discharge_hours_bin, eautocharge_hours_index, _ = self.split_individual(individual) + discharge_hours_bin, eautocharge_hours_index, washingstart_int = self.split_individual( + individual + ) - # Small Penalty for not discharging - # gesamtbilanz += sum( - # 0.01 for i in range(start_hour, self.prediction_hours) if discharge_hours_bin[i] == 0.0 - # ) + # EV 100% & charge not allowed + if self.optimize_ev: + eauto_soc_per_hour = np.array(o.get("EAuto_SoC_pro_Stunde", [])) # Beispielkey - # if self.optimize_ev: - # # Penalty for charging EV, with battery full - # len_soc = len(o["EAuto_SoC_pro_Stunde"]) - # eautocharge_hours = np.array(eautocharge_hours_index) - # relevant_indices = eautocharge_hours[-len_soc:] - # mask = (o["EAuto_SoC_pro_Stunde"] == 100) & (relevant_indices != 0) - # gesamtbilanz += np.sum(mask) * 0.1 + # Angleichung von hinten + min_length = min(len(eauto_soc_per_hour), len(eautocharge_hours_index)) + eauto_soc_per_hour_tail = eauto_soc_per_hour[-min_length:] + eautocharge_hours_index_tail = np.array(eautocharge_hours_index[-min_length:]) + # Erstelle die Maske für die relevanten Abschnitte + invalid_charge_mask = (eauto_soc_per_hour_tail == 100) & ( + eautocharge_hours_index_tail > 0 + ) + + # Überprüfen und anpassen der Ladezeiten + if np.any(invalid_charge_mask): + # Ignoriere den ersten ungültigen Eintrag + invalid_indices = np.where(invalid_charge_mask)[0] + if ( + len(invalid_indices) > 1 + ): # Nur anpassen, wenn mehr als ein ungültiger Eintrag vorliegt + eautocharge_hours_index_tail[invalid_indices[1:]] = 0 + + # Aktualisiere die letzten min_length-Einträge von eautocharge_hours_index + eautocharge_hours_index[-min_length:] = eautocharge_hours_index_tail.tolist() + + # Rückschreiben der Anpassungen in `individual` + adjusted_individual = self.merge_individual( + discharge_hours_bin, eautocharge_hours_index, washingstart_int + ) + + # print("Vor:", individual) + individual[:] = adjusted_individual # Aktualisiere das ursprüngliche individual + # print("Nach:", individual)# + + # Berechnung weiterer Metriken individual.extra_data = ( # type: ignore[attr-defined] o["Gesamtbilanz_Euro"], o["Gesamt_Verluste"], @@ -394,11 +455,9 @@ class optimization_problem: ) # Adjust total balance with battery value and penalties for unmet SOC - restwert_akku = ems.akku.aktueller_energieinhalt() * parameters.ems.preis_euro_pro_wh_akku - # print(ems.akku.aktueller_energieinhalt()," * ", parameters.ems.preis_euro_pro_wh_akku , " ", restwert_akku, " ", gesamtbilanz) gesamtbilanz += -restwert_akku - # print(gesamtbilanz) + if self.optimize_ev: gesamtbilanz += max( 0, @@ -524,14 +583,18 @@ class optimization_problem: if self.verbose == True: start_time = time.time() start_solution, extra_data = self.optimize(parameters.start_solution, ngen=ngen) + if self.verbose == True: elapsed_time = time.time() - start_time print(f"Time evaluate inner: {elapsed_time:.4f} sec.") # Perform final evaluation on the best solution + print(start_solution[start_hour:]) + print(start_hour) o = self.evaluate_inner(start_solution, ems, start_hour) discharge_hours_bin, eautocharge_hours_index, washingstart_int = self.split_individual( start_solution ) + eautocharge_hours_float = ( [ self._config.eos.available_charging_rates_in_percentage[i] From 6aa8838e5b1ce41ceb16a039b23c8ffb5009d2c0 Mon Sep 17 00:00:00 2001 From: Andreas Date: Sat, 21 Dec 2024 09:49:47 +0100 Subject: [PATCH 11/47] Price Forceast (use mean of last 7 days instead of repeat) --- .../prediction/price_forecast.py | 86 +++++++++++++++++-- src/akkudoktoreos/server/fastapi_server.py | 16 +++- 2 files changed, 89 insertions(+), 13 deletions(-) diff --git a/src/akkudoktoreos/prediction/price_forecast.py b/src/akkudoktoreos/prediction/price_forecast.py index f5bb781..c1701fe 100644 --- a/src/akkudoktoreos/prediction/price_forecast.py +++ b/src/akkudoktoreos/prediction/price_forecast.py @@ -3,8 +3,7 @@ import json import zoneinfo from datetime import datetime, timedelta, timezone from pathlib import Path -from typing import Any, Sequence - +from typing import Any, Sequence, Optional import numpy as np import requests @@ -37,10 +36,12 @@ class HourlyElectricityPriceForecast: if not self.cache_dir.is_dir(): raise SetupIncomplete(f"Output path does not exist: {self.cache_dir}.") + self.seven_day_mean = None self.cache_time_file = self.cache_dir / "cache_timestamp.txt" self.prices = self.load_data(source) self.charges = charges self.prediction_hours = config.eos.prediction_hours + self.seven_day_mean = self.get_average_price_last_7_days() def load_data(self, source: str | Path) -> list[dict[str, Any]]: cache_file = self.get_cache_file(source) @@ -116,10 +117,66 @@ class HourlyElectricityPriceForecast: return np.array(date_prices) / (1000.0 * 100.0) + self.charges - def get_price_for_daterange(self, start_date_str: str, end_date_str: str) -> np.ndarray: + def get_average_price_last_7_days(self, end_date_str: Optional[str] = None) -> np.ndarray: + """ + Calculate the hourly average electricity price for the last 7 days. + + Parameters: + end_date_str (Optional[str]): End date in the format "YYYY-MM-DD". + If not provided, today's date will be used. + + Returns: + np.ndarray: A NumPy array of 24 elements, each representing the hourly + average price over the last 7 days. + + Raises: + ValueError: If there is insufficient data to calculate the averages. + """ + # Determine the end date (use today's date if not provided) + if end_date_str is None: + end_date = datetime.now().date() - timedelta(days=1) + else: + end_date = datetime.strptime(end_date_str, "%Y-%m-%d").date() + + if self.seven_day_mean != None: + return self.seven_day_mean + + # Calculate the start date (7 days before the end date) + start_date = end_date - timedelta(days=7) + + # Convert dates to strings + start_date_str = start_date.strftime("%Y-%m-%d") + end_date_str = end_date.strftime("%Y-%m-%d") + + # Retrieve price data for the specified date range + price_data = self.get_price_for_daterange(start_date_str, end_date_str) + + # Ensure there is enough data for 7 full days (7 days × 24 hours) + if price_data.size < 7 * 24: + raise ValueError( + "Not enough data to calculate the average for the last 7 days.", price_data + ) + # Calculate the overall average price across all data + # overall_average_price = np.mean(price_data) + + # Create an array of 24 hourly values filled with the overall average + # average_prices = np.full(24, overall_average_price) + + # print("Overall AVG (duplicated for 24 hours):", average_prices) + # return average_prices + # Reshape the data into a 7x24 matrix (7 rows for days, 24 columns for hours) + price_matrix = price_data.reshape(-1, 24) + + # Calculate the average price for each hour across the 7 days + average_prices = np.mean(price_matrix, axis=0) + # print("AVG:", average_prices) + return average_prices + + def get_price_for_daterange( + self, start_date_str: str, end_date_str: str, repeat: bool = False + ) -> np.ndarray: """Returns all prices between the start and end dates.""" - print(start_date_str) - print(end_date_str) + start_date_utc = datetime.strptime(start_date_str, "%Y-%m-%d").replace(tzinfo=timezone.utc) end_date_utc = datetime.strptime(end_date_str, "%Y-%m-%d").replace(tzinfo=timezone.utc) start_date = start_date_utc.astimezone(zoneinfo.ZoneInfo("Europe/Berlin")) @@ -134,11 +191,22 @@ class HourlyElectricityPriceForecast: if daily_prices.size == 24: price_list.extend(daily_prices) start_date += timedelta(days=1) - + # print(date_str, ":", daily_prices) price_list_np = np.array(price_list) - # If prediction hours are greater than 0, reshape the price list - if self.prediction_hours > 0: - price_list_np = repeat_to_shape(price_list_np, (self.prediction_hours,)) + print(price_list_np) + # If prediction hours are greater than 0 and repeat is True + + if self.prediction_hours > 0 and repeat: + # Check if price_list_np is shorter than prediction_hours + if price_list_np.size < self.prediction_hours: + # Repeat the seven_day_mean array to cover the missing hours + repeat_count = (self.prediction_hours // self.seven_day_mean.size) + 1 + additional_values = np.tile(self.seven_day_mean, repeat_count)[ + : self.prediction_hours - price_list_np.size + ] + + # Concatenate existing values with the repeated values + price_list_np = np.concatenate((price_list_np, additional_values)) return price_list_np diff --git a/src/akkudoktoreos/server/fastapi_server.py b/src/akkudoktoreos/server/fastapi_server.py index c68967c..6b470ec 100755 --- a/src/akkudoktoreos/server/fastapi_server.py +++ b/src/akkudoktoreos/server/fastapi_server.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import os -from datetime import datetime +from datetime import datetime, timedelta from pathlib import Path from typing import Annotated, Any, Dict, List, Optional @@ -59,15 +59,23 @@ class PdfResponse(FileResponse): @app.get("/strompreis") def fastapi_strompreis() -> list[float]: # Get the current date and the end date based on prediction hours - date_now, date = get_start_enddate(config.eos.prediction_hours, startdate=datetime.now().date()) + date_start_pred, date_end = get_start_enddate( + config.eos.prediction_hours, startdate=datetime.now().date() + ) + date_start = (datetime.now().date() - timedelta(days=8)).strftime("%Y-%m-%d") price_forecast = HourlyElectricityPriceForecast( - source=f"https://api.akkudoktor.net/prices?start={date_now}&end={date}", + source=f"https://api.akkudoktor.net/prices?start={date_start}&end={date_end}", config=config, use_cache=False, ) + # seven Day mean specific_date_prices = price_forecast.get_price_for_daterange( - date_now, date + date_start, date_end ) # Fetch prices for the specified date range + + specific_date_prices = price_forecast.get_price_for_daterange( + date_start_pred, date_end, repeat=True + ) return specific_date_prices.tolist() From d2a83f6ea4cff0e0f21d6b19537a81b3fc15278a Mon Sep 17 00:00:00 2001 From: Andreas Date: Sat, 21 Dec 2024 13:26:41 +0100 Subject: [PATCH 12/47] Price Prediction as JSON simulation output, config fixed electricty fees configurable + MyPy & Ruff --- src/akkudoktoreos/config.py | 1 + src/akkudoktoreos/default.config.json | 3 +- src/akkudoktoreos/optimization/genetic.py | 49 +++++++------------ src/akkudoktoreos/prediction/ems.py | 9 +++- .../prediction/price_forecast.py | 31 ++++++------ .../self_consumption_probability.py | 8 +-- src/akkudoktoreos/server/fastapi_server.py | 1 + tests/test_class_ems.py | 15 +++++- tests/test_class_ems_2.py | 15 +++++- 9 files changed, 78 insertions(+), 54 deletions(-) diff --git a/src/akkudoktoreos/config.py b/src/akkudoktoreos/config.py index 442d362..2071e79 100644 --- a/src/akkudoktoreos/config.py +++ b/src/akkudoktoreos/config.py @@ -56,6 +56,7 @@ class EOSConfig(BaseModel): penalty: int available_charging_rates_in_percentage: list[float] feed_in_tariff_eur_per_wh: int + electricty_price_fixed_fee: float class BaseConfig(BaseModel): diff --git a/src/akkudoktoreos/default.config.json b/src/akkudoktoreos/default.config.json index d05c20a..2d9f1ac 100644 --- a/src/akkudoktoreos/default.config.json +++ b/src/akkudoktoreos/default.config.json @@ -10,6 +10,7 @@ "available_charging_rates_in_percentage": [ 0.0, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0 ], - "feed_in_tariff_eur_per_wh": 48 + "feed_in_tariff_eur_per_wh": 48, + "electricty_price_fixed_fee": 0.00021 } } diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index 871bb2d..4f31c39 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -1,13 +1,13 @@ import random -from tabnanny import verbose -from typing import Any, Optional, Tuple import time +from pathlib import Path +from typing import Any, Optional, Tuple + import numpy as np from deap import algorithms, base, creator, tools from pydantic import BaseModel, Field, field_validator, model_validator from typing_extensions import Self -from pathlib import Path -import sys + from akkudoktoreos.config import AppConfig from akkudoktoreos.devices.battery import ( EAutoParameters, @@ -15,9 +15,6 @@ from akkudoktoreos.devices.battery import ( PVAkku, PVAkkuParameters, ) -from akkudoktoreos.prediction.self_consumption_probability import ( - self_consumption_probability_interpolator, -) from akkudoktoreos.devices.generic import HomeAppliance, HomeApplianceParameters from akkudoktoreos.devices.inverter import Wechselrichter, WechselrichterParameters from akkudoktoreos.prediction.ems import ( @@ -25,6 +22,9 @@ from akkudoktoreos.prediction.ems import ( EnergieManagementSystemParameters, SimulationResult, ) +from akkudoktoreos.prediction.self_consumption_probability import ( + self_consumption_probability_interpolator, +) from akkudoktoreos.utils.utils import NumpyEncoder from akkudoktoreos.visualize import visualisiere_ergebnisse @@ -126,7 +126,7 @@ class optimization_problem: random.seed(fixed_seed) def decode_charge_discharge( - self, discharge_hours_bin: list[int] + self, discharge_hours_bin: np.ndarray ) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: """Decode the input array into ac_charge, dc_charge, and discharge arrays.""" discharge_hours_bin_np = np.array(discharge_hours_bin) @@ -229,8 +229,7 @@ class optimization_problem: eautocharge_hours_index: Optional[np.ndarray], washingstart_int: Optional[int], ) -> list[int]: - """ - Merge the individual components back into a single solution list. + """Merge the individual components back into a single solution list. Parameters: discharge_hours_bin (np.ndarray): Binary discharge hours. @@ -262,8 +261,7 @@ class optimization_problem: def split_individual( self, individual: list[int] ) -> Tuple[np.ndarray, Optional[np.ndarray], Optional[int]]: - """ - Split the individual solution into its components. + """Split the individual solution into its components. Components: 1. Discharge hours (binary as int NumPy array), @@ -398,7 +396,6 @@ class optimization_problem: worst_case: bool, ) -> Tuple[float]: """Evaluate the fitness of an individual solution based on the simulation results.""" - try: o = self.evaluate_inner(individual, ems, start_hour) except Exception as e: @@ -414,36 +411,29 @@ class optimization_problem: if self.optimize_ev: eauto_soc_per_hour = np.array(o.get("EAuto_SoC_pro_Stunde", [])) # Beispielkey - # Angleichung von hinten - min_length = min(len(eauto_soc_per_hour), len(eautocharge_hours_index)) + if eauto_soc_per_hour is None or eautocharge_hours_index is None: + raise ValueError("eauto_soc_per_hour or eautocharge_hours_index is None") + min_length = min(eauto_soc_per_hour.size, eautocharge_hours_index.size) eauto_soc_per_hour_tail = eauto_soc_per_hour[-min_length:] - eautocharge_hours_index_tail = np.array(eautocharge_hours_index[-min_length:]) + eautocharge_hours_index_tail = eautocharge_hours_index[-min_length:] - # Erstelle die Maske für die relevanten Abschnitte + # Mask invalid_charge_mask = (eauto_soc_per_hour_tail == 100) & ( eautocharge_hours_index_tail > 0 ) - # Überprüfen und anpassen der Ladezeiten if np.any(invalid_charge_mask): - # Ignoriere den ersten ungültigen Eintrag invalid_indices = np.where(invalid_charge_mask)[0] - if ( - len(invalid_indices) > 1 - ): # Nur anpassen, wenn mehr als ein ungültiger Eintrag vorliegt + if len(invalid_indices) > 1: eautocharge_hours_index_tail[invalid_indices[1:]] = 0 - # Aktualisiere die letzten min_length-Einträge von eautocharge_hours_index eautocharge_hours_index[-min_length:] = eautocharge_hours_index_tail.tolist() - # Rückschreiben der Anpassungen in `individual` adjusted_individual = self.merge_individual( discharge_hours_bin, eautocharge_hours_index, washingstart_int ) - # print("Vor:", individual) individual[:] = adjusted_individual # Aktualisiere das ursprüngliche individual - # print("Nach:", individual)# # Berechnung weiterer Metriken individual.extra_data = ( # type: ignore[attr-defined] @@ -472,7 +462,7 @@ class optimization_problem: return (gesamtbilanz,) def optimize( - self, start_solution: Optional[list[float]] = None, ngen: int = 400 + self, start_solution: Optional[list[float]] = None, ngen: int = 200 ) -> Tuple[Any, dict[str, list[Any]]]: """Run the optimization process using a genetic algorithm.""" population = self.toolbox.population(n=300) @@ -588,13 +578,11 @@ class optimization_problem: elapsed_time = time.time() - start_time print(f"Time evaluate inner: {elapsed_time:.4f} sec.") # Perform final evaluation on the best solution - print(start_solution[start_hour:]) - print(start_hour) + o = self.evaluate_inner(start_solution, ems, start_hour) discharge_hours_bin, eautocharge_hours_index, washingstart_int = self.split_individual( start_solution ) - eautocharge_hours_float = ( [ self._config.eos.available_charging_rates_in_percentage[i] @@ -620,7 +608,6 @@ class optimization_problem: config=self._config, extra_data=extra_data, ) - return OptimizeResponse( **{ "ac_charge": ac_charge, diff --git a/src/akkudoktoreos/prediction/ems.py b/src/akkudoktoreos/prediction/ems.py index 833142c..e9998d4 100644 --- a/src/akkudoktoreos/prediction/ems.py +++ b/src/akkudoktoreos/prediction/ems.py @@ -78,6 +78,9 @@ class SimulationResult(BaseModel): akku_soc_pro_stunde: list[Optional[float]] = Field( description="The state of charge of the battery (not the EV) in percentage per hour." ) + Electricity_price: list[Optional[float]] = Field( + description="Used Electricity Price, including predictions" + ) @field_validator( "Last_Wh_pro_Stunde", @@ -89,6 +92,7 @@ class SimulationResult(BaseModel): "EAuto_SoC_pro_Stunde", "Verluste_Pro_Stunde", "Home_appliance_wh_per_hour", + "Electricity_price", mode="before", ) def convert_numpy(cls, field: Any) -> Any: @@ -171,6 +175,7 @@ class EnergieManagementSystem: eauto_soc_pro_stunde = np.full((total_hours), np.nan) verluste_wh_pro_stunde = np.full((total_hours), np.nan) home_appliance_wh_per_hour = np.full((total_hours), np.nan) + electricity_price_per_hour = np.full((total_hours), np.nan) # Set initial state akku_soc_pro_stunde[0] = self.akku.ladezustand_in_prozent() @@ -222,7 +227,7 @@ class EnergieManagementSystem: netzbezug_wh_pro_stunde[stunde_since_now] = netzbezug verluste_wh_pro_stunde[stunde_since_now] += verluste last_wh_pro_stunde[stunde_since_now] = verbrauch - + electricity_price_per_hour[stunde_since_now] = self.strompreis_euro_pro_wh[stunde] # Financial calculations kosten_euro_pro_stunde[stunde_since_now] = ( netzbezug * self.strompreis_euro_pro_wh[stunde] @@ -252,6 +257,6 @@ class EnergieManagementSystem: "Verluste_Pro_Stunde": verluste_wh_pro_stunde, "Gesamt_Verluste": np.nansum(verluste_wh_pro_stunde), "Home_appliance_wh_per_hour": home_appliance_wh_per_hour, + "Electricity_price": electricity_price_per_hour, } - return out diff --git a/src/akkudoktoreos/prediction/price_forecast.py b/src/akkudoktoreos/prediction/price_forecast.py index c1701fe..e2313d2 100644 --- a/src/akkudoktoreos/prediction/price_forecast.py +++ b/src/akkudoktoreos/prediction/price_forecast.py @@ -3,7 +3,8 @@ import json import zoneinfo from datetime import datetime, timedelta, timezone from pathlib import Path -from typing import Any, Sequence, Optional +from typing import Any, Optional, Sequence + import numpy as np import requests @@ -28,7 +29,7 @@ class HourlyElectricityPriceForecast: self, source: str | Path, config: AppConfig, - charges: float = 0.000228, + charges: float = 0.00021, use_cache: bool = True, ): # 228 self.cache_dir = config.working_dir / config.directories.cache @@ -36,7 +37,7 @@ class HourlyElectricityPriceForecast: if not self.cache_dir.is_dir(): raise SetupIncomplete(f"Output path does not exist: {self.cache_dir}.") - self.seven_day_mean = None + self.seven_day_mean = np.array([]) self.cache_time_file = self.cache_dir / "cache_timestamp.txt" self.prices = self.load_data(source) self.charges = charges @@ -97,7 +98,7 @@ class HourlyElectricityPriceForecast: # Extract the price from 00:00 of the previous day previous_day_prices = [ - entry["marketpriceEurocentPerKWh"] + self.charges + entry["marketpriceEurocentPerKWh"] # + self.charges for entry in self.prices if previous_day_str in entry["end"] ] @@ -105,21 +106,22 @@ class HourlyElectricityPriceForecast: # Extract all prices for the specified date date_prices = [ - entry["marketpriceEurocentPerKWh"] + self.charges + entry["marketpriceEurocentPerKWh"] # + self.charges for entry in self.prices if date_str in entry["end"] ] - print(f"getPrice: {len(date_prices)}") + # print(f"getPrice: {len(date_prices)}") # Add the last price of the previous day at the start of the list if len(date_prices) == 23: date_prices.insert(0, last_price_of_previous_day) - + # print(np.array(date_prices) / (1000.0 * 100.0)) + # print("PRICE:") + # print(np.array(date_prices) / (1000.0 * 100.0) + self.charges) return np.array(date_prices) / (1000.0 * 100.0) + self.charges def get_average_price_last_7_days(self, end_date_str: Optional[str] = None) -> np.ndarray: - """ - Calculate the hourly average electricity price for the last 7 days. + """Calculate the hourly average electricity price for the last 7 days. Parameters: end_date_str (Optional[str]): End date in the format "YYYY-MM-DD". @@ -138,8 +140,8 @@ class HourlyElectricityPriceForecast: else: end_date = datetime.strptime(end_date_str, "%Y-%m-%d").date() - if self.seven_day_mean != None: - return self.seven_day_mean + if self.seven_day_mean.size > 0: + return np.array([self.seven_day_mean]) # Calculate the start date (7 days before the end date) start_date = end_date - timedelta(days=7) @@ -176,7 +178,6 @@ class HourlyElectricityPriceForecast: self, start_date_str: str, end_date_str: str, repeat: bool = False ) -> np.ndarray: """Returns all prices between the start and end dates.""" - start_date_utc = datetime.strptime(start_date_str, "%Y-%m-%d").replace(tzinfo=timezone.utc) end_date_utc = datetime.strptime(end_date_str, "%Y-%m-%d").replace(tzinfo=timezone.utc) start_date = start_date_utc.astimezone(zoneinfo.ZoneInfo("Europe/Berlin")) @@ -194,9 +195,9 @@ class HourlyElectricityPriceForecast: # print(date_str, ":", daily_prices) price_list_np = np.array(price_list) - print(price_list_np) + # print(price_list_np.shape, " ", self.prediction_hours) # If prediction hours are greater than 0 and repeat is True - + # print(price_list_np) if self.prediction_hours > 0 and repeat: # Check if price_list_np is shorter than prediction_hours if price_list_np.size < self.prediction_hours: @@ -208,5 +209,5 @@ class HourlyElectricityPriceForecast: # Concatenate existing values with the repeated values price_list_np = np.concatenate((price_list_np, additional_values)) - + # print(price_list_np) return price_list_np diff --git a/src/akkudoktoreos/prediction/self_consumption_probability.py b/src/akkudoktoreos/prediction/self_consumption_probability.py index 65261dc..a97b03e 100644 --- a/src/akkudoktoreos/prediction/self_consumption_probability.py +++ b/src/akkudoktoreos/prediction/self_consumption_probability.py @@ -1,22 +1,24 @@ #!/usr/bin/env python -import numpy as np import pickle from functools import lru_cache # from scipy.interpolate import RegularGridInterpolator from pathlib import Path +from typing import Tuple + +import numpy as np class self_consumption_probability_interpolator: def __init__(self, filepath: str | Path): self.filepath = filepath - self.interpolator = None + # self.interpolator = None # Load the RegularGridInterpolator with open(self.filepath, "rb") as file: self.interpolator = pickle.load(file) @lru_cache(maxsize=128) - def generate_points(self, load_1h_power: float, pv_power: float): + def generate_points(self, load_1h_power: float, pv_power: float) -> Tuple: """Generate the grid points for interpolation.""" partial_loads = np.arange(0, pv_power + 50, 50) points = np.array([np.full_like(partial_loads, load_1h_power), partial_loads]).T diff --git a/src/akkudoktoreos/server/fastapi_server.py b/src/akkudoktoreos/server/fastapi_server.py index 6b470ec..96b90f7 100755 --- a/src/akkudoktoreos/server/fastapi_server.py +++ b/src/akkudoktoreos/server/fastapi_server.py @@ -67,6 +67,7 @@ def fastapi_strompreis() -> list[float]: source=f"https://api.akkudoktor.net/prices?start={date_start}&end={date_end}", config=config, use_cache=False, + charges=config.eos.electricty_price_fixed_fee, ) # seven Day mean specific_date_prices = price_forecast.get_price_for_daterange( diff --git a/tests/test_class_ems.py b/tests/test_class_ems.py index 70c92b8..6a7c8d6 100644 --- a/tests/test_class_ems.py +++ b/tests/test_class_ems.py @@ -1,3 +1,5 @@ +from pathlib import Path + import numpy as np import pytest @@ -10,6 +12,9 @@ from akkudoktoreos.prediction.ems import ( EnergieManagementSystemParameters, SimulationResult, ) +from akkudoktoreos.prediction.self_consumption_probability import ( + self_consumption_probability_interpolator, +) prediction_hours = 48 optimization_hours = 24 @@ -25,8 +30,16 @@ def create_ems_instance(tmp_config: AppConfig) -> EnergieManagementSystem: PVAkkuParameters(kapazitaet_wh=5000, start_soc_prozent=80, min_soc_prozent=10), hours=prediction_hours, ) + + # 1h Load to Sub 1h Load Distribution -> SelfConsumptionRate + sc = self_consumption_probability_interpolator( + Path(__file__).parent.resolve() / ".." / "data" / "regular_grid_interpolator.pkl" + ) + akku.reset() - wechselrichter = Wechselrichter(WechselrichterParameters(max_leistung_wh=10000), akku) + wechselrichter = Wechselrichter( + WechselrichterParameters(max_leistung_wh=10000), akku, self_consumption_predictor=sc + ) # Household device (currently not used, set to None) home_appliance = HomeAppliance( diff --git a/tests/test_class_ems_2.py b/tests/test_class_ems_2.py index 11de678..9a05aa4 100644 --- a/tests/test_class_ems_2.py +++ b/tests/test_class_ems_2.py @@ -1,3 +1,5 @@ +from pathlib import Path + import numpy as np import pytest @@ -9,6 +11,9 @@ from akkudoktoreos.prediction.ems import ( EnergieManagementSystem, EnergieManagementSystemParameters, ) +from akkudoktoreos.prediction.self_consumption_probability import ( + self_consumption_probability_interpolator, +) prediction_hours = 48 optimization_hours = 24 @@ -24,8 +29,16 @@ def create_ems_instance(tmp_config: AppConfig) -> EnergieManagementSystem: PVAkkuParameters(kapazitaet_wh=5000, start_soc_prozent=80, min_soc_prozent=10), hours=prediction_hours, ) + + # 1h Load to Sub 1h Load Distribution -> SelfConsumptionRate + sc = self_consumption_probability_interpolator( + Path(__file__).parent.resolve() / ".." / "data" / "regular_grid_interpolator.pkl" + ) + akku.reset() - wechselrichter = Wechselrichter(WechselrichterParameters(max_leistung_wh=10000), akku) + wechselrichter = Wechselrichter( + WechselrichterParameters(max_leistung_wh=10000), akku, self_consumption_predictor=sc + ) # Household device (currently not used, set to None) home_appliance = HomeAppliance( From 471788f11d783a25738e68ed822f2dd7d66cf233 Mon Sep 17 00:00:00 2001 From: Andreas Date: Sat, 21 Dec 2024 13:30:51 +0100 Subject: [PATCH 13/47] Path --- tests/test_class_ems.py | 7 ++++++- tests/test_class_ems_2.py | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/test_class_ems.py b/tests/test_class_ems.py index 6a7c8d6..fc28d3c 100644 --- a/tests/test_class_ems.py +++ b/tests/test_class_ems.py @@ -33,7 +33,12 @@ def create_ems_instance(tmp_config: AppConfig) -> EnergieManagementSystem: # 1h Load to Sub 1h Load Distribution -> SelfConsumptionRate sc = self_consumption_probability_interpolator( - Path(__file__).parent.resolve() / ".." / "data" / "regular_grid_interpolator.pkl" + Path(__file__).parent.resolve() + / ".." + / "src" + / "akkudoktoreos" + / "data" + / "regular_grid_interpolator.pkl" ) akku.reset() diff --git a/tests/test_class_ems_2.py b/tests/test_class_ems_2.py index 9a05aa4..cebb622 100644 --- a/tests/test_class_ems_2.py +++ b/tests/test_class_ems_2.py @@ -32,7 +32,12 @@ def create_ems_instance(tmp_config: AppConfig) -> EnergieManagementSystem: # 1h Load to Sub 1h Load Distribution -> SelfConsumptionRate sc = self_consumption_probability_interpolator( - Path(__file__).parent.resolve() / ".." / "data" / "regular_grid_interpolator.pkl" + Path(__file__).parent.resolve() + / ".." + / "src" + / "akkudoktoreos" + / "data" + / "regular_grid_interpolator.pkl" ) akku.reset() From 117a8852ee7168caaea455d36c227b5343ee30d9 Mon Sep 17 00:00:00 2001 From: Andreas Date: Sat, 21 Dec 2024 14:39:57 +0100 Subject: [PATCH 14/47] Tests fixed --- docs/akkudoktoreos/openapi.json | 56 +- tests/test_class_ems.py | 16 +- tests/testdata/optimize_result_1.json | 476 ++++++++------- tests/testdata/optimize_result_2.json | 672 +++++++++++---------- tests/testdata/optimize_result_2_full.json | 604 +++++++++--------- 5 files changed, 969 insertions(+), 855 deletions(-) diff --git a/docs/akkudoktoreos/openapi.json b/docs/akkudoktoreos/openapi.json index 29299bb..0925c8d 100644 --- a/docs/akkudoktoreos/openapi.json +++ b/docs/akkudoktoreos/openapi.json @@ -307,9 +307,7 @@ } }, "type": "object", - "required": [ - "kapazitaet_wh" - ], + "required": ["kapazitaet_wh"], "title": "EAutoParameters" }, "EAutoResult": { @@ -455,10 +453,7 @@ } }, "type": "object", - "required": [ - "temperature", - "pvpower" - ], + "required": ["temperature", "pvpower"], "title": "ForecastResponse" }, "GesamtlastRequest": { @@ -480,11 +475,7 @@ } }, "type": "object", - "required": [ - "year_energy", - "measured_data", - "hours" - ], + "required": ["year_energy", "measured_data", "hours"], "title": "GesamtlastRequest" }, "HTTPValidationError": { @@ -516,10 +507,7 @@ } }, "type": "object", - "required": [ - "consumption_wh", - "duration_h" - ], + "required": ["consumption_wh", "duration_h"], "title": "HomeApplianceParameters" }, "OptimizationParameters": { @@ -588,11 +576,7 @@ } }, "type": "object", - "required": [ - "ems", - "pv_akku", - "eauto" - ], + "required": ["ems", "pv_akku", "eauto"], "title": "OptimizationParameters" }, "OptimizeResponse": { @@ -751,9 +735,7 @@ } }, "type": "object", - "required": [ - "kapazitaet_wh" - ], + "required": ["kapazitaet_wh"], "title": "PVAkkuParameters" }, "SimulationResult": { @@ -912,6 +894,21 @@ "type": "array", "title": "Akku Soc Pro Stunde", "description": "The state of charge of the battery (not the EV) in percentage per hour." + }, + "Electricity_price": { + "items": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "type": "array", + "title": "Electricity Price", + "description": "Used Electricity Price, including predictions" } }, "type": "object", @@ -928,7 +925,8 @@ "Netzbezug_Wh_pro_Stunde", "Netzeinspeisung_Wh_pro_Stunde", "Verluste_Pro_Stunde", - "akku_soc_pro_stunde" + "akku_soc_pro_stunde", + "Electricity_price" ], "title": "SimulationResult", "description": "This object contains the results of the simulation and provides insights into various parameters over the entire forecast period." @@ -959,11 +957,7 @@ } }, "type": "object", - "required": [ - "loc", - "msg", - "type" - ], + "required": ["loc", "msg", "type"], "title": "ValidationError" }, "WechselrichterParameters": { @@ -980,4 +974,4 @@ } } } -} \ No newline at end of file +} diff --git a/tests/test_class_ems.py b/tests/test_class_ems.py index fc28d3c..52867b1 100644 --- a/tests/test_class_ems.py +++ b/tests/test_class_ems.py @@ -312,21 +312,21 @@ def test_simulation(create_ems_instance): # Verify the total balance assert ( - abs(result["Gesamtbilanz_Euro"] - 1.7880374129090917) < 1e-5 - ), "Total balance should be 1.7880374129090917." + abs(result["Gesamtbilanz_Euro"] - 1.958185274567674) < 1e-5 + ), "Total balance should be 1.958185274567674." # Check total revenue and total costs assert ( - abs(result["Gesamteinnahmen_Euro"] - 1.3169784090909087) < 1e-5 - ), "Total revenue should be 1.3169784090909087." + abs(result["Gesamteinnahmen_Euro"] - 1.168863124510214) < 1e-5 + ), "Total revenue should be 1.168863124510214." assert ( - abs(result["Gesamtkosten_Euro"] - 3.1050158220000004) < 1e-5 - ), "Total costs should be 3.1050158220000004 ." + abs(result["Gesamtkosten_Euro"] - 3.127048399077888) < 1e-5 + ), "Total costs should be 3.127048399077888 ." # Check the losses assert ( - abs(result["Gesamt_Verluste"] - 2615.222727272727) < 1e-5 - ), "Total losses should be 2615.222727272727 ." + abs(result["Gesamt_Verluste"] - 2871.5330639359036) < 1e-5 + ), "Total losses should be 2871.5330639359036 ." # Check the values in 'akku_soc_pro_stunde' assert ( diff --git a/tests/testdata/optimize_result_1.json b/tests/testdata/optimize_result_1.json index fc823d0..6241fb2 100644 --- a/tests/testdata/optimize_result_1.json +++ b/tests/testdata/optimize_result_1.json @@ -1,52 +1,52 @@ { "ac_charge": [ - 0.75, - 0.75, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.75, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, 0.0, 0.0, 0.875, 0.0, + 0.875, + 0.0, + 0.625, + 0.75, + 0.0, + 0.375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, + 1.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.375, + 0.0, + 0.0, + 0.625, + 0.0, + 0.0, + 0.375, + 0.75, + 1.0, + 0.0, 0.0 ], "dc_charge": [ @@ -102,35 +102,6 @@ "discharge_allowed": [ 0, 0, - 1, - 1, - 0, - 1, - 1, - 1, - 0, - 1, - 1, - 1, - 0, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 0, - 1, - 1, - 0, 0, 1, 0, @@ -138,8 +109,6 @@ 0, 0, 0, - 1, - 0, 0, 0, 1, @@ -147,7 +116,38 @@ 0, 1, 1, - 1 + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0 ], "eautocharge_hours_float": null, "result": { @@ -179,7 +179,7 @@ 992.46, 1155.99, 827.01, - 1257.98, + 3132.98, 1232.67, 871.26, 860.88, @@ -237,10 +237,10 @@ 0.0, 0.0, 0.0, - 0.212927386983471, - 0.19275619999999996, - 0.1339926, - 0.0569765, + 0.22334747537370364, + 0.19016535126346096, + 0.12880892587597292, + 0.04260510586128589, 0.0, 0.0, 0.0, @@ -260,21 +260,21 @@ 0.0, 0.0, 0.0, - 0.1512260012396691, - 0.257789, - 0.1516669, - 0.09915009999999999, - 0.0348376, + 0.059176154400016855, + 0.25751345302450973, + 0.14923279815365575, + 0.07926913850394514, + 0.024174420063375994, 0.0, 0.0, 0.0, 0.0, 0.0 ], - "Gesamt_Verluste": 2071.900103305785, - "Gesamtbilanz_Euro": 0.9349588927768602, - "Gesamteinnahmen_Euro": 1.2913222882231399, - "Gesamtkosten_Euro": 2.226281181, + "Gesamt_Verluste": 2500.030611233429, + "Gesamtbilanz_Euro": 1.4988843060949502, + "Gesamteinnahmen_Euro": 1.1542928225199272, + "Gesamtkosten_Euro": 2.6531771286148773, "Home_appliance_wh_per_hour": [ null, null, @@ -316,84 +316,84 @@ null ], "Kosten_Euro_pro_Stunde": [ - 0.0, + 0.027996119999999992, 0.0, 0.04475252599999999, + 0.0018232052307313393, 0.0, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, + 0.008135265032732555, + 0.016809914659344942, + 0.061530097476751734, 0.05480703000000003, - 0.225316611, - 0.291163892, - 0.26650619799999997, + 0.0, + 0.0, + 0.0, 0.19588158, 0.174739608, 0.0, - 0.0, - 0.199865757, + 0.22802125600000003, 0.0, 0.0, + 0.162995926, 0.16677339, 0.26411047, 0.0, 0.08545095, 0.0, + 0.028255713342252034, + 0.0, + 0.3629952558325975, 0.0, 0.0, + 0.0076430797975209205, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, + 0.04565364324294593, 0.08231598, 0.174597189, + 0.293043269, 0.0, - 0.0, - 0.0 + 0.16484566 ], "Netzbezug_Wh_pro_Stunde": [ - 0.0, + 122.78999999999996, 0.0, 213.81999999999994, + 9.703061366318996, 0.0, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, + 37.01212480770043, + 74.05248748610107, + 205.30563055305882, 171.54000000000008, - 731.31, - 980.68, - 912.38, + 0.0, + 0.0, + 0.0, 704.61, 516.37, 0.0, - 0.0, - 608.79, + 694.34, 0.0, 0.0, + 488.89, 506.91, 799.85, 0.0, 351.65, 0.0, + 127.73830624887898, + 0.0, + 1931.853410498124, 0.0, 0.0, + 34.77288351920346, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, + 152.3311419517715, 257.64, 566.69, + 987.01, 0.0, - 0.0, - 0.0 + 592.97 ], "Netzeinspeisung_Wh_pro_Stunde": [ 0.0, @@ -401,10 +401,10 @@ 0.0, 0.0, 0.0, - 3041.819814049586, - 2753.66, - 1914.18, - 813.95, + 3190.678219624338, + 2716.6478751922996, + 1840.127512513899, + 608.6443694469413, 0.0, 0.0, 0.0, @@ -424,11 +424,11 @@ 0.0, 0.0, 0.0, - 2160.371446280987, - 3682.7, - 2166.67, - 1416.43, - 497.68000000000006, + 845.3736342859552, + 3678.7636146358536, + 2131.8971164807967, + 1132.4162643420734, + 345.3488580482285, 0.0, 0.0, 0.0, @@ -436,51 +436,74 @@ 0.0 ], "Verluste_Pro_Stunde": [ - 16.744090909090914, + 0.0, 2.817272727272737, 0.0, - 3.5592000000000112, - 582.6179999999995, - 156.0516223140496, - 0.0, - 0.0, - 0.0, + 2.3948326360417305, + 582.6180000000041, + 138.18861364508305, 0.0, 0.0, 0.0, 0.0, + 99.72409090909093, + 133.72909090909081, + 124.41545454545451, 0.0, 0.0, 118.37045454545455, - 94.68272727272722, 0.0, + 83.01681818181817, 75.86045454545456, - 66.66681818181814, + 0.0, 0.0, 0.0, 109.96227272727276, 0.0, - 15.439199999999985, - 53.855999999999995, - 159.6443999999999, - 21.032399999999996, - 279.0538264462814, + 16.01263877609336, + 38.52740325013451, + 161.62968357967037, + 239.20999074022512, + 436.85356388568886, + 0.5004782113116364, + 0.0, + 36.109951963721926, 0.0, 0.0, 0.0, 0.0, - 0.0, - 0.0, - 134.59227272727276, 100.08954545454549, - 80.85954545454547 + 0.0 ], "akku_soc_pro_stunde": [ - 79.4714617768595, - 79.38253271349862, - 79.38253271349862, - 79.48139938016529, - 95.66523271349861, + 80.0, + 79.91107093663912, + 79.91107093663912, + 79.97759406541806, + 96.1614273987495, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 96.85214359504131, + 92.63089703856748, + 88.7036415289256, + 88.7036415289256, + 88.7036415289256, + 84.96720041322313, + 84.96720041322313, + 82.34672004132229, + 79.95213498622587, + 79.95213498622587, + 79.95213498622587, + 79.95213498622587, + 76.48110365013771, + 76.48110365013771, + 76.64231728537023, + 77.71252293120729, + 81.22045681594867, + 87.86517878095492, 100.0, 100.0, 100.0, @@ -489,31 +512,48 @@ 100.0, 100.0, 100.0, - 100.0, - 100.0, - 96.26355888429752, - 93.27483643250687, - 93.27483643250687, - 90.88025137741046, - 88.7758694903581, - 88.7758694903581, - 88.7758694903581, - 85.30483815426996, - 85.30483815426996, - 85.73370482093662, - 87.22970482093662, - 91.66427148760329, - 92.24850482093663, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 95.75150654269973, - 92.59211432506888, - 90.0397296831956 + 96.84060778236915, + 96.84060778236915 + ], + "Electricity_price": [ + 0.000228, + 0.0002212, + 0.0002093, + 0.0001879, + 0.0001838, + 0.0002004, + 0.0002198, + 0.000227, + 0.0002997, + 0.0003195, + 0.0003081, + 0.0002969, + 0.0002921, + 0.000278, + 0.0003384, + 0.0003318, + 0.0003284, + 0.0003283, + 0.0003289, + 0.0003334, + 0.000329, + 0.0003302, + 0.0003042, + 0.000243, + 0.000228, + 0.0002212, + 0.0002093, + 0.0001879, + 0.0001838, + 0.0002004, + 0.0002198, + 0.000227, + 0.0002997, + 0.0003195, + 0.0003081, + 0.0002969, + 0.0002921, + 0.000278 ] }, "eauto_obj": { @@ -626,54 +666,54 @@ "start_soc_prozent": 54 }, "start_solution": [ - 18.0, - 18.0, - 9.0, - 13.0, - 4.0, - 7.0, - 9.0, - 8.0, - 0.0, - 12.0, - 10.0, - 10.0, - 14.0, - 8.0, - 7.0, - 11.0, - 6.0, - 4.0, - 18.0, - 3.0, - 4.0, - 3.0, - 5.0, - 14.0, - 14.0, - 10.0, - 13.0, - 3.0, - 7.0, - 11.0, - 6.0, - 14.0, - 9.0, - 14.0, - 8.0, - 3.0, - 2.0, - 5.0, - 9.0, - 19.0, 1.0, - 6.0, + 5.0, + 19.0, 10.0, - 4.0, - 2.0, + 19.0, 7.0, + 17.0, + 18.0, + 3.0, + 15.0, + 4.0, + 10.0, + 2.0, + 3.0, 11.0, - 10.0 + 10.0, + 5.0, + 20.0, + 2.0, + 20.0, + 11.0, + 13.0, + 11.0, + 0.0, + 1.0, + 8.0, + 4.0, + 11.0, + 8.0, + 3.0, + 0.0, + 1.0, + 12.0, + 14.0, + 13.0, + 0.0, + 13.0, + 15.0, + 12.0, + 11.0, + 17.0, + 12.0, + 3.0, + 15.0, + 18.0, + 20.0, + 7.0, + 5.0 ], "washingstart": null } \ No newline at end of file diff --git a/tests/testdata/optimize_result_2.json b/tests/testdata/optimize_result_2.json index 4c3b3a8..1e4999c 100644 --- a/tests/testdata/optimize_result_2.json +++ b/tests/testdata/optimize_result_2.json @@ -1,47 +1,47 @@ { "ac_charge": [ + 0.5, + 0.0, + 0.0, + 0.0, + 0.0, + 0.75, + 0.0, + 0.5, + 0.0, + 1.0, + 0.0, + 0.0, + 0.75, + 0.75, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.75, + 0.0, + 0.0, 0.0, 0.0, 0.0, - 0.625, 0.0, 0.0, 0.0, 0.0, 0.625, 0.0, - 0.375, - 0.0, - 0.0, - 0.75, - 0.0, - 0.75, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.75, 0.0, 0.0, 0.0, @@ -101,17 +101,15 @@ ], "discharge_allowed": [ 0, - 0, + 1, 1, 0, 0, - 1, - 1, - 1, 0, - 1, 0, - 1, + 0, + 0, + 0, 1, 0, 0, @@ -124,15 +122,14 @@ 1, 1, 1, + 1, + 1, 0, 1, 1, 0, 0, 0, - 1, - 1, - 1, 0, 0, 0, @@ -141,76 +138,79 @@ 0, 0, 1, + 1, + 0, 0, 1, 0, 0, 0, - 1, + 0, + 0, 0 ], "eautocharge_hours_float": [ - 0.0, - 0.5, - 0.0, - 0.5, - 0.375, - 1.0, - 0.875, - 0.375, - 0.5, - 1.0, - 0.875, - 0.875, - 0.875, - 0.75, - 0.5, - 0.625, - 0.875, - 0.75, - 0.5, - 0.0, - 0.625, - 0.5, - 0.0, - 1.0, - 0.625, - 0.0, - 1.0, - 0.625, - 0.875, - 0.375, - 1.0, - 0.375, - 0.625, - 0.75, - 0.75, - 0.0, - 0.5, - 0.875, 0.875, 0.75, 0.875, 0.5, + 0.375, + 0.75, + 0.875, + 0.625, + 0.375, + 0.5, + 0.375, + 0.0, + 0.875, + 0.5, + 0.75, + 0.625, 0.875, 0.0, - 0.375, - 0.875, - 1.0, - 0.5 + 0.5, + 0.625, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 ], "result": { "Last_Wh_pro_Stunde": [ - 12105.07, - 10240.91, - 10497.56, - 12748.03, - 8907.67, - 13981.82, + 4986.07, + 1063.91, + 14247.56, + 12626.029999999999, + 11529.67, + 7731.82, 10393.22, - 1730.78, - 1129.12, - 1178.71, + 1103.78, + 6373.12, + 7733.71, 1050.98, 988.56, 912.38, @@ -221,7 +221,7 @@ 608.79, 556.31, 488.89, - 506.91, + 4256.91, 804.89, 1141.98, 1056.97, @@ -231,8 +231,8 @@ 1257.98, 1232.67, 871.26, - 860.88, - 4027.009545454555, + 3985.88, + 1158.03, 1222.72, 1221.04, 949.99, @@ -241,44 +241,44 @@ 592.97 ], "EAuto_SoC_pro_Stunde": [ - 20.294999999999998, + 11.555, + 11.555, + 26.85, 35.589999999999996, - 50.885000000000005, - 63.995000000000005, - 72.735, + 48.699999999999996, + 59.62499999999999, + 74.92, + 74.92, 83.66, - 98.955, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0 + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585 ], "Einnahmen_Euro_pro_Stunde": [ 0.0, @@ -313,24 +313,24 @@ 0.0, 0.0, 0.0, - 0.0348376, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], - "Gesamt_Verluste": 8823.859090909093, - "Gesamtbilanz_Euro": 12.348447740818184, - "Gesamteinnahmen_Euro": 0.0348376, - "Gesamtkosten_Euro": 12.383285340818183, + "Gesamt_Verluste": 9258.73062020124, + "Gesamtbilanz_Euro": 12.332782378812306, + "Gesamteinnahmen_Euro": 0.0, + "Gesamtkosten_Euro": 12.332782378812306, "Home_appliance_wh_per_hour": [ 0.0, 0.0, 0.0, + 2500.0, + 2500.0, 0.0, - 2500.0, - 2500.0, 0.0, 0.0, 0.0, @@ -365,16 +365,16 @@ 0.0 ], "Kosten_Euro_pro_Stunde": [ - 2.54785212, - 0.928522392, - 0.9189986259999999, - 2.1770732859999997, - 0.53097063, - 1.6959351, + 0.0, + 0.004569992000000018, + 2.750373626, + 2.1541494859999997, + 1.0128942300000001, + 0.0, 1.4118501319999999, 0.0, 0.0, - 0.0, + 0.55162953, 0.0, 0.0, 0.0, @@ -385,36 +385,36 @@ 0.199865757, 0.182970359, 0.162995926, - 0.0, - 0.0, - 0.0, + 1.4005233899999998, + 0.26411047, + 0.24530383800000005, 0.08545095, + 0.007989913613567745, + 0.028255713342252034, + 0.025392879919306634, 0.0, 0.0, + 0.0003442778967139274, + 0.6945180797975209, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.651258356818184, - 0.0, + 0.04565364324294593, 0.08231598, 0.174597189, 0.293043269, - 0.0, + 0.214398479, 0.16484566 ], "Netzbezug_Wh_pro_Stunde": [ - 11174.789999999999, - 4197.66, - 4390.82, - 11586.34, - 2888.8500000000004, - 8462.75, + 0.0, + 20.660000000000082, + 13140.82, + 11464.339999999998, + 5510.85, + 0.0, 6423.339999999999, 0.0, 0.0, - 0.0, + 1726.54, 0.0, 0.0, 0.0, @@ -425,23 +425,23 @@ 608.79, 556.31, 488.89, - 0.0, - 0.0, - 0.0, + 4256.91, + 799.85, + 806.3900000000001, 351.65, + 35.04348076126204, + 127.73830624887898, + 121.32288542430308, 0.0, 0.0, + 1.7179535764168035, + 3159.7728835192033, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 2868.979545454555, - 0.0, + 152.3311419517715, 257.64, 566.69, 987.01, - 0.0, + 733.99, 592.97 ], "Netzeinspeisung_Wh_pro_Stunde": [ @@ -477,7 +477,7 @@ 0.0, 0.0, 0.0, - 497.68000000000006, + 0.0, 0.0, 0.0, 0.0, @@ -485,16 +485,16 @@ 0.0 ], "Verluste_Pro_Stunde": [ - 708.0, - 1164.818181818182, - 1164.818181818182, - 864.0, - 276.0, - 795.0, + 760.062272727273, + 0.0, + 933.0, + 726.0, + 414.0, + 646.7386363636365, 483.0, - 187.4616000000001, - 97.67399999999998, - 23.391818181818195, + 230.91336797704525, + 880.0977272727268, + 1026.818181818182, 99.72409090909093, 133.72909090909081, 124.41545454545451, @@ -505,64 +505,104 @@ 0.0, 0.0, 0.0, - 69.12409090909085, - 109.0704545454546, - 109.96227272727276, + 450.0, 0.0, - 15.439199999999985, - 53.855999999999995, - 159.6443999999999, - 21.032399999999996, - 538.2984000000001, - 441.924, - 260.0003999999999, - 514.2491454545468, + 0.0, + 0.0, + 11.233982308648535, + 38.52740325013451, + 145.08565374908358, + 21.962728535423857, + 538.2984000000038, + 441.7178455708299, + 630.8276539776955, + 171.99990368477063, + 41.441862965787436, 0.0, 0.0, 0.0, 0.0, - 100.08954545454549, 0.0 ], "akku_soc_pro_stunde": [ - 86.25, - 64.72796143250687, - 43.20592286501377, - 55.70592286501377, - 55.70592286501377, - 68.20592286501376, - 68.20592286501376, - 72.49652286501377, - 75.20968953168044, - 74.47131143250688, - 71.32345502754819, - 67.10220847107436, - 63.17495296143248, - 60.14202424242422, - 60.14202424242422, - 56.40558312672175, - 53.41686067493111, - 53.41686067493111, - 53.41686067493111, - 53.41686067493111, - 51.23491336088152, - 47.792032851239654, - 44.3210015151515, - 44.3210015151515, - 44.749868181818165, - 46.24586818181816, - 50.68043484848482, - 51.264668181818166, - 66.21740151515148, - 78.49306818181815, - 85.71530151515148, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 96.84060778236915, - 96.84060778236915 + 62.54222623966943, + 62.54222623966943, + 75.04222623966943, + 87.54222623966943, + 87.54222623966943, + 78.01764807162535, + 78.01764807162535, + 83.83265434833275, + 64.76391295714818, + 43.24187438965506, + 40.094017984696386, + 35.87277142822256, + 31.945515918580686, + 28.912587199572425, + 28.912587199572425, + 25.176146083869945, + 22.187423632079316, + 22.187423632079316, + 22.187423632079316, + 22.187423632079316, + 34.68742363207931, + 34.68742363207931, + 34.68742363207931, + 34.68742363207931, + 34.99947869620843, + 36.0696843420455, + 40.099841390631155, + 40.249843096950585, + 55.20257643028218, + 67.47251658502745, + 84.99550697329678, + 88.77022785443704, + 89.9213907145978, + 89.9213907145978, + 89.9213907145978, + 89.9213907145978, + 89.9213907145978, + 89.9213907145978 + ], + "Electricity_price": [ + 0.000228, + 0.0002212, + 0.0002093, + 0.0001879, + 0.0001838, + 0.0002004, + 0.0002198, + 0.000227, + 0.0002997, + 0.0003195, + 0.0003081, + 0.0002969, + 0.0002921, + 0.000278, + 0.0003384, + 0.0003318, + 0.0003284, + 0.0003283, + 0.0003289, + 0.0003334, + 0.000329, + 0.0003302, + 0.0003042, + 0.000243, + 0.000228, + 0.0002212, + 0.0002093, + 0.0001879, + 0.0001838, + 0.0002004, + 0.0002198, + 0.000227, + 0.0002997, + 0.0003195, + 0.0003081, + 0.0002969, + 0.0002921, + 0.000278 ] }, "eauto_obj": { @@ -671,107 +711,107 @@ "kapazitaet_wh": 60000, "lade_effizienz": 0.95, "max_ladeleistung_w": 11040, - "soc_wh": 60000.0, + "soc_wh": 56751.0, "start_soc_prozent": 5 }, "start_solution": [ - 0.0, - 4.0, + 16.0, 13.0, - 17.0, - 14.0, - 12.0, - 9.0, - 9.0, - 17.0, - 13.0, - 15.0, - 12.0, - 9.0, - 18.0, - 14.0, - 18.0, - 14.0, - 9.0, - 2.0, - 8.0, - 10.0, - 12.0, - 10.0, - 10.0, - 14.0, - 8.0, - 7.0, - 2.0, - 6.0, - 4.0, - 7.0, - 10.0, - 8.0, - 2.0, - 5.0, - 0.0, - 2.0, - 4.0, - 5.0, - 14.0, - 10.0, - 18.0, 11.0, + 14.0, + 2.0, + 18.0, + 3.0, + 16.0, + 4.0, + 20.0, + 12.0, + 2.0, + 18.0, + 18.0, 1.0, - 0.0, - 5.0, 13.0, - 1.0, - 0.0, - 2.0, - 0.0, - 2.0, - 1.0, - 6.0, - 5.0, - 1.0, - 2.0, - 6.0, - 5.0, - 5.0, - 5.0, 4.0, + 7.0, + 9.0, + 8.0, + 10.0, + 12.0, + 10.0, + 10.0, + 14.0, + 8.0, + 7.0, + 2.0, + 6.0, + 4.0, + 18.0, + 3.0, + 4.0, + 3.0, + 5.0, + 14.0, + 14.0, + 10.0, + 13.0, + 3.0, + 17.0, + 11.0, + 6.0, + 14.0, + 14.0, + 14.0, 2.0, 3.0, 5.0, 4.0, - 2.0, - 0.0, - 3.0, - 2.0, - 0.0, - 6.0, - 3.0, - 0.0, - 6.0, - 3.0, 5.0, + 2.0, 1.0, - 6.0, - 1.0, - 3.0, - 4.0, - 4.0, - 0.0, - 2.0, - 5.0, - 5.0, 4.0, 5.0, + 3.0, + 1.0, 2.0, + 1.0, + 0.0, + 5.0, + 2.0, + 4.0, + 3.0, 5.0, 0.0, - 1.0, - 5.0, - 6.0, 2.0, - 14.0 + 3.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 13.0 ], - "washingstart": 14 + "washingstart": 13 } \ No newline at end of file diff --git a/tests/testdata/optimize_result_2_full.json b/tests/testdata/optimize_result_2_full.json index ad0bef1..1e4999c 100644 --- a/tests/testdata/optimize_result_2_full.json +++ b/tests/testdata/optimize_result_2_full.json @@ -1,21 +1,19 @@ { "ac_charge": [ + 0.5, 0.0, 0.0, - 0.875, + 0.0, + 0.0, + 0.75, + 0.0, + 0.5, 0.0, 1.0, 0.0, 0.0, - 0.0, - 0.0, - 0.875, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, + 0.75, + 0.75, 0.0, 0.0, 0.0, @@ -32,6 +30,7 @@ 0.0, 0.0, 0.0, + 0.75, 0.0, 0.0, 0.0, @@ -41,6 +40,7 @@ 0.0, 0.0, 0.0, + 0.625, 0.0, 0.0, 0.0, @@ -100,16 +100,16 @@ 1.0 ], "discharge_allowed": [ - 1, - 0, - 0, - 1, - 0, - 0, 0, 1, 1, 0, + 0, + 0, + 0, + 0, + 0, + 0, 1, 0, 0, @@ -124,56 +124,56 @@ 1, 1, 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 1, 0, 1, 1, 0, - 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 0, 1, 1, + 0, + 0, 1, - 1, - 1, - 1 + 0, + 0, + 0, + 0, + 0, + 0 ], "eautocharge_hours_float": [ - 0.75, - 0.75, - 0.5, - 0.0, - 1.0, - 0.625, - 0.0, 0.875, 0.75, - 1.0, - 0.0, - 0.75, - 1.0, - 1.0, - 1.0, + 0.875, + 0.5, 0.375, 0.75, - 0.5, - 0.5, - 1.0, - 0.625, 0.875, 0.625, - 1.0, + 0.375, + 0.5, + 0.375, + 0.0, + 0.875, + 0.5, + 0.75, + 0.625, + 0.875, + 0.0, + 0.5, + 0.625, + 0.0, + 0.0, + 0.0, + 0.0, 0.0, 0.0, 0.0, @@ -201,16 +201,16 @@ ], "result": { "Last_Wh_pro_Stunde": [ - 1053.07, - 8929.91, - 11808.56, - 11620.03, - 14151.67, - 7609.82, - 9082.22, - 6347.78, - 1756.12, - 1178.71, + 4986.07, + 1063.91, + 14247.56, + 12626.029999999999, + 11529.67, + 7731.82, + 10393.22, + 1103.78, + 6373.12, + 7733.71, 1050.98, 988.56, 912.38, @@ -221,7 +221,7 @@ 608.79, 556.31, 488.89, - 506.91, + 4256.91, 804.89, 1141.98, 1056.97, @@ -231,7 +231,7 @@ 1257.98, 1232.67, 871.26, - 860.88, + 3985.88, 1158.03, 1222.72, 1221.04, @@ -241,44 +241,44 @@ 592.97 ], "EAuto_SoC_pro_Stunde": [ - 5.0, - 18.11, + 11.555, + 11.555, + 26.85, 35.589999999999996, - 53.06999999999999, - 70.55, - 77.105, - 90.215, - 98.955, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0, - 100.0 + 48.699999999999996, + 59.62499999999999, + 74.92, + 74.92, + 83.66, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585, + 94.585 ], "Einnahmen_Euro_pro_Stunde": [ 0.0, @@ -320,17 +320,17 @@ 0.0, 0.0 ], - "Gesamt_Verluste": 7248.648818181819, - "Gesamtbilanz_Euro": 8.568052366, + "Gesamt_Verluste": 9258.73062020124, + "Gesamtbilanz_Euro": 12.332782378812306, "Gesamteinnahmen_Euro": 0.0, - "Gesamtkosten_Euro": 8.568052366, + "Gesamtkosten_Euro": 12.332782378812306, "Home_appliance_wh_per_hour": [ 0.0, 0.0, 0.0, + 2500.0, + 2500.0, 0.0, - 2500.0, - 2500.0, 0.0, 0.0, 0.0, @@ -366,83 +366,83 @@ ], "Kosten_Euro_pro_Stunde": [ 0.0, - 1.7445291920000001, - 2.2398909259999997, - 1.9651220859999998, - 1.4948178300000001, + 0.004569992000000018, + 2.750373626, + 2.1541494859999997, + 1.0128942300000001, 0.0, - 1.1236923319999998, + 1.4118501319999999, + 0.0, + 0.0, + 0.55162953, 0.0, 0.0, 0.0, 0.0, + 0.174739608, 0.0, 0.0, + 0.199865757, + 0.182970359, + 0.162995926, + 1.4005233899999998, + 0.26411047, + 0.24530383800000005, + 0.08545095, + 0.007989913613567745, + 0.028255713342252034, + 0.025392879919306634, 0.0, 0.0, + 0.0003442778967139274, + 0.6945180797975209, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 + 0.04565364324294593, + 0.08231598, + 0.174597189, + 0.293043269, + 0.214398479, + 0.16484566 ], "Netzbezug_Wh_pro_Stunde": [ 0.0, - 7886.66, - 10701.82, - 10458.34, - 8132.85, + 20.660000000000082, + 13140.82, + 11464.339999999998, + 5510.85, 0.0, - 5112.339999999999, + 6423.339999999999, + 0.0, + 0.0, + 1726.54, 0.0, 0.0, 0.0, 0.0, + 516.37, 0.0, 0.0, + 608.79, + 556.31, + 488.89, + 4256.91, + 799.85, + 806.3900000000001, + 351.65, + 35.04348076126204, + 127.73830624887898, + 121.32288542430308, 0.0, 0.0, + 1.7179535764168035, + 3159.7728835192033, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 + 152.3311419517715, + 257.64, + 566.69, + 987.01, + 733.99, + 592.97 ], "Netzeinspeisung_Wh_pro_Stunde": [ 0.0, @@ -485,84 +485,124 @@ 0.0 ], "Verluste_Pro_Stunde": [ - 16.744090909090914, + 760.062272727273, + 0.0, + 933.0, + 726.0, 414.0, - 552.0, - 552.0, - 552.0, - 492.1022727272725, - 414.0, - 730.0663636363638, - 55.434, - 23.391818181818195, + 646.7386363636365, + 483.0, + 230.91336797704525, + 880.0977272727268, + 1026.818181818182, 99.72409090909093, 133.72909090909081, 124.41545454545451, 96.08318181818186, - 70.41409090909087, + 0.0, 118.37045454545455, 94.68272727272722, - 83.01681818181817, - 75.86045454545456, - 66.66681818181814, - 69.12409090909085, - 109.0704545454546, - 109.96227272727276, - 47.952272727272714, - 15.439199999999985, - 53.855999999999995, - 159.6443999999999, - 21.032399999999996, - 538.2984000000001, - 441.924, - 260.0003999999999, - 169.97160000000008, - 59.721600000000024, - 35.132727272727266, - 77.27590909090907, - 134.59227272727276, - 100.08954545454549, - 80.85954545454547 + 0.0, + 0.0, + 0.0, + 450.0, + 0.0, + 0.0, + 0.0, + 11.233982308648535, + 38.52740325013451, + 145.08565374908358, + 21.962728535423857, + 538.2984000000038, + 441.7178455708299, + 630.8276539776955, + 171.99990368477063, + 41.441862965787436, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 ], "akku_soc_pro_stunde": [ - 79.4714617768595, - 79.4714617768595, - 79.4714617768595, - 79.4714617768595, - 79.4714617768595, - 70.47202134986226, - 70.47202134986226, - 56.13911845730028, - 56.76228512396694, - 56.02390702479339, - 52.876050619834714, - 48.654804063360885, - 44.72754855371902, - 41.69461983471075, - 39.47195282369147, - 35.73551170798899, - 32.746789256198355, - 30.126308884297526, - 27.731723829201112, - 25.627341942148767, - 23.445394628099184, - 20.002514118457306, - 16.531482782369153, - 15.017837809917364, - 15.446704476584031, - 16.94270447658403, - 21.377271143250695, - 21.961504476584032, - 36.91423780991737, - 49.189904476584026, - 56.41213780991736, - 61.133571143250684, - 62.79250447658402, - 61.68351687327823, - 59.2442520661157, - 54.99575860881543, - 51.836366391184576, - 49.28398174931129 + 62.54222623966943, + 62.54222623966943, + 75.04222623966943, + 87.54222623966943, + 87.54222623966943, + 78.01764807162535, + 78.01764807162535, + 83.83265434833275, + 64.76391295714818, + 43.24187438965506, + 40.094017984696386, + 35.87277142822256, + 31.945515918580686, + 28.912587199572425, + 28.912587199572425, + 25.176146083869945, + 22.187423632079316, + 22.187423632079316, + 22.187423632079316, + 22.187423632079316, + 34.68742363207931, + 34.68742363207931, + 34.68742363207931, + 34.68742363207931, + 34.99947869620843, + 36.0696843420455, + 40.099841390631155, + 40.249843096950585, + 55.20257643028218, + 67.47251658502745, + 84.99550697329678, + 88.77022785443704, + 89.9213907145978, + 89.9213907145978, + 89.9213907145978, + 89.9213907145978, + 89.9213907145978, + 89.9213907145978 + ], + "Electricity_price": [ + 0.000228, + 0.0002212, + 0.0002093, + 0.0001879, + 0.0001838, + 0.0002004, + 0.0002198, + 0.000227, + 0.0002997, + 0.0003195, + 0.0003081, + 0.0002969, + 0.0002921, + 0.000278, + 0.0003384, + 0.0003318, + 0.0003284, + 0.0003283, + 0.0003289, + 0.0003334, + 0.000329, + 0.0003302, + 0.0003042, + 0.000243, + 0.000228, + 0.0002212, + 0.0002093, + 0.0001879, + 0.0001838, + 0.0002004, + 0.0002198, + 0.000227, + 0.0002997, + 0.0003195, + 0.0003081, + 0.0002969, + 0.0002921, + 0.000278 ] }, "eauto_obj": { @@ -671,82 +711,78 @@ "kapazitaet_wh": 60000, "lade_effizienz": 0.95, "max_ladeleistung_w": 11040, - "soc_wh": 60000.0, + "soc_wh": 56751.0, "start_soc_prozent": 5 }, "start_solution": [ - 12.0, + 16.0, + 13.0, + 11.0, + 14.0, + 2.0, + 18.0, + 3.0, + 16.0, 4.0, - 19.0, - 9.0, 20.0, - 14.0, - 6.0, - 9.0, - 8.0, - 19.0, - 7.0, - 2.0, + 12.0, 2.0, + 18.0, + 18.0, 1.0, - 3.0, - 8.0, - 14.0, - 11.0, - 10.0, + 13.0, + 4.0, + 7.0, 9.0, + 8.0, 10.0, 12.0, - 11.0, - 13.0, - 11.0, - 8.0, 10.0, 10.0, - 9.0, - 11.0, - 13.0, - 7.0, - 8.0, - 7.0, - 1.0, - 7.0, - 2.0, - 11.0, - 11.0, 14.0, - 11.0, - 5.0, - 10.0, - 9.0, - 13.0, - 10.0, - 9.0, 8.0, - 4.0, - 4.0, + 7.0, 2.0, - 0.0, 6.0, + 4.0, + 18.0, + 3.0, + 4.0, + 3.0, + 5.0, + 14.0, + 14.0, + 10.0, + 13.0, + 3.0, + 17.0, + 11.0, + 6.0, + 14.0, + 14.0, + 14.0, + 2.0, 3.0, - 0.0, 5.0, 4.0, - 6.0, - 0.0, - 4.0, - 6.0, - 6.0, - 6.0, + 5.0, + 2.0, 1.0, 4.0, - 2.0, - 2.0, - 6.0, - 3.0, 5.0, 3.0, - 6.0, + 1.0, + 2.0, + 1.0, + 0.0, + 5.0, + 2.0, + 4.0, + 3.0, + 5.0, + 0.0, + 2.0, + 3.0, 0.0, 0.0, 0.0, @@ -771,7 +807,11 @@ 0.0, 0.0, 0.0, - 14.0 + 0.0, + 0.0, + 0.0, + 0.0, + 13.0 ], - "washingstart": 14 + "washingstart": 13 } \ No newline at end of file From 9dcb88881b5d2454ac2c6ae5a1c271cfad0315fd Mon Sep 17 00:00:00 2001 From: Andreas Date: Sat, 21 Dec 2024 14:50:43 +0100 Subject: [PATCH 15/47] Test Update with new algorithm --- tests/testdata/optimize_result_2_full.json | 520 ++++++++++----------- 1 file changed, 260 insertions(+), 260 deletions(-) diff --git a/tests/testdata/optimize_result_2_full.json b/tests/testdata/optimize_result_2_full.json index 1e4999c..b3ba460 100644 --- a/tests/testdata/optimize_result_2_full.json +++ b/tests/testdata/optimize_result_2_full.json @@ -1,19 +1,21 @@ { "ac_charge": [ - 0.5, + 0.0, + 0.0, + 0.0, + 0.375, + 0.0, + 0.875, + 0.0, + 0.375, + 0.0, + 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, - 0.75, 0.0, - 0.5, - 0.0, - 1.0, - 0.0, - 0.0, - 0.75, - 0.75, 0.0, 0.0, 0.0, @@ -30,7 +32,6 @@ 0.0, 0.0, 0.0, - 0.75, 0.0, 0.0, 0.0, @@ -40,7 +41,6 @@ 0.0, 0.0, 0.0, - 0.625, 0.0, 0.0, 0.0, @@ -100,23 +100,27 @@ 1.0 ], "discharge_allowed": [ - 0, - 1, 1, 0, + 1, 0, + 1, 0, - 0, - 0, + 1, 0, 0, 1, 0, 0, + 1, 0, 0, 1, 0, + 0, + 1, + 1, + 1, 1, 1, 1, @@ -127,49 +131,45 @@ 0, 1, 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, 1, 1, - 0, - 0, 1, - 0, - 0, - 0, - 0, - 0, - 0 + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 ], "eautocharge_hours_float": [ - 0.875, - 0.75, - 0.875, - 0.5, - 0.375, - 0.75, - 0.875, 0.625, - 0.375, - 0.5, + 0.875, + 0.875, 0.375, 0.0, - 0.875, + 1.0, + 0.75, + 1.0, + 0.0, + 0.375, 0.5, 0.75, - 0.625, - 0.875, + 0.375, 0.0, 0.5, 0.625, + 1.0, + 0.625, + 0.0, + 0.0, 0.0, 0.0, 0.0, @@ -201,16 +201,16 @@ ], "result": { "Last_Wh_pro_Stunde": [ - 4986.07, - 1063.91, - 14247.56, - 12626.029999999999, - 11529.67, + 6297.07, + 8929.91, + 5253.5599999999995, + 3632.0299999999997, + 8907.67, 7731.82, - 10393.22, - 1103.78, - 6373.12, - 7733.71, + 11704.22, + 7658.78, + 1129.12, + 1178.71, 1050.98, 988.56, 912.38, @@ -221,7 +221,7 @@ 608.79, 556.31, 488.89, - 4256.91, + 506.91, 804.89, 1141.98, 1056.97, @@ -231,7 +231,7 @@ 1257.98, 1232.67, 871.26, - 3985.88, + 860.88, 1158.03, 1222.72, 1221.04, @@ -241,44 +241,44 @@ 592.97 ], "EAuto_SoC_pro_Stunde": [ - 11.555, - 11.555, + 13.74, 26.85, - 35.589999999999996, - 48.699999999999996, - 59.62499999999999, - 74.92, - 74.92, - 83.66, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585 + 33.405, + 33.405, + 42.144999999999996, + 53.06999999999999, + 70.55, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475 ], "Einnahmen_Euro_pro_Stunde": [ 0.0, @@ -320,10 +320,10 @@ 0.0, 0.0 ], - "Gesamt_Verluste": 9258.73062020124, - "Gesamtbilanz_Euro": 12.332782378812306, + "Gesamt_Verluste": 6757.733989740087, + "Gesamtbilanz_Euro": 6.952642478544519, "Gesamteinnahmen_Euro": 0.0, - "Gesamtkosten_Euro": 12.332782378812306, + "Gesamtkosten_Euro": 6.952642478544519, "Home_appliance_wh_per_hour": [ 0.0, 0.0, @@ -365,84 +365,84 @@ 0.0 ], "Kosten_Euro_pro_Stunde": [ + 1.22362812, + 1.7445291920000001, + 0.0, + 0.4641768859999999, + 0.53097063, + 0.0, + 1.7000079319999999, + 1.0534661399999998, + 0.0, + 0.0, 0.0, - 0.004569992000000018, - 2.750373626, - 2.1541494859999997, - 1.0128942300000001, 0.0, - 1.4118501319999999, - 0.0, - 0.0, - 0.55162953, 0.0, 0.0, 0.0, 0.0, - 0.174739608, 0.0, 0.0, - 0.199865757, 0.182970359, - 0.162995926, - 1.4005233899999998, - 0.26411047, - 0.24530383800000005, - 0.08545095, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0326838476973626, 0.007989913613567745, - 0.028255713342252034, - 0.025392879919306634, + 0.012219458233588555, 0.0, 0.0, - 0.0003442778967139274, - 0.6945180797975209, 0.0, - 0.04565364324294593, - 0.08231598, - 0.174597189, - 0.293043269, - 0.214398479, - 0.16484566 + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 ], "Netzbezug_Wh_pro_Stunde": [ + 5366.79, + 7886.66, + 0.0, + 2470.3399999999997, + 2888.8500000000004, + 0.0, + 7734.339999999999, + 4640.82, + 0.0, + 0.0, 0.0, - 20.660000000000082, - 13140.82, - 11464.339999999998, - 5510.85, 0.0, - 6423.339999999999, - 0.0, - 0.0, - 1726.54, 0.0, 0.0, 0.0, 0.0, - 516.37, 0.0, 0.0, - 608.79, 556.31, - 488.89, - 4256.91, - 799.85, - 806.3900000000001, - 351.65, + 0.0, + 0.0, + 0.0, + 0.0, + 134.50143085334403, 35.04348076126204, - 127.73830624887898, - 121.32288542430308, + 55.24167375040034, 0.0, 0.0, - 1.7179535764168035, - 3159.7728835192033, 0.0, - 152.3311419517715, - 257.64, - 566.69, - 987.01, - 733.99, - 592.97 + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 ], "Netzeinspeisung_Wh_pro_Stunde": [ 0.0, @@ -485,84 +485,84 @@ 0.0 ], "Verluste_Pro_Stunde": [ - 760.062272727273, - 0.0, - 933.0, - 726.0, + 276.0, 414.0, + 772.4754545454543, + 0.0, + 276.0, 646.7386363636365, - 483.0, - 230.91336797704525, - 880.0977272727268, - 1026.818181818182, + 552.0, + 345.0, + 101.0335466817773, + 23.391818181818195, 99.72409090909093, 133.72909090909081, 124.41545454545451, 96.08318181818186, - 0.0, + 70.41409090909087, 118.37045454545455, 94.68272727272722, + 83.01681818181817, 0.0, - 0.0, - 0.0, - 450.0, - 0.0, - 0.0, - 0.0, + 66.66681818181814, + 69.12409090909085, + 109.0704545454546, + 109.96227272727276, + 29.61116851999853, 11.233982308648535, - 38.52740325013451, - 145.08565374908358, + 48.41330768174524, + 161.62968357967037, 21.962728535423857, 538.2984000000038, - 441.7178455708299, - 630.8276539776955, + 441.95211196761403, + 260.56941082122324, 171.99990368477063, - 41.441862965787436, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 + 62.214291413756285, + 35.132727272727266, + 77.27590909090907, + 134.59227272727276, + 100.08954545454549, + 80.85954545454547 ], "akku_soc_pro_stunde": [ - 62.54222623966943, - 62.54222623966943, - 75.04222623966943, - 87.54222623966943, - 87.54222623966943, - 78.01764807162535, - 78.01764807162535, - 83.83265434833275, - 64.76391295714818, - 43.24187438965506, - 40.094017984696386, - 35.87277142822256, - 31.945515918580686, - 28.912587199572425, - 28.912587199572425, - 25.176146083869945, - 22.187423632079316, - 22.187423632079316, - 22.187423632079316, - 22.187423632079316, - 34.68742363207931, - 34.68742363207931, - 34.68742363207931, - 34.68742363207931, - 34.99947869620843, - 36.0696843420455, - 40.099841390631155, - 40.249843096950585, - 55.20257643028218, - 67.47251658502745, - 84.99550697329678, - 88.77022785443704, - 89.9213907145978, - 89.9213907145978, - 89.9213907145978, - 89.9213907145978, - 89.9213907145978, - 89.9213907145978 + 80.0, + 80.0, + 62.150396005509634, + 62.150396005509634, + 62.150396005509634, + 52.62581783746556, + 52.62581783746556, + 52.62581783746556, + 53.77091326251142, + 53.03253516333787, + 49.884678758379195, + 45.663432201905366, + 41.73617669226349, + 38.70324797325523, + 36.48058096223595, + 32.74413984653347, + 29.75541739474284, + 27.134937022842013, + 27.134937022842013, + 25.030555135789673, + 22.848607821740085, + 19.405727312098207, + 15.934695976010055, + 15.0, + 15.312055064129126, + 16.07020564583707, + 19.578139530578447, + 19.728141236897873, + 34.68087457022947, + 46.94341995234899, + 53.90006700591099, + 57.67478788705125, + 58.17025540478875, + 57.06126780148296, + 54.622002994320425, + 50.373509537020155, + 47.214117319389295, + 44.661732677516014 ], "Electricity_price": [ 0.000228, @@ -711,78 +711,78 @@ "kapazitaet_wh": 60000, "lade_effizienz": 0.95, "max_ladeleistung_w": 11040, - "soc_wh": 56751.0, + "soc_wh": 48885.0, "start_soc_prozent": 5 }, "start_solution": [ - 16.0, - 13.0, + 7.0, + 4.0, 11.0, - 14.0, - 2.0, - 18.0, - 3.0, - 16.0, - 4.0, - 20.0, - 12.0, - 2.0, - 18.0, - 18.0, - 1.0, + 15.0, 13.0, - 4.0, + 19.0, + 8.0, + 15.0, + 5.0, + 11.0, + 1.0, + 2.0, + 8.0, + 1.0, + 2.0, + 13.0, + 14.0, + 1.0, + 9.0, 7.0, 9.0, - 8.0, - 10.0, 12.0, - 10.0, - 10.0, - 14.0, + 12.0, 8.0, - 7.0, - 2.0, - 6.0, - 4.0, - 18.0, - 3.0, - 4.0, - 3.0, - 5.0, - 14.0, - 14.0, - 10.0, 13.0, - 3.0, - 17.0, - 11.0, + 13.0, + 7.0, + 7.0, 6.0, - 14.0, - 14.0, - 14.0, - 2.0, + 13.0, + 7.0, + 7.0, + 10.0, + 11.0, + 12.0, + 9.0, + 9.0, + 11.0, + 11.0, + 9.0, + 10.0, + 10.0, + 11.0, + 10.0, + 8.0, + 13.0, + 11.0, + 8.0, 3.0, 5.0, - 4.0, 5.0, - 2.0, - 1.0, - 4.0, - 5.0, - 3.0, - 1.0, - 2.0, 1.0, 0.0, - 5.0, + 6.0, + 4.0, + 6.0, + 0.0, + 1.0, 2.0, 4.0, - 3.0, - 5.0, + 1.0, 0.0, 2.0, 3.0, + 6.0, + 3.0, + 0.0, + 0.0, 0.0, 0.0, 0.0, From 75ee2408c4326acc1104ac9156991d0f641eba5b Mon Sep 17 00:00:00 2001 From: Andreas Date: Sat, 21 Dec 2024 15:34:34 +0100 Subject: [PATCH 16/47] Standard Optimization time 48h -> Tests updated --- src/akkudoktoreos/default.config.json | 2 +- tests/test_class_optimize.py | 4 +- tests/testdata/optimize_input_2.json | 99 ++--- tests/testdata/optimize_result_2_full.json | 472 ++++++++++----------- 4 files changed, 290 insertions(+), 287 deletions(-) diff --git a/src/akkudoktoreos/default.config.json b/src/akkudoktoreos/default.config.json index 2d9f1ac..f25916b 100644 --- a/src/akkudoktoreos/default.config.json +++ b/src/akkudoktoreos/default.config.json @@ -5,7 +5,7 @@ }, "eos": { "prediction_hours": 48, - "optimization_hours": 24, + "optimization_hours": 48, "penalty": 10, "available_charging_rates_in_percentage": [ 0.0, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0 diff --git a/tests/test_class_optimize.py b/tests/test_class_optimize.py index 5c907fd..09dea5a 100644 --- a/tests/test_class_optimize.py +++ b/tests/test_class_optimize.py @@ -61,8 +61,8 @@ def test_optimize( opt_class = optimization_problem(tmp_config, fixed_seed=42) start_hour = 10 - if ngen > 10 and not is_full_run: - pytest.skip() + # if ngen > 10 and not is_full_run: + # pytest.skip() visualize_filename = str((DIR_TESTDATA / f"new_{fn_out}").with_suffix(".pdf")) diff --git a/tests/testdata/optimize_input_2.json b/tests/testdata/optimize_input_2.json index 9a715d6..0c1deb3 100644 --- a/tests/testdata/optimize_input_2.json +++ b/tests/testdata/optimize_input_2.json @@ -1,51 +1,54 @@ { - "ems": { - "preis_euro_pro_wh_akku": 0.0001, - "einspeiseverguetung_euro_pro_wh": 0.00007, - "gesamtlast": [ - 676.71, 876.19, 527.13, 468.88, 531.38, 517.95, 483.15, 472.28, 1011.68, 995.00, - 1053.07, 1063.91, 1320.56, 1132.03, 1163.67, 1176.82, 1216.22, 1103.78, 1129.12, - 1178.71, 1050.98, 988.56, 912.38, 704.61, 516.37, 868.05, 694.34, 608.79, 556.31, - 488.89, 506.91, 804.89, 1141.98, 1056.97, 992.46, 1155.99, 827.01, 1257.98, 1232.67, - 871.26, 860.88, 1158.03, 1222.72, 1221.04, 949.99, 987.01, 733.99, 592.97 - ], - "pv_prognose_wh": [ - 0, 0, 0, 0, 0, 0, 0, 8.05, 352.91, 728.51, 930.28, 1043.25, 1106.74, 1161.69, - 6018.82, 5519.07, 3969.88, 3017.96, 1943.07, 1007.17, 319.67, 7.88, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5.04, 335.59, 705.32, 1121.12, 1604.79, 2157.38, 1433.25, 5718.49, - 4553.96, 3027.55, 2574.46, 1720.4, 963.4, 383.3, 0, 0, 0 - ], - "strompreis_euro_pro_wh": [ - 0.0003384, 0.0003318, 0.0003284, 0.0003283, 0.0003289, 0.0003334, 0.0003290, - 0.0003302, 0.0003042, 0.0002430, 0.0002280, 0.0002212, 0.0002093, 0.0001879, - 0.0001838, 0.0002004, 0.0002198, 0.0002270, 0.0002997, 0.0003195, 0.0003081, - 0.0002969, 0.0002921, 0.0002780, 0.0003384, 0.0003318, 0.0003284, 0.0003283, - 0.0003289, 0.0003334, 0.0003290, 0.0003302, 0.0003042, 0.0002430, 0.0002280, - 0.0002212, 0.0002093, 0.0001879, 0.0001838, 0.0002004, 0.0002198, 0.0002270, - 0.0002997, 0.0003195, 0.0003081, 0.0002969, 0.0002921, 0.0002780 - ] - }, - "pv_akku": { - "kapazitaet_wh": 26400, - "start_soc_prozent": 80, - "min_soc_prozent": 15 - }, - "eauto": { - "kapazitaet_wh": 60000, - "lade_effizienz": 0.95, - "max_ladeleistung_w": 11040, - "start_soc_prozent": 5, - "min_soc_prozent": 80 - }, - "dishwasher" :{ - "consumption_wh": 5000, - "duration_h": 2 - }, - "temperature_forecast": [ - 18.3, 17.8, 16.9, 16.2, 15.6, 15.1, 14.6, 14.2, 14.3, 14.8, 15.7, 16.7, 17.4, - 18.0, 18.6, 19.2, 19.1, 18.7, 18.5, 17.7, 16.2, 14.6, 13.6, 13.0, 12.6, 12.2, - 11.7, 11.6, 11.3, 11.0, 10.7, 10.2, 11.4, 14.4, 16.4, 18.3, 19.5, 20.7, 21.9, - 22.7, 23.1, 23.1, 22.8, 21.8, 20.2, 19.1, 18.0, 17.4 + "ems": { + "preis_euro_pro_wh_akku": 0.0, + "einspeiseverguetung_euro_pro_wh": 0.00007, + "gesamtlast": [ + 676.71, 876.19, 527.13, 468.88, 531.38, 517.95, 483.15, 472.28, 1011.68, + 995.0, 1053.07, 1063.91, 1320.56, 1132.03, 1163.67, 1176.82, 1216.22, + 1103.78, 1129.12, 1178.71, 1050.98, 988.56, 912.38, 704.61, 516.37, + 868.05, 694.34, 608.79, 556.31, 488.89, 506.91, 804.89, 1141.98, 1056.97, + 992.46, 1155.99, 827.01, 1257.98, 1232.67, 871.26, 860.88, 1158.03, + 1222.72, 1221.04, 949.99, 987.01, 733.99, 592.97 ], - "start_solution": null + "pv_prognose_wh": [ + 0, 0, 0, 0, 0, 0, 0, 8.05, 352.91, 728.51, 930.28, 1043.25, 1106.74, + 1161.69, 6018.82, 5519.07, 3969.88, 3017.96, 1943.07, 1007.17, 319.67, + 7.88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.04, 335.59, 705.32, 1121.12, 1604.79, + 2157.38, 1433.25, 5718.49, 4553.96, 3027.55, 2574.46, 1720.4, 963.4, + 383.3, 0, 0, 0 + ], + "strompreis_euro_pro_wh": [ + 0.0003384, 0.0003318, 0.0003284, 0.0003283, 0.0003289, 0.0003334, + 0.000329, 0.0003302, 0.0003042, 0.000243, 0.000228, 0.0002212, 0.0002093, + 0.0001879, 0.0001838, 0.0002004, 0.0002198, 0.000227, 0.0002997, + 0.0003195, 0.0003081, 0.0002969, 0.0002921, 0.000278, 0.0003384, + 0.0003318, 0.0003284, 0.0003283, 0.0003289, 0.0003334, 0.000329, + 0.0003302, 0.0003042, 0.000243, 0.000228, 0.0002212, 0.0002093, 0.0001879, + 0.0001838, 0.0002004, 0.0002198, 0.000227, 0.0002997, 0.0003195, + 0.0003081, 0.0002969, 0.0002921, 0.000278 + ] + }, + "pv_akku": { + "kapazitaet_wh": 26400, + "start_soc_prozent": 80, + "min_soc_prozent": 0 + }, + "eauto": { + "kapazitaet_wh": 60000, + "lade_effizienz": 0.95, + "max_ladeleistung_w": 11040, + "start_soc_prozent": 5, + "min_soc_prozent": 80 + }, + "dishwasher": { + "consumption_wh": 5000, + "duration_h": 2 + }, + "temperature_forecast": [ + 18.3, 17.8, 16.9, 16.2, 15.6, 15.1, 14.6, 14.2, 14.3, 14.8, 15.7, 16.7, + 17.4, 18.0, 18.6, 19.2, 19.1, 18.7, 18.5, 17.7, 16.2, 14.6, 13.6, 13.0, + 12.6, 12.2, 11.7, 11.6, 11.3, 11.0, 10.7, 10.2, 11.4, 14.4, 16.4, 18.3, + 19.5, 20.7, 21.9, 22.7, 23.1, 23.1, 22.8, 21.8, 20.2, 19.1, 18.0, 17.4 + ], + "start_solution": null } diff --git a/tests/testdata/optimize_result_2_full.json b/tests/testdata/optimize_result_2_full.json index b3ba460..03c21ff 100644 --- a/tests/testdata/optimize_result_2_full.json +++ b/tests/testdata/optimize_result_2_full.json @@ -1,25 +1,24 @@ { "ac_charge": [ + 0.75, + 0.0, + 0.0, + 0.0, 0.0, 0.0, 0.0, 0.375, 0.0, - 0.875, - 0.0, - 0.375, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, + 1.0, 0.0, 0.0, 0.0, + 0.75, + 0.0, + 0.0, + 0.75, + 0.0, + 0.0, 0.0, 0.0, 0.0, @@ -33,6 +32,7 @@ 0.0, 0.0, 0.0, + 0.5, 0.0, 0.0, 0.0, @@ -100,24 +100,28 @@ 1.0 ], "discharge_allowed": [ + 0, + 0, + 0, + 0, + 0, + 1, 1, 0, 1, 0, 1, - 0, + 1, 1, 0, 0, 1, 0, - 0, 1, - 0, - 0, 1, - 0, - 0, + 1, + 1, + 1, 1, 1, 1, @@ -130,18 +134,14 @@ 1, 0, 1, + 0, + 0, 1, 1, + 0, + 0, 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, + 0, 1, 1, 1, @@ -150,28 +150,24 @@ 1 ], "eautocharge_hours_float": [ - 0.625, - 0.875, - 0.875, - 0.375, - 0.0, - 1.0, - 0.75, - 1.0, - 0.0, - 0.375, 0.5, - 0.75, - 0.375, - 0.0, 0.5, 0.625, 1.0, - 0.625, - 0.0, - 0.0, - 0.0, - 0.0, + 0.0, + 0.375, + 0.0, + 0.5, + 0.75, + 1.0, + 0.0, + 0.375, + 1.0, + 0.0, + 0.75, + 0.375, + 0.0, + 0.375, 0.0, 0.0, 0.0, @@ -189,11 +185,15 @@ 0.0, 0.0, 0.0, + 0.5, + 0.0, + 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.5, 0.0, 0.0, 0.0, @@ -201,14 +201,14 @@ ], "result": { "Last_Wh_pro_Stunde": [ - 6297.07, - 8929.91, - 5253.5599999999995, - 3632.0299999999997, - 8907.67, - 7731.82, - 11704.22, - 7658.78, + 1053.07, + 4996.91, + 11808.56, + 4882.03, + 9029.67, + 7609.82, + 7466.22, + 5036.78, 1129.12, 1178.71, 1050.98, @@ -223,57 +223,57 @@ 488.89, 506.91, 804.89, - 1141.98, + 3641.98, 1056.97, 992.46, - 1155.99, + 6399.99, 827.01, - 1257.98, + 6501.98, 1232.67, 871.26, 860.88, 1158.03, 1222.72, - 1221.04, + 6465.04, 949.99, 987.01, 733.99, 592.97 ], "EAuto_SoC_pro_Stunde": [ - 13.74, - 26.85, - 33.405, - 33.405, + 5.0, + 11.555, + 29.035, + 29.035, 42.144999999999996, - 53.06999999999999, - 70.55, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, - 81.475, + 48.699999999999996, + 48.699999999999996, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 55.254999999999995, + 63.995000000000005, + 63.995000000000005, + 72.735, + 72.735, + 72.735, + 72.735, + 72.735, + 72.735, 81.475, 81.475, 81.475, @@ -320,18 +320,18 @@ 0.0, 0.0 ], - "Gesamt_Verluste": 6757.733989740087, - "Gesamtbilanz_Euro": 6.952642478544519, + "Gesamt_Verluste": 10116.23845689936, + "Gesamtbilanz_Euro": 5.609399525190347, "Gesamteinnahmen_Euro": 0.0, - "Gesamtkosten_Euro": 6.952642478544519, + "Gesamtkosten_Euro": 5.609399525190347, "Home_appliance_wh_per_hour": [ 0.0, 0.0, 0.0, - 2500.0, - 2500.0, 0.0, 0.0, + 2500.0, + 2500.0, 0.0, 0.0, 0.0, @@ -365,14 +365,13 @@ 0.0 ], "Kosten_Euro_pro_Stunde": [ - 1.22362812, - 1.7445291920000001, 0.0, - 0.4641768859999999, - 0.53097063, 0.0, - 1.7000079319999999, - 1.0534661399999998, + 1.193390926, + 0.7064482052307314, + 0.5533942300000001, + 0.0, + 0.880004468, 0.0, 0.0, 0.0, @@ -383,36 +382,36 @@ 0.0, 0.0, 0.0, - 0.182970359, 0.0, 0.0, 0.0, 0.0, - 0.0326838476973626, + 0.0, + 1.005803838, + 0.0, 0.007989913613567745, - 0.012219458233588555, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, + 1.06069824, 0.0, + 0.012914366999999916, + 4.174095896658514e-14, + 0.0003442778967139274, 0.0, + 0.028137079449292023, 0.0, + 0.16027398000000012, 0.0, 0.0, 0.0, 0.0 ], "Netzbezug_Wh_pro_Stunde": [ - 5366.79, - 7886.66, 0.0, - 2470.3399999999997, - 2888.8500000000004, 0.0, - 7734.339999999999, - 4640.82, + 5701.82, + 3759.703061366319, + 3010.8500000000004, + 0.0, + 4003.66, 0.0, 0.0, 0.0, @@ -423,22 +422,23 @@ 0.0, 0.0, 0.0, - 556.31, 0.0, 0.0, 0.0, 0.0, - 134.50143085334403, + 0.0, + 3306.3900000000003, + 0.0, 35.04348076126204, - 55.24167375040034, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, + 4795.2, 0.0, + 68.72999999999956, + 2.270998855635753e-10, + 1.7179535764168035, 0.0, + 123.95189184710142, 0.0, + 501.6400000000003, 0.0, 0.0, 0.0, @@ -485,14 +485,14 @@ 0.0 ], "Verluste_Pro_Stunde": [ - 276.0, + 16.744090909090914, + 746.1354545454542, + 1233.818181818182, + 452.3948326360417, 414.0, - 772.4754545454543, - 0.0, - 276.0, - 646.7386363636365, - 552.0, - 345.0, + 492.1022727272725, + 450.0, + 482.2936363636363, 101.0335466817773, 23.391818181818195, 99.72409090909093, @@ -503,66 +503,66 @@ 118.37045454545455, 94.68272727272722, 83.01681818181817, - 0.0, + 75.86045454545456, 66.66681818181814, 69.12409090909085, 109.0704545454546, - 109.96227272727276, - 29.61116851999853, + 300.0, + 47.952272727272714, 11.233982308648535, - 48.41330768174524, + 276.0, 161.62968357967037, - 21.962728535423857, - 538.2984000000038, - 441.95211196761403, + 957.818181818182, + 538.2983999999728, + 441.7178455708299, 260.56941082122324, - 171.99990368477063, + 155.09737297834772, 62.214291413756285, - 35.132727272727266, + 957.818181818182, 77.27590909090907, 134.59227272727276, 100.08954545454549, 80.85954545454547 ], "akku_soc_pro_stunde": [ - 80.0, - 80.0, - 62.150396005509634, - 62.150396005509634, - 62.150396005509634, - 52.62581783746556, - 52.62581783746556, - 52.62581783746556, - 53.77091326251142, - 53.03253516333787, - 49.884678758379195, - 45.663432201905366, - 41.73617669226349, - 38.70324797325523, - 36.48058096223595, - 32.74413984653347, - 29.75541739474284, - 27.134937022842013, - 27.134937022842013, - 25.030555135789673, - 22.848607821740085, - 19.405727312098207, - 15.934695976010055, - 15.0, - 15.312055064129126, - 16.07020564583707, - 19.578139530578447, - 19.728141236897873, - 34.68087457022947, - 46.94341995234899, - 53.90006700591099, - 57.67478788705125, - 58.17025540478875, - 57.06126780148296, - 54.622002994320425, - 50.373509537020155, - 47.214117319389295, - 44.661732677516014 + 79.4714617768595, + 62.45329717630854, + 40.931258608815426, + 53.49778173759437, + 53.49778173759437, + 44.49834131059713, + 56.998341310597134, + 48.308516930431836, + 49.4536123554777, + 48.71523425630414, + 45.56737785134547, + 41.34613129487165, + 37.41887578522978, + 34.38594706622151, + 32.16328005520223, + 28.42683893949975, + 25.438116487709117, + 22.81763611580829, + 20.42305106071187, + 18.318669173659533, + 16.136721859609946, + 12.693841349968071, + 21.027174683301403, + 19.51352971084961, + 19.82558477497874, + 19.82558477497874, + 23.333518659720113, + 1.8114800922269987, + 16.764213425559575, + 29.03415358030485, + 35.990800633866854, + 40.29906099437652, + 40.79452851211402, + 19.272489944620908, + 16.833225137458374, + 12.584731680158098, + 9.425339462527244, + 6.872954820653964 ], "Electricity_price": [ 0.000228, @@ -715,72 +715,72 @@ "start_soc_prozent": 5 }, "start_solution": [ + 18.0, + 3.0, + 2.0, + 1.0, + 1.0, + 8.0, + 10.0, + 15.0, + 13.0, + 20.0, + 12.0, + 9.0, + 13.0, + 18.0, + 0.0, 7.0, - 4.0, + 18.0, + 7.0, + 9.0, + 9.0, + 10.0, + 12.0, + 10.0, 11.0, - 15.0, 13.0, - 19.0, 8.0, - 15.0, + 12.0, + 12.0, + 10.0, + 10.0, + 7.0, + 8.0, + 16.0, + 12.0, + 6.0, + 0.0, + 12.0, + 13.0, 5.0, - 11.0, - 1.0, - 2.0, - 8.0, - 1.0, - 2.0, - 13.0, 14.0, - 1.0, 9.0, - 7.0, - 9.0, - 12.0, - 12.0, - 8.0, - 13.0, - 13.0, - 7.0, - 7.0, - 6.0, - 13.0, - 7.0, - 7.0, - 10.0, - 11.0, - 12.0, - 9.0, - 9.0, - 11.0, - 11.0, - 9.0, - 10.0, - 10.0, - 11.0, - 10.0, - 8.0, - 13.0, - 11.0, - 8.0, - 3.0, 5.0, - 5.0, - 1.0, - 0.0, - 6.0, - 4.0, - 6.0, - 0.0, - 1.0, + 13.0, + 8.0, + 10.0, + 10.0, + 9.0, + 7.0, 2.0, - 4.0, - 1.0, - 0.0, 2.0, 3.0, 6.0, - 3.0, + 0.0, + 1.0, + 0.0, + 2.0, + 4.0, + 6.0, + 0.0, + 1.0, + 6.0, + 0.0, + 4.0, + 1.0, + 0.0, + 1.0, 0.0, 0.0, 0.0, @@ -798,20 +798,20 @@ 0.0, 0.0, 0.0, + 2.0, + 0.0, + 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 2.0, 0.0, 0.0, 0.0, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 13.0 + 15.0 ], - "washingstart": 13 + "washingstart": 15 } \ No newline at end of file From 11b925f9bde23c228f9a64288d81150ee54be813 Mon Sep 17 00:00:00 2001 From: Dominique Lasserre Date: Sat, 21 Dec 2024 18:05:31 +0100 Subject: [PATCH 17/47] input data: Fix indentation * Comment full_run (use pytest --full-run to activate) --- tests/test_class_optimize.py | 5 +- tests/testdata/optimize_input_2.json | 271 ++++++++++++++++++++++----- 2 files changed, 223 insertions(+), 53 deletions(-) diff --git a/tests/test_class_optimize.py b/tests/test_class_optimize.py index 09dea5a..4a9d808 100644 --- a/tests/test_class_optimize.py +++ b/tests/test_class_optimize.py @@ -61,8 +61,9 @@ def test_optimize( opt_class = optimization_problem(tmp_config, fixed_seed=42) start_hour = 10 - # if ngen > 10 and not is_full_run: - # pytest.skip() + # Activate with pytest --full-run + if ngen > 10 and not is_full_run: + pytest.skip() visualize_filename = str((DIR_TESTDATA / f"new_{fn_out}").with_suffix(".pdf")) diff --git a/tests/testdata/optimize_input_2.json b/tests/testdata/optimize_input_2.json index 0c1deb3..3a01eb8 100644 --- a/tests/testdata/optimize_input_2.json +++ b/tests/testdata/optimize_input_2.json @@ -1,54 +1,223 @@ { - "ems": { - "preis_euro_pro_wh_akku": 0.0, - "einspeiseverguetung_euro_pro_wh": 0.00007, - "gesamtlast": [ - 676.71, 876.19, 527.13, 468.88, 531.38, 517.95, 483.15, 472.28, 1011.68, - 995.0, 1053.07, 1063.91, 1320.56, 1132.03, 1163.67, 1176.82, 1216.22, - 1103.78, 1129.12, 1178.71, 1050.98, 988.56, 912.38, 704.61, 516.37, - 868.05, 694.34, 608.79, 556.31, 488.89, 506.91, 804.89, 1141.98, 1056.97, - 992.46, 1155.99, 827.01, 1257.98, 1232.67, 871.26, 860.88, 1158.03, - 1222.72, 1221.04, 949.99, 987.01, 733.99, 592.97 + "ems": { + "preis_euro_pro_wh_akku": 0.0, + "einspeiseverguetung_euro_pro_wh": 0.00007, + "gesamtlast": [ + 676.71, + 876.19, + 527.13, + 468.88, + 531.38, + 517.95, + 483.15, + 472.28, + 1011.68, + 995.0, + 1053.07, + 1063.91, + 1320.56, + 1132.03, + 1163.67, + 1176.82, + 1216.22, + 1103.78, + 1129.12, + 1178.71, + 1050.98, + 988.56, + 912.38, + 704.61, + 516.37, + 868.05, + 694.34, + 608.79, + 556.31, + 488.89, + 506.91, + 804.89, + 1141.98, + 1056.97, + 992.46, + 1155.99, + 827.01, + 1257.98, + 1232.67, + 871.26, + 860.88, + 1158.03, + 1222.72, + 1221.04, + 949.99, + 987.01, + 733.99, + 592.97 + ], + "pv_prognose_wh": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8.05, + 352.91, + 728.51, + 930.28, + 1043.25, + 1106.74, + 1161.69, + 6018.82, + 5519.07, + 3969.88, + 3017.96, + 1943.07, + 1007.17, + 319.67, + 7.88, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 5.04, + 335.59, + 705.32, + 1121.12, + 1604.79, + 2157.38, + 1433.25, + 5718.49, + 4553.96, + 3027.55, + 2574.46, + 1720.4, + 963.4, + 383.3, + 0, + 0, + 0 + ], + "strompreis_euro_pro_wh": [ + 0.0003384, + 0.0003318, + 0.0003284, + 0.0003283, + 0.0003289, + 0.0003334, + 0.000329, + 0.0003302, + 0.0003042, + 0.000243, + 0.000228, + 0.0002212, + 0.0002093, + 0.0001879, + 0.0001838, + 0.0002004, + 0.0002198, + 0.000227, + 0.0002997, + 0.0003195, + 0.0003081, + 0.0002969, + 0.0002921, + 0.000278, + 0.0003384, + 0.0003318, + 0.0003284, + 0.0003283, + 0.0003289, + 0.0003334, + 0.000329, + 0.0003302, + 0.0003042, + 0.000243, + 0.000228, + 0.0002212, + 0.0002093, + 0.0001879, + 0.0001838, + 0.0002004, + 0.0002198, + 0.000227, + 0.0002997, + 0.0003195, + 0.0003081, + 0.0002969, + 0.0002921, + 0.000278 + ] + }, + "pv_akku": { + "kapazitaet_wh": 26400, + "start_soc_prozent": 80, + "min_soc_prozent": 0 + }, + "eauto": { + "kapazitaet_wh": 60000, + "lade_effizienz": 0.95, + "max_ladeleistung_w": 11040, + "start_soc_prozent": 5, + "min_soc_prozent": 80 + }, + "dishwasher": { + "consumption_wh": 5000, + "duration_h": 2 + }, + "temperature_forecast": [ + 18.3, + 17.8, + 16.9, + 16.2, + 15.6, + 15.1, + 14.6, + 14.2, + 14.3, + 14.8, + 15.7, + 16.7, + 17.4, + 18.0, + 18.6, + 19.2, + 19.1, + 18.7, + 18.5, + 17.7, + 16.2, + 14.6, + 13.6, + 13.0, + 12.6, + 12.2, + 11.7, + 11.6, + 11.3, + 11.0, + 10.7, + 10.2, + 11.4, + 14.4, + 16.4, + 18.3, + 19.5, + 20.7, + 21.9, + 22.7, + 23.1, + 23.1, + 22.8, + 21.8, + 20.2, + 19.1, + 18.0, + 17.4 ], - "pv_prognose_wh": [ - 0, 0, 0, 0, 0, 0, 0, 8.05, 352.91, 728.51, 930.28, 1043.25, 1106.74, - 1161.69, 6018.82, 5519.07, 3969.88, 3017.96, 1943.07, 1007.17, 319.67, - 7.88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.04, 335.59, 705.32, 1121.12, 1604.79, - 2157.38, 1433.25, 5718.49, 4553.96, 3027.55, 2574.46, 1720.4, 963.4, - 383.3, 0, 0, 0 - ], - "strompreis_euro_pro_wh": [ - 0.0003384, 0.0003318, 0.0003284, 0.0003283, 0.0003289, 0.0003334, - 0.000329, 0.0003302, 0.0003042, 0.000243, 0.000228, 0.0002212, 0.0002093, - 0.0001879, 0.0001838, 0.0002004, 0.0002198, 0.000227, 0.0002997, - 0.0003195, 0.0003081, 0.0002969, 0.0002921, 0.000278, 0.0003384, - 0.0003318, 0.0003284, 0.0003283, 0.0003289, 0.0003334, 0.000329, - 0.0003302, 0.0003042, 0.000243, 0.000228, 0.0002212, 0.0002093, 0.0001879, - 0.0001838, 0.0002004, 0.0002198, 0.000227, 0.0002997, 0.0003195, - 0.0003081, 0.0002969, 0.0002921, 0.000278 - ] - }, - "pv_akku": { - "kapazitaet_wh": 26400, - "start_soc_prozent": 80, - "min_soc_prozent": 0 - }, - "eauto": { - "kapazitaet_wh": 60000, - "lade_effizienz": 0.95, - "max_ladeleistung_w": 11040, - "start_soc_prozent": 5, - "min_soc_prozent": 80 - }, - "dishwasher": { - "consumption_wh": 5000, - "duration_h": 2 - }, - "temperature_forecast": [ - 18.3, 17.8, 16.9, 16.2, 15.6, 15.1, 14.6, 14.2, 14.3, 14.8, 15.7, 16.7, - 17.4, 18.0, 18.6, 19.2, 19.1, 18.7, 18.5, 17.7, 16.2, 14.6, 13.6, 13.0, - 12.6, 12.2, 11.7, 11.6, 11.3, 11.0, 10.7, 10.2, 11.4, 14.4, 16.4, 18.3, - 19.5, 20.7, 21.9, 22.7, 23.1, 23.1, 22.8, 21.8, 20.2, 19.1, 18.0, 17.4 - ], - "start_solution": null + "start_solution": null } From 6aa2112da1db0c4d14d9644f71226948dea11661 Mon Sep 17 00:00:00 2001 From: Dominique Lasserre Date: Sat, 21 Dec 2024 18:09:07 +0100 Subject: [PATCH 18/47] workflow: Pytest also upload artifacts on test failure --- .github/workflows/pytest.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml index 5f2254a..c0f1f75 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yml @@ -30,6 +30,7 @@ jobs: - name: Upload test artifacts uses: actions/upload-artifact@v4 + if: success() || failure() with: name: optimize-results path: tests/testdata/new_optimize_result* From 82b9216be599f9d0ed3801d97a73ce4425ba1f12 Mon Sep 17 00:00:00 2001 From: Andreas Date: Sun, 22 Dec 2024 12:03:48 +0100 Subject: [PATCH 19/47] Soc 1 hour shift fixed + some german -> english translations in ems --- src/akkudoktoreos/prediction/ems.py | 129 ++--- tests/test_class_ems.py | 10 +- tests/test_class_ems_2.py | 12 +- tests/test_class_optimize.py | 4 +- tests/testdata/optimize_result_1.json | 2 +- tests/testdata/optimize_result_2.json | 124 ++--- tests/testdata/optimize_result_2_full.json | 562 ++++++++++----------- 7 files changed, 422 insertions(+), 421 deletions(-) diff --git a/src/akkudoktoreos/prediction/ems.py b/src/akkudoktoreos/prediction/ems.py index e9998d4..014385a 100644 --- a/src/akkudoktoreos/prediction/ems.py +++ b/src/akkudoktoreos/prediction/ems.py @@ -150,7 +150,7 @@ class EnergieManagementSystem: start_stunde = jetzt.hour return self.simuliere(start_stunde) - def simuliere(self, start_stunde: int) -> dict[str, Any]: + def simuliere(self, start_hour: int) -> dict[str, Any]: """hour. akku_soc_pro_stunde begin of the hour, initial hour state! @@ -162,100 +162,101 @@ class EnergieManagementSystem: ), f"Array sizes do not match: Load Curve = {len(lastkurve_wh)}, PV Forecast = {len(self.pv_prognose_wh)}, Electricity Price = {len(self.strompreis_euro_pro_wh)}" # Optimized total hours calculation - ende = len(lastkurve_wh) - total_hours = ende - start_stunde + end_hour = len(lastkurve_wh) + total_hours = end_hour - start_hour # Pre-allocate arrays for the results, optimized for speed - 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) + loads_energy_per_hour = np.full((total_hours), np.nan) + feedin_energy_per_hour = np.full((total_hours), np.nan) + consumption_energy_per_hour = np.full((total_hours), np.nan) + costs_per_hour = np.full((total_hours), np.nan) + revenue_per_hour = np.full((total_hours), np.nan) + soc_per_hour = np.full((total_hours), np.nan) # Hour End State + soc_ev_per_hour = np.full((total_hours), np.nan) + losses_wh_per_hour = np.full((total_hours), np.nan) home_appliance_wh_per_hour = np.full((total_hours), np.nan) electricity_price_per_hour = np.full((total_hours), np.nan) # Set initial state - akku_soc_pro_stunde[0] = self.akku.ladezustand_in_prozent() + soc_per_hour[0] = self.akku.ladezustand_in_prozent() if self.eauto: - eauto_soc_pro_stunde[0] = self.eauto.ladezustand_in_prozent() + soc_ev_per_hour[0] = self.eauto.ladezustand_in_prozent() - for stunde in range(start_stunde, ende): - stunde_since_now = stunde - start_stunde + # All States + for hour in range(start_hour, end_hour): + hour_since_now = hour - start_hour + + # save begin states + soc_per_hour[hour_since_now] = self.akku.ladezustand_in_prozent() + if self.eauto: + soc_ev_per_hour[hour_since_now] = self.eauto.ladezustand_in_prozent() # Accumulate loads and PV generation - verbrauch = self.gesamtlast[stunde] - verluste_wh_pro_stunde[stunde_since_now] = 0.0 + consumption = self.gesamtlast[hour] + losses_wh_per_hour[hour_since_now] = 0.0 if self.home_appliance: - ha_load = self.home_appliance.get_load_for_hour(stunde) - verbrauch += ha_load - home_appliance_wh_per_hour[stunde_since_now] = ha_load + ha_load = self.home_appliance.get_load_for_hour(hour) + consumption += ha_load + home_appliance_wh_per_hour[hour_since_now] = ha_load # E-Auto handling - if self.eauto and self.ev_charge_hours[stunde] > 0: - geladene_menge_eauto, verluste_eauto = self.eauto.energie_laden( - None, stunde, relative_power=self.ev_charge_hours[stunde] + if self.eauto and self.ev_charge_hours[hour] > 0: + loaded_energy_ev, verluste_eauto = self.eauto.energie_laden( + None, hour, relative_power=self.ev_charge_hours[hour] ) - verbrauch += geladene_menge_eauto - verluste_wh_pro_stunde[stunde_since_now] += verluste_eauto + consumption += loaded_energy_ev + losses_wh_per_hour[hour_since_now] += verluste_eauto - if self.eauto: - eauto_soc_pro_stunde[stunde_since_now] = self.eauto.ladezustand_in_prozent() # Process inverter logic - erzeugung = self.pv_prognose_wh[stunde] - self.akku.set_charge_allowed_for_hour(self.dc_charge_hours[stunde], stunde) - netzeinspeisung, netzbezug, verluste, eigenverbrauch = ( - self.wechselrichter.energie_verarbeiten(erzeugung, verbrauch, stunde) + energy_produced = self.pv_prognose_wh[hour] + self.akku.set_charge_allowed_for_hour(self.dc_charge_hours[hour], hour) + energy_feedin_grid_actual, energy_consumption_grid_actual, losses, eigenverbrauch = ( + self.wechselrichter.energie_verarbeiten(energy_produced, consumption, hour) ) # AC PV Battery Charge - if self.ac_charge_hours[stunde] > 0.0: - self.akku.set_charge_allowed_for_hour(1, stunde) - geladene_menge, verluste_wh = self.akku.energie_laden( - None, stunde, relative_power=self.ac_charge_hours[stunde] + if self.ac_charge_hours[hour] > 0.0: + self.akku.set_charge_allowed_for_hour(1, hour) + battery_charged_energy_actual, battery_losses_actual = self.akku.energie_laden( + None, hour, relative_power=self.ac_charge_hours[hour] ) # print(stunde, " ", geladene_menge, " ",self.ac_charge_hours[stunde]," ",self.akku.ladezustand_in_prozent()) - verbrauch += geladene_menge - verbrauch += verluste_wh - netzbezug += geladene_menge - netzbezug += verluste_wh - verluste_wh_pro_stunde[stunde_since_now] += verluste_wh + consumption += battery_charged_energy_actual + consumption += battery_losses_actual + energy_consumption_grid_actual += battery_charged_energy_actual + energy_consumption_grid_actual += battery_losses_actual + losses_wh_per_hour[hour_since_now] += battery_losses_actual - netzeinspeisung_wh_pro_stunde[stunde_since_now] = netzeinspeisung - netzbezug_wh_pro_stunde[stunde_since_now] = netzbezug - verluste_wh_pro_stunde[stunde_since_now] += verluste - last_wh_pro_stunde[stunde_since_now] = verbrauch - electricity_price_per_hour[stunde_since_now] = self.strompreis_euro_pro_wh[stunde] + feedin_energy_per_hour[hour_since_now] = energy_feedin_grid_actual + consumption_energy_per_hour[hour_since_now] = energy_consumption_grid_actual + losses_wh_per_hour[hour_since_now] += losses + loads_energy_per_hour[hour_since_now] = consumption + electricity_price_per_hour[hour_since_now] = self.strompreis_euro_pro_wh[hour] # Financial calculations - kosten_euro_pro_stunde[stunde_since_now] = ( - netzbezug * self.strompreis_euro_pro_wh[stunde] + costs_per_hour[hour_since_now] = ( + energy_consumption_grid_actual * self.strompreis_euro_pro_wh[hour] ) - einnahmen_euro_pro_stunde[stunde_since_now] = ( - netzeinspeisung * self.einspeiseverguetung_euro_pro_wh_arr[stunde] + revenue_per_hour[hour_since_now] = ( + energy_feedin_grid_actual * self.einspeiseverguetung_euro_pro_wh_arr[hour] ) - # Akku SOC tracking - akku_soc_pro_stunde[stunde_since_now] = self.akku.ladezustand_in_prozent() - # Total cost and return - gesamtkosten_euro = np.nansum(kosten_euro_pro_stunde) - np.nansum(einnahmen_euro_pro_stunde) + gesamtkosten_euro = np.nansum(costs_per_hour) - np.nansum(revenue_per_hour) # Prepare output dictionary out: Dict[str, Union[np.ndarray, float]] = { - "Last_Wh_pro_Stunde": last_wh_pro_stunde, - "Netzeinspeisung_Wh_pro_Stunde": netzeinspeisung_wh_pro_stunde, - "Netzbezug_Wh_pro_Stunde": netzbezug_wh_pro_stunde, - "Kosten_Euro_pro_Stunde": kosten_euro_pro_stunde, - "akku_soc_pro_stunde": akku_soc_pro_stunde, - "Einnahmen_Euro_pro_Stunde": einnahmen_euro_pro_stunde, + "Last_Wh_pro_Stunde": loads_energy_per_hour, + "Netzeinspeisung_Wh_pro_Stunde": feedin_energy_per_hour, + "Netzbezug_Wh_pro_Stunde": consumption_energy_per_hour, + "Kosten_Euro_pro_Stunde": costs_per_hour, + "akku_soc_pro_stunde": soc_per_hour, + "Einnahmen_Euro_pro_Stunde": revenue_per_hour, "Gesamtbilanz_Euro": gesamtkosten_euro, - "EAuto_SoC_pro_Stunde": eauto_soc_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.nansum(verluste_wh_pro_stunde), + "EAuto_SoC_pro_Stunde": soc_ev_per_hour, + "Gesamteinnahmen_Euro": np.nansum(revenue_per_hour), + "Gesamtkosten_Euro": np.nansum(costs_per_hour), + "Verluste_Pro_Stunde": losses_wh_per_hour, + "Gesamt_Verluste": np.nansum(losses_wh_per_hour), "Home_appliance_wh_per_hour": home_appliance_wh_per_hour, "Electricity_price": electricity_price_per_hour, } diff --git a/tests/test_class_ems.py b/tests/test_class_ems.py index 52867b1..c1518b6 100644 --- a/tests/test_class_ems.py +++ b/tests/test_class_ems.py @@ -244,7 +244,7 @@ def test_simulation(create_ems_instance): # Simulate starting from hour 1 (this value can be adjusted) - result = ems.simuliere(start_stunde=start_hour) + result = ems.simuliere(start_hour=start_hour) # visualisiere_ergebnisse( # ems.gesamtlast, @@ -330,11 +330,11 @@ def test_simulation(create_ems_instance): # Check the values in 'akku_soc_pro_stunde' assert ( - result["akku_soc_pro_stunde"][-1] == 28.675 - ), "The value at index -1 of 'akku_soc_pro_stunde' should be 28.675." + result["akku_soc_pro_stunde"][-1] == 42.151590909090906 + ), "The value at index -1 of 'akku_soc_pro_stunde' should be 42.151590909090906." assert ( - result["akku_soc_pro_stunde"][1] == 25.379090909090905 - ), "The value at index 1 of 'akku_soc_pro_stunde' should be 25.379090909090905." + result["akku_soc_pro_stunde"][1] == 60.08659090909091 + ), "The value at index 1 of 'akku_soc_pro_stunde' should be 60.08659090909091." # Check home appliances assert ( diff --git a/tests/test_class_ems_2.py b/tests/test_class_ems_2.py index cebb622..19d2c85 100644 --- a/tests/test_class_ems_2.py +++ b/tests/test_class_ems_2.py @@ -154,7 +154,7 @@ def test_simulation(create_ems_instance): ems = create_ems_instance # Simulate starting from hour 0 (this value can be adjusted) - result = ems.simuliere(start_stunde=start_hour) + result = ems.simuliere(start_hour=start_hour) # --- Pls do not remove! --- # visualisiere_ergebnisse( @@ -224,12 +224,12 @@ def test_simulation(create_ems_instance): ), "The length of 'akku_soc_pro_stunde' should be 48." # Verfify DC and AC Charge Bins + assert ( + abs(result["akku_soc_pro_stunde"][2] - 44.70681818181818) < 1e-5 + ), "'akku_soc_pro_stunde[2]' should be 44.70681818181818." assert ( abs(result["akku_soc_pro_stunde"][10] - 10.0) < 1e-5 ), "'akku_soc_pro_stunde[10]' should be 10." - assert ( - abs(result["akku_soc_pro_stunde"][11] - 79.275184) < 1e-5 - ), "'akku_soc_pro_stunde[11]' should be 79.275184." assert ( abs(result["Netzeinspeisung_Wh_pro_Stunde"][10] - 3946.93) < 1e-3 @@ -240,8 +240,8 @@ def test_simulation(create_ems_instance): ), "'Netzeinspeisung_Wh_pro_Stunde[11]' should be 0.0." assert ( - abs(result["akku_soc_pro_stunde"][20] - 98) < 1e-5 - ), "'akku_soc_pro_stunde[11]' should be 98." + abs(result["akku_soc_pro_stunde"][20] - 10) < 1e-5 + ), "'akku_soc_pro_stunde[20]' should be 10." assert ( abs(result["Last_Wh_pro_Stunde"][20] - 6050.98) < 1e-3 ), "'Netzeinspeisung_Wh_pro_Stunde[11]' should be 0.0." diff --git a/tests/test_class_optimize.py b/tests/test_class_optimize.py index 4a9d808..5cee674 100644 --- a/tests/test_class_optimize.py +++ b/tests/test_class_optimize.py @@ -62,8 +62,8 @@ def test_optimize( start_hour = 10 # Activate with pytest --full-run - if ngen > 10 and not is_full_run: - pytest.skip() + # if ngen > 10 and not is_full_run: + # pytest.skip() visualize_filename = str((DIR_TESTDATA / f"new_{fn_out}").with_suffix(".pdf")) diff --git a/tests/testdata/optimize_result_1.json b/tests/testdata/optimize_result_1.json index 6241fb2..de5c094 100644 --- a/tests/testdata/optimize_result_1.json +++ b/tests/testdata/optimize_result_1.json @@ -476,6 +476,7 @@ 0.0 ], "akku_soc_pro_stunde": [ + 80.0, 80.0, 79.91107093663912, 79.91107093663912, @@ -512,7 +513,6 @@ 100.0, 100.0, 100.0, - 96.84060778236915, 96.84060778236915 ], "Electricity_price": [ diff --git a/tests/testdata/optimize_result_2.json b/tests/testdata/optimize_result_2.json index 1e4999c..b4bef8e 100644 --- a/tests/testdata/optimize_result_2.json +++ b/tests/testdata/optimize_result_2.json @@ -170,7 +170,7 @@ 0.0, 0.5, 0.625, - 0.0, + 0.75, 0.0, 0.0, 0.0, @@ -211,7 +211,7 @@ 1103.78, 6373.12, 7733.71, - 1050.98, + 4299.98, 988.56, 912.38, 704.61, @@ -241,6 +241,7 @@ 592.97 ], "EAuto_SoC_pro_Stunde": [ + 5.0, 11.555, 11.555, 26.85, @@ -251,34 +252,33 @@ 74.92, 83.66, 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585, - 94.585 + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0, + 100.0 ], "Einnahmen_Euro_pro_Stunde": [ 0.0, @@ -320,7 +320,7 @@ 0.0, 0.0 ], - "Gesamt_Verluste": 9258.73062020124, + "Gesamt_Verluste": 9872.776074746695, "Gesamtbilanz_Euro": 12.332782378812306, "Gesamteinnahmen_Euro": 0.0, "Gesamtkosten_Euro": 12.332782378812306, @@ -495,7 +495,7 @@ 230.91336797704525, 880.0977272727268, 1026.818181818182, - 99.72409090909093, + 713.7695454545456, 133.72909090909081, 124.41545454545451, 96.08318181818186, @@ -525,6 +525,7 @@ 0.0 ], "akku_soc_pro_stunde": [ + 80.0, 62.54222623966943, 62.54222623966943, 75.04222623966943, @@ -535,34 +536,33 @@ 83.83265434833275, 64.76391295714818, 43.24187438965506, - 40.094017984696386, - 35.87277142822256, - 31.945515918580686, - 28.912587199572425, - 28.912587199572425, - 25.176146083869945, - 22.187423632079316, - 22.187423632079316, - 22.187423632079316, - 22.187423632079316, - 34.68742363207931, - 34.68742363207931, - 34.68742363207931, - 34.68742363207931, - 34.99947869620843, - 36.0696843420455, - 40.099841390631155, - 40.249843096950585, - 55.20257643028218, - 67.47251658502745, - 84.99550697329678, - 88.77022785443704, - 89.9213907145978, - 89.9213907145978, - 89.9213907145978, - 89.9213907145978, - 89.9213907145978, - 89.9213907145978 + 26.108997323539356, + 21.88775076706553, + 17.96049525742366, + 14.927566538415393, + 14.927566538415393, + 11.191125422712915, + 8.20240297092228, + 8.20240297092228, + 8.20240297092228, + 8.20240297092228, + 20.70240297092228, + 20.70240297092228, + 20.70240297092228, + 20.70240297092228, + 21.014458035051405, + 22.08466368088848, + 26.114820729474133, + 26.264822435793555, + 41.217555769125156, + 53.48749592387043, + 71.01048631213975, + 74.78520719328002, + 75.93637005344077, + 75.93637005344077, + 75.93637005344077, + 75.93637005344077, + 75.93637005344077 ], "Electricity_price": [ 0.000228, @@ -711,7 +711,7 @@ "kapazitaet_wh": 60000, "lade_effizienz": 0.95, "max_ladeleistung_w": 11040, - "soc_wh": 56751.0, + "soc_wh": 60000.0, "start_soc_prozent": 5 }, "start_solution": [ @@ -783,7 +783,7 @@ 0.0, 2.0, 3.0, - 0.0, + 4.0, 0.0, 0.0, 0.0, diff --git a/tests/testdata/optimize_result_2_full.json b/tests/testdata/optimize_result_2_full.json index 03c21ff..f580969 100644 --- a/tests/testdata/optimize_result_2_full.json +++ b/tests/testdata/optimize_result_2_full.json @@ -1,29 +1,15 @@ { "ac_charge": [ - 0.75, 0.0, 0.0, 0.0, - 0.0, - 0.0, - 0.0, - 0.375, - 0.0, 1.0, - 0.0, - 0.0, - 0.0, - 0.75, - 0.0, - 0.0, + 1.0, 0.75, 0.0, 0.0, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, + 0.5, 0.0, 0.0, 0.0, @@ -47,6 +33,20 @@ 0.0, 0.0, 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, 0.0 ], "dc_charge": [ @@ -100,13 +100,13 @@ 1.0 ], "discharge_allowed": [ - 0, - 0, - 0, - 0, 0, 1, - 1, + 0, + 0, + 0, + 0, + 0, 0, 1, 0, @@ -115,6 +115,11 @@ 1, 0, 0, + 0, + 1, + 1, + 0, + 1, 1, 0, 1, @@ -123,26 +128,21 @@ 1, 1, 1, + 0, 1, 1, + 0, 1, 1, - 1, + 0, 1, 1, 1, 1, 0, - 1, - 0, 0, 1, 1, - 0, - 0, - 1, - 0, - 1, 1, 1, 1, @@ -150,50 +150,50 @@ 1 ], "eautocharge_hours_float": [ + 0.5, + 0.375, + 0.625, + 0.75, + 0.625, + 0.5, + 0.5, + 0.75, + 0.0, + 0.5, + 0.375, + 0.0, + 0.0, 0.5, 0.5, 0.625, - 1.0, - 0.0, - 0.375, - 0.0, 0.5, - 0.75, - 1.0, - 0.0, - 0.375, - 1.0, - 0.0, - 0.75, - 0.375, - 0.0, - 0.375, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.5, - 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, - 0.5, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.375, + 0.0, + 0.0, + 0.0, + 0.375, + 0.0, + 0.0, + 0.625, + 0.0, 0.0, 0.0, 0.0, @@ -201,15 +201,15 @@ ], "result": { "Last_Wh_pro_Stunde": [ - 1053.07, - 4996.91, - 11808.56, - 4882.03, - 9029.67, - 7609.82, - 7466.22, - 5036.78, - 1129.12, + 4986.07, + 1063.91, + 1320.56, + 8876.029999999999, + 8907.67, + 7731.82, + 6460.22, + 6347.78, + 3629.12, 1178.71, 1050.98, 988.56, @@ -223,18 +223,18 @@ 488.89, 506.91, 804.89, - 3641.98, + 1141.98, 1056.97, 992.46, - 6399.99, + 5088.99, 827.01, - 6501.98, + 1257.98, 1232.67, - 871.26, + 4804.26, 860.88, 1158.03, - 1222.72, - 6465.04, + 7777.72, + 1221.04, 949.99, 987.01, 733.99, @@ -243,37 +243,37 @@ "EAuto_SoC_pro_Stunde": [ 5.0, 11.555, + 11.555, + 11.555, + 20.294999999999998, 29.035, - 29.035, - 42.144999999999996, + 39.96, 48.699999999999996, - 48.699999999999996, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, - 55.254999999999995, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, + 57.440000000000005, 63.995000000000005, 63.995000000000005, - 72.735, - 72.735, - 72.735, - 72.735, - 72.735, - 72.735, + 63.995000000000005, + 63.995000000000005, + 70.55, + 70.55, + 70.55, 81.475, 81.475, 81.475, @@ -320,13 +320,11 @@ 0.0, 0.0 ], - "Gesamt_Verluste": 10116.23845689936, - "Gesamtbilanz_Euro": 5.609399525190347, + "Gesamt_Verluste": 7755.845910804702, + "Gesamtbilanz_Euro": 4.690157296412734, "Gesamteinnahmen_Euro": 0.0, - "Gesamtkosten_Euro": 5.609399525190347, + "Gesamtkosten_Euro": 4.690157296412734, "Home_appliance_wh_per_hour": [ - 0.0, - 0.0, 0.0, 0.0, 0.0, @@ -362,87 +360,89 @@ 0.0, 0.0, 0.0, + 0.0, + 0.0, 0.0 ], "Kosten_Euro_pro_Stunde": [ 0.0, 0.0, - 1.193390926, - 0.7064482052307314, - 0.5533942300000001, 0.0, - 0.880004468, + 1.4495244859999996, + 0.53097063, + 0.44343509999999997, + 0.0, + 0.0, + 0.8107800974767518, + 0.0, + 0.0, + 0.291163892, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.182970359, 0.0, 0.0, + 0.26411047, 0.0, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.005803838, - 0.0, 0.007989913613567745, - 1.06069824, 0.0, - 0.012914366999999916, - 4.174095896658514e-14, - 0.0003442778967139274, + 0.002459704740224363, 0.0, - 0.028137079449292023, 0.0, - 0.16027398000000012, + 0.05016012000000004, + 0.0076430797975209205, + 0.0, + 0.31687880399999996, 0.0, 0.0, 0.0, - 0.0 + 0.16722497978466921, + 0.16484566 ], "Netzbezug_Wh_pro_Stunde": [ 0.0, 0.0, - 5701.82, - 3759.703061366319, - 3010.8500000000004, 0.0, - 4003.66, + 7714.339999999998, + 2888.8500000000004, + 2212.75, + 0.0, + 0.0, + 2705.305630553059, + 0.0, + 0.0, + 980.68, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 556.31, 0.0, 0.0, + 799.85, 0.0, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 3306.3900000000003, - 0.0, 35.04348076126204, - 4795.2, 0.0, - 68.72999999999956, - 2.270998855635753e-10, - 1.7179535764168035, + 11.752053226107805, 0.0, - 123.95189184710142, 0.0, - 501.6400000000003, + 250.30000000000018, + 34.77288351920346, + 0.0, + 1057.3199999999997, 0.0, 0.0, 0.0, - 0.0 + 572.4922279516235, + 592.97 ], "Netzeinspeisung_Wh_pro_Stunde": [ 0.0, @@ -485,84 +485,84 @@ 0.0 ], "Verluste_Pro_Stunde": [ - 16.744090909090914, - 746.1354545454542, - 1233.818181818182, - 452.3948326360417, - 414.0, - 492.1022727272725, - 450.0, - 482.2936363636363, - 101.0335466817773, + 760.062272727273, + 2.817272727272737, + 29.157272727272726, + 276.0, + 276.0, + 345.0, + 615.5918181818183, + 730.0663636363638, + 373.0373243336329, 23.391818181818195, 99.72409090909093, - 133.72909090909081, + 0.0, 124.41545454545451, 96.08318181818186, 70.41409090909087, 118.37045454545455, 94.68272727272722, 83.01681818181817, - 75.86045454545456, + 0.0, 66.66681818181814, 69.12409090909085, - 109.0704545454546, - 300.0, + 0.0, + 109.96227272727276, 47.952272727272714, 11.233982308648535, - 276.0, - 161.62968357967037, - 957.818181818182, - 538.2983999999728, - 441.7178455708299, - 260.56941082122324, - 155.09737297834772, - 62.214291413756285, - 957.818181818182, + 682.1181818181817, + 160.0271308670193, + 21.962728535423857, + 538.2984000000038, + 207.0, + 255.8276539776955, + 171.99990368477063, + 1026.818181818182, + 35.132727272727266, 77.27590909090907, 134.59227272727276, - 100.08954545454549, - 80.85954545454547 + 22.022423461142267, + 0.0 ], "akku_soc_pro_stunde": [ - 79.4714617768595, + 80.0, + 62.54222623966943, 62.45329717630854, - 40.931258608815426, - 53.49778173759437, - 53.49778173759437, - 44.49834131059713, - 56.998341310597134, - 48.308516930431836, - 49.4536123554777, - 48.71523425630414, - 45.56737785134547, - 41.34613129487165, - 37.41887578522978, - 34.38594706622151, - 32.16328005520223, - 28.42683893949975, - 25.438116487709117, - 22.81763611580829, - 20.42305106071187, - 18.318669173659533, - 16.136721859609946, - 12.693841349968071, - 21.027174683301403, - 19.51352971084961, - 19.82558477497874, - 19.82558477497874, - 23.333518659720113, - 1.8114800922269987, - 16.764213425559575, - 29.03415358030485, - 35.990800633866854, - 40.29906099437652, - 40.79452851211402, - 19.272489944620908, - 16.833225137458374, - 12.584731680158098, - 9.425339462527244, - 6.872954820653964 + 61.532928719008275, + 61.532928719008275, + 61.532928719008275, + 61.532928719008275, + 50.81349001377411, + 36.480587121212125, + 46.842735019368604, + 46.10435692019505, + 42.95650051523637, + 42.95650051523637, + 39.029245005594504, + 35.996316286586236, + 33.77364927556696, + 30.03720815986448, + 27.048485708073848, + 24.428005336173022, + 24.428005336173022, + 22.32362344912068, + 20.141676135071094, + 20.141676135071094, + 16.670644798982938, + 15.156999826531148, + 15.469054890660274, + 0.471637535288375, + 4.030157048585656, + 4.180158754905081, + 19.132892088236673, + 19.132892088236673, + 26.239215809839333, + 30.01393669097958, + 8.49189812348647, + 7.382910520180684, + 4.9436457130181495, + 0.6951522557178741, + 0.0 ], "Electricity_price": [ 0.000228, @@ -715,103 +715,103 @@ "start_soc_prozent": 5 }, "start_solution": [ - 18.0, - 3.0, - 2.0, - 1.0, - 1.0, - 8.0, - 10.0, - 15.0, + 14.0, 13.0, - 20.0, - 12.0, - 9.0, - 13.0, - 18.0, 0.0, - 7.0, + 20.0, + 20.0, 18.0, - 7.0, + 5.0, + 3.0, 9.0, - 9.0, - 10.0, - 12.0, - 10.0, - 11.0, - 13.0, - 8.0, - 12.0, - 12.0, - 10.0, - 10.0, - 7.0, - 8.0, 16.0, 12.0, - 6.0, - 0.0, - 12.0, - 13.0, - 5.0, - 14.0, - 9.0, - 5.0, 13.0, 8.0, - 10.0, - 10.0, + 4.0, + 0.0, + 14.0, + 11.0, 9.0, + 16.0, + 8.0, + 9.0, + 5.0, + 10.0, + 13.0, + 13.0, + 8.0, + 8.0, + 9.0, + 5.0, + 10.0, 7.0, 2.0, + 8.0, + 12.0, + 2.0, + 9.0, + 11.0, + 10.0, + 10.0, + 6.0, + 1.0, + 12.0, + 9.0, + 12.0, + 13.0, + 10.0, + 13.0, + 11.0, + 2.0, + 1.0, + 3.0, + 4.0, + 3.0, + 2.0, + 2.0, + 4.0, + 0.0, + 2.0, + 1.0, + 0.0, + 0.0, + 2.0, 2.0, 3.0, - 6.0, - 0.0, - 1.0, - 0.0, 2.0, - 4.0, - 6.0, - 0.0, - 1.0, - 6.0, - 0.0, - 4.0, - 1.0, - 0.0, - 1.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 2.0, - 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, - 2.0, 0.0, 0.0, 0.0, 0.0, - 15.0 + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 3.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 13.0 ], - "washingstart": 15 + "washingstart": 13 } \ No newline at end of file From 2a526aa2288cf64c376e927acf8a8c808d1f5795 Mon Sep 17 00:00:00 2001 From: Andreas Date: Sun, 22 Dec 2024 12:18:16 +0100 Subject: [PATCH 20/47] English translation EMS --- src/akkudoktoreos/optimization/genetic.py | 20 +++--- src/akkudoktoreos/prediction/ems.py | 81 ++++++++++++----------- tests/test_class_ems.py | 6 +- tests/test_class_ems_2.py | 6 +- tests/test_class_optimize.py | 4 +- 5 files changed, 60 insertions(+), 57 deletions(-) diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index 4f31c39..f3135ee 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -385,7 +385,7 @@ class optimization_problem: else: ems.set_ev_charge_hours(np.full(self.prediction_hours, 0)) - return ems.simuliere(start_hour) + return ems.simulate(start_hour) def evaluate( self, @@ -439,21 +439,23 @@ class optimization_problem: individual.extra_data = ( # type: ignore[attr-defined] o["Gesamtbilanz_Euro"], o["Gesamt_Verluste"], - parameters.eauto.min_soc_prozent - ems.eauto.ladezustand_in_prozent() - if parameters.eauto and ems.eauto + parameters.eauto.min_soc_prozent - ems.ev.ladezustand_in_prozent() + if parameters.eauto and ems.ev else 0, ) # Adjust total balance with battery value and penalties for unmet SOC - restwert_akku = ems.akku.aktueller_energieinhalt() * parameters.ems.preis_euro_pro_wh_akku + restwert_akku = ( + ems.battery.aktueller_energieinhalt() * parameters.ems.preis_euro_pro_wh_akku + ) gesamtbilanz += -restwert_akku if self.optimize_ev: gesamtbilanz += max( 0, ( - parameters.eauto.min_soc_prozent - ems.eauto.ladezustand_in_prozent() - if parameters.eauto and ems.eauto + parameters.eauto.min_soc_prozent - ems.ev.ladezustand_in_prozent() + if parameters.eauto and ems.ev else 0 ) * self.strafe, @@ -558,8 +560,8 @@ class optimization_problem: ems = EnergieManagementSystem( self._config.eos, parameters.ems, - wechselrichter=wr, - eauto=eauto, + inverter=wr, + ev=eauto, home_appliance=dishwasher, ) @@ -615,7 +617,7 @@ class optimization_problem: "discharge_allowed": discharge, "eautocharge_hours_float": eautocharge_hours_float, "result": SimulationResult(**o), - "eauto_obj": ems.eauto, + "eauto_obj": ems.ev, "start_solution": start_solution, "washingstart": washingstart_int, } diff --git a/src/akkudoktoreos/prediction/ems.py b/src/akkudoktoreos/prediction/ems.py index 014385a..ce878fb 100644 --- a/src/akkudoktoreos/prediction/ems.py +++ b/src/akkudoktoreos/prediction/ems.py @@ -104,28 +104,30 @@ class EnergieManagementSystem: self, config: EOSConfig, parameters: EnergieManagementSystemParameters, - wechselrichter: Wechselrichter, - eauto: Optional[PVAkku] = None, + inverter: Wechselrichter, + ev: Optional[PVAkku] = None, home_appliance: Optional[HomeAppliance] = None, ): - self.akku = wechselrichter.akku - self.gesamtlast = np.array(parameters.gesamtlast, float) - self.pv_prognose_wh = np.array(parameters.pv_prognose_wh, float) - self.strompreis_euro_pro_wh = np.array(parameters.strompreis_euro_pro_wh, float) - self.einspeiseverguetung_euro_pro_wh_arr = ( + self.battery = inverter.akku + self.load_energy_array = np.array(parameters.gesamtlast, float) + self.pv_prediction_wh = np.array(parameters.pv_prognose_wh, float) + self.elect_price_hourly = np.array(parameters.strompreis_euro_pro_wh, float) + self.elect_revenue_per_hour_arr = ( parameters.einspeiseverguetung_euro_pro_wh if isinstance(parameters.einspeiseverguetung_euro_pro_wh, list) - else np.full(len(self.gesamtlast), parameters.einspeiseverguetung_euro_pro_wh, float) + else np.full( + len(self.load_energy_array), parameters.einspeiseverguetung_euro_pro_wh, float + ) ) - self.eauto = eauto + self.ev = ev self.home_appliance = home_appliance - self.wechselrichter = wechselrichter + self.inverter = inverter self.ac_charge_hours = np.full(config.prediction_hours, 0) self.dc_charge_hours = np.full(config.prediction_hours, 1) self.ev_charge_hours = np.full(config.prediction_hours, 0) def set_akku_discharge_hours(self, ds: np.ndarray) -> None: - self.akku.set_discharge_per_hour(ds) + self.battery.set_discharge_per_hour(ds) def set_akku_ac_charge_hours(self, ds: np.ndarray) -> None: self.ac_charge_hours = ds @@ -141,28 +143,27 @@ class EnergieManagementSystem: self.home_appliance.set_starting_time(start_hour, global_start_hour=global_start_hour) def reset(self) -> None: - if self.eauto: - self.eauto.reset() - self.akku.reset() + if self.ev: + self.ev.reset() + self.battery.reset() - def simuliere_ab_jetzt(self) -> dict[str, Any]: - jetzt = datetime.now() - start_stunde = jetzt.hour - return self.simuliere(start_stunde) + def simulate_start_now(self) -> dict[str, Any]: + start_hour = datetime.now().hour + return self.simulate(start_hour) - def simuliere(self, start_hour: int) -> dict[str, Any]: + def simulate(self, start_hour: int) -> dict[str, Any]: """hour. akku_soc_pro_stunde begin of the hour, initial hour state! last_wh_pro_stunde integral of last hour (end state) """ - lastkurve_wh = self.gesamtlast + load_energy_array = self.load_energy_array assert ( - len(lastkurve_wh) == len(self.pv_prognose_wh) == len(self.strompreis_euro_pro_wh) - ), f"Array sizes do not match: Load Curve = {len(lastkurve_wh)}, PV Forecast = {len(self.pv_prognose_wh)}, Electricity Price = {len(self.strompreis_euro_pro_wh)}" + len(load_energy_array) == len(self.pv_prediction_wh) == len(self.elect_price_hourly) + ), f"Array sizes do not match: Load Curve = {len(load_energy_array)}, PV Forecast = {len(self.pv_prediction_wh)}, Electricity Price = {len(self.elect_price_hourly)}" # Optimized total hours calculation - end_hour = len(lastkurve_wh) + end_hour = len(load_energy_array) total_hours = end_hour - start_hour # Pre-allocate arrays for the results, optimized for speed @@ -178,21 +179,21 @@ class EnergieManagementSystem: electricity_price_per_hour = np.full((total_hours), np.nan) # Set initial state - soc_per_hour[0] = self.akku.ladezustand_in_prozent() - if self.eauto: - soc_ev_per_hour[0] = self.eauto.ladezustand_in_prozent() + soc_per_hour[0] = self.battery.ladezustand_in_prozent() + if self.ev: + soc_ev_per_hour[0] = self.ev.ladezustand_in_prozent() # All States for hour in range(start_hour, end_hour): hour_since_now = hour - start_hour # save begin states - soc_per_hour[hour_since_now] = self.akku.ladezustand_in_prozent() - if self.eauto: - soc_ev_per_hour[hour_since_now] = self.eauto.ladezustand_in_prozent() + soc_per_hour[hour_since_now] = self.battery.ladezustand_in_prozent() + if self.ev: + soc_ev_per_hour[hour_since_now] = self.ev.ladezustand_in_prozent() # Accumulate loads and PV generation - consumption = self.gesamtlast[hour] + consumption = self.load_energy_array[hour] losses_wh_per_hour[hour_since_now] = 0.0 if self.home_appliance: ha_load = self.home_appliance.get_load_for_hour(hour) @@ -200,24 +201,24 @@ class EnergieManagementSystem: home_appliance_wh_per_hour[hour_since_now] = ha_load # E-Auto handling - if self.eauto and self.ev_charge_hours[hour] > 0: - loaded_energy_ev, verluste_eauto = self.eauto.energie_laden( + if self.ev and self.ev_charge_hours[hour] > 0: + loaded_energy_ev, verluste_eauto = self.ev.energie_laden( None, hour, relative_power=self.ev_charge_hours[hour] ) consumption += loaded_energy_ev losses_wh_per_hour[hour_since_now] += verluste_eauto # Process inverter logic - energy_produced = self.pv_prognose_wh[hour] - self.akku.set_charge_allowed_for_hour(self.dc_charge_hours[hour], hour) + energy_produced = self.pv_prediction_wh[hour] + self.battery.set_charge_allowed_for_hour(self.dc_charge_hours[hour], hour) energy_feedin_grid_actual, energy_consumption_grid_actual, losses, eigenverbrauch = ( - self.wechselrichter.energie_verarbeiten(energy_produced, consumption, hour) + self.inverter.energie_verarbeiten(energy_produced, consumption, hour) ) # AC PV Battery Charge if self.ac_charge_hours[hour] > 0.0: - self.akku.set_charge_allowed_for_hour(1, hour) - battery_charged_energy_actual, battery_losses_actual = self.akku.energie_laden( + self.battery.set_charge_allowed_for_hour(1, hour) + battery_charged_energy_actual, battery_losses_actual = self.battery.energie_laden( None, hour, relative_power=self.ac_charge_hours[hour] ) # print(stunde, " ", geladene_menge, " ",self.ac_charge_hours[stunde]," ",self.akku.ladezustand_in_prozent()) @@ -231,13 +232,13 @@ class EnergieManagementSystem: consumption_energy_per_hour[hour_since_now] = energy_consumption_grid_actual losses_wh_per_hour[hour_since_now] += losses loads_energy_per_hour[hour_since_now] = consumption - electricity_price_per_hour[hour_since_now] = self.strompreis_euro_pro_wh[hour] + electricity_price_per_hour[hour_since_now] = self.elect_price_hourly[hour] # Financial calculations costs_per_hour[hour_since_now] = ( - energy_consumption_grid_actual * self.strompreis_euro_pro_wh[hour] + energy_consumption_grid_actual * self.elect_price_hourly[hour] ) revenue_per_hour[hour_since_now] = ( - energy_feedin_grid_actual * self.einspeiseverguetung_euro_pro_wh_arr[hour] + energy_feedin_grid_actual * self.elect_revenue_per_hour_arr[hour] ) # Total cost and return diff --git a/tests/test_class_ems.py b/tests/test_class_ems.py index c1518b6..8c7ea4b 100644 --- a/tests/test_class_ems.py +++ b/tests/test_class_ems.py @@ -230,8 +230,8 @@ def create_ems_instance(tmp_config: AppConfig) -> EnergieManagementSystem: preis_euro_pro_wh_akku=preis_euro_pro_wh_akku, gesamtlast=gesamtlast, ), - wechselrichter=wechselrichter, - eauto=eauto, + inverter=wechselrichter, + ev=eauto, home_appliance=home_appliance, ) @@ -244,7 +244,7 @@ def test_simulation(create_ems_instance): # Simulate starting from hour 1 (this value can be adjusted) - result = ems.simuliere(start_hour=start_hour) + result = ems.simulate(start_hour=start_hour) # visualisiere_ergebnisse( # ems.gesamtlast, diff --git a/tests/test_class_ems_2.py b/tests/test_class_ems_2.py index 19d2c85..ba8cd75 100644 --- a/tests/test_class_ems_2.py +++ b/tests/test_class_ems_2.py @@ -134,8 +134,8 @@ def create_ems_instance(tmp_config: AppConfig) -> EnergieManagementSystem: preis_euro_pro_wh_akku=0, gesamtlast=gesamtlast, ), - wechselrichter=wechselrichter, - eauto=eauto, + inverter=wechselrichter, + ev=eauto, home_appliance=home_appliance, ) @@ -154,7 +154,7 @@ def test_simulation(create_ems_instance): ems = create_ems_instance # Simulate starting from hour 0 (this value can be adjusted) - result = ems.simuliere(start_hour=start_hour) + result = ems.simulate(start_hour=start_hour) # --- Pls do not remove! --- # visualisiere_ergebnisse( diff --git a/tests/test_class_optimize.py b/tests/test_class_optimize.py index 5cee674..4a9d808 100644 --- a/tests/test_class_optimize.py +++ b/tests/test_class_optimize.py @@ -62,8 +62,8 @@ def test_optimize( start_hour = 10 # Activate with pytest --full-run - # if ngen > 10 and not is_full_run: - # pytest.skip() + if ngen > 10 and not is_full_run: + pytest.skip() visualize_filename = str((DIR_TESTDATA / f"new_{fn_out}").with_suffix(".pdf")) From 343cb0e1388d5f360ab8e1b7f073a98a87d38f7f Mon Sep 17 00:00:00 2001 From: Normann Date: Tue, 24 Dec 2024 13:11:15 +0100 Subject: [PATCH 21/47] backport visualize v3 (#279) * backport visualize v3 * test backport * compare file * old test files removed --- src/akkudoktoreos/optimization/genetic.py | 30 +- src/akkudoktoreos/utils/visualize.py | 510 ++++++++++++++++++ src/akkudoktoreos/visualize.py | 350 ------------ tests/test_class_optimize.py | 17 +- tests/test_visualize.py | 56 +- .../images/visualize_base_output_1.pdf | Bin 43879 -> 0 bytes tests/testdata/test_example_report.pdf | Bin 0 -> 37237 bytes 7 files changed, 566 insertions(+), 397 deletions(-) create mode 100644 src/akkudoktoreos/utils/visualize.py delete mode 100644 src/akkudoktoreos/visualize.py delete mode 100644 tests/testdata/images/visualize_base_output_1.pdf create mode 100644 tests/testdata/test_example_report.pdf diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index f3135ee..85be8f3 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -26,7 +26,6 @@ from akkudoktoreos.prediction.self_consumption_probability import ( self_consumption_probability_interpolator, ) from akkudoktoreos.utils.utils import NumpyEncoder -from akkudoktoreos.visualize import visualisiere_ergebnisse class OptimizationParameters(BaseModel): @@ -596,20 +595,23 @@ class optimization_problem: ac_charge, dc_charge, discharge = self.decode_charge_discharge(discharge_hours_bin) # Visualize the results - visualisiere_ergebnisse( - parameters.ems.gesamtlast, - parameters.ems.pv_prognose_wh, - parameters.ems.strompreis_euro_pro_wh, - o, - ac_charge, - dc_charge, - discharge, - parameters.temperature_forecast, - start_hour, - einspeiseverguetung_euro_pro_wh, - config=self._config, - extra_data=extra_data, + from akkudoktoreos.utils.visualize import ( # import here to prevent circular import + prepare_visualize, ) + + visualize = { + "ac_charge": ac_charge.tolist(), + "dc_charge": dc_charge.tolist(), + "discharge_allowed": discharge.tolist(), + "eautocharge_hours_float": eautocharge_hours_float, + "result": o, + "eauto_obj": ems.ev, + "start_solution": start_solution, + "spuelstart": washingstart_int, + "extra_data": extra_data, + } + + prepare_visualize(parameters, visualize, config=self._config, start_hour=start_hour) return OptimizeResponse( **{ "ac_charge": ac_charge, diff --git a/src/akkudoktoreos/utils/visualize.py b/src/akkudoktoreos/utils/visualize.py new file mode 100644 index 0000000..c036a0d --- /dev/null +++ b/src/akkudoktoreos/utils/visualize.py @@ -0,0 +1,510 @@ +import os +from collections.abc import Sequence +from typing import Callable, Optional, Union + +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.backends.backend_pdf import PdfPages + +from akkudoktoreos.config import AppConfig +from akkudoktoreos.optimization.genetic import OptimizationParameters + + +class VisualizationReport: + def __init__(self, config: AppConfig, filename: str = "visualization_results.pdf") -> None: + # Initialize the report with a given filename and empty groups + self.filename = filename + self.groups: list[list[Callable[[], None]]] = [] # Store groups of charts + self.current_group: list[ + Callable[[], None] + ] = [] # Store current group of charts being created + self.config = config + self.pdf_pages = PdfPages(filename, metadata={}) # Initialize PdfPages without metadata + + def add_chart_to_group(self, chart_func: Callable[[], None]) -> None: + """Add a chart function to the current group.""" + self.current_group.append(chart_func) + + def finalize_group(self) -> None: + """Finalize the current group and prepare for a new group.""" + if self.current_group: # Check if current group has charts + self.groups.append(self.current_group) # Add current group to groups + else: + print("Finalizing an empty group!") # Warn if group is empty + self.current_group = [] # Reset current group for new charts + + def _initialize_pdf(self) -> None: + """Create the output directory if it doesn't exist and initialize the PDF.""" + output_dir = self.config.working_dir / self.config.directories.output + + # If self.filename is already a valid path, use it; otherwise, combine it with output_dir + if os.path.isabs(self.filename): + output_file = self.filename + else: + output_dir.mkdir(parents=True, exist_ok=True) + output_file = os.path.join(output_dir, self.filename) + + self.pdf_pages = PdfPages( + output_file, metadata={} + ) # Re-initialize PdfPages without metadata + + def _save_group_to_pdf(self, group: list[Callable[[], None]]) -> None: + """Save a group of charts to the PDF.""" + fig_count = len(group) # Number of charts in the group + if fig_count == 0: + print("Attempted to save an empty group to PDF!") # Warn if group is empty + return # Prevent saving an empty group + + # Create a figure layout based on the number of charts + if fig_count == 3: + # Layout for three charts: 1 full-width on top, 2 below + fig = plt.figure(figsize=(14, 10)) # Set a larger figure size + ax1 = fig.add_subplot(2, 1, 1) # Full-width subplot + ax2 = fig.add_subplot(2, 2, 3) # Bottom left subplot + ax3 = fig.add_subplot(2, 2, 4) # Bottom right subplot + + # Store axes in a list for easy access + axs = [ax1, ax2, ax3] + else: + # Dynamic layout for any other number of charts + cols = 2 if fig_count > 1 else 1 # Determine number of columns + rows = (fig_count // 2) + (fig_count % 2) # Calculate required rows + fig, axs = plt.subplots(rows, cols, figsize=(14, 7 * rows)) # Create subplots + # If axs is a 2D array of axes, flatten it into a 1D list + # if isinstance(axs, np.ndarray): + axs = list(np.array(axs).reshape(-1)) + + # Draw each chart in the corresponding axes + for idx, chart_func in enumerate(group): + plt.sca(axs[idx]) # Set current axes + chart_func() # Call the chart function to draw + + # Hide any unused axes + for idx in range(fig_count, len(axs)): + axs[idx].set_visible(False) # Hide unused axes + self.pdf_pages.savefig(fig) # Save the figure to the PDF + + plt.close(fig) # Close the figure to free up memory + + def create_line_chart( + self, + start_hour: Optional[int], + y_list: list[Union[np.ndarray, list[float]]], + title: str, + xlabel: str, + ylabel: str, + labels: Optional[list[str]] = None, + markers: Optional[list[str]] = None, + line_styles: Optional[list[str]] = None, + ) -> None: + """Create a line chart and add it to the current group.""" + + def chart() -> None: + nonlocal start_hour # Allow modifying `x` within the nested function + if start_hour is None: + start_hour = 0 + first_element = y_list[0] + x: np.ndarray + # Case 1: y_list contains np.ndarray elements + if isinstance(first_element, np.ndarray): + x = np.arange( + start_hour, start_hour + len(first_element) + ) # Start at x and extend by ndarray length + # Case 2: y_list contains float elements (1D list) + elif isinstance(first_element, float): + x = np.arange( + start_hour, start_hour + len(y_list) + ) # Start at x and extend by list length + # Case 3: y_list is a nested list of floats + elif isinstance(first_element, list) and all( + isinstance(i, float) for i in first_element + ): + max_len = max(len(sublist) for sublist in y_list) + x = np.arange( + start_hour, start_hour + max_len + ) # Start at x and extend by max sublist length + else: + print(f"Unsupported y_list structure: {type(y_list)}, {y_list}") + raise TypeError( + "y_list elements must be np.ndarray, float, or a nested list of floats" + ) + + for idx, y_data in enumerate(y_list): + label = labels[idx] if labels else None # Chart label + marker = markers[idx] if markers and idx < len(markers) else "o" # Marker style + line_style = ( + line_styles[idx] if line_styles and idx < len(line_styles) else "-" + ) # Line style + plt.plot(x, y_data, label=label, marker=marker, linestyle=line_style) # Plot line + plt.title(title) # Set title + plt.xlabel(xlabel) # Set x-axis label + plt.ylabel(ylabel) # Set y-axis label + if labels: + plt.legend() # Show legend if labels are provided + plt.grid(True) # Show grid + plt.xlim(x[0] - 0.5, x[-1] + 0.5) # Adjust x-limits + + self.add_chart_to_group(chart) # Add chart function to current group + + def create_scatter_plot( + self, + x: np.ndarray, + y: np.ndarray, + title: str, + xlabel: str, + ylabel: str, + c: Optional[np.ndarray] = None, + ) -> None: + """Create a scatter plot and add it to the current group.""" + + def chart() -> None: + scatter = plt.scatter(x, y, c=c, cmap="viridis") # Create scatter plot + plt.title(title) # Set title + plt.xlabel(xlabel) # Set x-axis label + plt.ylabel(ylabel) # Set y-axis label + if c is not None: + plt.colorbar(scatter, label="Constraint") # Add colorbar if color data is provided + plt.grid(True) # Show grid + + self.add_chart_to_group(chart) # Add chart function to current group + + def create_bar_chart( + self, + labels: list[str], + values_list: Sequence[Union[int, float, list[Union[int, float]]]], + title: str, + ylabel: str, + xlabels: Optional[list[str]] = None, + label_names: Optional[list[str]] = None, + colors: Optional[list[str]] = None, + bar_width: float = 0.35, + bottom: Optional[int] = None, + ) -> None: + """Create a bar chart and add it to the current group.""" + + def chart() -> None: + num_groups = len(values_list) # Number of data groups + num_bars = len(labels) # Number of bars (categories) + # Calculate the positions for each bar group on the x-axis + x = np.arange(num_bars) # x positions for bars + offset = np.linspace( + -bar_width * (num_groups - 1) / 2, bar_width * (num_groups - 1) / 2, num_groups + ) # Bar offsets + for i, values in enumerate(values_list): + bottom_use = None + if bottom == i + 1: # Set bottom if specified + bottom_use = 1 + color = colors[i] if colors and i < len(colors) else None # Bar color + label_name = label_names[i] if label_names else None # Bar label + plt.bar( + x + offset[i], + values, + bar_width, + label=label_name, + color=color, + zorder=2, + alpha=0.6, + bottom=bottom_use, + ) # Create bar + if xlabels: + plt.xticks(x, labels) # Add custom labels to the x-axis + plt.title(title) # Set title + plt.ylabel(ylabel) # Set y-axis label + + if colors and label_names: + plt.legend() # Show legend if colors are provided + plt.grid(True, zorder=0) # Show grid in the background + plt.xlim(-0.5, len(labels) - 0.5) # Set x-axis limits + + self.add_chart_to_group(chart) # Add chart function to current group + + def create_violin_plot( + self, data_list: list[np.ndarray], labels: list[str], title: str, xlabel: str, ylabel: str + ) -> None: + """Create a violin plot and add it to the current group.""" + + def chart() -> None: + plt.violinplot(data_list, showmeans=True, showmedians=True) # Create violin plot + plt.xticks(np.arange(1, len(labels) + 1), labels) # Set x-ticks and labels + plt.title(title) # Set title + plt.xlabel(xlabel) # Set x-axis label + plt.ylabel(ylabel) # Set y-axis label + plt.grid(True) # Show grid + + self.add_chart_to_group(chart) # Add chart function to current group + + def generate_pdf(self) -> None: + """Generate the PDF report with all the added chart groups.""" + self._initialize_pdf() # Initialize the PDF + + for group in self.groups: + self._save_group_to_pdf(group) # Save each group to the PDF + + self.pdf_pages.close() # Close the PDF to finalize the report + + +def prepare_visualize( + parameters: OptimizationParameters, + results: dict, + config: AppConfig, + filename: str = "visualization_results_new.pdf", + start_hour: Optional[int] = 0, +) -> None: + report = VisualizationReport(config, filename) + # Group 1: + report.create_line_chart( + None, + [parameters.ems.gesamtlast], + title="Load Profile", + xlabel="Hours", + ylabel="Load (Wh)", + labels=["Total Load (Wh)"], + markers=["s"], + line_styles=["-"], + ) + report.create_line_chart( + None, + [parameters.ems.pv_prognose_wh], + title="PV Forecast", + xlabel="Hours", + ylabel="PV Generation (Wh)", + ) + + report.create_line_chart( + None, + [np.full(len(parameters.ems.gesamtlast), parameters.ems.einspeiseverguetung_euro_pro_wh)], + title="Remuneration", + xlabel="Hours", + ylabel="€/Wh", + ) + if parameters.temperature_forecast: + report.create_line_chart( + None, + [parameters.temperature_forecast], + title="Temperature Forecast", + xlabel="Hours", + ylabel="°C", + ) + report.finalize_group() + + # Group 2: + report.create_line_chart( + start_hour, + [ + results["result"]["Last_Wh_pro_Stunde"], + results["result"]["Home_appliance_wh_per_hour"], + results["result"]["Netzeinspeisung_Wh_pro_Stunde"], + results["result"]["Netzbezug_Wh_pro_Stunde"], + results["result"]["Verluste_Pro_Stunde"], + ], + title="Energy Flow per Hour", + xlabel="Hours", + ylabel="Energy (Wh)", + labels=[ + "Load (Wh)", + "Household Device (Wh)", + "Grid Feed-in (Wh)", + "Grid Consumption (Wh)", + "Losses (Wh)", + ], + markers=["o", "o", "x", "^", "^"], + line_styles=["-", "--", ":", "-.", "-"], + ) + report.finalize_group() + + # Group 3: + report.create_line_chart( + start_hour, + [results["result"]["akku_soc_pro_stunde"], results["result"]["EAuto_SoC_pro_Stunde"]], + title="Battery SOC", + xlabel="Hours", + ylabel="%", + labels=[ + "Battery SOC (%)", + "Electric Vehicle SOC (%)", + ], + markers=["o", "x"], + ) + report.create_line_chart( + None, + [parameters.ems.strompreis_euro_pro_wh], + title="Electricity Price", + xlabel="Hours", + ylabel="Price (€/Wh)", + ) + + report.create_bar_chart( + list(str(i) for i in range(len(results["ac_charge"]))), + [results["ac_charge"], results["dc_charge"], results["discharge_allowed"]], + title="AC/DC Charging and Discharge Overview", + ylabel="Relative Power (0-1) / Discharge (0 or 1)", + label_names=["AC Charging (relative)", "DC Charging (relative)", "Discharge Allowed"], + colors=["blue", "green", "red"], + bottom=3, + ) + report.finalize_group() + + # Group 4: + + report.create_line_chart( + start_hour, + [ + results["result"]["Kosten_Euro_pro_Stunde"], + results["result"]["Einnahmen_Euro_pro_Stunde"], + ], + title="Financial Balance per Hour", + xlabel="Hours", + ylabel="Euro", + labels=["Costs", "Revenue"], + ) + + extra_data = results["extra_data"] + report.create_scatter_plot( + extra_data["verluste"], + extra_data["bilanz"], + title="", + xlabel="losses", + ylabel="balance", + c=extra_data["nebenbedingung"], + ) + + # Example usage + values_list = [ + [ + results["result"]["Gesamtkosten_Euro"], + results["result"]["Gesamteinnahmen_Euro"], + results["result"]["Gesamtbilanz_Euro"], + ] + ] + labels = ["Total Costs [€]", "Total Revenue [€]", "Total Balance [€]"] + + report.create_bar_chart( + labels=labels, + values_list=values_list, + title="Financial Overview", + ylabel="Euro", + xlabels=["Total Costs [€]", "Total Revenue [€]", "Total Balance [€]"], + ) + + report.finalize_group() + + # Group 1: Scatter plot of losses vs balance with color-coded constraints + f1 = np.array(extra_data["verluste"]) # Losses + f2 = np.array(extra_data["bilanz"]) # Balance + n1 = np.array(extra_data["nebenbedingung"]) # Constraints + + # Filter data where 'nebenbedingung' < 0.01 + filtered_indices = n1 < 0.01 + filtered_losses = f1[filtered_indices] + filtered_balance = f2[filtered_indices] + + # Group 2: Violin plot for filtered losses + if filtered_losses.size > 0: + report.create_violin_plot( + data_list=[filtered_losses], # Data for filtered losses + labels=["Filtered Losses"], # Label for the violin plot + title="Violin Plot for Filtered Losses (Constraint < 0.01)", + xlabel="Losses", + ylabel="Values", + ) + else: + print("No data available for filtered losses violin plot (Constraint < 0.01)") + + # Group 3: Violin plot for filtered balance + if filtered_balance.size > 0: + report.create_violin_plot( + data_list=[filtered_balance], # Data for filtered balance + labels=["Filtered Balance"], # Label for the violin plot + title="Violin Plot for Filtered Balance (Constraint < 0.01)", + xlabel="Balance", + ylabel="Values", + ) + else: + print("No data available for filtered balance violin plot (Constraint < 0.01)") + + if filtered_balance.size > 0 or filtered_losses.size > 0: + report.finalize_group() + + # Generate the PDF report + report.generate_pdf() + + +if __name__ == "__main__": + # Example usage + from akkudoktoreos.config import get_working_dir, load_config + + working_dir = get_working_dir() + config = load_config(working_dir) + report = VisualizationReport(config=config, filename="example_report.pdf") + x_hours = 0 # Define x-axis start values (e.g., hours) + + # Group 1: Adding charts to be displayed on the same page + report.create_line_chart( + x_hours, + [np.array([10, 20, 30, 40])], + title="Load Profile", + xlabel="Hours", + ylabel="Load (Wh)", + ) + report.create_line_chart( + x_hours, + [np.array([5, 15, 25, 35])], + title="PV Forecast", + xlabel="Hours", + ylabel="PV Generation (Wh)", + ) + report.create_line_chart( + x_hours, + [np.array([5, 15, 25, 35])], + title="PV Forecast", + xlabel="Hours", + ylabel="PV Generation (Wh)", + ) + # Note: If there are only 3 charts per page, the first is as wide as the page + + report.finalize_group() # Finalize the first group of charts + + # Group 2: Adding more charts to be displayed on another page + report.create_line_chart( + x_hours, + [np.array([0.2, 0.25, 0.3, 0.35])], + title="Electricity Price", + xlabel="Hours", + ylabel="Price (€/Wh)", + ) + report.create_bar_chart( + ["Costs", "Revenue", "Balance"], + [[500.0], [600.0], [100.0]], + title="Financial Overview", + ylabel="Euro", + label_names=["AC Charging (relative)", "DC Charging (relative)", "Discharge Allowed"], + colors=["red", "green", "blue"], + ) + report.create_scatter_plot( + np.array([5, 6, 7, 8]), + np.array([100, 200, 150, 250]), + title="Scatter Plot", + xlabel="Losses", + ylabel="Balance", + c=np.array([0.1, 0.2, 0.3, 0.4]), + ) + report.finalize_group() # Finalize the second group of charts + + # Group 3: Adding a violin plot + data = [np.random.normal(0, std, 100) for std in range(1, 5)] # Example data for violin plot + report.create_violin_plot( + data, + labels=["Group 1", "Group 2", "Group 3", "Group 4"], + title="Violin Plot", + xlabel="Groups", + ylabel="Values", + ) + data = [np.random.normal(0, 1, 100)] # Example data for violin plot + report.create_violin_plot( + data, labels=["Group 1"], title="Violin Plot", xlabel="Group", ylabel="Values" + ) + + report.finalize_group() # Finalize the third group of charts + + # Generate the PDF report + report.generate_pdf() diff --git a/src/akkudoktoreos/visualize.py b/src/akkudoktoreos/visualize.py deleted file mode 100644 index 4046915..0000000 --- a/src/akkudoktoreos/visualize.py +++ /dev/null @@ -1,350 +0,0 @@ -# Set the backend for matplotlib to Agg -from typing import Any, Optional - -import matplotlib -import matplotlib.pyplot as plt -import numpy as np -from matplotlib.backends.backend_pdf import PdfPages - -from akkudoktoreos.config import AppConfig, SetupIncomplete - -matplotlib.use("Agg") - - -def visualisiere_ergebnisse( - gesamtlast: list[float], - pv_forecast: list[float], - strompreise: list[float], - ergebnisse: dict[str, Any], - ac: np.ndarray, # AC charging allowed - dc: np.ndarray, # DC charging allowed - discharge: np.ndarray, # Discharge allowed - temperature: Optional[list[float]], - start_hour: int, - einspeiseverguetung_euro_pro_wh: np.ndarray, - config: AppConfig, - filename: str = "visualization_results.pdf", - extra_data: Optional[dict[str, Any]] = None, -) -> None: - ##################### - # 24-hour visualization - ##################### - output_dir = config.working_dir / config.directories.output - if not output_dir.is_dir(): - raise SetupIncomplete(f"Output path does not exist: {output_dir}.") - - output_file = output_dir.joinpath(filename) - with PdfPages(output_file) as pdf: - # Load and PV generation - plt.figure(figsize=(14, 14)) - plt.subplot(3, 3, 1) - hours = np.arange(0, config.eos.prediction_hours) - - gesamtlast_array = np.array(gesamtlast) - # Plot individual loads - plt.plot(hours, gesamtlast_array, label="Load (Wh)", marker="o") - - # Calculate and plot total load - plt.plot( - hours, - gesamtlast_array, - label="Total Load (Wh)", - marker="o", - linewidth=2, - linestyle="--", - ) - plt.xlabel("Hour") - plt.ylabel("Load (Wh)") - plt.title("Load Profiles") - plt.grid(True) - plt.legend() - - # PV forecast - plt.subplot(3, 2, 3) - plt.plot(hours, pv_forecast, label="PV Generation (Wh)", marker="x") - plt.title("PV Forecast") - plt.xlabel("Hour of the Day") - plt.ylabel("Wh") - plt.legend() - plt.grid(True) - - # Feed-in remuneration - plt.subplot(3, 2, 4) - plt.plot( - hours, - einspeiseverguetung_euro_pro_wh, - label="Remuneration (€/Wh)", - marker="x", - ) - plt.title("Remuneration") - plt.xlabel("Hour of the Day") - plt.ylabel("€/Wh") - plt.legend() - plt.grid(True) - - # Temperature forecast - if temperature is not None: - plt.subplot(3, 2, 5) - plt.title("Temperature Forecast (°C)") - plt.plot(hours, temperature, label="Temperature (°C)", marker="x") - plt.xlabel("Hour of the Day") - plt.ylabel("°C") - plt.legend() - plt.grid(True) - - pdf.savefig() # Save the current figure state to the PDF - plt.close() # Close the current figure to free up memory - - ##################### - # Start hour visualization - ##################### - - plt.figure(figsize=(14, 10)) - hours = np.arange(start_hour, config.eos.prediction_hours) - - # Energy flow, grid feed-in, and grid consumption - plt.subplot(3, 2, 1) - # Plot with transparency (alpha) and different linestyles - plt.plot( - hours, - ergebnisse["Last_Wh_pro_Stunde"], - label="Load (Wh)", - marker="o", - linestyle="-", - alpha=0.8, - ) - plt.plot( - hours, - ergebnisse["Home_appliance_wh_per_hour"], - label="Household Device (Wh)", - marker="o", - linestyle="--", - alpha=0.8, - ) - plt.plot( - hours, - ergebnisse["Netzeinspeisung_Wh_pro_Stunde"], - label="Grid Feed-in (Wh)", - marker="x", - linestyle=":", - alpha=0.8, - ) - plt.plot( - hours, - ergebnisse["Netzbezug_Wh_pro_Stunde"], - label="Grid Consumption (Wh)", - marker="^", - linestyle="-.", - alpha=0.8, - ) - plt.plot( - hours, - ergebnisse["Verluste_Pro_Stunde"], - label="Losses (Wh)", - marker="^", - linestyle="-", - alpha=0.8, - ) - - # Title and labels - plt.title("Energy Flow per Hour") - plt.xlabel("Hour") - plt.ylabel("Energy (Wh)") - - # Show legend with a higher number of columns to avoid overlap - plt.legend(ncol=2) - - # Electricity prices - hours_p = np.arange(0, len(strompreise)) - plt.subplot(3, 2, 3) - plt.plot( - hours_p, - strompreise, - label="Electricity Price (€/Wh)", - color="purple", - marker="s", - ) - plt.title("Electricity Prices") - plt.xlabel("Hour of the Day") - plt.ylabel("Price (€/Wh)") - plt.legend() - plt.grid(True) - - # State of charge for batteries - plt.subplot(3, 2, 2) - plt.plot(hours, ergebnisse["akku_soc_pro_stunde"], label="PV Battery (%)", marker="x") - plt.plot( - hours, - ergebnisse["EAuto_SoC_pro_Stunde"], - label="E-Car Battery (%)", - marker="x", - ) - plt.legend(loc="upper left", bbox_to_anchor=(1, 1)) # Place legend outside the plot - plt.grid(True, which="both", axis="x") # Grid for every hour - - # Plot for AC, DC charging, and Discharge status using bar charts - ax1 = plt.subplot(3, 2, 5) - hours = np.arange(0, config.eos.prediction_hours) - # Plot AC charging as bars (relative values between 0 and 1) - plt.bar(hours, ac, width=0.4, label="AC Charging (relative)", color="blue", alpha=0.6) - - # Plot DC charging as bars (relative values between 0 and 1) - plt.bar( - hours + 0.4, dc, width=0.4, label="DC Charging (relative)", color="green", alpha=0.6 - ) - - # Plot Discharge as bars (0 or 1, binary values) - plt.bar( - hours, - discharge, - width=0.4, - label="Discharge Allowed", - color="red", - alpha=0.6, - bottom=np.maximum(ac, dc), - ) - - # Configure the plot - ax1.legend(loc="upper left") - ax1.set_xlim(0, config.eos.prediction_hours) - ax1.set_xlabel("Hour") - ax1.set_ylabel("Relative Power (0-1) / Discharge (0 or 1)") - ax1.set_title("AC/DC Charging and Discharge Overview") - ax1.grid(True) - - hours = np.arange(start_hour, config.eos.prediction_hours) - - pdf.savefig() # Save the current figure state to the PDF - plt.close() # Close the current figure to free up memory - - # Financial overview - fig, axs = plt.subplots(1, 2, figsize=(14, 10)) # Create a 1x2 grid of subplots - total_costs = ergebnisse["Gesamtkosten_Euro"] - total_revenue = ergebnisse["Gesamteinnahmen_Euro"] - total_balance = ergebnisse["Gesamtbilanz_Euro"] - losses = ergebnisse["Gesamt_Verluste"] - - # Costs and revenues per hour on the first axis (axs[0]) - costs = ergebnisse["Kosten_Euro_pro_Stunde"] - revenues = ergebnisse["Einnahmen_Euro_pro_Stunde"] - - # Plot costs - axs[0].plot( - hours, - costs, - label="Costs (Euro)", - marker="o", - color="red", - ) - # Annotate costs - for hour, value in enumerate(costs): - if value is None or np.isnan(value): - value = 0 - axs[0].annotate( - f"{value:.2f}", - (hour, value), - textcoords="offset points", - xytext=(0, 5), - ha="center", - fontsize=8, - color="red", - ) - - # Plot revenues - axs[0].plot( - hours, - revenues, - label="Revenue (Euro)", - marker="x", - color="green", - ) - # Annotate revenues - for hour, value in enumerate(revenues): - if value is None or np.isnan(value): - value = 0 - axs[0].annotate( - f"{value:.2f}", - (hour, value), - textcoords="offset points", - xytext=(0, 5), - ha="center", - fontsize=8, - color="green", - ) - - # Title and labels - axs[0].set_title("Financial Balance per Hour") - axs[0].set_xlabel("Hour") - axs[0].set_ylabel("Euro") - axs[0].legend() - axs[0].grid(True) - - # Summary of finances on the second axis (axs[1]) - labels = ["Total Costs [€]", "Total Revenue [€]", "Total Balance [€]"] - values = [total_costs, total_revenue, total_balance] - colors = ["red" if value > 0 else "green" for value in values] - axs[1].bar(labels, values, color=colors) - axs[1].set_title("Financial Overview") - axs[1].set_ylabel("Euro") - - # Second axis (ax2) for losses, shared with axs[1] - ax2 = axs[1].twinx() - ax2.bar("Total Losses", losses, color="blue") - ax2.set_ylabel("Losses [Wh]", color="blue") - ax2.tick_params(axis="y", labelcolor="blue") - - pdf.savefig() # Save the complete figure to the PDF - plt.close() # Close the figure - - # Additional data visualization if provided - if extra_data is not None: - plt.figure(figsize=(14, 10)) - plt.subplot(1, 2, 1) - f1 = np.array(extra_data["verluste"]) - f2 = np.array(extra_data["bilanz"]) - n1 = np.array(extra_data["nebenbedingung"]) - scatter = plt.scatter(f1, f2, c=n1, cmap="viridis") - - # Add color legend - plt.colorbar(scatter, label="Constraint") - - pdf.savefig() # Save the complete figure to the PDF - plt.close() # Close the figure - - plt.figure(figsize=(14, 10)) - filtered_losses = np.array( - [ - v - for v, n in zip(extra_data["verluste"], extra_data["nebenbedingung"]) - if n < 0.01 - ] - ) - filtered_balance = np.array( - [b for b, n in zip(extra_data["bilanz"], extra_data["nebenbedingung"]) if n < 0.01] - ) - if filtered_losses.size != 0: - best_loss = min(filtered_losses) - worst_loss = max(filtered_losses) - best_balance = min(filtered_balance) - worst_balance = max(filtered_balance) - - data = [filtered_losses, filtered_balance] - labels = ["Losses", "Balance"] - # Create plots - fig, axs = plt.subplots( - 1, 2, figsize=(10, 6), sharey=False - ) # Two subplots, separate y-axes - - # First violin plot for losses - axs[0].violinplot(data[0], positions=[1], showmeans=True, showmedians=True) - axs[0].set(xticks=[1], xticklabels=["Losses"]) - - # Second violin plot for balance - axs[1].violinplot(data[1], positions=[1], showmeans=True, showmedians=True) - axs[1].set(xticks=[1], xticklabels=["Balance"]) - - # Fine-tuning - plt.tight_layout() - - pdf.savefig() # Save the current figure state to the PDF - plt.close() # Close the figure diff --git a/tests/test_class_optimize.py b/tests/test_class_optimize.py index 4a9d808..041a3ac 100644 --- a/tests/test_class_optimize.py +++ b/tests/test_class_optimize.py @@ -11,6 +11,7 @@ from akkudoktoreos.optimization.genetic import ( OptimizeResponse, optimization_problem, ) +from akkudoktoreos.utils.visualize import prepare_visualize DIR_TESTDATA = Path(__file__).parent / "testdata" @@ -67,16 +68,12 @@ def test_optimize( visualize_filename = str((DIR_TESTDATA / f"new_{fn_out}").with_suffix(".pdf")) - def visualize_to_file(*args, **kwargs): - from akkudoktoreos.visualize import visualisiere_ergebnisse - - # Write test output pdf to file, so we can look at it manually - kwargs["filename"] = visualize_filename - return visualisiere_ergebnisse(*args, **kwargs) - with patch( - "akkudoktoreos.optimization.genetic.visualisiere_ergebnisse", side_effect=visualize_to_file - ) as visualisiere_ergebnisse_patch: + "akkudoktoreos.utils.visualize.prepare_visualize", + side_effect=lambda parameters, results, *args, **kwargs: prepare_visualize( + parameters, results, filename=visualize_filename, **kwargs + ), + ) as prepare_visualize_patch: # Call the optimization function ergebnis = opt_class.optimierung_ems( parameters=input_data, start_hour=start_hour, ngen=ngen @@ -95,4 +92,4 @@ def test_optimize( compare_dict(ergebnis.model_dump(), expected_result.model_dump()) # The function creates a visualization result PDF as a side-effect. - visualisiere_ergebnisse_patch.assert_called_once() + prepare_visualize_patch.assert_called_once() diff --git a/tests/test_visualize.py b/tests/test_visualize.py index 3cbd6d3..81f3845 100644 --- a/tests/test_visualize.py +++ b/tests/test_visualize.py @@ -1,32 +1,42 @@ -import json +import os +import subprocess from pathlib import Path -import pytest from matplotlib.testing.compare import compare_images -from akkudoktoreos.config import AppConfig -from akkudoktoreos.visualize import visualisiere_ergebnisse +from akkudoktoreos.config import get_working_dir, load_config + +filename = "example_report.pdf" + +working_dir = get_working_dir() +config = load_config(working_dir) +output_dir = config.working_dir / config.directories.output + +# If self.filename is already a valid path, use it; otherwise, combine it with output_dir +if os.path.isabs(filename): + output_file = filename +else: + output_dir.mkdir(parents=True, exist_ok=True) + output_file = os.path.join(output_dir, filename) DIR_TESTDATA = Path(__file__).parent / "testdata" -DIR_IMAGEDATA = DIR_TESTDATA / "images" +reference_file = DIR_TESTDATA / "test_example_report.pdf" -@pytest.mark.parametrize( - "fn_in, fn_out, fn_out_base", - [("visualize_input_1.json", "visualize_output_1.pdf", "visualize_base_output_1.pdf")], -) -def test_visualisiere_ergebnisse(fn_in, fn_out, fn_out_base, tmp_config: AppConfig): - with open(DIR_TESTDATA / fn_in, "r") as f: - input_data = json.load(f) - visualisiere_ergebnisse(config=tmp_config, **input_data) - output_file: Path = tmp_config.working_dir / tmp_config.directories.output / fn_out +def test_generate_pdf_main(): + # Delete the old generated file if it exists + if os.path.isfile(output_file): + os.remove(output_file) - assert output_file.is_file() - assert ( - compare_images( - str(output_file), - str(DIR_IMAGEDATA / fn_out_base), - 0, - ) - is None - ) + # Execute the __main__ block of visualize.py by running it as a script + script_path = Path(__file__).parent.parent / "src" / "akkudoktoreos" / "utils" / "visualize.py" + subprocess.run(["python", str(script_path)], check=True) + + # Check if the file exists + assert os.path.isfile(output_file) + + # Compare the generated file with the reference file + comparison = compare_images(str(reference_file), str(output_file), tol=0) + + # Assert that there are no differences + assert comparison is None, f"Images differ: {comparison}" diff --git a/tests/testdata/images/visualize_base_output_1.pdf b/tests/testdata/images/visualize_base_output_1.pdf deleted file mode 100644 index c607cc494a55b5ce88dffd8212272d6a8a9202bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43879 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 Djn_h4 diff --git a/tests/testdata/test_example_report.pdf b/tests/testdata/test_example_report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ef05327ffd12659944e6f0dbd1f1b4c0fd7722b6 GIT binary patch literal 37237 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 AEC2ui literal 0 HcmV?d00001 From d596ed3cc3f7fbae02594a2335412a8623118119 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Dec 2024 13:15:08 +0100 Subject: [PATCH 22/47] Bump pydantic from 2.10.3 to 2.10.4 (#280) Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.10.3 to 2.10.4. - [Release notes](https://github.com/pydantic/pydantic/releases) - [Changelog](https://github.com/pydantic/pydantic/blob/main/HISTORY.md) - [Commits](https://github.com/pydantic/pydantic/compare/v2.10.3...v2.10.4) --- updated-dependencies: - dependency-name: pydantic dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 2c251c6..72e34de 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,10 +2,10 @@ numpy==2.2.0 matplotlib==3.9.2 fastapi[standard]==0.115.5 uvicorn==0.32.1 -pydantic==2.10.3 +pydantic==2.10.4 scikit-learn==1.6.0 timezonefinder==6.5.7 deap==1.4.1 requests==2.32.3 pandas==2.2.3 -pydantic==2.10.3 +pydantic==2.10.4 From da9b2110131e8170d3c01decbb1d8d1a406367ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Dec 2024 13:16:19 +0100 Subject: [PATCH 23/47] Bump pytest from 8.3.3 to 8.3.4 (#253) Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.3.3 to 8.3.4. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/8.3.3...8.3.4) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 9e39a4f..4a98ca2 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,7 +4,7 @@ myst-parser==4.0.0 sphinx==8.1.3 sphinx_rtd_theme==3.0.2 sphinxcontrib-openapi==0.8.4 -pytest==8.3.3 +pytest==8.3.4 pytest-cov==6.0.0 pytest-xprocess==1.0.2 pre-commit From 62acf8f1f0c80c71eb732452bd95a244e744b761 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Dec 2024 13:21:01 +0100 Subject: [PATCH 24/47] Bump uvicorn from 0.32.1 to 0.34.0 (#252) Bumps [uvicorn](https://github.com/encode/uvicorn) from 0.32.1 to 0.34.0. - [Release notes](https://github.com/encode/uvicorn/releases) - [Changelog](https://github.com/encode/uvicorn/blob/master/CHANGELOG.md) - [Commits](https://github.com/encode/uvicorn/compare/0.32.1...0.34.0) --- updated-dependencies: - dependency-name: uvicorn dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 72e34de..df70b0b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ numpy==2.2.0 matplotlib==3.9.2 fastapi[standard]==0.115.5 -uvicorn==0.32.1 +uvicorn==0.34.0 pydantic==2.10.4 scikit-learn==1.6.0 timezonefinder==6.5.7 From 815aaa78e2f6a33f8a64e84771daca1215654670 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Dec 2024 13:26:47 +0100 Subject: [PATCH 25/47] Bump fastapi[standard] from 0.115.5 to 0.115.6 (#254) Bumps [fastapi[standard]](https://github.com/fastapi/fastapi) from 0.115.5 to 0.115.6. - [Release notes](https://github.com/fastapi/fastapi/releases) - [Commits](https://github.com/fastapi/fastapi/compare/0.115.5...0.115.6) --- updated-dependencies: - dependency-name: fastapi[standard] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index df70b0b..794dd9b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ numpy==2.2.0 matplotlib==3.9.2 -fastapi[standard]==0.115.5 +fastapi[standard]==0.115.6 uvicorn==0.34.0 pydantic==2.10.4 scikit-learn==1.6.0 From cc2490470304552ae1ec5087204ac897fe3d5b3c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Dec 2024 13:32:04 +0100 Subject: [PATCH 26/47] Bump matplotlib from 3.9.2 to 3.10.0 (#251) Bumps [matplotlib](https://github.com/matplotlib/matplotlib) from 3.9.2 to 3.10.0. - [Release notes](https://github.com/matplotlib/matplotlib/releases) - [Commits](https://github.com/matplotlib/matplotlib/compare/v3.9.2...v3.10.0) --- updated-dependencies: - dependency-name: matplotlib dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 794dd9b..8716274 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ numpy==2.2.0 -matplotlib==3.9.2 +matplotlib==3.10.0 fastapi[standard]==0.115.6 uvicorn==0.34.0 pydantic==2.10.4 From 56aa0ac2f5fc6f593b519a2a45703ccd71149768 Mon Sep 17 00:00:00 2001 From: Andreas Date: Wed, 25 Dec 2024 19:12:38 +0100 Subject: [PATCH 27/47] Awattar Price changed to more precise value; if SoC=0 discharge =1 forced. Exp Avg for siple Price Forecast --- src/akkudoktoreos/optimization/genetic.py | 20 +++++++++++++++++-- .../prediction/price_forecast.py | 18 ++++++++--------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index 85be8f3..3395bcb 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -432,9 +432,25 @@ class optimization_problem: discharge_hours_bin, eautocharge_hours_index, washingstart_int ) - individual[:] = adjusted_individual # Aktualisiere das ursprüngliche individual + individual[:] = adjusted_individual - # Berechnung weiterer Metriken + # New check: Activate discharge when battery SoC is 0 + battery_soc_per_hour = np.array( + o.get("Battery_SoC_pro_Stunde", []) + ) # Example key for battery SoC + + if battery_soc_per_hour is not None: + # Find hours where battery SoC is 0 + zero_soc_mask = battery_soc_per_hour == 0 + discharge_hours_bin[zero_soc_mask] = 1 # Activate discharge for these hours + + # Merge the updated discharge_hours_bin back into the individual + adjusted_individual = self.merge_individual( + discharge_hours_bin, eautocharge_hours_index, washingstart_int + ) + individual[:] = adjusted_individual + + # More metrics individual.extra_data = ( # type: ignore[attr-defined] o["Gesamtbilanz_Euro"], o["Gesamt_Verluste"], diff --git a/src/akkudoktoreos/prediction/price_forecast.py b/src/akkudoktoreos/prediction/price_forecast.py index e2313d2..f73b5f9 100644 --- a/src/akkudoktoreos/prediction/price_forecast.py +++ b/src/akkudoktoreos/prediction/price_forecast.py @@ -98,7 +98,7 @@ class HourlyElectricityPriceForecast: # Extract the price from 00:00 of the previous day previous_day_prices = [ - entry["marketpriceEurocentPerKWh"] # + self.charges + entry["marketprice"] # + self.charges for entry in self.prices if previous_day_str in entry["end"] ] @@ -106,19 +106,16 @@ class HourlyElectricityPriceForecast: # Extract all prices for the specified date date_prices = [ - entry["marketpriceEurocentPerKWh"] # + self.charges + entry["marketprice"] # + self.charges for entry in self.prices if date_str in entry["end"] ] - # print(f"getPrice: {len(date_prices)}") # Add the last price of the previous day at the start of the list if len(date_prices) == 23: date_prices.insert(0, last_price_of_previous_day) - # print(np.array(date_prices) / (1000.0 * 100.0)) - # print("PRICE:") - # print(np.array(date_prices) / (1000.0 * 100.0) + self.charges) - return np.array(date_prices) / (1000.0 * 100.0) + self.charges + + return np.array(date_prices) / (1000.0 * 1000.0) + self.charges def get_average_price_last_7_days(self, end_date_str: Optional[str] = None) -> np.ndarray: """Calculate the hourly average electricity price for the last 7 days. @@ -170,8 +167,11 @@ class HourlyElectricityPriceForecast: price_matrix = price_data.reshape(-1, 24) # Calculate the average price for each hour across the 7 days - average_prices = np.mean(price_matrix, axis=0) - # print("AVG:", average_prices) + average_prices = np.average( + price_matrix, + axis=0, + weights=np.array([1, 2, 4, 8, 16, 32, 64]) / np.sum(np.array([1, 2, 4, 8, 16, 32, 64])), + ) return average_prices def get_price_for_daterange( From af49072a2e2062a19728d288ae515bdd5755bd6d Mon Sep 17 00:00:00 2001 From: Andreas Date: Wed, 25 Dec 2024 19:12:38 +0100 Subject: [PATCH 28/47] Awattar Price changed to more precise value; if SoC=0 discharge =1 forced. Exp Avg for siple Price Forecast --- src/akkudoktoreos/optimization/genetic.py | 20 +++++++++++++++++-- .../prediction/price_forecast.py | 18 ++++++++--------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index 85be8f3..3395bcb 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -432,9 +432,25 @@ class optimization_problem: discharge_hours_bin, eautocharge_hours_index, washingstart_int ) - individual[:] = adjusted_individual # Aktualisiere das ursprüngliche individual + individual[:] = adjusted_individual - # Berechnung weiterer Metriken + # New check: Activate discharge when battery SoC is 0 + battery_soc_per_hour = np.array( + o.get("Battery_SoC_pro_Stunde", []) + ) # Example key for battery SoC + + if battery_soc_per_hour is not None: + # Find hours where battery SoC is 0 + zero_soc_mask = battery_soc_per_hour == 0 + discharge_hours_bin[zero_soc_mask] = 1 # Activate discharge for these hours + + # Merge the updated discharge_hours_bin back into the individual + adjusted_individual = self.merge_individual( + discharge_hours_bin, eautocharge_hours_index, washingstart_int + ) + individual[:] = adjusted_individual + + # More metrics individual.extra_data = ( # type: ignore[attr-defined] o["Gesamtbilanz_Euro"], o["Gesamt_Verluste"], diff --git a/src/akkudoktoreos/prediction/price_forecast.py b/src/akkudoktoreos/prediction/price_forecast.py index e2313d2..f73b5f9 100644 --- a/src/akkudoktoreos/prediction/price_forecast.py +++ b/src/akkudoktoreos/prediction/price_forecast.py @@ -98,7 +98,7 @@ class HourlyElectricityPriceForecast: # Extract the price from 00:00 of the previous day previous_day_prices = [ - entry["marketpriceEurocentPerKWh"] # + self.charges + entry["marketprice"] # + self.charges for entry in self.prices if previous_day_str in entry["end"] ] @@ -106,19 +106,16 @@ class HourlyElectricityPriceForecast: # Extract all prices for the specified date date_prices = [ - entry["marketpriceEurocentPerKWh"] # + self.charges + entry["marketprice"] # + self.charges for entry in self.prices if date_str in entry["end"] ] - # print(f"getPrice: {len(date_prices)}") # Add the last price of the previous day at the start of the list if len(date_prices) == 23: date_prices.insert(0, last_price_of_previous_day) - # print(np.array(date_prices) / (1000.0 * 100.0)) - # print("PRICE:") - # print(np.array(date_prices) / (1000.0 * 100.0) + self.charges) - return np.array(date_prices) / (1000.0 * 100.0) + self.charges + + return np.array(date_prices) / (1000.0 * 1000.0) + self.charges def get_average_price_last_7_days(self, end_date_str: Optional[str] = None) -> np.ndarray: """Calculate the hourly average electricity price for the last 7 days. @@ -170,8 +167,11 @@ class HourlyElectricityPriceForecast: price_matrix = price_data.reshape(-1, 24) # Calculate the average price for each hour across the 7 days - average_prices = np.mean(price_matrix, axis=0) - # print("AVG:", average_prices) + average_prices = np.average( + price_matrix, + axis=0, + weights=np.array([1, 2, 4, 8, 16, 32, 64]) / np.sum(np.array([1, 2, 4, 8, 16, 32, 64])), + ) return average_prices def get_price_for_daterange( From 8b9ad60759bfd45fe2986fc9940d3f97cb81d333 Mon Sep 17 00:00:00 2001 From: Andreas Date: Thu, 26 Dec 2024 07:50:25 +0100 Subject: [PATCH 29/47] Discharge Mask Bug, Tests updated, simple Price Forecast with linear weighting --- src/akkudoktoreos/optimization/genetic.py | 15 +- .../prediction/price_forecast.py | 19 +- tests/test_class_optimize.py | 4 +- tests/testdata/optimize_result_2.json | 446 ++++++++--------- tests/testdata/optimize_result_2_full.json | 472 +++++++++--------- 5 files changed, 483 insertions(+), 473 deletions(-) diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index 3395bcb..cf9f6c0 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -436,13 +436,22 @@ class optimization_problem: # New check: Activate discharge when battery SoC is 0 battery_soc_per_hour = np.array( - o.get("Battery_SoC_pro_Stunde", []) + o.get("akku_soc_pro_stunde", []) ) # Example key for battery SoC if battery_soc_per_hour is not None: + if battery_soc_per_hour is None or discharge_hours_bin is None: + raise ValueError("battery_soc_per_hour or discharge_hours_bin is None") + min_length = min(battery_soc_per_hour.size, discharge_hours_bin.size) + battery_soc_per_hour_tail = battery_soc_per_hour[-min_length:] + discharge_hours_bin_tail = discharge_hours_bin[-min_length:] + len_ac = len(self._config.eos.available_charging_rates_in_percentage) + # Find hours where battery SoC is 0 - zero_soc_mask = battery_soc_per_hour == 0 - discharge_hours_bin[zero_soc_mask] = 1 # Activate discharge for these hours + zero_soc_mask = battery_soc_per_hour_tail == 0 + discharge_hours_bin_tail[zero_soc_mask] = ( + len_ac + 2 + ) # Activate discharge for these hours # Merge the updated discharge_hours_bin back into the individual adjusted_individual = self.merge_individual( diff --git a/src/akkudoktoreos/prediction/price_forecast.py b/src/akkudoktoreos/prediction/price_forecast.py index f73b5f9..059f833 100644 --- a/src/akkudoktoreos/prediction/price_forecast.py +++ b/src/akkudoktoreos/prediction/price_forecast.py @@ -155,24 +155,25 @@ class HourlyElectricityPriceForecast: raise ValueError( "Not enough data to calculate the average for the last 7 days.", price_data ) - # Calculate the overall average price across all data - # overall_average_price = np.mean(price_data) - # Create an array of 24 hourly values filled with the overall average - # average_prices = np.full(24, overall_average_price) - - # print("Overall AVG (duplicated for 24 hours):", average_prices) - # return average_prices # Reshape the data into a 7x24 matrix (7 rows for days, 24 columns for hours) price_matrix = price_data.reshape(-1, 24) - # Calculate the average price for each hour across the 7 days average_prices = np.average( price_matrix, axis=0, weights=np.array([1, 2, 4, 8, 16, 32, 64]) / np.sum(np.array([1, 2, 4, 8, 16, 32, 64])), ) - return average_prices + final_weights = np.linspace(1, 0, price_matrix.shape[1]) + + # Weight last known price linear falling + average_prices_with_final_weight = [ + (average_prices[i] * (1 - final_weights[i])) + + (price_matrix[-1, -1] * (final_weights[i])) + for i in range(price_matrix.shape[1]) + ] + + return np.array(average_prices_with_final_weight) def get_price_for_daterange( self, start_date_str: str, end_date_str: str, repeat: bool = False diff --git a/tests/test_class_optimize.py b/tests/test_class_optimize.py index 041a3ac..0dbd79c 100644 --- a/tests/test_class_optimize.py +++ b/tests/test_class_optimize.py @@ -63,8 +63,8 @@ def test_optimize( start_hour = 10 # Activate with pytest --full-run - if ngen > 10 and not is_full_run: - pytest.skip() + # if ngen > 10 and not is_full_run: + # pytest.skip() visualize_filename = str((DIR_TESTDATA / f"new_{fn_out}").with_suffix(".pdf")) diff --git a/tests/testdata/optimize_result_2.json b/tests/testdata/optimize_result_2.json index b4bef8e..5b48065 100644 --- a/tests/testdata/optimize_result_2.json +++ b/tests/testdata/optimize_result_2.json @@ -1,19 +1,25 @@ { "ac_charge": [ - 0.5, 0.0, 0.0, 0.0, 0.0, - 0.75, 0.0, 0.5, + 0.375, + 0.0, 0.0, 1.0, 0.0, 0.0, - 0.75, - 0.75, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.375, 0.0, 0.0, 0.0, @@ -30,17 +36,11 @@ 0.0, 0.0, 0.0, - 0.75, 0.0, 0.0, 0.0, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.625, + 0.5, 0.0, 0.0, 0.0, @@ -102,75 +102,75 @@ "discharge_allowed": [ 0, 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, 0, 1, 0, 0, 0, 0, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, 0, 0, 1, 1, 0, 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 0, + 0, 1, 0, 0, 0, 0, - 0, - 0 + 1, + 1 ], "eautocharge_hours_float": [ - 0.875, - 0.75, - 0.875, 0.5, - 0.375, - 0.75, - 0.875, + 1.0, + 0.625, + 0.5, 0.625, 0.375, - 0.5, + 0.75, 0.375, + 0.75, + 0.875, + 0.375, + 1.0, 0.0, 0.875, 0.5, + 1.0, + 0.375, 0.75, 0.625, - 0.875, + 1.0, 0.0, - 0.5, - 0.625, - 0.75, 0.0, 0.0, 0.0, @@ -202,17 +202,17 @@ "result": { "Last_Wh_pro_Stunde": [ 4986.07, - 1063.91, - 14247.56, - 12626.029999999999, - 11529.67, - 7731.82, - 10393.22, - 1103.78, - 6373.12, - 7733.71, - 4299.98, - 988.56, + 11551.91, + 1320.56, + 10309.03, + 6407.67, + 11664.82, + 5149.22, + 8969.78, + 7000.12, + 3053.71, + 3550.98, + 3488.56, 912.38, 704.61, 516.37, @@ -221,7 +221,7 @@ 608.79, 556.31, 488.89, - 4256.91, + 506.91, 804.89, 1141.98, 1056.97, @@ -231,7 +231,7 @@ 1257.98, 1232.67, 871.26, - 3985.88, + 3360.88, 1158.03, 1222.72, 1221.04, @@ -243,15 +243,15 @@ "EAuto_SoC_pro_Stunde": [ 5.0, 11.555, - 11.555, - 26.85, - 35.589999999999996, - 48.699999999999996, - 59.62499999999999, - 74.92, - 74.92, - 83.66, - 94.585, + 29.035, + 29.035, + 44.330000000000005, + 53.06999999999999, + 70.55, + 77.105, + 90.215, + 100.0, + 100.0, 100.0, 100.0, 100.0, @@ -320,11 +320,18 @@ 0.0, 0.0 ], - "Gesamt_Verluste": 9872.776074746695, - "Gesamtbilanz_Euro": 12.332782378812306, + "Gesamt_Verluste": 8120.988554782056, + "Gesamtbilanz_Euro": 10.524080664893, "Gesamteinnahmen_Euro": 0.0, - "Gesamtkosten_Euro": 12.332782378812306, + "Gesamtkosten_Euro": 10.524080664893, "Home_appliance_wh_per_hour": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, 0.0, 0.0, 0.0, @@ -355,94 +362,87 @@ 0.0, 0.0, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, 0.0 ], "Kosten_Euro_pro_Stunde": [ 0.0, - 0.004569992000000018, - 2.750373626, - 2.1541494859999997, - 1.0128942300000001, - 0.0, - 1.4118501319999999, - 0.0, - 0.0, - 0.55162953, - 0.0, - 0.0, + 1.218515592, + 0.04475252599999999, + 1.7187851859999999, + 0.07147063000000006, + 1.2316083, 0.0, + 1.3510631400000002, + 0.017097885000000056, + 0.65386953, 0.0, + 0.5669364879999996, + 0.26650619799999997, + 0.19588158, 0.174739608, - 0.0, - 0.0, + 0.28801899, + 0.22802125600000003, 0.199865757, 0.182970359, 0.162995926, - 1.4005233899999998, + 0.16677339, 0.26411047, 0.24530383800000005, 0.08545095, 0.007989913613567745, 0.028255713342252034, - 0.025392879919306634, + 0.0, 0.0, 0.0, 0.0003442778967139274, - 0.6945180797975209, + 0.5571430797975209, 0.0, 0.04565364324294593, 0.08231598, 0.174597189, 0.293043269, - 0.214398479, - 0.16484566 + 0.0, + 0.0 ], "Netzbezug_Wh_pro_Stunde": [ 0.0, - 20.660000000000082, - 13140.82, - 11464.339999999998, - 5510.85, - 0.0, - 6423.339999999999, - 0.0, - 0.0, - 1726.54, - 0.0, - 0.0, + 5508.66, + 213.81999999999994, + 9147.34, + 388.85000000000036, + 6145.75, 0.0, + 5951.820000000001, + 57.05000000000018, + 2046.54, 0.0, + 1909.5199999999986, + 912.38, + 704.61, 516.37, - 0.0, - 0.0, + 868.05, + 694.34, 608.79, 556.31, 488.89, - 4256.91, + 506.91, 799.85, 806.3900000000001, 351.65, 35.04348076126204, 127.73830624887898, - 121.32288542430308, + 0.0, 0.0, 0.0, 1.7179535764168035, - 3159.7728835192033, + 2534.7728835192033, 0.0, 152.3311419517715, 257.64, 566.69, 987.01, - 733.99, - 592.97 + 0.0, + 0.0 ], "Netzeinspeisung_Wh_pro_Stunde": [ 0.0, @@ -486,83 +486,83 @@ ], "Verluste_Pro_Stunde": [ 760.062272727273, + 1233.818181818182, 0.0, - 933.0, - 726.0, - 414.0, - 646.7386363636365, 483.0, - 230.91336797704525, - 880.0977272727268, - 1026.818181818182, - 713.7695454545456, - 133.72909090909081, - 124.41545454545451, - 96.08318181818186, - 0.0, - 118.37045454545455, - 94.68272727272722, + 276.0, + 552.0, + 367.81909090909085, + 414.0, + 990.818181818182, + 225.0, + 440.6331818181816, + 214.24909090909114, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, 0.0, 0.0, 0.0, - 450.0, 0.0, 0.0, 0.0, 11.233982308648535, 38.52740325013451, - 145.08565374908358, + 161.62968357967037, 21.962728535423857, 538.2984000000038, 441.7178455708299, - 630.8276539776955, + 555.8276539776955, 171.99990368477063, 41.441862965787436, 0.0, 0.0, 0.0, - 0.0, - 0.0 + 100.08954545454549, + 80.85954545454547 ], "akku_soc_pro_stunde": [ 80.0, 62.54222623966943, - 62.54222623966943, - 75.04222623966943, - 87.54222623966943, - 87.54222623966943, - 78.01764807162535, - 78.01764807162535, - 83.83265434833275, - 64.76391295714818, - 43.24187438965506, - 26.108997323539356, - 21.88775076706553, - 17.96049525742366, - 14.927566538415393, - 14.927566538415393, - 11.191125422712915, - 8.20240297092228, - 8.20240297092228, - 8.20240297092228, - 8.20240297092228, - 20.70240297092228, - 20.70240297092228, - 20.70240297092228, - 20.70240297092228, - 21.014458035051405, - 22.08466368088848, - 26.114820729474133, - 26.264822435793555, - 41.217555769125156, - 53.48749592387043, - 71.01048631213975, - 74.78520719328002, - 75.93637005344077, - 75.93637005344077, - 75.93637005344077, - 75.93637005344077, - 75.93637005344077 + 41.02018767217631, + 41.02018767217631, + 41.02018767217631, + 41.02018767217631, + 41.02018767217631, + 35.94382747933885, + 35.94382747933885, + 14.421788911845734, + 20.671788911845734, + 6.762913223140502, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3120550641291261, + 1.3822607099661959, + 4.890194594707572, + 5.040196301026997, + 19.992929634358592, + 32.26286978910387, + 47.70252684403985, + 51.477247725180106, + 52.628410585340866, + 52.628410585340866, + 52.628410585340866, + 52.628410585340866, + 49.469018367710014 ], "Electricity_price": [ 0.000228, @@ -715,75 +715,74 @@ "start_soc_prozent": 5 }, "start_solution": [ - 16.0, - 13.0, + 6.0, 11.0, + 5.0, + 9.0, 14.0, - 2.0, - 18.0, - 3.0, 16.0, + 15.0, + 3.0, 4.0, 20.0, - 12.0, - 2.0, - 18.0, - 18.0, - 1.0, - 13.0, - 4.0, - 7.0, - 9.0, - 8.0, - 10.0, - 12.0, - 10.0, - 10.0, - 14.0, - 8.0, - 7.0, - 2.0, - 6.0, - 4.0, - 18.0, - 3.0, - 4.0, - 3.0, - 5.0, - 14.0, - 14.0, - 10.0, - 13.0, - 3.0, - 17.0, 11.0, + 10.0, + 4.0, + 3.0, 6.0, 14.0, + 13.0, + 0.0, + 7.0, + 15.0, + 10.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 13.0, + 7.0, + 4.0, + 13.0, + 13.0, + 13.0, 14.0, + 16.0, + 11.0, + 0.0, 14.0, + 4.0, + 0.0, + 13.0, + 11.0, + 2.0, + 6.0, + 3.0, 2.0, 3.0, - 5.0, + 1.0, 4.0, - 5.0, - 2.0, 1.0, 4.0, 5.0, - 3.0, - 1.0, - 2.0, 1.0, + 6.0, 0.0, 5.0, 2.0, + 6.0, + 1.0, 4.0, 3.0, - 5.0, - 0.0, - 2.0, - 3.0, - 4.0, + 6.0, 0.0, 0.0, 0.0, @@ -811,7 +810,8 @@ 0.0, 0.0, 0.0, - 13.0 + 0.0, + 20.0 ], - "washingstart": 13 + "washingstart": 20 } \ No newline at end of file diff --git a/tests/testdata/optimize_result_2_full.json b/tests/testdata/optimize_result_2_full.json index f580969..1fc032e 100644 --- a/tests/testdata/optimize_result_2_full.json +++ b/tests/testdata/optimize_result_2_full.json @@ -3,13 +3,14 @@ 0.0, 0.0, 0.0, - 1.0, - 1.0, + 0.0, 0.75, 0.0, 0.0, + 0.375, + 0.0, + 1.0, 0.0, - 0.5, 0.0, 0.0, 0.0, @@ -18,7 +19,6 @@ 0.0, 0.0, 0.0, - 0.5, 0.0, 0.0, 0.0, @@ -103,6 +103,12 @@ 0, 1, 0, + 1, + 0, + 1, + 0, + 0, + 0, 0, 0, 0, @@ -111,17 +117,20 @@ 1, 0, 1, - 1, - 1, - 0, - 0, 0, 1, 1, - 0, 1, 1, - 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, 1, 1, 1, @@ -130,18 +139,9 @@ 1, 0, 1, - 1, 0, 1, 1, - 0, - 1, - 1, - 1, - 1, - 0, - 0, - 1, 1, 1, 1, @@ -150,24 +150,24 @@ 1 ], "eautocharge_hours_float": [ - 0.5, 0.375, - 0.625, + 0.0, + 0.875, + 1.0, + 0.5, 0.75, 0.625, - 0.5, - 0.5, + 0.375, + 0.375, 0.75, - 0.0, - 0.5, 0.375, - 0.0, - 0.0, 0.5, + 0.625, + 0.625, + 0.625, 0.5, 0.625, 0.5, - 0.5, 0.0, 0.0, 0.0, @@ -185,14 +185,14 @@ 0.0, 0.0, 0.0, - 0.375, 0.0, 0.0, 0.0, - 0.375, 0.0, 0.0, - 0.625, + 0.0, + 0.0, + 0.0, 0.0, 0.0, 0.0, @@ -202,15 +202,15 @@ "result": { "Last_Wh_pro_Stunde": [ 4986.07, - 1063.91, - 1320.56, - 8876.029999999999, - 8907.67, - 7731.82, - 6460.22, + 6307.91, + 7875.5599999999995, + 7687.03, + 7718.67, + 6420.82, + 7771.22, 6347.78, 3629.12, - 1178.71, + 3678.71, 1050.98, 988.56, 912.38, @@ -226,14 +226,14 @@ 1141.98, 1056.97, 992.46, - 5088.99, + 1155.99, 827.01, 1257.98, 1232.67, - 4804.26, + 871.26, 860.88, 1158.03, - 7777.72, + 1222.72, 1221.04, 949.99, 987.01, @@ -243,37 +243,37 @@ "EAuto_SoC_pro_Stunde": [ 5.0, 11.555, - 11.555, - 11.555, 20.294999999999998, - 29.035, - 39.96, - 48.699999999999996, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 57.440000000000005, - 63.995000000000005, - 63.995000000000005, - 63.995000000000005, - 63.995000000000005, - 70.55, - 70.55, - 70.55, + 31.22, + 42.144999999999996, + 53.06999999999999, + 61.809999999999995, + 72.735, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, + 81.475, 81.475, 81.475, 81.475, @@ -320,11 +320,16 @@ 0.0, 0.0 ], - "Gesamt_Verluste": 7755.845910804702, - "Gesamtbilanz_Euro": 4.690157296412734, + "Gesamt_Verluste": 7087.636815800874, + "Gesamtbilanz_Euro": 5.921655371576468, "Gesamteinnahmen_Euro": 0.0, - "Gesamtkosten_Euro": 4.690157296412734, + "Gesamtkosten_Euro": 5.921655371576468, "Home_appliance_wh_per_hour": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, 0.0, 0.0, 0.0, @@ -357,92 +362,87 @@ 0.0, 0.0, 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, 0.0 ], "Kosten_Euro_pro_Stunde": [ + 0.92472012, + 1.164542792, + 1.416714026, + 1.226111386, 0.0, + 0.1807107, 0.0, - 0.0, - 1.4495244859999996, - 0.53097063, - 0.44343509999999997, - 0.0, - 0.0, - 0.8107800974767518, - 0.0, - 0.0, - 0.291163892, + 0.7558691399999999, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, - 0.182970359, 0.0, 0.0, - 0.26411047, 0.0, 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.13629985200000028, + 0.08545095, 0.007989913613567745, + 0.012219458233588571, 0.0, - 0.002459704740224363, + 0.010682755832597498, 0.0, - 0.0, - 0.05016012000000004, - 0.0076430797975209205, - 0.0, - 0.31687880399999996, + 0.0003442778967139274, 0.0, 0.0, 0.0, - 0.16722497978466921, - 0.16484566 + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 ], "Netzbezug_Wh_pro_Stunde": [ + 4055.79, + 5264.66, + 6768.82, + 6525.34, 0.0, + 901.75, 0.0, - 0.0, - 7714.339999999998, - 2888.8500000000004, - 2212.75, - 0.0, - 0.0, - 2705.305630553059, - 0.0, - 0.0, - 980.68, + 3329.8199999999997, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, - 556.31, 0.0, 0.0, - 799.85, 0.0, 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 448.06000000000085, + 351.65, 35.04348076126204, + 55.24167375040041, 0.0, - 11.752053226107805, + 56.853410498124, 0.0, - 0.0, - 250.30000000000018, - 34.77288351920346, - 0.0, - 1057.3199999999997, + 1.7179535764168035, 0.0, 0.0, 0.0, - 572.4922279516235, - 592.97 + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 ], "Netzeinspeisung_Wh_pro_Stunde": [ 0.0, @@ -485,84 +485,84 @@ 0.0 ], "Verluste_Pro_Stunde": [ - 760.062272727273, - 2.817272727272737, - 29.157272727272726, - 276.0, + 207.0, 276.0, 345.0, - 615.5918181818183, - 730.0663636363638, - 373.0373243336329, - 23.391818181818195, + 345.0, + 576.7977272727273, + 276.0, + 863.3645454545458, + 276.0, + 229.91590909090905, + 364.30090909090904, 99.72409090909093, - 0.0, + 133.72909090909081, 124.41545454545451, 96.08318181818186, 70.41409090909087, 118.37045454545455, 94.68272727272722, 83.01681818181817, - 0.0, + 75.86045454545456, 66.66681818181814, 69.12409090909085, + 109.0704545454546, + 48.863181818181715, 0.0, - 109.96227272727276, - 47.952272727272714, 11.233982308648535, - 682.1181818181817, - 160.0271308670193, - 21.962728535423857, + 48.41330768174522, + 161.62968357967037, + 14.209990740225123, 538.2984000000038, - 207.0, - 255.8276539776955, + 441.7178455708299, + 260.56941082122324, 171.99990368477063, - 1026.818181818182, + 62.214291413756285, 35.132727272727266, 77.27590909090907, 134.59227272727276, - 22.022423461142267, - 0.0 + 100.08954545454549, + 80.85954545454547 ], "akku_soc_pro_stunde": [ 80.0, - 62.54222623966943, - 62.45329717630854, - 61.532928719008275, - 61.532928719008275, - 61.532928719008275, - 61.532928719008275, - 50.81349001377411, - 36.480587121212125, - 46.842735019368604, - 46.10435692019505, - 42.95650051523637, - 42.95650051523637, - 39.029245005594504, - 35.996316286586236, - 33.77364927556696, - 30.03720815986448, - 27.048485708073848, - 24.428005336173022, - 24.428005336173022, - 22.32362344912068, - 20.141676135071094, - 20.141676135071094, - 16.670644798982938, - 15.156999826531148, - 15.469054890660274, - 0.471637535288375, - 4.030157048585656, - 4.180158754905081, - 19.132892088236673, - 19.132892088236673, - 26.239215809839333, - 30.01393669097958, - 8.49189812348647, - 7.382910520180684, - 4.9436457130181495, - 0.6951522557178741, - 0.0 + 80.0, + 80.0, + 80.0, + 80.0, + 72.68315254820936, + 72.68315254820936, + 56.320635330578504, + 56.320635330578504, + 49.063188705234154, + 37.563791322314046, + 34.41593491735537, + 30.194688360881543, + 26.26743285123967, + 23.2345041322314, + 21.011837121212118, + 17.275396005509634, + 14.286673553719003, + 11.666193181818178, + 9.27160812672176, + 7.167226239669419, + 4.9852789256198315, + 1.5423984159779582, + 0.0, + 0.0, + 0.3120550641291261, + 1.07020564583707, + 4.578139530578446, + 4.9728614955846995, + 19.925594828916292, + 32.195534983661574, + 39.152182037223575, + 42.92690291836383, + 43.42237043610133, + 42.31338283279554, + 39.87411802563301, + 35.62562456833274, + 32.46623235070188 ], "Electricity_price": [ 0.000228, @@ -715,72 +715,72 @@ "start_soc_prozent": 5 }, "start_solution": [ - 14.0, - 13.0, - 0.0, - 20.0, - 20.0, - 18.0, - 5.0, - 3.0, - 9.0, - 16.0, - 12.0, - 13.0, - 8.0, - 4.0, - 0.0, - 14.0, - 11.0, - 9.0, - 16.0, - 8.0, - 9.0, - 5.0, - 10.0, - 13.0, - 13.0, - 8.0, - 8.0, - 9.0, - 5.0, - 10.0, - 7.0, - 2.0, - 8.0, - 12.0, - 2.0, - 9.0, - 11.0, - 10.0, - 10.0, 6.0, - 1.0, - 12.0, + 13.0, + 0.0, 9.0, + 18.0, 12.0, + 5.0, + 15.0, + 4.0, + 20.0, + 14.0, + 2.0, + 14.0, + 3.0, 13.0, + 14.0, + 13.0, + 2.0, + 9.0, + 8.0, 10.0, + 12.0, + 10.0, + 9.0, 13.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 9.0, + 10.0, + 14.0, + 13.0, + 2.0, + 9.0, + 9.0, + 13.0, + 12.0, 11.0, - 2.0, + 10.0, + 9.0, + 13.0, 1.0, - 3.0, + 0.0, + 5.0, + 6.0, + 2.0, 4.0, 3.0, - 2.0, - 2.0, + 1.0, + 1.0, 4.0, - 0.0, - 2.0, 1.0, - 0.0, - 0.0, 2.0, + 3.0, + 3.0, + 3.0, 2.0, 3.0, 2.0, - 2.0, 0.0, 0.0, 0.0, @@ -798,20 +798,20 @@ 0.0, 0.0, 0.0, - 1.0, - 0.0, - 0.0, - 0.0, - 1.0, - 0.0, - 0.0, - 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, - 13.0 + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 18.0 ], - "washingstart": 13 + "washingstart": 18 } \ No newline at end of file From a126d893629f92f0130564c50428e5afcd9b3d2f Mon Sep 17 00:00:00 2001 From: Andreas Date: Thu, 26 Dec 2024 07:50:30 +0100 Subject: [PATCH 30/47] Price Forecast with linear weighting, last value = highest weighting Discharge enforce when soc = 0 -> mask bug --- .sesskey | 1 + 1 file changed, 1 insertion(+) create mode 100644 .sesskey diff --git a/.sesskey b/.sesskey new file mode 100644 index 0000000..8454446 --- /dev/null +++ b/.sesskey @@ -0,0 +1 @@ +e39e31eb-09f7-46cf-b307-e43453c95009 \ No newline at end of file From 83a048fb83c9388f1afc7028123f55568a54a965 Mon Sep 17 00:00:00 2001 From: Andreas Date: Thu, 26 Dec 2024 07:55:29 +0100 Subject: [PATCH 31/47] Ruff --- src/akkudoktoreos/prediction/price_forecast.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/akkudoktoreos/prediction/price_forecast.py b/src/akkudoktoreos/prediction/price_forecast.py index 7b4fd58..47e4ce1 100644 --- a/src/akkudoktoreos/prediction/price_forecast.py +++ b/src/akkudoktoreos/prediction/price_forecast.py @@ -176,7 +176,6 @@ class HourlyElectricityPriceForecast: return np.array(average_prices_with_final_weight) - def get_price_for_daterange( self, start_date_str: str, end_date_str: str, repeat: bool = False ) -> np.ndarray: From 546400aea656e6edef976da5a22c86ae17d90307 Mon Sep 17 00:00:00 2001 From: Andreas Date: Thu, 26 Dec 2024 07:55:29 +0100 Subject: [PATCH 32/47] Ruff --- .sesskey | 1 - src/akkudoktoreos/prediction/price_forecast.py | 1 - 2 files changed, 2 deletions(-) delete mode 100644 .sesskey diff --git a/.sesskey b/.sesskey deleted file mode 100644 index 8454446..0000000 --- a/.sesskey +++ /dev/null @@ -1 +0,0 @@ -e39e31eb-09f7-46cf-b307-e43453c95009 \ No newline at end of file diff --git a/src/akkudoktoreos/prediction/price_forecast.py b/src/akkudoktoreos/prediction/price_forecast.py index 7b4fd58..47e4ce1 100644 --- a/src/akkudoktoreos/prediction/price_forecast.py +++ b/src/akkudoktoreos/prediction/price_forecast.py @@ -176,7 +176,6 @@ class HourlyElectricityPriceForecast: return np.array(average_prices_with_final_weight) - def get_price_for_daterange( self, start_date_str: str, end_date_str: str, repeat: bool = False ) -> np.ndarray: From f89889410d14ef3c8930ea491d26bbae9e3c31c5 Mon Sep 17 00:00:00 2001 From: Andreas Date: Wed, 25 Dec 2024 19:12:38 +0100 Subject: [PATCH 33/47] Awattar Price changed to more precise value; if SoC=0 discharge =1 forced. Exp Avg for siple Price Forecast --- src/akkudoktoreos/prediction/price_forecast.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/akkudoktoreos/prediction/price_forecast.py b/src/akkudoktoreos/prediction/price_forecast.py index 059f833..9e4d880 100644 --- a/src/akkudoktoreos/prediction/price_forecast.py +++ b/src/akkudoktoreos/prediction/price_forecast.py @@ -98,6 +98,7 @@ class HourlyElectricityPriceForecast: # Extract the price from 00:00 of the previous day previous_day_prices = [ + entry["marketprice"] # + self.charges entry["marketprice"] # + self.charges for entry in self.prices if previous_day_str in entry["end"] @@ -106,6 +107,7 @@ class HourlyElectricityPriceForecast: # Extract all prices for the specified date date_prices = [ + entry["marketprice"] # + self.charges entry["marketprice"] # + self.charges for entry in self.prices if date_str in entry["end"] @@ -117,6 +119,8 @@ class HourlyElectricityPriceForecast: return np.array(date_prices) / (1000.0 * 1000.0) + self.charges + return np.array(date_prices) / (1000.0 * 1000.0) + self.charges + def get_average_price_last_7_days(self, end_date_str: Optional[str] = None) -> np.ndarray: """Calculate the hourly average electricity price for the last 7 days. @@ -164,6 +168,12 @@ class HourlyElectricityPriceForecast: axis=0, weights=np.array([1, 2, 4, 8, 16, 32, 64]) / np.sum(np.array([1, 2, 4, 8, 16, 32, 64])), ) + return average_prices + average_prices = np.average( + price_matrix, + axis=0, + weights=np.array([1, 2, 4, 8, 16, 32, 64]) / np.sum(np.array([1, 2, 4, 8, 16, 32, 64])), + ) final_weights = np.linspace(1, 0, price_matrix.shape[1]) # Weight last known price linear falling From 072413f1a488ceab6dbd184150fa811c7a2e4f93 Mon Sep 17 00:00:00 2001 From: Andreas Date: Thu, 26 Dec 2024 07:55:29 +0100 Subject: [PATCH 34/47] Ruff --- .sesskey | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .sesskey diff --git a/.sesskey b/.sesskey deleted file mode 100644 index 8454446..0000000 --- a/.sesskey +++ /dev/null @@ -1 +0,0 @@ -e39e31eb-09f7-46cf-b307-e43453c95009 \ No newline at end of file From c791ecb6830649c46337c065dedbbfd6bb4ef3f8 Mon Sep 17 00:00:00 2001 From: Andreas Date: Thu, 26 Dec 2024 08:12:56 +0100 Subject: [PATCH 35/47] Merge --- src/akkudoktoreos/prediction/price_forecast.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/akkudoktoreos/prediction/price_forecast.py b/src/akkudoktoreos/prediction/price_forecast.py index c35edee..f9d86f6 100644 --- a/src/akkudoktoreos/prediction/price_forecast.py +++ b/src/akkudoktoreos/prediction/price_forecast.py @@ -166,12 +166,6 @@ class HourlyElectricityPriceForecast: axis=0, weights=np.array([1, 2, 4, 8, 16, 32, 64]) / np.sum(np.array([1, 2, 4, 8, 16, 32, 64])), ) - return average_prices - average_prices = np.average( - price_matrix, - axis=0, - weights=np.array([1, 2, 4, 8, 16, 32, 64]) / np.sum(np.array([1, 2, 4, 8, 16, 32, 64])), - ) final_weights = np.linspace(1, 0, price_matrix.shape[1]) From 043f9e74e5aa67f852851a9f9f11868171b2bc23 Mon Sep 17 00:00:00 2001 From: Normann Date: Fri, 27 Dec 2024 10:46:13 +0100 Subject: [PATCH 36/47] default filename changed back (#288) --- src/akkudoktoreos/utils/visualize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/akkudoktoreos/utils/visualize.py b/src/akkudoktoreos/utils/visualize.py index c036a0d..f7452f5 100644 --- a/src/akkudoktoreos/utils/visualize.py +++ b/src/akkudoktoreos/utils/visualize.py @@ -247,7 +247,7 @@ def prepare_visualize( parameters: OptimizationParameters, results: dict, config: AppConfig, - filename: str = "visualization_results_new.pdf", + filename: str = "visualization_results.pdf", start_hour: Optional[int] = 0, ) -> None: report = VisualizationReport(config, filename) From 4f51c891d3a455b9443103810233755e954db515 Mon Sep 17 00:00:00 2001 From: Normann Date: Fri, 27 Dec 2024 21:42:50 +0100 Subject: [PATCH 37/47] duplicate line removed (#290) --- src/akkudoktoreos/prediction/price_forecast.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/akkudoktoreos/prediction/price_forecast.py b/src/akkudoktoreos/prediction/price_forecast.py index f9d86f6..47e4ce1 100644 --- a/src/akkudoktoreos/prediction/price_forecast.py +++ b/src/akkudoktoreos/prediction/price_forecast.py @@ -117,8 +117,6 @@ class HourlyElectricityPriceForecast: return np.array(date_prices) / (1000.0 * 1000.0) + self.charges - return np.array(date_prices) / (1000.0 * 1000.0) + self.charges - def get_average_price_last_7_days(self, end_date_str: Optional[str] = None) -> np.ndarray: """Calculate the hourly average electricity price for the last 7 days. From f195edb07da3c9db25c2b0834f5a6be72ddcab72 Mon Sep 17 00:00:00 2001 From: Dominique Lasserre Date: Sun, 29 Dec 2024 16:43:37 +0100 Subject: [PATCH 38/47] pvforecast: Some values optional. Closes #292 (#293) * temperature, relativehumidity_2m, windspeed_10m can be null * prettify pv_forecast_input_1.json (and add null value) --- docs/akkudoktoreos/openapi.json | 65 +- src/akkudoktoreos/optimization/genetic.py | 2 +- src/akkudoktoreos/prediction/pv_forecast.py | 10 +- src/akkudoktoreos/utils/visualize.py | 2 +- tests/test_pv_forecast.py | 6 +- tests/testdata/pv_forecast_input_1.json | 11663 +++++++++++++++++- 6 files changed, 11726 insertions(+), 22 deletions(-) diff --git a/docs/akkudoktoreos/openapi.json b/docs/akkudoktoreos/openapi.json index 0925c8d..a322e08 100644 --- a/docs/akkudoktoreos/openapi.json +++ b/docs/akkudoktoreos/openapi.json @@ -307,7 +307,9 @@ } }, "type": "object", - "required": ["kapazitaet_wh"], + "required": [ + "kapazitaet_wh" + ], "title": "EAutoParameters" }, "EAutoResult": { @@ -439,21 +441,38 @@ "properties": { "temperature": { "items": { - "type": "number" + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] }, "type": "array", "title": "Temperature" }, "pvpower": { "items": { - "type": "number" + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] }, "type": "array", "title": "Pvpower" } }, "type": "object", - "required": ["temperature", "pvpower"], + "required": [ + "temperature", + "pvpower" + ], "title": "ForecastResponse" }, "GesamtlastRequest": { @@ -475,7 +494,11 @@ } }, "type": "object", - "required": ["year_energy", "measured_data", "hours"], + "required": [ + "year_energy", + "measured_data", + "hours" + ], "title": "GesamtlastRequest" }, "HTTPValidationError": { @@ -507,7 +530,10 @@ } }, "type": "object", - "required": ["consumption_wh", "duration_h"], + "required": [ + "consumption_wh", + "duration_h" + ], "title": "HomeApplianceParameters" }, "OptimizationParameters": { @@ -548,7 +574,14 @@ "anyOf": [ { "items": { - "type": "number" + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] }, "type": "array" }, @@ -576,7 +609,11 @@ } }, "type": "object", - "required": ["ems", "pv_akku", "eauto"], + "required": [ + "ems", + "pv_akku", + "eauto" + ], "title": "OptimizationParameters" }, "OptimizeResponse": { @@ -735,7 +772,9 @@ } }, "type": "object", - "required": ["kapazitaet_wh"], + "required": [ + "kapazitaet_wh" + ], "title": "PVAkkuParameters" }, "SimulationResult": { @@ -957,7 +996,11 @@ } }, "type": "object", - "required": ["loc", "msg", "type"], + "required": [ + "loc", + "msg", + "type" + ], "title": "ValidationError" }, "WechselrichterParameters": { @@ -974,4 +1017,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/akkudoktoreos/optimization/genetic.py b/src/akkudoktoreos/optimization/genetic.py index cf9f6c0..d66f34f 100644 --- a/src/akkudoktoreos/optimization/genetic.py +++ b/src/akkudoktoreos/optimization/genetic.py @@ -34,7 +34,7 @@ class OptimizationParameters(BaseModel): wechselrichter: WechselrichterParameters = WechselrichterParameters() eauto: Optional[EAutoParameters] dishwasher: Optional[HomeApplianceParameters] = None - temperature_forecast: Optional[list[float]] = Field( + temperature_forecast: Optional[list[Optional[float]]] = Field( default=None, description="An array of floats representing the temperature forecast in degrees Celsius for different time intervals.", ) diff --git a/src/akkudoktoreos/prediction/pv_forecast.py b/src/akkudoktoreos/prediction/pv_forecast.py index 43b0323..0357ad9 100644 --- a/src/akkudoktoreos/prediction/pv_forecast.py +++ b/src/akkudoktoreos/prediction/pv_forecast.py @@ -80,9 +80,9 @@ class AkkudoktorForecastValue(BaseModel): power: float sunTilt: float sunAzimuth: float - temperature: float - relativehumidity_2m: float - windspeed_10m: float + temperature: Optional[float] + relativehumidity_2m: Optional[float] + windspeed_10m: Optional[float] class AkkudoktorForecast(BaseModel): @@ -109,8 +109,8 @@ def validate_pv_forecast_data(data: dict[str, Any]) -> Optional[str]: class ForecastResponse(BaseModel): - temperature: list[float] - pvpower: list[float] + temperature: list[Optional[float]] + pvpower: list[Optional[float]] class ForecastData: diff --git a/src/akkudoktoreos/utils/visualize.py b/src/akkudoktoreos/utils/visualize.py index f7452f5..fcfa0a1 100644 --- a/src/akkudoktoreos/utils/visualize.py +++ b/src/akkudoktoreos/utils/visualize.py @@ -89,7 +89,7 @@ class VisualizationReport: def create_line_chart( self, start_hour: Optional[int], - y_list: list[Union[np.ndarray, list[float]]], + y_list: list[Union[np.ndarray, list[Optional[float]], list[float]]], title: str, xlabel: str, ylabel: str, diff --git a/tests/test_pv_forecast.py b/tests/test_pv_forecast.py index ad9d18e..1391ce2 100644 --- a/tests/test_pv_forecast.py +++ b/tests/test_pv_forecast.py @@ -138,7 +138,7 @@ def test_get_temperature_forecast_for_date(pv_forecast_instance, sample_forecast """Test fetching temperature forecast for a specific date.""" forecast_temps = pv_forecast_instance.get_temperature_forecast_for_date(sample_forecast_start) assert len(forecast_temps) == 24 - assert forecast_temps[0] == 7.0 + assert forecast_temps[0] is None assert forecast_temps[1] == 6.5 assert forecast_temps[2] == 6.0 @@ -162,7 +162,7 @@ def test_get_temperature_for_date_range(pv_forecast_instance, sample_forecast_st sample_forecast_start, end_date ) assert len(forecast_temps) == 48 - assert forecast_temps[0] == 7.0 + assert forecast_temps[0] is None assert forecast_temps[1] == 6.5 assert forecast_temps[2] == 6.0 @@ -273,7 +273,7 @@ def test_timezone_behaviour( # Test fetching temperature forecast for a specific date. forecast_temps = pv_forecast_instance.get_temperature_forecast_for_date(sample_forecast_start) assert len(forecast_temps) == 24 - assert forecast_temps[0] == 7.0 + assert forecast_temps[0] is None assert forecast_temps[1] == 6.5 assert forecast_temps[2] == 6.0 diff --git a/tests/testdata/pv_forecast_input_1.json b/tests/testdata/pv_forecast_input_1.json index 127ef90..1ff241d 100644 --- a/tests/testdata/pv_forecast_input_1.json +++ b/tests/testdata/pv_forecast_input_1.json @@ -1 +1,11662 @@ -{"meta":{"lat":52.52,"lon":13.405,"power":[5000,4800,1400,1600],"azimuth":[-10,-90,-40,5],"tilt":[7,7,60,45],"timezone":"Europe/Berlin","albedo":0.25,"past_days":5,"inverterEfficiency":0.8,"powerInverter":[5000,4800,1400,1600],"cellCoEff":-0.36,"range":false,"horizont":[[{"altitude":20,"azimuthFrom":-180,"azimuthTo":-90},{"altitude":27,"azimuthFrom":-90,"azimuthTo":0},{"altitude":22,"azimuthFrom":0,"azimuthTo":90},{"altitude":20,"azimuthFrom":90,"azimuthTo":180}],[{"altitude":30,"azimuthFrom":-180,"azimuthTo":-90},{"altitude":30,"azimuthFrom":-90,"azimuthTo":0},{"altitude":30,"azimuthFrom":0,"azimuthTo":90},{"altitude":50,"azimuthFrom":90,"azimuthTo":180}],[{"altitude":60,"azimuthFrom":-180,"azimuthTo":-90},{"altitude":30,"azimuthFrom":-90,"azimuthTo":0},{"altitude":0,"azimuthFrom":0,"azimuthTo":90},{"altitude":30,"azimuthFrom":90,"azimuthTo":180}],[{"altitude":45,"azimuthFrom":-180,"azimuthTo":-90},{"altitude":25,"azimuthFrom":-90,"azimuthTo":0},{"altitude":30,"azimuthFrom":0,"azimuthTo":90},{"altitude":60,"azimuthFrom":90,"azimuthTo":180}]],"horizontString":["20,27,22,20","30,30,30,50","60,30,0,30","45,25,30,60"]},"values":[[{"datetime":"2024-10-06T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.03892891605494,"sunAzimuth":163.14263622624128,"temperature":7,"relativehumidity_2m":88,"windspeed_10m":7.9},{"datetime":"2024-10-06T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.13778324543035,"sunAzimuth":-176.22585898864278,"temperature":6.5,"relativehumidity_2m":91,"windspeed_10m":6.8},{"datetime":"2024-10-06T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.87117274960936,"sunAzimuth":-155.9729639229445,"temperature":6,"relativehumidity_2m":91,"windspeed_10m":5.9},{"datetime":"2024-10-06T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-36.70531092777589,"sunAzimuth":-137.8059489226708,"temperature":5.5,"relativehumidity_2m":92,"windspeed_10m":5.1},{"datetime":"2024-10-06T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-29.46443142893699,"sunAzimuth":-122.16602054266892,"temperature":5.1,"relativehumidity_2m":92,"windspeed_10m":6.2},{"datetime":"2024-10-06T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-20.930765133481234,"sunAzimuth":-108.58249513077881,"temperature":4.9,"relativehumidity_2m":93,"windspeed_10m":5.8},{"datetime":"2024-10-06T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-11.710347315474053,"sunAzimuth":-96.31140508589108,"temperature":5.1,"relativehumidity_2m":92,"windspeed_10m":6.5},{"datetime":"2024-10-06T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-2.2689443207496223,"sunAzimuth":-84.62890292197706,"temperature":5.3,"relativehumidity_2m":92,"windspeed_10m":7.6},{"datetime":"2024-10-06T08:00:00.000+02:00","dcPower":11.737826509478335,"power":9.390261207582668,"sunTilt":6.991906328571172,"sunAzimuth":-72.87999206290318,"temperature":5.5,"relativehumidity_2m":91,"windspeed_10m":8.4},{"datetime":"2024-10-06T09:00:00.000+02:00","dcPower":242.57051171912266,"power":194.05640937529813,"sunTilt":15.663160391528187,"sunAzimuth":-60.45596163553978,"temperature":6.3,"relativehumidity_2m":90,"windspeed_10m":9.3},{"datetime":"2024-10-06T10:00:00.000+02:00","dcPower":479.53210925713626,"power":383.625687405709,"sunTilt":23.268816289666535,"sunAzimuth":-46.79827360798693,"temperature":8,"relativehumidity_2m":85,"windspeed_10m":11.6},{"datetime":"2024-10-06T11:00:00.000+02:00","dcPower":2020.1663735831366,"power":1616.1330988665095,"sunTilt":29.234287239795027,"sunAzimuth":-31.503805204051176,"temperature":9.5,"relativehumidity_2m":86,"windspeed_10m":15.1},{"datetime":"2024-10-06T12:00:00.000+02:00","dcPower":1840.0674202135267,"power":1472.0539361708215,"sunTilt":32.93002248275174,"sunAzimuth":-14.578212396799534,"temperature":10.8,"relativehumidity_2m":82,"windspeed_10m":16.3},{"datetime":"2024-10-06T13:00:00.000+02:00","dcPower":1958.118125361256,"power":1566.494500289005,"sunTilt":33.84613522696556,"sunAzimuth":3.3037874055175505,"temperature":10.9,"relativehumidity_2m":82,"windspeed_10m":16.9},{"datetime":"2024-10-06T14:00:00.000+02:00","dcPower":1862.34412446005,"power":1489.87529956804,"sunTilt":31.83736693728352,"sunAzimuth":20.94669333759787,"temperature":12.6,"relativehumidity_2m":74,"windspeed_10m":17.1},{"datetime":"2024-10-06T15:00:00.000+02:00","dcPower":2071.518360584685,"power":1657.2146884677481,"sunTilt":27.209548486852757,"sunAzimuth":37.29302345489315,"temperature":12.8,"relativehumidity_2m":75,"windspeed_10m":17.8},{"datetime":"2024-10-06T16:00:00.000+02:00","dcPower":856.2189711080925,"power":684.9751768864741,"sunTilt":20.54547686442047,"sunAzimuth":51.93430385037965,"temperature":13.1,"relativehumidity_2m":73,"windspeed_10m":17.8},{"datetime":"2024-10-06T17:00:00.000+02:00","dcPower":806.8246131382091,"power":645.4596905105673,"sunTilt":12.4658413410018,"sunAzimuth":65.05541740712634,"temperature":12.6,"relativehumidity_2m":72,"windspeed_10m":15.3},{"datetime":"2024-10-06T18:00:00.000+02:00","dcPower":429.22798847242814,"power":343.38239077794253,"sunTilt":3.5065849097251456,"sunAzimuth":77.13919140741508,"temperature":11.9,"relativehumidity_2m":76,"windspeed_10m":14.8},{"datetime":"2024-10-06T19:00:00.000+02:00","dcPower":86.22924149013942,"power":68.98339319211154,"sunTilt":-5.8888854618235795,"sunAzimuth":88.76774476136781,"temperature":11.1,"relativehumidity_2m":79,"windspeed_10m":15.1},{"datetime":"2024-10-06T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-15.324219942418523,"sunAzimuth":100.56460329657087,"temperature":10.6,"relativehumidity_2m":81,"windspeed_10m":12.2},{"datetime":"2024-10-06T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-24.385415066790006,"sunAzimuth":113.21108724923529,"temperature":10.3,"relativehumidity_2m":81,"windspeed_10m":13.4},{"datetime":"2024-10-06T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.56528997863786,"sunAzimuth":127.45995077522508,"temperature":10.3,"relativehumidity_2m":83,"windspeed_10m":13.4},{"datetime":"2024-10-06T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.19130152908581,"sunAzimuth":144.02419079232183,"temperature":10.7,"relativehumidity_2m":83,"windspeed_10m":13},{"datetime":"2024-10-07T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.4292477470776,"sunAzimuth":163.14429087891105,"temperature":11,"relativehumidity_2m":83,"windspeed_10m":13.6},{"datetime":"2024-10-07T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.517749495901406,"sunAzimuth":-176.10136944486192,"temperature":11,"relativehumidity_2m":87,"windspeed_10m":11.2},{"datetime":"2024-10-07T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.22254930467857,"sunAzimuth":-155.74445709329385,"temperature":10.9,"relativehumidity_2m":91,"windspeed_10m":9.8},{"datetime":"2024-10-07T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.020882886444426,"sunAzimuth":-137.5192133151141,"temperature":11,"relativehumidity_2m":93,"windspeed_10m":8.7},{"datetime":"2024-10-07T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-29.748563322135755,"sunAzimuth":-121.8586066543482,"temperature":11.4,"relativehumidity_2m":94,"windspeed_10m":8.9},{"datetime":"2024-10-07T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.193270783038106,"sunAzimuth":-108.27337691467278,"temperature":11.5,"relativehumidity_2m":95,"windspeed_10m":11},{"datetime":"2024-10-07T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-11.962117012521006,"sunAzimuth":-96.00713008699226,"temperature":12,"relativehumidity_2m":94,"windspeed_10m":8.4},{"datetime":"2024-10-07T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-2.520439907672165,"sunAzimuth":-84.33068309080377,"temperature":12.2,"relativehumidity_2m":95,"windspeed_10m":9.3},{"datetime":"2024-10-07T08:00:00.000+02:00","dcPower":5.20619301519954,"power":4.1649544121596325,"sunTilt":6.730829735879827,"sunAzimuth":-72.58838243599898,"temperature":12.7,"relativehumidity_2m":94,"windspeed_10m":6.2},{"datetime":"2024-10-07T09:00:00.000+02:00","dcPower":106.2638790743732,"power":85.01110325949855,"sunTilt":15.383293627086166,"sunAzimuth":-60.174375329765816,"temperature":13.3,"relativehumidity_2m":94,"windspeed_10m":7.4},{"datetime":"2024-10-07T10:00:00.000+02:00","dcPower":425.50881675323336,"power":340.4070534025867,"sunTilt":22.96230371458641,"sunAzimuth":-46.53655309716923,"temperature":14.4,"relativehumidity_2m":91,"windspeed_10m":8.9},{"datetime":"2024-10-07T11:00:00.000+02:00","dcPower":443.2481574750867,"power":354.5985259800694,"sunTilt":28.896671975172765,"sunAzimuth":-31.281195510232457,"temperature":15.2,"relativehumidity_2m":91,"windspeed_10m":10.9},{"datetime":"2024-10-07T12:00:00.000+02:00","dcPower":782.1822024422786,"power":625.7457619538229,"sunTilt":32.56343562699629,"sunAzimuth":-14.421329305847635,"temperature":16,"relativehumidity_2m":89,"windspeed_10m":8.4},{"datetime":"2024-10-07T13:00:00.000+02:00","dcPower":1472.4584677473485,"power":1177.966774197879,"sunTilt":33.46089993111447,"sunAzimuth":3.3732496911031458,"temperature":17,"relativehumidity_2m":82,"windspeed_10m":10.5},{"datetime":"2024-10-07T14:00:00.000+02:00","dcPower":1709.702157101353,"power":1367.7617256810825,"sunTilt":31.448234246769605,"sunAzimuth":20.927108911856653,"temperature":18,"relativehumidity_2m":75,"windspeed_10m":9.8},{"datetime":"2024-10-07T15:00:00.000+02:00","dcPower":1624.9532433869356,"power":1299.9625947095485,"sunTilt":26.828539273003113,"sunAzimuth":37.20261442198752,"temperature":18.6,"relativehumidity_2m":70,"windspeed_10m":5.8},{"datetime":"2024-10-07T16:00:00.000+02:00","dcPower":878.2827125323747,"power":702.6261700258998,"sunTilt":20.17798028996772,"sunAzimuth":51.797067137147856,"temperature":18.9,"relativehumidity_2m":70,"windspeed_10m":7.4},{"datetime":"2024-10-07T17:00:00.000+02:00","dcPower":790.4767257839096,"power":632.3813806271278,"sunTilt":12.11146577521795,"sunAzimuth":64.89046144901918,"temperature":18.4,"relativehumidity_2m":72,"windspeed_10m":7.2},{"datetime":"2024-10-07T18:00:00.000+02:00","dcPower":360.64272843920315,"power":288.5141827513625,"sunTilt":3.1615292467832945,"sunAzimuth":76.95875071433478,"temperature":17.4,"relativehumidity_2m":74,"windspeed_10m":9.5},{"datetime":"2024-10-07T19:00:00.000+02:00","dcPower":79.53042904330093,"power":63.62434323464075,"sunTilt":-6.2300935503595385,"sunAzimuth":88.57949984494998,"temperature":16.4,"relativehumidity_2m":79,"windspeed_10m":7.6},{"datetime":"2024-10-07T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-15.667810875617224,"sunAzimuth":100.37506201699385,"temperature":15.4,"relativehumidity_2m":87,"windspeed_10m":9.2},{"datetime":"2024-10-07T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-24.737727405113922,"sunAzimuth":113.02960837119129,"temperature":14.9,"relativehumidity_2m":90,"windspeed_10m":10.9},{"datetime":"2024-10-07T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.93153539182831,"sunAzimuth":127.30408938398604,"temperature":14.5,"relativehumidity_2m":94,"windspeed_10m":10.7},{"datetime":"2024-10-07T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.572641175501424,"sunAzimuth":143.925225436442,"temperature":14.7,"relativehumidity_2m":94,"windspeed_10m":11.6},{"datetime":"2024-10-08T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.818121034022454,"sunAzimuth":163.14384998115503,"temperature":14.7,"relativehumidity_2m":94,"windspeed_10m":15.8},{"datetime":"2024-10-08T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.8965146817323,"sunAzimuth":-175.97781528741945,"temperature":14.8,"relativehumidity_2m":93,"windspeed_10m":14},{"datetime":"2024-10-08T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.572826067170936,"sunAzimuth":-155.51612909180187,"temperature":15.4,"relativehumidity_2m":94,"windspeed_10m":11.2},{"datetime":"2024-10-08T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.33548533853669,"sunAzimuth":-137.23273090041528,"temperature":15.4,"relativehumidity_2m":93,"windspeed_10m":12.2},{"datetime":"2024-10-08T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.031970973409337,"sunAzimuth":-121.55190085899577,"temperature":15.4,"relativehumidity_2m":93,"windspeed_10m":11.2},{"datetime":"2024-10-08T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.45536424486834,"sunAzimuth":-107.96544161465735,"temperature":15.8,"relativehumidity_2m":94,"windspeed_10m":10},{"datetime":"2024-10-08T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.213784351950519,"sunAzimuth":-95.70446004731738,"temperature":15.8,"relativehumidity_2m":93,"windspeed_10m":10.8},{"datetime":"2024-10-08T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-2.772091353585381,"sunAzimuth":-84.03447848078322,"temperature":15.7,"relativehumidity_2m":93,"windspeed_10m":10.5},{"datetime":"2024-10-08T08:00:00.000+02:00","dcPower":4.121973110641917,"power":3.2975784885135333,"sunTilt":6.469429830924286,"sunAzimuth":-72.29923977528891,"temperature":15.7,"relativehumidity_2m":90,"windspeed_10m":10.2},{"datetime":"2024-10-08T09:00:00.000+02:00","dcPower":215.35955387207488,"power":172.28764309765992,"sunTilt":15.10307050684314,"sunAzimuth":-59.895772492079,"temperature":15.7,"relativehumidity_2m":89,"windspeed_10m":8.3},{"datetime":"2024-10-08T10:00:00.000+02:00","dcPower":575.8348468079607,"power":460.6678774463686,"sunTilt":22.655587204347487,"sunAzimuth":-46.27834028428006,"temperature":16.3,"relativehumidity_2m":86,"windspeed_10m":10.6},{"datetime":"2024-10-08T11:00:00.000+02:00","dcPower":973.7759889631144,"power":779.0207911704915,"sunTilt":28.55922255887939,"sunAzimuth":-31.06241498925654,"temperature":17,"relativehumidity_2m":85,"windspeed_10m":9},{"datetime":"2024-10-08T12:00:00.000+02:00","dcPower":1253.7838457017754,"power":1003.0270765614204,"sunTilt":32.19754822667087,"sunAzimuth":-14.26805544520534,"temperature":17.6,"relativehumidity_2m":82,"windspeed_10m":13.1},{"datetime":"2024-10-08T13:00:00.000+02:00","dcPower":1709.4582030972936,"power":1367.5665624778349,"sunTilt":33.07688907994966,"sunAzimuth":3.4399896103944245,"temperature":18.3,"relativehumidity_2m":73,"windspeed_10m":12.7},{"datetime":"2024-10-08T14:00:00.000+02:00","dcPower":1534.8297541086074,"power":1227.863803286886,"sunTilt":31.060677746554727,"sunAzimuth":20.90593811884074,"temperature":18.2,"relativehumidity_2m":71,"windspeed_10m":13.2},{"datetime":"2024-10-08T15:00:00.000+02:00","dcPower":1356.474994260473,"power":1085.1799954083785,"sunTilt":26.44928138282813,"sunAzimuth":37.11144846293623,"temperature":18.1,"relativehumidity_2m":71,"windspeed_10m":13.3},{"datetime":"2024-10-08T16:00:00.000+02:00","dcPower":863.9472141756544,"power":691.1577713405236,"sunTilt":19.81233269039211,"sunAzimuth":51.65943401571543,"temperature":17.4,"relativehumidity_2m":73,"windspeed_10m":9.2},{"datetime":"2024-10-08T17:00:00.000+02:00","dcPower":616.9390616093008,"power":493.55124928744067,"sunTilt":11.759033809196055,"sunAzimuth":64.72512518734406,"temperature":16.9,"relativehumidity_2m":75,"windspeed_10m":6.3},{"datetime":"2024-10-08T18:00:00.000+02:00","dcPower":352.2716884355315,"power":281.8173507484252,"sunTilt":2.818529310708217,"sunAzimuth":76.77774147088243,"temperature":16,"relativehumidity_2m":75,"windspeed_10m":8.6},{"datetime":"2024-10-08T19:00:00.000+02:00","dcPower":79.91850169407824,"power":63.9348013552626,"sunTilt":-6.569128186596377,"sunAzimuth":88.39036262615889,"temperature":15,"relativehumidity_2m":82,"windspeed_10m":5.8},{"datetime":"2024-10-08T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-16.00913432264249,"sunAzimuth":100.18418560559792,"temperature":14.5,"relativehumidity_2m":89,"windspeed_10m":4.7},{"datetime":"2024-10-08T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-25.087746753502067,"sunAzimuth":112.84624373263145,"temperature":14,"relativehumidity_2m":93,"windspeed_10m":8.4},{"datetime":"2024-10-08T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-33.29558919415396,"sunAzimuth":127.1457755347392,"temperature":14,"relativehumidity_2m":88,"windspeed_10m":8.6},{"datetime":"2024-10-08T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.95205668980692,"sunAzimuth":143.82353531827584,"temperature":13,"relativehumidity_2m":91,"windspeed_10m":7.2},{"datetime":"2024-10-09T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.20543351779722,"sunAzimuth":163.1411836959831,"temperature":12.6,"relativehumidity_2m":92,"windspeed_10m":7.8},{"datetime":"2024-10-09T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.27398595213309,"sunAzimuth":-175.8553370630724,"temperature":12.9,"relativehumidity_2m":91,"windspeed_10m":10.5},{"datetime":"2024-10-09T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.92193289241474,"sunAzimuth":-155.28812310014723,"temperature":12.7,"relativehumidity_2m":92,"windspeed_10m":10.5},{"datetime":"2024-10-09T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.64906836752005,"sunAzimuth":-136.94664669208646,"temperature":12.9,"relativehumidity_2m":91,"windspeed_10m":12.3},{"datetime":"2024-10-09T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.314619206373006,"sunAzimuth":-121.24604384005964,"temperature":12.9,"relativehumidity_2m":91,"windspeed_10m":10.2},{"datetime":"2024-10-09T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.71701795569338,"sunAzimuth":-107.65882183814558,"temperature":13.2,"relativehumidity_2m":90,"windspeed_10m":12.9},{"datetime":"2024-10-09T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.465322674764078,"sunAzimuth":-95.40351983003244,"temperature":13.3,"relativehumidity_2m":89,"windspeed_10m":13.5},{"datetime":"2024-10-09T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.023867147662328,"sunAzimuth":-83.74040781223535,"temperature":12.9,"relativehumidity_2m":92,"windspeed_10m":13.2},{"datetime":"2024-10-09T08:00:00.000+02:00","dcPower":1.0406185617178385,"power":0.8324948493742709,"sunTilt":6.207747953736028,"sunAzimuth":-72.01267721735641,"temperature":12.9,"relativehumidity_2m":92,"windspeed_10m":11.8},{"datetime":"2024-10-09T09:00:00.000+02:00","dcPower":56.142707531844685,"power":44.91416602547575,"sunTilt":14.82254636430179,"sunAzimuth":-59.62025856421435,"temperature":12.8,"relativehumidity_2m":93,"windspeed_10m":11.8},{"datetime":"2024-10-09T10:00:00.000+02:00","dcPower":178.65989116760815,"power":142.92791293408652,"sunTilt":22.348738640203063,"sunAzimuth":-46.023727432629336,"temperature":13.1,"relativehumidity_2m":91,"windspeed_10m":13.7},{"datetime":"2024-10-09T11:00:00.000+02:00","dcPower":364.3024142519385,"power":291.4419314015508,"sunTilt":28.22202694317921,"sunAzimuth":-30.847536638720733,"temperature":13.7,"relativehumidity_2m":92,"windspeed_10m":12.8},{"datetime":"2024-10-09T12:00:00.000+02:00","dcPower":541.4560120701284,"power":433.16480965610276,"sunTilt":31.832460658762763,"sunAzimuth":-14.118446086753368,"temperature":13.8,"relativehumidity_2m":91,"windspeed_10m":12},{"datetime":"2024-10-09T13:00:00.000+02:00","dcPower":498.7759057406506,"power":399.02072459252054,"sunTilt":32.69421193791607,"sunAzimuth":3.503957762689472,"temperature":14.2,"relativehumidity_2m":90,"windspeed_10m":11.5},{"datetime":"2024-10-09T14:00:00.000+02:00","dcPower":371.1850633611338,"power":296.9480506889071,"sunTilt":30.674814714273392,"sunAzimuth":20.883130296493302,"temperature":13.9,"relativehumidity_2m":91,"windspeed_10m":13.7},{"datetime":"2024-10-09T15:00:00.000+02:00","dcPower":211.70593908566224,"power":169.3647512685298,"sunTilt":26.07189945210854,"sunAzimuth":37.01947906146245,"temperature":13.8,"relativehumidity_2m":92,"windspeed_10m":13.8},{"datetime":"2024-10-09T16:00:00.000+02:00","dcPower":162.78835470536214,"power":130.23068376428972,"sunTilt":19.448663917806936,"sunAzimuth":51.521368716140636,"temperature":13.8,"relativehumidity_2m":91,"windspeed_10m":14.5},{"datetime":"2024-10-09T17:00:00.000+02:00","dcPower":108.77138997105102,"power":87.01711197684082,"sunTilt":11.408678227135676,"sunAzimuth":64.55938454107346,"temperature":13.5,"relativehumidity_2m":90,"windspeed_10m":15.8},{"datetime":"2024-10-09T18:00:00.000+02:00","dcPower":64.83235444876868,"power":51.86588355901495,"sunTilt":2.4777195309842384,"sunAzimuth":76.59614824640437,"temperature":13.4,"relativehumidity_2m":92,"windspeed_10m":13.4},{"datetime":"2024-10-09T19:00:00.000+02:00","dcPower":14.529021929144772,"power":11.623217543315818,"sunTilt":-6.905853552820109,"sunAzimuth":88.20032142925027,"temperature":13.6,"relativehumidity_2m":93,"windspeed_10m":14.5},{"datetime":"2024-10-09T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-16.348052794342024,"sunAzimuth":99.99195941586059,"temperature":13.7,"relativehumidity_2m":94,"windspeed_10m":15.3},{"datetime":"2024-10-09T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-25.43533401280622,"sunAzimuth":112.66096568522038,"temperature":14,"relativehumidity_2m":93,"windspeed_10m":15.5},{"datetime":"2024-10-09T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-33.657312701408955,"sunAzimuth":126.98495418142949,"temperature":14.2,"relativehumidity_2m":93,"windspeed_10m":14.3},{"datetime":"2024-10-09T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-40.32941598688323,"sunAzimuth":143.71902473598436,"temperature":14.8,"relativehumidity_2m":90,"windspeed_10m":17.6},{"datetime":"2024-10-10T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.59106942107243,"sunAzimuth":163.13616076353475,"temperature":15.3,"relativehumidity_2m":89,"windspeed_10m":16.9},{"datetime":"2024-10-10T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.65007030458014,"sunAzimuth":-175.73407816523158,"temperature":15,"relativehumidity_2m":92,"windspeed_10m":15.1},{"datetime":"2024-10-10T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.26979987634531,"sunAzimuth":-155.060585251648,"temperature":14.9,"relativehumidity_2m":91,"windspeed_10m":15.3},{"datetime":"2024-10-10T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.96158240518052,"sunAzimuth":-136.66110792848332,"temperature":13.8,"relativehumidity_2m":97,"windspeed_10m":18.8},{"datetime":"2024-10-10T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.59647297796838,"sunAzimuth":-120.94117758387233,"temperature":12.4,"relativehumidity_2m":94,"windspeed_10m":25.6},{"datetime":"2024-10-10T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.97820409915596,"sunAzimuth":-107.35365077473413,"temperature":12.1,"relativehumidity_2m":92,"windspeed_10m":22.8},{"datetime":"2024-10-10T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.716704637744286,"sunAzimuth":-95.1044343497123,"temperature":12,"relativehumidity_2m":95,"windspeed_10m":19.5},{"datetime":"2024-10-10T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.275734703378654,"sunAzimuth":-83.4485894065161,"temperature":11.8,"relativehumidity_2m":93,"windspeed_10m":17.2},{"datetime":"2024-10-10T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":5.945826827444097,"sunAzimuth":-71.72880701980833,"temperature":12.1,"relativehumidity_2m":95,"windspeed_10m":16.3},{"datetime":"2024-10-10T09:00:00.000+02:00","dcPower":28.679605119169743,"power":22.943684095335797,"sunTilt":14.541778076840487,"sunAzimuth":-59.34793757422427,"temperature":12.1,"relativehumidity_2m":94,"windspeed_10m":14.7},{"datetime":"2024-10-10T10:00:00.000+02:00","dcPower":84.33498019934706,"power":67.46798415947765,"sunTilt":22.041831409435048,"sunAzimuth":-45.7728048820313,"temperature":12.2,"relativehumidity_2m":92,"windspeed_10m":15},{"datetime":"2024-10-10T11:00:00.000+02:00","dcPower":156.79561502122667,"power":125.43649201698133,"sunTilt":27.885174335468335,"sunAzimuth":-30.63663127573816,"temperature":12.5,"relativehumidity_2m":92,"windspeed_10m":15.7},{"datetime":"2024-10-10T12:00:00.000+02:00","dcPower":752.5340778483028,"power":602.0272622786423,"sunTilt":31.46827419380231,"sunAzimuth":-13.972554382839954,"temperature":12.8,"relativehumidity_2m":89,"windspeed_10m":18.5},{"datetime":"2024-10-10T13:00:00.000+02:00","dcPower":442.48615809817903,"power":353.98892647854325,"sunTilt":32.31297830760232,"sunAzimuth":3.5651067967559134,"temperature":12.3,"relativehumidity_2m":91,"windspeed_10m":17.7},{"datetime":"2024-10-10T14:00:00.000+02:00","dcPower":1051.0549131692967,"power":840.8439305354374,"sunTilt":30.29076264178465,"sunAzimuth":20.858636821509823,"temperature":13.1,"relativehumidity_2m":87,"windspeed_10m":16},{"datetime":"2024-10-10T15:00:00.000+02:00","dcPower":1158.2998809674602,"power":926.6399047739683,"sunTilt":25.696518065354862,"sunAzimuth":36.92666158608413,"temperature":13.2,"relativehumidity_2m":86,"windspeed_10m":15.1},{"datetime":"2024-10-10T16:00:00.000+02:00","dcPower":635.9116798103347,"power":508.7293438482678,"sunTilt":19.087103602605772,"sunAzimuth":51.382837136526646,"temperature":13,"relativehumidity_2m":81,"windspeed_10m":15.1},{"datetime":"2024-10-10T17:00:00.000+02:00","dcPower":499.23307173700306,"power":399.38645738960247,"sunTilt":11.060531491249431,"sunAzimuth":64.39321702308736,"temperature":12.8,"relativehumidity_2m":75,"windspeed_10m":13.3},{"datetime":"2024-10-10T18:00:00.000+02:00","dcPower":333.928005717175,"power":267.14240457374,"sunTilt":2.1392339596675116,"sunAzimuth":76.4139573135511,"temperature":12.3,"relativehumidity_2m":79,"windspeed_10m":12.2},{"datetime":"2024-10-10T19:00:00.000+02:00","dcPower":61.72489409515999,"power":49.379915276127996,"sunTilt":-7.240134220715796,"sunAzimuth":88.00936653945188,"temperature":11,"relativehumidity_2m":80,"windspeed_10m":7},{"datetime":"2024-10-10T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-16.684429132286564,"sunAzimuth":99.79837109714164,"temperature":10.6,"relativehumidity_2m":84,"windspeed_10m":5.2},{"datetime":"2024-10-10T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-25.780350237977437,"sunAzimuth":112.47374911967749,"temperature":10.1,"relativehumidity_2m":85,"windspeed_10m":4.3},{"datetime":"2024-10-10T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-34.01656707008997,"sunAzimuth":126.82157256673277,"temperature":10.2,"relativehumidity_2m":84,"windspeed_10m":9.2},{"datetime":"2024-10-10T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-40.704586491662205,"sunAzimuth":143.61159893587703,"temperature":9.8,"relativehumidity_2m":90,"windspeed_10m":7.9},{"datetime":"2024-10-11T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.97491243886403,"sunAzimuth":163.128648637255,"temperature":9.3,"relativehumidity_2m":92,"windspeed_10m":10.8},{"datetime":"2024-10-11T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.02467456169168,"sunAzimuth":-175.6141848122969,"temperature":8.9,"relativehumidity_2m":94,"windspeed_10m":8.7},{"datetime":"2024-10-11T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.61635732682025,"sunAzimuth":-154.8336646265192,"temperature":8.3,"relativehumidity_2m":91,"windspeed_10m":2.9},{"datetime":"2024-10-11T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-38.27297819203817,"sunAzimuth":-136.37626404685486,"temperature":8.3,"relativehumidity_2m":93,"windspeed_10m":3.6},{"datetime":"2024-10-11T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.877497329298222,"sunAzimuth":-120.63744534201388,"temperature":8.3,"relativehumidity_2m":95,"windspeed_10m":8.7},{"datetime":"2024-10-11T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-22.238894548955713,"sunAzimuth":-107.05006215076084,"temperature":8.3,"relativehumidity_2m":98,"windspeed_10m":6.5},{"datetime":"2024-10-11T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.96790216264699,"sunAzimuth":-94.80732853145587,"temperature":8.3,"relativehumidity_2m":96,"windspeed_10m":8.6},{"datetime":"2024-10-11T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.5276603134629134,"sunAzimuth":-83.1591411410959,"temperature":7.9,"relativehumidity_2m":95,"windspeed_10m":7.8},{"datetime":"2024-10-11T08:00:00.000+02:00","dcPower":1.0600042231633038,"power":0.8480033785306431,"sunTilt":5.683710585945252,"sunAzimuth":-71.44774052199065,"temperature":7.5,"relativehumidity_2m":96,"windspeed_10m":6.9},{"datetime":"2024-10-11T09:00:00.000+02:00","dcPower":132.00210321891544,"power":105.60168257513236,"sunTilt":14.260824082236146,"sunAzimuth":-59.0789120948653,"temperature":7.8,"relativehumidity_2m":93,"windspeed_10m":8.6},{"datetime":"2024-10-11T10:00:00.000+02:00","dcPower":462.0210524027087,"power":369.61684192216694,"sunTilt":21.734940400779433,"sunAzimuth":-45.525661029390804,"temperature":8.1,"relativehumidity_2m":89,"windspeed_10m":8.2},{"datetime":"2024-10-11T11:00:00.000+02:00","dcPower":1798.689582839002,"power":1438.9516662712017,"sunTilt":27.54875518315372,"sunAzimuth":-30.429767533564867,"temperature":9,"relativehumidity_2m":84,"windspeed_10m":7.6},{"datetime":"2024-10-11T12:00:00.000+02:00","dcPower":1894.8011928812136,"power":1515.840954304971,"sunTilt":31.105090976135774,"sunAzimuth":-13.830431372703888,"temperature":9.8,"relativehumidity_2m":79,"windspeed_10m":7.4},{"datetime":"2024-10-11T13:00:00.000+02:00","dcPower":1985.9627540265499,"power":1588.77020322124,"sunTilt":31.9332985100557,"sunAzimuth":3.6233914143032355,"temperature":10.3,"relativehumidity_2m":74,"windspeed_10m":6.5},{"datetime":"2024-10-11T14:00:00.000+02:00","dcPower":2210.0949240181085,"power":1768.0759392144869,"sunTilt":29.908639212205873,"sunAzimuth":20.83241114244682,"temperature":10.8,"relativehumidity_2m":71,"windspeed_10m":5.1},{"datetime":"2024-10-11T15:00:00.000+02:00","dcPower":2011.3085922284695,"power":1609.0468737827757,"sunTilt":25.3232617284627,"sunAzimuth":36.83295334168066,"temperature":11.1,"relativehumidity_2m":69,"windspeed_10m":4.3},{"datetime":"2024-10-11T16:00:00.000+02:00","dcPower":648.2559726986733,"power":518.6047781589386,"sunTilt":18.727781114603793,"sunAzimuth":51.243806920166435,"temperature":11.2,"relativehumidity_2m":68,"windspeed_10m":4},{"datetime":"2024-10-11T17:00:00.000+02:00","dcPower":560.3066399417806,"power":448.24531195342456,"sunTilt":10.714725694488843,"sunAzimuth":64.22660182758023,"temperature":10.9,"relativehumidity_2m":71,"windspeed_10m":4.1},{"datetime":"2024-10-11T18:00:00.000+02:00","dcPower":298.6186217115864,"power":238.89489736926913,"sunTilt":1.803206213409536,"sunAzimuth":76.23115674859116,"temperature":10.3,"relativehumidity_2m":77,"windspeed_10m":0.5},{"datetime":"2024-10-11T19:00:00.000+02:00","dcPower":62.17166718764051,"power":49.73733375011241,"sunTilt":-7.571835214892863,"sunAzimuth":87.81749031617603,"temperature":9,"relativehumidity_2m":79,"windspeed_10m":1.9},{"datetime":"2024-10-11T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-17.0181265759899,"sunAzimuth":99.60341073267222,"temperature":7.9,"relativehumidity_2m":83,"windspeed_10m":2.4},{"datetime":"2024-10-11T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-26.122656701936815,"sunAzimuth":112.28457164140065,"temperature":7,"relativehumidity_2m":85,"windspeed_10m":2.9},{"datetime":"2024-10-11T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-34.37321335134456,"sunAzimuth":126.65558045028693,"temperature":6.5,"relativehumidity_2m":86,"windspeed_10m":3},{"datetime":"2024-10-11T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.07743516418665,"sunAzimuth":143.5011643499793,"temperature":6,"relativehumidity_2m":88,"windspeed_10m":3.3},{"datetime":"2024-10-12T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.35684572865986,"sunAzimuth":163.11851362268473,"temperature":5.4,"relativehumidity_2m":89,"windspeed_10m":4.8},{"datetime":"2024-10-12T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.397705346785955,"sunAzimuth":-175.49580600360676,"temperature":5.1,"relativehumidity_2m":90,"windspeed_10m":4.7},{"datetime":"2024-10-12T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.961535734103165,"sunAzimuth":-154.60751324634,"temperature":4.9,"relativehumidity_2m":90,"windspeed_10m":5.1},{"datetime":"2024-10-12T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-38.58320673599567,"sunAzimuth":-136.09226665392447,"temperature":4.9,"relativehumidity_2m":91,"windspeed_10m":5.1},{"datetime":"2024-10-12T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.157657336040163,"sunAzimuth":-120.33499159290702,"temperature":4.9,"relativehumidity_2m":91,"windspeed_10m":5.4},{"datetime":"2024-10-12T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-22.499060815350038,"sunAzimuth":-106.7481901878237,"temperature":4.8,"relativehumidity_2m":91,"windspeed_10m":5},{"datetime":"2024-10-12T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.218886384957228,"sunAzimuth":-94.51232726794028,"temperature":4.6,"relativehumidity_2m":91,"windspeed_10m":5.4},{"datetime":"2024-10-12T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.77960910849284,"sunAzimuth":-82.87218040699524,"temperature":4.5,"relativehumidity_2m":91,"windspeed_10m":5.4},{"datetime":"2024-10-12T08:00:00.000+02:00","dcPower":1.070056047616508,"power":0.8560448380932064,"sunTilt":5.421444806545091,"sunAzimuth":-71.16958809655219,"temperature":4.7,"relativehumidity_2m":92,"windspeed_10m":6.6},{"datetime":"2024-10-12T09:00:00.000+02:00","dcPower":197.4003911897386,"power":157.9203129517909,"sunTilt":13.979744388367903,"sunAzimuth":-58.8132832097472,"temperature":5.9,"relativehumidity_2m":90,"windspeed_10m":7.9},{"datetime":"2024-10-12T10:00:00.000+02:00","dcPower":550.3000645182516,"power":440.24005161460127,"sunTilt":21.42814200059926,"sunAzimuth":-45.28238230412684,"temperature":7.3,"relativehumidity_2m":87,"windspeed_10m":9.9},{"datetime":"2024-10-12T11:00:00.000+02:00","dcPower":962.495254869171,"power":769.9962038953369,"sunTilt":27.21286115693797,"sunAzimuth":-30.227011858140273,"temperature":8.4,"relativehumidity_2m":87,"windspeed_10m":10.4},{"datetime":"2024-10-12T12:00:00.000+02:00","dcPower":1839.8932783620644,"power":1471.9146226896517,"sunTilt":30.743014004100917,"sunAzimuth":-13.692125978099353,"temperature":10.1,"relativehumidity_2m":82,"windspeed_10m":12.3},{"datetime":"2024-10-12T13:00:00.000+02:00","dcPower":1693.6453312654874,"power":1354.9162650123899,"sunTilt":31.555283363449327,"sunAzimuth":3.6787683789403496,"temperature":10.6,"relativehumidity_2m":81,"windspeed_10m":12.4},{"datetime":"2024-10-12T14:00:00.000+02:00","dcPower":1646.0264815435514,"power":1316.8211852348413,"sunTilt":29.52856227644022,"sunAzimuth":20.80440880713897,"temperature":11.2,"relativehumidity_2m":80,"windspeed_10m":11.3},{"datetime":"2024-10-12T15:00:00.000+02:00","dcPower":1236.85137350003,"power":989.481098800024,"sunTilt":24.95225483898691,"sunAzimuth":36.7383136221432,"temperature":11.7,"relativehumidity_2m":80,"windspeed_10m":9.7},{"datetime":"2024-10-12T16:00:00.000+02:00","dcPower":741.2076560280071,"power":592.9661248224057,"sunTilt":18.37082552430316,"sunAzimuth":51.10424752804786,"temperature":11.5,"relativehumidity_2m":82,"windspeed_10m":8.4},{"datetime":"2024-10-12T17:00:00.000+02:00","dcPower":487.7543072254275,"power":390.203445780342,"sunTilt":10.371392509810583,"sunAzimuth":64.05951991866706,"temperature":11.1,"relativehumidity_2m":84,"windspeed_10m":9.4},{"datetime":"2024-10-12T18:00:00.000+02:00","dcPower":176.62539380738255,"power":141.30031504590605,"sunTilt":1.4697694157713943,"sunAzimuth":76.0477365277625,"temperature":10.5,"relativehumidity_2m":87,"windspeed_10m":8.4},{"datetime":"2024-10-12T19:00:00.000+02:00","dcPower":27.32951530385693,"power":21.863612243085544,"sunTilt":-7.900822080898683,"sunAzimuth":87.62468730812897,"temperature":9.8,"relativehumidity_2m":90,"windspeed_10m":8.5},{"datetime":"2024-10-12T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-17.349008833561726,"sunAzimuth":99.4070709783674,"temperature":9.6,"relativehumidity_2m":92,"windspeed_10m":8.6},{"datetime":"2024-10-12T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-26.462114969564762,"sunAzimuth":112.09341375841275,"temperature":9.6,"relativehumidity_2m":92,"windspeed_10m":9.2},{"datetime":"2024-10-12T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-34.7271125456906,"sunAzimuth":126.48693033734844,"temperature":9.7,"relativehumidity_2m":92,"windspeed_10m":8},{"datetime":"2024-10-12T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.447828525061254,"sunAzimuth":143.38762883737587,"temperature":9.4,"relativehumidity_2m":94,"windspeed_10m":7.3},{"datetime":"2024-10-13T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.73675190204195,"sunAzimuth":163.1056210331007,"temperature":9.3,"relativehumidity_2m":94,"windspeed_10m":6.5},{"datetime":"2024-10-13T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.76906905918878,"sunAzimuth":-175.37909348313417,"temperature":9.1,"relativehumidity_2m":94,"windspeed_10m":7.4},{"datetime":"2024-10-13T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.30526573902631,"sunAzimuth":-154.3822860597556,"temperature":9.5,"relativehumidity_2m":92,"windspeed_10m":10},{"datetime":"2024-10-13T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-38.89221927072221,"sunAzimuth":-135.80926949668307,"temperature":9.6,"relativehumidity_2m":90,"windspeed_10m":16.3},{"datetime":"2024-10-13T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.436918053719957,"sunAzimuth":-120.03396199414307,"temperature":8.8,"relativehumidity_2m":87,"windspeed_10m":18},{"datetime":"2024-10-13T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-22.75867399010402,"sunAzimuth":-106.44816955814555,"temperature":8.4,"relativehumidity_2m":87,"windspeed_10m":15.5},{"datetime":"2024-10-13T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.469627601285604,"sunAzimuth":-94.21955537307969,"temperature":7.5,"relativehumidity_2m":83,"windspeed_10m":17},{"datetime":"2024-10-13T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.0315450153141486,"sunAzimuth":-82.58782406375519,"temperature":7.2,"relativehumidity_2m":82,"windspeed_10m":16.2},{"datetime":"2024-10-13T08:00:00.000+02:00","dcPower":1.0628761730070764,"power":0.8503009384056611,"sunTilt":5.159076534957485,"sunAzimuth":-70.89445910846419,"temperature":6.7,"relativehumidity_2m":84,"windspeed_10m":16.8},{"datetime":"2024-10-13T09:00:00.000+02:00","dcPower":145.59209961839045,"power":116.47367969471236,"sunTilt":13.698600583367673,"sunAzimuth":-58.55115047580995,"temperature":6.9,"relativehumidity_2m":86,"windspeed_10m":15.5},{"datetime":"2024-10-13T10:00:00.000+02:00","dcPower":420.1869623239068,"power":336.14956985912545,"sunTilt":21.12151408595382,"sunAzimuth":-45.043053146408546,"temperature":7.5,"relativehumidity_2m":83,"windspeed_10m":22.7},{"datetime":"2024-10-13T11:00:00.000+02:00","dcPower":522.9364319872756,"power":418.34914558982047,"sunTilt":26.877585132999467,"sunAzimuth":-30.028428502780528,"temperature":8.1,"relativehumidity_2m":83,"windspeed_10m":19.5},{"datetime":"2024-10-13T12:00:00.000+02:00","dcPower":928.7775408499571,"power":743.0220326799657,"sunTilt":30.382147107830978,"sunAzimuth":-13.557685005032592,"temperature":8.5,"relativehumidity_2m":82,"windspeed_10m":18.9},{"datetime":"2024-10-13T13:00:00.000+02:00","dcPower":1538.0761562598432,"power":1230.4609250078747,"sunTilt":31.17904416002473,"sunAzimuth":3.731196531846679,"temperature":9.4,"relativehumidity_2m":79,"windspeed_10m":19.1},{"datetime":"2024-10-13T14:00:00.000+02:00","dcPower":1689.2405941284853,"power":1351.3924753027884,"sunTilt":29.150649828823855,"sunAzimuth":20.774587486422366,"temperature":10.4,"relativehumidity_2m":75,"windspeed_10m":17.7},{"datetime":"2024-10-13T15:00:00.000+02:00","dcPower":1654.777719219827,"power":1323.8221753758617,"sunTilt":24.583621654336596,"sunAzimuth":36.642703763191776,"temperature":10.3,"relativehumidity_2m":74,"windspeed_10m":17.6},{"datetime":"2024-10-13T16:00:00.000+02:00","dcPower":748.7985198938329,"power":599.0388159150664,"sunTilt":18.016365562424813,"sunAzimuth":50.96413031013026,"temperature":10.3,"relativehumidity_2m":77,"windspeed_10m":15.1},{"datetime":"2024-10-13T17:00:00.000+02:00","dcPower":555.8420628793457,"power":444.67365030347656,"sunTilt":10.030663139779685,"sunAzimuth":63.89195411454739,"temperature":9.9,"relativehumidity_2m":79,"windspeed_10m":13.7},{"datetime":"2024-10-13T18:00:00.000+02:00","dcPower":230.90863388928312,"power":184.7269071114265,"sunTilt":1.1390561362362333,"sunAzimuth":75.8636886240363,"temperature":9.1,"relativehumidity_2m":82,"windspeed_10m":10.8},{"datetime":"2024-10-13T19:00:00.000+02:00","dcPower":31.697596783778167,"power":25.358077427022536,"sunTilt":-8.226960953264081,"sunAzimuth":87.43095436456028,"temperature":8.3,"relativehumidity_2m":87,"windspeed_10m":6.2},{"datetime":"2024-10-13T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-17.676940156857277,"sunAzimuth":99.2093472034457,"temperature":8.1,"relativehumidity_2m":87,"windspeed_10m":6.4},{"datetime":"2024-10-13T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-26.79858696849319,"sunAzimuth":111.90025906076745,"temperature":7.6,"relativehumidity_2m":90,"windspeed_10m":6.8},{"datetime":"2024-10-13T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-35.0781256664598,"sunAzimuth":126.3155777234557,"temperature":7.1,"relativehumidity_2m":90,"windspeed_10m":5},{"datetime":"2024-10-13T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.815632684929426,"sunAzimuth":143.2709019404984,"temperature":6.5,"relativehumidity_2m":91,"windspeed_10m":2.6},{"datetime":"2024-10-14T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.11451301786215,"sunAzimuth":163.08983536166957,"temperature":6.3,"relativehumidity_2m":89,"windspeed_10m":2.4},{"datetime":"2024-10-14T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.138671848584934,"sunAzimuth":-175.2642016873541,"temperature":5.8,"relativehumidity_2m":89,"windspeed_10m":1.5},{"datetime":"2024-10-14T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.647478099904184,"sunAzimuth":-154.15814092455744,"temperature":5.3,"relativehumidity_2m":90,"windspeed_10m":4},{"datetime":"2024-10-14T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.1999672120048,"sunAzimuth":-135.52742842855076,"temperature":4.5,"relativehumidity_2m":93,"windspeed_10m":1.5},{"datetime":"2024-10-14T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.715244466780028,"sunAzimuth":-119.73450334119632,"temperature":4,"relativehumidity_2m":94,"windspeed_10m":4.5},{"datetime":"2024-10-14T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.01770469074795,"sunAzimuth":-106.15013533780943,"temperature":3.8,"relativehumidity_2m":94,"windspeed_10m":4.7},{"datetime":"2024-10-14T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.720095220219516,"sunAzimuth":-93.92913753819082,"temperature":4.2,"relativehumidity_2m":94,"windspeed_10m":5.8},{"datetime":"2024-10-14T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.283430715645694,"sunAzimuth":-82.30618839226909,"temperature":4.7,"relativehumidity_2m":94,"windspeed_10m":4.7},{"datetime":"2024-10-14T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.896654311121907,"sunAzimuth":-70.62246187023919,"temperature":5.1,"relativehumidity_2m":93,"windspeed_10m":4.3},{"datetime":"2024-10-14T09:00:00.000+02:00","dcPower":132.97359671714773,"power":106.37887737371818,"sunTilt":13.417455844515738,"sunAzimuth":-58.29261188464403,"temperature":5.6,"relativehumidity_2m":92,"windspeed_10m":3.8},{"datetime":"2024-10-14T10:00:00.000+02:00","dcPower":405.59211479841304,"power":324.4736918387305,"sunTilt":20.815136015137117,"sunAzimuth":-44.807755986987566,"temperature":6.7,"relativehumidity_2m":87,"windspeed_10m":6.2},{"datetime":"2024-10-14T11:00:00.000+02:00","dcPower":616.8979931513162,"power":493.518394521053,"sunTilt":26.543021174019792,"sunAzimuth":-29.83407952105961,"temperature":7.5,"relativehumidity_2m":85,"windspeed_10m":10.1},{"datetime":"2024-10-14T12:00:00.000+02:00","dcPower":544.0337398355801,"power":435.22699186846415,"sunTilt":30.022594925866507,"sunAzimuth":-13.427153142476177,"temperature":7.8,"relativehumidity_2m":87,"windspeed_10m":7.4},{"datetime":"2024-10-14T13:00:00.000+02:00","dcPower":757.6272986491891,"power":606.1018389193513,"sunTilt":30.804692641790414,"sunAzimuth":3.780636799023051,"temperature":8.7,"relativehumidity_2m":84,"windspeed_10m":9.4},{"datetime":"2024-10-14T14:00:00.000+02:00","dcPower":802.6332382442511,"power":642.1065905954009,"sunTilt":28.775019978770835,"sunAzimuth":20.742907009369926,"temperature":8.8,"relativehumidity_2m":83,"windspeed_10m":7.7},{"datetime":"2024-10-14T15:00:00.000+02:00","dcPower":727.2477881703447,"power":581.7982305362758,"sunTilt":24.217486258022436,"sunAzimuth":36.546087194880954,"temperature":8.8,"relativehumidity_2m":85,"windspeed_10m":6.5},{"datetime":"2024-10-14T16:00:00.000+02:00","dcPower":588.679937715913,"power":470.9439501727304,"sunTilt":17.664529576020236,"sunAzimuth":50.82342857831685,"temperature":8.7,"relativehumidity_2m":88,"windspeed_10m":5.2},{"datetime":"2024-10-14T17:00:00.000+02:00","dcPower":408.4315746861509,"power":326.7452597489207,"sunTilt":9.692668263612882,"sunAzimuth":63.7238891712367,"temperature":8.4,"relativehumidity_2m":90,"windspeed_10m":3.6},{"datetime":"2024-10-14T18:00:00.000+02:00","dcPower":189.55947192037354,"power":151.64757753629883,"sunTilt":0.8111983279457368,"sunAzimuth":75.67900710147994,"temperature":8.2,"relativehumidity_2m":91,"windspeed_10m":1.8},{"datetime":"2024-10-14T19:00:00.000+02:00","dcPower":31.73574416203751,"power":25.388595329630007,"sunTilt":-8.5501186243532,"sunAzimuth":87.23629074336492,"temperature":7.9,"relativehumidity_2m":93,"windspeed_10m":0.4},{"datetime":"2024-10-14T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.00178541748869,"sunAzimuth":99.01023762777291,"temperature":7.4,"relativehumidity_2m":94,"windspeed_10m":1.1},{"datetime":"2024-10-14T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-27.131935065748255,"sunAzimuth":111.70509440468732,"temperature":6.7,"relativehumidity_2m":96,"windspeed_10m":1.1},{"datetime":"2024-10-14T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-35.426113802819536,"sunAzimuth":126.14148133580082,"temperature":5.8,"relativehumidity_2m":98,"windspeed_10m":0.4},{"datetime":"2024-10-14T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.180713378529184,"sunAzimuth":143.15089515757862,"temperature":5,"relativehumidity_2m":100,"windspeed_10m":0.7},{"datetime":"2024-10-15T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.49001057641694,"sunAzimuth":163.07102046565072,"temperature":4.3,"relativehumidity_2m":100,"windspeed_10m":1.4},{"datetime":"2024-10-15T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.506419588733614,"sunAzimuth":-175.15128768425117,"temperature":3.8,"relativehumidity_2m":100,"windspeed_10m":1.9},{"datetime":"2024-10-15T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.988103658491234,"sunAzimuth":-153.9352385869432,"temperature":3.2,"relativehumidity_2m":100,"windspeed_10m":2.6},{"datetime":"2024-10-15T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.50640211284843,"sunAzimuth":-135.24690137263536,"temperature":2.4,"relativehumidity_2m":100,"windspeed_10m":2.9},{"datetime":"2024-10-15T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.992601433814595,"sunAzimuth":-119.43676351875516,"temperature":1.6,"relativehumidity_2m":100,"windspeed_10m":3.2},{"datetime":"2024-10-15T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.276123004228086,"sunAzimuth":-105.85422295783262,"temperature":1.2,"relativehumidity_2m":100,"windspeed_10m":3.6},{"datetime":"2024-10-15T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.970257710966642,"sunAzimuth":-93.64119828341282,"temperature":1.2,"relativehumidity_2m":100,"windspeed_10m":3.6},{"datetime":"2024-10-15T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.5352276078301,"sunAzimuth":-82.02738904900566,"temperature":1.6,"relativehumidity_2m":100,"windspeed_10m":3.6},{"datetime":"2024-10-15T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.63422819396966,"sunAzimuth":-70.35370359566531,"temperature":2.3,"relativehumidity_2m":100,"windspeed_10m":4},{"datetime":"2024-10-15T09:00:00.000+02:00","dcPower":160.7609025328025,"power":128.60872202624202,"sunTilt":13.136374944499462,"sunAzimuth":-58.037763824819606,"temperature":3.4,"relativehumidity_2m":98,"windspeed_10m":5},{"datetime":"2024-10-15T10:00:00.000+02:00","dcPower":455.71724945435693,"power":364.5737995634856,"sunTilt":20.50908861823578,"sunAzimuth":-44.57657122307415,"temperature":4.8,"relativehumidity_2m":94,"windspeed_10m":6.2},{"datetime":"2024-10-15T11:00:00.000+02:00","dcPower":687.0836404217806,"power":549.6669123374245,"sunTilt":26.20926450679345,"sunAzimuth":-29.644024765315514,"temperature":6.3,"relativehumidity_2m":91,"windspeed_10m":7.8},{"datetime":"2024-10-15T12:00:00.000+02:00","dcPower":1904.2142151339715,"power":1523.3713721071772,"sunTilt":29.66446288060627,"sunAzimuth":-13.300572957692536,"temperature":8,"relativehumidity_2m":88,"windspeed_10m":9.2},{"datetime":"2024-10-15T13:00:00.000+02:00","dcPower":2323.589968212759,"power":1858.8719745702072,"sunTilt":30.43234097439692,"sunAzimuth":3.8270522061418095,"temperature":9.7,"relativehumidity_2m":84,"windspeed_10m":10.9},{"datetime":"2024-10-15T14:00:00.000+02:00","dcPower":2439.6345315420713,"power":1951.7076252336572,"sunTilt":28.401790922595836,"sunAzimuth":20.709329389098386,"temperature":10.8,"relativehumidity_2m":82,"windspeed_10m":11.9},{"datetime":"2024-10-15T15:00:00.000+02:00","dcPower":2183.596181552923,"power":1746.8769452423385,"sunTilt":23.853972526435296,"sunAzimuth":36.448429487078144,"temperature":11.2,"relativehumidity_2m":81,"windspeed_10m":11.9},{"datetime":"2024-10-15T16:00:00.000+02:00","dcPower":610.6314730323843,"power":488.50517842590745,"sunTilt":17.315445485866938,"sunAzimuth":50.682117672382816,"temperature":11,"relativehumidity_2m":81,"windspeed_10m":11},{"datetime":"2024-10-15T17:00:00.000+02:00","dcPower":452.43008429729906,"power":361.9440674378393,"sunTilt":9.35753798215806,"sunAzimuth":63.55531186506398,"temperature":10.6,"relativehumidity_2m":82,"windspeed_10m":11.1},{"datetime":"2024-10-15T18:00:00.000+02:00","dcPower":246.26795036997265,"power":197.01436029597812,"sunTilt":0.48632726290863104,"sunAzimuth":75.49368820866877,"temperature":9.7,"relativehumidity_2m":85,"windspeed_10m":12.1},{"datetime":"2024-10-15T19:00:00.000+02:00","dcPower":52.82473341173196,"power":42.259786729385574,"sunTilt":-8.870162619560801,"sunAzimuth":87.04069822248259,"temperature":8.5,"relativehumidity_2m":88,"windspeed_10m":13.6},{"datetime":"2024-10-15T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.323410184499085,"sunAzimuth":98.80974345652376,"temperature":7.6,"relativehumidity_2m":91,"windspeed_10m":14.3},{"datetime":"2024-10-15T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-27.462022150796383,"sunAzimuth":111.50791010170794,"temperature":7.2,"relativehumidity_2m":91,"windspeed_10m":13.9},{"datetime":"2024-10-15T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-35.770938188604354,"sunAzimuth":125.96460338334036,"temperature":7,"relativehumidity_2m":91,"windspeed_10m":12.9},{"datetime":"2024-10-15T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.54293600102064,"sunAzimuth":143.02752222319543,"temperature":6.8,"relativehumidity_2m":89,"windspeed_10m":12.7},{"datetime":"2024-10-16T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.86312551477473,"sunAzimuth":163.04903976266138,"temperature":6.7,"relativehumidity_2m":86,"windspeed_10m":13.8},{"datetime":"2024-10-16T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.87221785059982,"sunAzimuth":-175.04051110279474,"temperature":6.8,"relativehumidity_2m":83,"windspeed_10m":15.6},{"datetime":"2024-10-16T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.32707330350441,"sunAzimuth":-153.71374265034802,"temperature":6.8,"relativehumidity_2m":80,"windspeed_10m":16.5},{"datetime":"2024-10-16T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.81147561550361,"sunAzimuth":-134.96784827714956,"temperature":7,"relativehumidity_2m":78,"windspeed_10m":16.1},{"datetime":"2024-10-16T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.26895363243685,"sunAzimuth":-119.1408914506387,"temperature":7.3,"relativehumidity_2m":77,"windspeed_10m":15.1},{"datetime":"2024-10-16T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.53389843309148,"sunAzimuth":-105.56056815727264,"temperature":7.4,"relativehumidity_2m":75,"windspeed_10m":14.3},{"datetime":"2024-10-16T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-14.220082554609817,"sunAzimuth":-93.355861910257,"temperature":7.4,"relativehumidity_2m":73,"windspeed_10m":14.3},{"datetime":"2024-10-16T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.786895768698711,"sunAzimuth":-81.75154101774274,"temperature":7.3,"relativehumidity_2m":71,"windspeed_10m":14.7},{"datetime":"2024-10-16T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.371849783596975,"sunAzimuth":-70.08829035405888,"temperature":7.2,"relativehumidity_2m":70,"windspeed_10m":14.8},{"datetime":"2024-10-16T09:00:00.000+02:00","dcPower":120.67880138508733,"power":96.54304110806987,"sunTilt":12.855424254104108,"sunAzimuth":-57.78670104663053,"temperature":9.8,"relativehumidity_2m":72,"windspeed_10m":17},{"datetime":"2024-10-16T10:00:00.000+02:00","dcPower":349.2545941544614,"power":279.40367532356913,"sunTilt":20.203454185088123,"sunAzimuth":-44.34957719582011,"temperature":10.2,"relativehumidity_2m":75,"windspeed_10m":16.5},{"datetime":"2024-10-16T11:00:00.000+02:00","dcPower":549.0777204410166,"power":439.2621763528133,"sunTilt":25.87641150088954,"sunAzimuth":-29.45832187587005,"temperature":10.7,"relativehumidity_2m":77,"windspeed_10m":16.2},{"datetime":"2024-10-16T12:00:00.000+02:00","dcPower":1293.9533240813814,"power":1035.1626592651053,"sunTilt":29.30785715204484,"sunAzimuth":-13.177984892004138,"temperature":11.6,"relativehumidity_2m":77,"windspeed_10m":15.7},{"datetime":"2024-10-16T13:00:00.000+02:00","dcPower":1629.0729841502784,"power":1303.258387320223,"sunTilt":30.062101719417093,"sunAzimuth":3.870407893111919,"temperature":12.5,"relativehumidity_2m":75,"windspeed_10m":15.3},{"datetime":"2024-10-16T14:00:00.000+02:00","dcPower":1733.765780840024,"power":1387.0126246720192,"sunTilt":28.03108091352568,"sunAzimuth":20.673818848950724,"temperature":13.2,"relativehumidity_2m":75,"windspeed_10m":14.8},{"datetime":"2024-10-16T15:00:00.000+02:00","dcPower":1540.2873204227294,"power":1232.2298563381837,"sunTilt":23.49320409080551,"sunAzimuth":36.34969840216598,"temperature":13.5,"relativehumidity_2m":77,"windspeed_10m":14.3},{"datetime":"2024-10-16T16:00:00.000+02:00","dcPower":670.2174910745355,"power":536.1739928596284,"sunTilt":16.969240740198778,"sunAzimuth":50.54017502787197,"temperature":13.5,"relativehumidity_2m":80,"windspeed_10m":13.7},{"datetime":"2024-10-16T17:00:00.000+02:00","dcPower":457.92616067692046,"power":366.3409285415364,"sunTilt":9.025401762418719,"sunAzimuth":63.386211071389155,"temperature":13.3,"relativehumidity_2m":82,"windspeed_10m":13.2},{"datetime":"2024-10-16T18:00:00.000+02:00","dcPower":227.80720186977683,"power":182.24576149582148,"sunTilt":0.16457346744538273,"sunAzimuth":75.30773046735078,"temperature":13,"relativehumidity_2m":82,"windspeed_10m":13},{"datetime":"2024-10-16T19:00:00.000+02:00","dcPower":46.84238505374372,"power":37.47390804299498,"sunTilt":-9.186961271997145,"sunAzimuth":86.84418120594421,"temperature":12.6,"relativehumidity_2m":81,"windspeed_10m":12.7},{"datetime":"2024-10-16T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.64168080965683,"sunAzimuth":98.60786901950698,"temperature":12.2,"relativehumidity_2m":80,"windspeed_10m":12.2},{"datetime":"2024-10-16T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-27.788711717705176,"sunAzimuth":111.30870010109864,"temperature":12,"relativehumidity_2m":80,"windspeed_10m":11.8},{"datetime":"2024-10-16T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-36.112460277357016,"sunAzimuth":125.78490981561183,"temperature":11.8,"relativehumidity_2m":81,"windspeed_10m":11},{"datetime":"2024-10-16T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.9021656490531,"sunAzimuth":142.90069940402603,"temperature":11.7,"relativehumidity_2m":82,"windspeed_10m":10.2},{"datetime":"2024-10-17T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.23373820466217,"sunAzimuth":163.02375644913673,"temperature":11.7,"relativehumidity_2m":82,"windspeed_10m":9.4},{"datetime":"2024-10-17T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-48.2359718752176,"sunAzimuth":-174.9320340577077,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":8.6},{"datetime":"2024-10-17T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.66431793404074,"sunAzimuth":-153.4938195445769,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":8.2},{"datetime":"2024-10-17T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-40.115139405653565,"sunAzimuth":-134.69043107615582,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":7.9},{"datetime":"2024-10-17T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.54426550294801,"sunAzimuth":-118.84703704658551,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":7.6},{"datetime":"2024-10-17T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.79099983796868,"sunAzimuth":-105.2693069294498,"temperature":11.7,"relativehumidity_2m":82,"windspeed_10m":7.6},{"datetime":"2024-10-17T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-14.469536195186127,"sunAzimuth":-93.07325245162968,"temperature":11.6,"relativehumidity_2m":82,"windspeed_10m":7.4},{"datetime":"2024-10-17T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-5.038393916921545,"sunAzimuth":-81.47875856041325,"temperature":11.4,"relativehumidity_2m":83,"windspeed_10m":7.3},{"datetime":"2024-10-17T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.109572239802723,"sunAzimuth":-69.8263270263417,"temperature":11.5,"relativehumidity_2m":83,"windspeed_10m":7.4},{"datetime":"2024-10-17T09:00:00.000+02:00","dcPower":109.40847975459633,"power":87.52678380367706,"sunTilt":12.574671747325786,"sunAzimuth":-57.53951661964237,"temperature":11.9,"relativehumidity_2m":83,"windspeed_10m":8},{"datetime":"2024-10-17T10:00:00.000+02:00","dcPower":325.9211402075719,"power":260.73691216605755,"sunTilt":19.89831645004539,"sunAzimuth":-44.1268501705138,"temperature":12.5,"relativehumidity_2m":82,"windspeed_10m":9.7},{"datetime":"2024-10-17T11:00:00.000+02:00","dcPower":508.9101858471262,"power":407.12814867770095,"sunTilt":25.54455964459646,"sunAzimuth":-29.277026273264024,"temperature":13.1,"relativehumidity_2m":82,"windspeed_10m":10.8},{"datetime":"2024-10-17T12:00:00.000+02:00","dcPower":894.0445396905282,"power":715.2356317524226,"sunTilt":28.952884649607554,"sunAzimuth":-13.059427258390235,"temperature":13.5,"relativehumidity_2m":83,"windspeed_10m":10.7},{"datetime":"2024-10-17T13:00:00.000+02:00","dcPower":951.2372373763384,"power":760.9897899010707,"sunTilt":29.694087805098004,"sunAzimuth":3.9106711264578404,"temperature":13.8,"relativehumidity_2m":85,"windspeed_10m":10.8},{"datetime":"2024-10-17T14:00:00.000+02:00","dcPower":939.5640180555158,"power":751.6512144444127,"sunTilt":27.663008228484166,"sunAzimuth":20.63634185579284,"temperature":14.2,"relativehumidity_2m":86,"windspeed_10m":10.5},{"datetime":"2024-10-17T15:00:00.000+02:00","dcPower":879.0007445936827,"power":703.2005956749463,"sunTilt":23.13530429931852,"sunAzimuth":36.24986394147597,"temperature":14.6,"relativehumidity_2m":87,"windspeed_10m":9.8},{"datetime":"2024-10-17T16:00:00.000+02:00","dcPower":651.4897418815121,"power":521.1917935052097,"sunTilt":16.626042266391202,"sunAzimuth":50.39758024284303,"temperature":14.9,"relativehumidity_2m":88,"windspeed_10m":9.2},{"datetime":"2024-10-17T17:00:00.000+02:00","dcPower":469.9569459149162,"power":375.965556731933,"sunTilt":8.696388379725821,"sunAzimuth":63.21657784217465,"temperature":15.1,"relativehumidity_2m":89,"windspeed_10m":8.7},{"datetime":"2024-10-17T18:00:00.000+02:00","dcPower":231.32779574813136,"power":185.0622365985051,"sunTilt":-0.15393334821361332,"sunAzimuth":75.12113476396313,"temperature":14.9,"relativehumidity_2m":90,"windspeed_10m":7.9},{"datetime":"2024-10-17T19:00:00.000+02:00","dcPower":41.347251661047395,"power":33.077801328837914,"sunTilt":-9.500383797971471,"sunAzimuth":86.64674682587622,"temperature":14.6,"relativehumidity_2m":92,"windspeed_10m":6.7},{"datetime":"2024-10-17T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.956464510241965,"sunAzimuth":98.40462190157557,"temperature":14.3,"relativehumidity_2m":93,"windspeed_10m":5.9},{"datetime":"2024-10-17T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-28.11186795253563,"sunAzimuth":111.10746217430679,"temperature":14.2,"relativehumidity_2m":94,"windspeed_10m":5.4},{"datetime":"2024-10-17T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-36.45054181856139,"sunAzimuth":125.60237057929713,"temperature":14.2,"relativehumidity_2m":94,"windspeed_10m":4.6},{"datetime":"2024-10-17T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.2582671659911,"sunAzimuth":142.77034580724174,"temperature":14.2,"relativehumidity_2m":95,"windspeed_10m":4.4}],[{"datetime":"2024-10-06T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.03892891605494,"sunAzimuth":163.14263622624128,"temperature":7,"relativehumidity_2m":88,"windspeed_10m":7.9},{"datetime":"2024-10-06T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.13778324543035,"sunAzimuth":-176.22585898864278,"temperature":6.5,"relativehumidity_2m":91,"windspeed_10m":6.8},{"datetime":"2024-10-06T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.87117274960936,"sunAzimuth":-155.9729639229445,"temperature":6,"relativehumidity_2m":91,"windspeed_10m":5.9},{"datetime":"2024-10-06T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-36.70531092777589,"sunAzimuth":-137.8059489226708,"temperature":5.5,"relativehumidity_2m":92,"windspeed_10m":5.1},{"datetime":"2024-10-06T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-29.46443142893699,"sunAzimuth":-122.16602054266892,"temperature":5.1,"relativehumidity_2m":92,"windspeed_10m":6.2},{"datetime":"2024-10-06T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-20.930765133481234,"sunAzimuth":-108.58249513077881,"temperature":4.9,"relativehumidity_2m":93,"windspeed_10m":5.8},{"datetime":"2024-10-06T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-11.710347315474053,"sunAzimuth":-96.31140508589108,"temperature":5.1,"relativehumidity_2m":92,"windspeed_10m":6.5},{"datetime":"2024-10-06T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-2.2689443207496223,"sunAzimuth":-84.62890292197706,"temperature":5.3,"relativehumidity_2m":92,"windspeed_10m":7.6},{"datetime":"2024-10-06T08:00:00.000+02:00","dcPower":11.268313449099201,"power":9.01465075927936,"sunTilt":6.991906328571172,"sunAzimuth":-72.87999206290318,"temperature":5.5,"relativehumidity_2m":91,"windspeed_10m":8.4},{"datetime":"2024-10-06T09:00:00.000+02:00","dcPower":232.86769125035775,"power":186.2941530002862,"sunTilt":15.663160391528187,"sunAzimuth":-60.45596163553978,"temperature":6.3,"relativehumidity_2m":90,"windspeed_10m":9.3},{"datetime":"2024-10-06T10:00:00.000+02:00","dcPower":460.35082488685083,"power":368.2806599094807,"sunTilt":23.268816289666535,"sunAzimuth":-46.79827360798693,"temperature":8,"relativehumidity_2m":85,"windspeed_10m":11.6},{"datetime":"2024-10-06T11:00:00.000+02:00","dcPower":672.3552091335482,"power":537.8841673068385,"sunTilt":29.234287239795027,"sunAzimuth":-31.503805204051176,"temperature":9.5,"relativehumidity_2m":86,"windspeed_10m":15.1},{"datetime":"2024-10-06T12:00:00.000+02:00","dcPower":1681.9915426189737,"power":1345.593234095179,"sunTilt":32.93002248275174,"sunAzimuth":-14.578212396799534,"temperature":10.8,"relativehumidity_2m":82,"windspeed_10m":16.3},{"datetime":"2024-10-06T13:00:00.000+02:00","dcPower":1774.549862136572,"power":1419.6398897092577,"sunTilt":33.84613522696556,"sunAzimuth":3.3037874055175505,"temperature":10.9,"relativehumidity_2m":82,"windspeed_10m":16.9},{"datetime":"2024-10-06T14:00:00.000+02:00","dcPower":1689.4756968481113,"power":1351.580557478489,"sunTilt":31.83736693728352,"sunAzimuth":20.94669333759787,"temperature":12.6,"relativehumidity_2m":74,"windspeed_10m":17.1},{"datetime":"2024-10-06T15:00:00.000+02:00","dcPower":1067.9359341691359,"power":854.3487473353088,"sunTilt":27.209548486852757,"sunAzimuth":37.29302345489315,"temperature":12.8,"relativehumidity_2m":75,"windspeed_10m":17.8},{"datetime":"2024-10-06T16:00:00.000+02:00","dcPower":821.9702122637689,"power":657.5761698110151,"sunTilt":20.54547686442047,"sunAzimuth":51.93430385037965,"temperature":13.1,"relativehumidity_2m":73,"windspeed_10m":17.8},{"datetime":"2024-10-06T17:00:00.000+02:00","dcPower":774.5516286126806,"power":619.6413028901445,"sunTilt":12.4658413410018,"sunAzimuth":65.05541740712634,"temperature":12.6,"relativehumidity_2m":72,"windspeed_10m":15.3},{"datetime":"2024-10-06T18:00:00.000+02:00","dcPower":412.058868933531,"power":329.6470951468248,"sunTilt":3.5065849097251456,"sunAzimuth":77.13919140741508,"temperature":11.9,"relativehumidity_2m":76,"windspeed_10m":14.8},{"datetime":"2024-10-06T19:00:00.000+02:00","dcPower":82.78007183053384,"power":66.22405746442708,"sunTilt":-5.8888854618235795,"sunAzimuth":88.76774476136781,"temperature":11.1,"relativehumidity_2m":79,"windspeed_10m":15.1},{"datetime":"2024-10-06T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-15.324219942418523,"sunAzimuth":100.56460329657087,"temperature":10.6,"relativehumidity_2m":81,"windspeed_10m":12.2},{"datetime":"2024-10-06T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-24.385415066790006,"sunAzimuth":113.21108724923529,"temperature":10.3,"relativehumidity_2m":81,"windspeed_10m":13.4},{"datetime":"2024-10-06T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.56528997863786,"sunAzimuth":127.45995077522508,"temperature":10.3,"relativehumidity_2m":83,"windspeed_10m":13.4},{"datetime":"2024-10-06T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.19130152908581,"sunAzimuth":144.02419079232183,"temperature":10.7,"relativehumidity_2m":83,"windspeed_10m":13},{"datetime":"2024-10-07T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.4292477470776,"sunAzimuth":163.14429087891105,"temperature":11,"relativehumidity_2m":83,"windspeed_10m":13.6},{"datetime":"2024-10-07T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.517749495901406,"sunAzimuth":-176.10136944486192,"temperature":11,"relativehumidity_2m":87,"windspeed_10m":11.2},{"datetime":"2024-10-07T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.22254930467857,"sunAzimuth":-155.74445709329385,"temperature":10.9,"relativehumidity_2m":91,"windspeed_10m":9.8},{"datetime":"2024-10-07T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.020882886444426,"sunAzimuth":-137.5192133151141,"temperature":11,"relativehumidity_2m":93,"windspeed_10m":8.7},{"datetime":"2024-10-07T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-29.748563322135755,"sunAzimuth":-121.8586066543482,"temperature":11.4,"relativehumidity_2m":94,"windspeed_10m":8.9},{"datetime":"2024-10-07T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.193270783038106,"sunAzimuth":-108.27337691467278,"temperature":11.5,"relativehumidity_2m":95,"windspeed_10m":11},{"datetime":"2024-10-07T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-11.962117012521006,"sunAzimuth":-96.00713008699226,"temperature":12,"relativehumidity_2m":94,"windspeed_10m":8.4},{"datetime":"2024-10-07T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-2.520439907672165,"sunAzimuth":-84.33068309080377,"temperature":12.2,"relativehumidity_2m":95,"windspeed_10m":9.3},{"datetime":"2024-10-07T08:00:00.000+02:00","dcPower":4.997945294591559,"power":3.9983562356732474,"sunTilt":6.730829735879827,"sunAzimuth":-72.58838243599898,"temperature":12.7,"relativehumidity_2m":94,"windspeed_10m":6.2},{"datetime":"2024-10-07T09:00:00.000+02:00","dcPower":102.01332391139826,"power":81.61065912911862,"sunTilt":15.383293627086166,"sunAzimuth":-60.174375329765816,"temperature":13.3,"relativehumidity_2m":94,"windspeed_10m":7.4},{"datetime":"2024-10-07T10:00:00.000+02:00","dcPower":408.4884640831041,"power":326.79077126648326,"sunTilt":22.96230371458641,"sunAzimuth":-46.53655309716923,"temperature":14.4,"relativehumidity_2m":91,"windspeed_10m":8.9},{"datetime":"2024-10-07T11:00:00.000+02:00","dcPower":378.1151467220305,"power":302.4921173776244,"sunTilt":28.896671975172765,"sunAzimuth":-31.281195510232457,"temperature":15.2,"relativehumidity_2m":91,"windspeed_10m":10.9},{"datetime":"2024-10-07T12:00:00.000+02:00","dcPower":734.6436488825714,"power":587.7149191060571,"sunTilt":32.56343562699629,"sunAzimuth":-14.421329305847635,"temperature":16,"relativehumidity_2m":89,"windspeed_10m":8.4},{"datetime":"2024-10-07T13:00:00.000+02:00","dcPower":1364.6506150490802,"power":1091.7204920392642,"sunTilt":33.46089993111447,"sunAzimuth":3.3732496911031458,"temperature":17,"relativehumidity_2m":82,"windspeed_10m":10.5},{"datetime":"2024-10-07T14:00:00.000+02:00","dcPower":1502.5040978903205,"power":1202.0032783122565,"sunTilt":31.448234246769605,"sunAzimuth":20.927108911856653,"temperature":18,"relativehumidity_2m":75,"windspeed_10m":9.8},{"datetime":"2024-10-07T15:00:00.000+02:00","dcPower":1019.1998220923691,"power":815.3598576738954,"sunTilt":26.828539273003113,"sunAzimuth":37.20261442198752,"temperature":18.6,"relativehumidity_2m":70,"windspeed_10m":5.8},{"datetime":"2024-10-07T16:00:00.000+02:00","dcPower":843.1514040310797,"power":674.5211232248638,"sunTilt":20.17798028996772,"sunAzimuth":51.797067137147856,"temperature":18.9,"relativehumidity_2m":70,"windspeed_10m":7.4},{"datetime":"2024-10-07T17:00:00.000+02:00","dcPower":758.8576567525531,"power":607.0861254020425,"sunTilt":12.11146577521795,"sunAzimuth":64.89046144901918,"temperature":18.4,"relativehumidity_2m":72,"windspeed_10m":7.2},{"datetime":"2024-10-07T18:00:00.000+02:00","dcPower":346.21701930163505,"power":276.973615441308,"sunTilt":3.1615292467832945,"sunAzimuth":76.95875071433478,"temperature":17.4,"relativehumidity_2m":74,"windspeed_10m":9.5},{"datetime":"2024-10-07T19:00:00.000+02:00","dcPower":76.34921188156889,"power":61.079369505255116,"sunTilt":-6.2300935503595385,"sunAzimuth":88.57949984494998,"temperature":16.4,"relativehumidity_2m":79,"windspeed_10m":7.6},{"datetime":"2024-10-07T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-15.667810875617224,"sunAzimuth":100.37506201699385,"temperature":15.4,"relativehumidity_2m":87,"windspeed_10m":9.2},{"datetime":"2024-10-07T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-24.737727405113922,"sunAzimuth":113.02960837119129,"temperature":14.9,"relativehumidity_2m":90,"windspeed_10m":10.9},{"datetime":"2024-10-07T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.93153539182831,"sunAzimuth":127.30408938398604,"temperature":14.5,"relativehumidity_2m":94,"windspeed_10m":10.7},{"datetime":"2024-10-07T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.572641175501424,"sunAzimuth":143.925225436442,"temperature":14.7,"relativehumidity_2m":94,"windspeed_10m":11.6},{"datetime":"2024-10-08T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.818121034022454,"sunAzimuth":163.14384998115503,"temperature":14.7,"relativehumidity_2m":94,"windspeed_10m":15.8},{"datetime":"2024-10-08T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.8965146817323,"sunAzimuth":-175.97781528741945,"temperature":14.8,"relativehumidity_2m":93,"windspeed_10m":14},{"datetime":"2024-10-08T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.572826067170936,"sunAzimuth":-155.51612909180187,"temperature":15.4,"relativehumidity_2m":94,"windspeed_10m":11.2},{"datetime":"2024-10-08T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.33548533853669,"sunAzimuth":-137.23273090041528,"temperature":15.4,"relativehumidity_2m":93,"windspeed_10m":12.2},{"datetime":"2024-10-08T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.031970973409337,"sunAzimuth":-121.55190085899577,"temperature":15.4,"relativehumidity_2m":93,"windspeed_10m":11.2},{"datetime":"2024-10-08T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.45536424486834,"sunAzimuth":-107.96544161465735,"temperature":15.8,"relativehumidity_2m":94,"windspeed_10m":10},{"datetime":"2024-10-08T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.213784351950519,"sunAzimuth":-95.70446004731738,"temperature":15.8,"relativehumidity_2m":93,"windspeed_10m":10.8},{"datetime":"2024-10-08T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-2.772091353585381,"sunAzimuth":-84.03447848078322,"temperature":15.7,"relativehumidity_2m":93,"windspeed_10m":10.5},{"datetime":"2024-10-08T08:00:00.000+02:00","dcPower":3.9570941862162403,"power":3.1656753489729925,"sunTilt":6.469429830924286,"sunAzimuth":-72.29923977528891,"temperature":15.7,"relativehumidity_2m":90,"windspeed_10m":10.2},{"datetime":"2024-10-08T09:00:00.000+02:00","dcPower":206.74517171719188,"power":165.3961373737535,"sunTilt":15.10307050684314,"sunAzimuth":-59.895772492079,"temperature":15.7,"relativehumidity_2m":89,"windspeed_10m":8.3},{"datetime":"2024-10-08T10:00:00.000+02:00","dcPower":552.8014529356424,"power":442.2411623485139,"sunTilt":22.655587204347487,"sunAzimuth":-46.27834028428006,"temperature":16.3,"relativehumidity_2m":86,"windspeed_10m":10.6},{"datetime":"2024-10-08T11:00:00.000+02:00","dcPower":817.8807593131021,"power":654.3046074504817,"sunTilt":28.55922255887939,"sunAzimuth":-31.06241498925654,"temperature":17,"relativehumidity_2m":85,"windspeed_10m":9},{"datetime":"2024-10-08T12:00:00.000+02:00","dcPower":1175.4689911230503,"power":940.3751928984402,"sunTilt":32.19754822667087,"sunAzimuth":-14.26805544520534,"temperature":17.6,"relativehumidity_2m":82,"windspeed_10m":13.1},{"datetime":"2024-10-08T13:00:00.000+02:00","dcPower":1568.6417485623892,"power":1254.9133988499116,"sunTilt":33.07688907994966,"sunAzimuth":3.4399896103944245,"temperature":18.3,"relativehumidity_2m":73,"windspeed_10m":12.7},{"datetime":"2024-10-08T14:00:00.000+02:00","dcPower":1421.4294036606193,"power":1137.1435229284955,"sunTilt":31.060677746554727,"sunAzimuth":20.90593811884074,"temperature":18.2,"relativehumidity_2m":71,"windspeed_10m":13.2},{"datetime":"2024-10-08T15:00:00.000+02:00","dcPower":1147.3071758445456,"power":917.8457406756365,"sunTilt":26.44928138282813,"sunAzimuth":37.11144846293623,"temperature":18.1,"relativehumidity_2m":71,"windspeed_10m":13.3},{"datetime":"2024-10-08T16:00:00.000+02:00","dcPower":829.3893256086282,"power":663.5114604869026,"sunTilt":19.81233269039211,"sunAzimuth":51.65943401571543,"temperature":17.4,"relativehumidity_2m":73,"windspeed_10m":9.2},{"datetime":"2024-10-08T17:00:00.000+02:00","dcPower":592.2614991449287,"power":473.80919931594303,"sunTilt":11.759033809196055,"sunAzimuth":64.72512518734406,"temperature":16.9,"relativehumidity_2m":75,"windspeed_10m":6.3},{"datetime":"2024-10-08T18:00:00.000+02:00","dcPower":338.1808208981102,"power":270.54465671848817,"sunTilt":2.818529310708217,"sunAzimuth":76.77774147088243,"temperature":16,"relativehumidity_2m":75,"windspeed_10m":8.6},{"datetime":"2024-10-08T19:00:00.000+02:00","dcPower":76.72176162631511,"power":61.3774093010521,"sunTilt":-6.569128186596377,"sunAzimuth":88.39036262615889,"temperature":15,"relativehumidity_2m":82,"windspeed_10m":5.8},{"datetime":"2024-10-08T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-16.00913432264249,"sunAzimuth":100.18418560559792,"temperature":14.5,"relativehumidity_2m":89,"windspeed_10m":4.7},{"datetime":"2024-10-08T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-25.087746753502067,"sunAzimuth":112.84624373263145,"temperature":14,"relativehumidity_2m":93,"windspeed_10m":8.4},{"datetime":"2024-10-08T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-33.29558919415396,"sunAzimuth":127.1457755347392,"temperature":14,"relativehumidity_2m":88,"windspeed_10m":8.6},{"datetime":"2024-10-08T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.95205668980692,"sunAzimuth":143.82353531827584,"temperature":13,"relativehumidity_2m":91,"windspeed_10m":7.2},{"datetime":"2024-10-09T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.20543351779722,"sunAzimuth":163.1411836959831,"temperature":12.6,"relativehumidity_2m":92,"windspeed_10m":7.8},{"datetime":"2024-10-09T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.27398595213309,"sunAzimuth":-175.8553370630724,"temperature":12.9,"relativehumidity_2m":91,"windspeed_10m":10.5},{"datetime":"2024-10-09T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.92193289241474,"sunAzimuth":-155.28812310014723,"temperature":12.7,"relativehumidity_2m":92,"windspeed_10m":10.5},{"datetime":"2024-10-09T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.64906836752005,"sunAzimuth":-136.94664669208646,"temperature":12.9,"relativehumidity_2m":91,"windspeed_10m":12.3},{"datetime":"2024-10-09T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.314619206373006,"sunAzimuth":-121.24604384005964,"temperature":12.9,"relativehumidity_2m":91,"windspeed_10m":10.2},{"datetime":"2024-10-09T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.71701795569338,"sunAzimuth":-107.65882183814558,"temperature":13.2,"relativehumidity_2m":90,"windspeed_10m":12.9},{"datetime":"2024-10-09T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.465322674764078,"sunAzimuth":-95.40351983003244,"temperature":13.3,"relativehumidity_2m":89,"windspeed_10m":13.5},{"datetime":"2024-10-09T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.023867147662328,"sunAzimuth":-83.74040781223535,"temperature":12.9,"relativehumidity_2m":92,"windspeed_10m":13.2},{"datetime":"2024-10-09T08:00:00.000+02:00","dcPower":0.9989938192491249,"power":0.7991950553992999,"sunTilt":6.207747953736028,"sunAzimuth":-72.01267721735641,"temperature":12.9,"relativehumidity_2m":92,"windspeed_10m":11.8},{"datetime":"2024-10-09T09:00:00.000+02:00","dcPower":53.8969992305709,"power":43.117599384456724,"sunTilt":14.82254636430179,"sunAzimuth":-59.62025856421435,"temperature":12.8,"relativehumidity_2m":93,"windspeed_10m":11.8},{"datetime":"2024-10-09T10:00:00.000+02:00","dcPower":171.5134955209038,"power":137.21079641672304,"sunTilt":22.348738640203063,"sunAzimuth":-46.023727432629336,"temperature":13.1,"relativehumidity_2m":91,"windspeed_10m":13.7},{"datetime":"2024-10-09T11:00:00.000+02:00","dcPower":349.730317681861,"power":279.7842541454888,"sunTilt":28.22202694317921,"sunAzimuth":-30.847536638720733,"temperature":13.7,"relativehumidity_2m":92,"windspeed_10m":12.8},{"datetime":"2024-10-09T12:00:00.000+02:00","dcPower":518.1643251136576,"power":414.5314600909261,"sunTilt":31.832460658762763,"sunAzimuth":-14.118446086753368,"temperature":13.8,"relativehumidity_2m":91,"windspeed_10m":12},{"datetime":"2024-10-09T13:00:00.000+02:00","dcPower":477.84371999495954,"power":382.2749759959677,"sunTilt":32.69421193791607,"sunAzimuth":3.503957762689472,"temperature":14.2,"relativehumidity_2m":90,"windspeed_10m":11.5},{"datetime":"2024-10-09T14:00:00.000+02:00","dcPower":356.3376608266884,"power":285.07012866135074,"sunTilt":30.674814714273392,"sunAzimuth":20.883130296493302,"temperature":13.9,"relativehumidity_2m":91,"windspeed_10m":13.7},{"datetime":"2024-10-09T15:00:00.000+02:00","dcPower":200.71128030166,"power":160.569024241328,"sunTilt":26.07189945210854,"sunAzimuth":37.01947906146245,"temperature":13.8,"relativehumidity_2m":92,"windspeed_10m":13.8},{"datetime":"2024-10-09T16:00:00.000+02:00","dcPower":156.27682051714766,"power":125.02145641371813,"sunTilt":19.448663917806936,"sunAzimuth":51.521368716140636,"temperature":13.8,"relativehumidity_2m":91,"windspeed_10m":14.5},{"datetime":"2024-10-09T17:00:00.000+02:00","dcPower":104.42053437220898,"power":83.53642749776719,"sunTilt":11.408678227135676,"sunAzimuth":64.55938454107346,"temperature":13.5,"relativehumidity_2m":90,"windspeed_10m":15.8},{"datetime":"2024-10-09T18:00:00.000+02:00","dcPower":62.23906027081793,"power":49.791248216654346,"sunTilt":2.4777195309842384,"sunAzimuth":76.59614824640437,"temperature":13.4,"relativehumidity_2m":92,"windspeed_10m":13.4},{"datetime":"2024-10-09T19:00:00.000+02:00","dcPower":13.94786105197898,"power":11.158288841583186,"sunTilt":-6.905853552820109,"sunAzimuth":88.20032142925027,"temperature":13.6,"relativehumidity_2m":93,"windspeed_10m":14.5},{"datetime":"2024-10-09T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-16.348052794342024,"sunAzimuth":99.99195941586059,"temperature":13.7,"relativehumidity_2m":94,"windspeed_10m":15.3},{"datetime":"2024-10-09T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-25.43533401280622,"sunAzimuth":112.66096568522038,"temperature":14,"relativehumidity_2m":93,"windspeed_10m":15.5},{"datetime":"2024-10-09T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-33.657312701408955,"sunAzimuth":126.98495418142949,"temperature":14.2,"relativehumidity_2m":93,"windspeed_10m":14.3},{"datetime":"2024-10-09T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-40.32941598688323,"sunAzimuth":143.71902473598436,"temperature":14.8,"relativehumidity_2m":90,"windspeed_10m":17.6},{"datetime":"2024-10-10T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.59106942107243,"sunAzimuth":163.13616076353475,"temperature":15.3,"relativehumidity_2m":89,"windspeed_10m":16.9},{"datetime":"2024-10-10T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.65007030458014,"sunAzimuth":-175.73407816523158,"temperature":15,"relativehumidity_2m":92,"windspeed_10m":15.1},{"datetime":"2024-10-10T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.26979987634531,"sunAzimuth":-155.060585251648,"temperature":14.9,"relativehumidity_2m":91,"windspeed_10m":15.3},{"datetime":"2024-10-10T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.96158240518052,"sunAzimuth":-136.66110792848332,"temperature":13.8,"relativehumidity_2m":97,"windspeed_10m":18.8},{"datetime":"2024-10-10T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.59647297796838,"sunAzimuth":-120.94117758387233,"temperature":12.4,"relativehumidity_2m":94,"windspeed_10m":25.6},{"datetime":"2024-10-10T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.97820409915596,"sunAzimuth":-107.35365077473413,"temperature":12.1,"relativehumidity_2m":92,"windspeed_10m":22.8},{"datetime":"2024-10-10T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.716704637744286,"sunAzimuth":-95.1044343497123,"temperature":12,"relativehumidity_2m":95,"windspeed_10m":19.5},{"datetime":"2024-10-10T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.275734703378654,"sunAzimuth":-83.4485894065161,"temperature":11.8,"relativehumidity_2m":93,"windspeed_10m":17.2},{"datetime":"2024-10-10T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":5.945826827444097,"sunAzimuth":-71.72880701980833,"temperature":12.1,"relativehumidity_2m":95,"windspeed_10m":16.3},{"datetime":"2024-10-10T09:00:00.000+02:00","dcPower":27.532420914402955,"power":22.025936731522364,"sunTilt":14.541778076840487,"sunAzimuth":-59.34793757422427,"temperature":12.1,"relativehumidity_2m":94,"windspeed_10m":14.7},{"datetime":"2024-10-10T10:00:00.000+02:00","dcPower":80.96158099137317,"power":64.76926479309854,"sunTilt":22.041831409435048,"sunAzimuth":-45.7728048820313,"temperature":12.2,"relativehumidity_2m":92,"windspeed_10m":15},{"datetime":"2024-10-10T11:00:00.000+02:00","dcPower":150.5237904203776,"power":120.41903233630208,"sunTilt":27.885174335468335,"sunAzimuth":-30.63663127573816,"temperature":12.5,"relativehumidity_2m":92,"windspeed_10m":15.7},{"datetime":"2024-10-10T12:00:00.000+02:00","dcPower":698.2747101395488,"power":558.619768111639,"sunTilt":31.46827419380231,"sunAzimuth":-13.972554382839954,"temperature":12.8,"relativehumidity_2m":89,"windspeed_10m":18.5},{"datetime":"2024-10-10T13:00:00.000+02:00","dcPower":417.97423461812605,"power":334.37938769450085,"sunTilt":32.31297830760232,"sunAzimuth":3.5651067967559134,"temperature":12.3,"relativehumidity_2m":91,"windspeed_10m":17.7},{"datetime":"2024-10-10T14:00:00.000+02:00","dcPower":958.9876822522824,"power":767.190145801826,"sunTilt":30.29076264178465,"sunAzimuth":20.858636821509823,"temperature":13.1,"relativehumidity_2m":87,"windspeed_10m":16},{"datetime":"2024-10-10T15:00:00.000+02:00","dcPower":688.4299066938424,"power":550.743925355074,"sunTilt":25.696518065354862,"sunAzimuth":36.92666158608413,"temperature":13.2,"relativehumidity_2m":86,"windspeed_10m":15.1},{"datetime":"2024-10-10T16:00:00.000+02:00","dcPower":610.4752126179212,"power":488.380170094337,"sunTilt":19.087103602605772,"sunAzimuth":51.382837136526646,"temperature":13,"relativehumidity_2m":81,"windspeed_10m":15.1},{"datetime":"2024-10-10T17:00:00.000+02:00","dcPower":479.2637488675229,"power":383.41099909401834,"sunTilt":11.060531491249431,"sunAzimuth":64.39321702308736,"temperature":12.8,"relativehumidity_2m":75,"windspeed_10m":13.3},{"datetime":"2024-10-10T18:00:00.000+02:00","dcPower":320.570885488488,"power":256.4567083907904,"sunTilt":2.1392339596675116,"sunAzimuth":76.4139573135511,"temperature":12.3,"relativehumidity_2m":79,"windspeed_10m":12.2},{"datetime":"2024-10-10T19:00:00.000+02:00","dcPower":59.25589833135359,"power":47.404718665082875,"sunTilt":-7.240134220715796,"sunAzimuth":88.00936653945188,"temperature":11,"relativehumidity_2m":80,"windspeed_10m":7},{"datetime":"2024-10-10T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-16.684429132286564,"sunAzimuth":99.79837109714164,"temperature":10.6,"relativehumidity_2m":84,"windspeed_10m":5.2},{"datetime":"2024-10-10T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-25.780350237977437,"sunAzimuth":112.47374911967749,"temperature":10.1,"relativehumidity_2m":85,"windspeed_10m":4.3},{"datetime":"2024-10-10T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-34.01656707008997,"sunAzimuth":126.82157256673277,"temperature":10.2,"relativehumidity_2m":84,"windspeed_10m":9.2},{"datetime":"2024-10-10T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-40.704586491662205,"sunAzimuth":143.61159893587703,"temperature":9.8,"relativehumidity_2m":90,"windspeed_10m":7.9},{"datetime":"2024-10-11T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.97491243886403,"sunAzimuth":163.128648637255,"temperature":9.3,"relativehumidity_2m":92,"windspeed_10m":10.8},{"datetime":"2024-10-11T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.02467456169168,"sunAzimuth":-175.6141848122969,"temperature":8.9,"relativehumidity_2m":94,"windspeed_10m":8.7},{"datetime":"2024-10-11T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.61635732682025,"sunAzimuth":-154.8336646265192,"temperature":8.3,"relativehumidity_2m":91,"windspeed_10m":2.9},{"datetime":"2024-10-11T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-38.27297819203817,"sunAzimuth":-136.37626404685486,"temperature":8.3,"relativehumidity_2m":93,"windspeed_10m":3.6},{"datetime":"2024-10-11T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.877497329298222,"sunAzimuth":-120.63744534201388,"temperature":8.3,"relativehumidity_2m":95,"windspeed_10m":8.7},{"datetime":"2024-10-11T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-22.238894548955713,"sunAzimuth":-107.05006215076084,"temperature":8.3,"relativehumidity_2m":98,"windspeed_10m":6.5},{"datetime":"2024-10-11T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.96790216264699,"sunAzimuth":-94.80732853145587,"temperature":8.3,"relativehumidity_2m":96,"windspeed_10m":8.6},{"datetime":"2024-10-11T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.5276603134629134,"sunAzimuth":-83.1591411410959,"temperature":7.9,"relativehumidity_2m":95,"windspeed_10m":7.8},{"datetime":"2024-10-11T08:00:00.000+02:00","dcPower":1.0176040542367717,"power":0.8140832433894174,"sunTilt":5.683710585945252,"sunAzimuth":-71.44774052199065,"temperature":7.5,"relativehumidity_2m":96,"windspeed_10m":6.9},{"datetime":"2024-10-11T09:00:00.000+02:00","dcPower":126.72201909015881,"power":101.37761527212706,"sunTilt":14.260824082236146,"sunAzimuth":-59.0789120948653,"temperature":7.8,"relativehumidity_2m":93,"windspeed_10m":8.6},{"datetime":"2024-10-11T10:00:00.000+02:00","dcPower":443.54021030660033,"power":354.8321682452803,"sunTilt":21.734940400779433,"sunAzimuth":-45.525661029390804,"temperature":8.1,"relativehumidity_2m":89,"windspeed_10m":8.2},{"datetime":"2024-10-11T11:00:00.000+02:00","dcPower":701.7623472438349,"power":561.4098777950679,"sunTilt":27.54875518315372,"sunAzimuth":-30.429767533564867,"temperature":9,"relativehumidity_2m":84,"windspeed_10m":7.6},{"datetime":"2024-10-11T12:00:00.000+02:00","dcPower":1689.8795805363357,"power":1351.9036644290686,"sunTilt":31.105090976135774,"sunAzimuth":-13.830431372703888,"temperature":9.8,"relativehumidity_2m":79,"windspeed_10m":7.4},{"datetime":"2024-10-11T13:00:00.000+02:00","dcPower":1738.8014116916338,"power":1391.041129353307,"sunTilt":31.9332985100557,"sunAzimuth":3.6233914143032355,"temperature":10.3,"relativehumidity_2m":74,"windspeed_10m":6.5},{"datetime":"2024-10-11T14:00:00.000+02:00","dcPower":877.0554642263434,"power":701.6443713810747,"sunTilt":29.908639212205873,"sunAzimuth":20.83241114244682,"temperature":10.8,"relativehumidity_2m":71,"windspeed_10m":5.1},{"datetime":"2024-10-11T15:00:00.000+02:00","dcPower":766.0323265356332,"power":612.8258612285066,"sunTilt":25.3232617284627,"sunAzimuth":36.83295334168066,"temperature":11.1,"relativehumidity_2m":69,"windspeed_10m":4.3},{"datetime":"2024-10-11T16:00:00.000+02:00","dcPower":622.3257337907264,"power":497.8605870325812,"sunTilt":18.727781114603793,"sunAzimuth":51.243806920166435,"temperature":11.2,"relativehumidity_2m":68,"windspeed_10m":4},{"datetime":"2024-10-11T17:00:00.000+02:00","dcPower":537.8943743441093,"power":430.3154994752875,"sunTilt":10.714725694488843,"sunAzimuth":64.22660182758023,"temperature":10.9,"relativehumidity_2m":71,"windspeed_10m":4.1},{"datetime":"2024-10-11T18:00:00.000+02:00","dcPower":286.67387684312297,"power":229.3391014744984,"sunTilt":1.803206213409536,"sunAzimuth":76.23115674859116,"temperature":10.3,"relativehumidity_2m":77,"windspeed_10m":0.5},{"datetime":"2024-10-11T19:00:00.000+02:00","dcPower":59.684800500134884,"power":47.74784040010791,"sunTilt":-7.571835214892863,"sunAzimuth":87.81749031617603,"temperature":9,"relativehumidity_2m":79,"windspeed_10m":1.9},{"datetime":"2024-10-11T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-17.0181265759899,"sunAzimuth":99.60341073267222,"temperature":7.9,"relativehumidity_2m":83,"windspeed_10m":2.4},{"datetime":"2024-10-11T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-26.122656701936815,"sunAzimuth":112.28457164140065,"temperature":7,"relativehumidity_2m":85,"windspeed_10m":2.9},{"datetime":"2024-10-11T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-34.37321335134456,"sunAzimuth":126.65558045028693,"temperature":6.5,"relativehumidity_2m":86,"windspeed_10m":3},{"datetime":"2024-10-11T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.07743516418665,"sunAzimuth":143.5011643499793,"temperature":6,"relativehumidity_2m":88,"windspeed_10m":3.3},{"datetime":"2024-10-12T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.35684572865986,"sunAzimuth":163.11851362268473,"temperature":5.4,"relativehumidity_2m":89,"windspeed_10m":4.8},{"datetime":"2024-10-12T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.397705346785955,"sunAzimuth":-175.49580600360676,"temperature":5.1,"relativehumidity_2m":90,"windspeed_10m":4.7},{"datetime":"2024-10-12T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.961535734103165,"sunAzimuth":-154.60751324634,"temperature":4.9,"relativehumidity_2m":90,"windspeed_10m":5.1},{"datetime":"2024-10-12T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-38.58320673599567,"sunAzimuth":-136.09226665392447,"temperature":4.9,"relativehumidity_2m":91,"windspeed_10m":5.1},{"datetime":"2024-10-12T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.157657336040163,"sunAzimuth":-120.33499159290702,"temperature":4.9,"relativehumidity_2m":91,"windspeed_10m":5.4},{"datetime":"2024-10-12T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-22.499060815350038,"sunAzimuth":-106.7481901878237,"temperature":4.8,"relativehumidity_2m":91,"windspeed_10m":5},{"datetime":"2024-10-12T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.218886384957228,"sunAzimuth":-94.51232726794028,"temperature":4.6,"relativehumidity_2m":91,"windspeed_10m":5.4},{"datetime":"2024-10-12T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.77960910849284,"sunAzimuth":-82.87218040699524,"temperature":4.5,"relativehumidity_2m":91,"windspeed_10m":5.4},{"datetime":"2024-10-12T08:00:00.000+02:00","dcPower":1.0272538057118477,"power":0.8218030445694782,"sunTilt":5.421444806545091,"sunAzimuth":-71.16958809655219,"temperature":4.7,"relativehumidity_2m":92,"windspeed_10m":6.6},{"datetime":"2024-10-12T09:00:00.000+02:00","dcPower":189.50437554214903,"power":151.60350043371923,"sunTilt":13.979744388367903,"sunAzimuth":-58.8132832097472,"temperature":5.9,"relativehumidity_2m":90,"windspeed_10m":7.9},{"datetime":"2024-10-12T10:00:00.000+02:00","dcPower":528.2880619375215,"power":422.63044955001726,"sunTilt":21.42814200059926,"sunAzimuth":-45.28238230412684,"temperature":7.3,"relativehumidity_2m":87,"windspeed_10m":9.9},{"datetime":"2024-10-12T11:00:00.000+02:00","dcPower":764.8989677490279,"power":611.9191741992223,"sunTilt":27.21286115693797,"sunAzimuth":-30.227011858140273,"temperature":8.4,"relativehumidity_2m":87,"windspeed_10m":10.4},{"datetime":"2024-10-12T12:00:00.000+02:00","dcPower":1665.2058569778644,"power":1332.1646855822917,"sunTilt":30.743014004100917,"sunAzimuth":-13.692125978099353,"temperature":10.1,"relativehumidity_2m":82,"windspeed_10m":12.3},{"datetime":"2024-10-12T13:00:00.000+02:00","dcPower":1547.0060348694196,"power":1237.604827895536,"sunTilt":31.555283363449327,"sunAzimuth":3.6787683789403496,"temperature":10.6,"relativehumidity_2m":81,"windspeed_10m":12.4},{"datetime":"2024-10-12T14:00:00.000+02:00","dcPower":1185.607045814405,"power":948.485636651524,"sunTilt":29.52856227644022,"sunAzimuth":20.80440880713897,"temperature":11.2,"relativehumidity_2m":80,"windspeed_10m":11.3},{"datetime":"2024-10-12T15:00:00.000+02:00","dcPower":1052.3012345518403,"power":841.8409876414722,"sunTilt":24.95225483898691,"sunAzimuth":36.7383136221432,"temperature":11.7,"relativehumidity_2m":80,"windspeed_10m":9.7},{"datetime":"2024-10-12T16:00:00.000+02:00","dcPower":711.5593497868869,"power":569.2474798295095,"sunTilt":18.37082552430316,"sunAzimuth":51.10424752804786,"temperature":11.5,"relativehumidity_2m":82,"windspeed_10m":8.4},{"datetime":"2024-10-12T17:00:00.000+02:00","dcPower":468.24413493641043,"power":374.59530794912837,"sunTilt":10.371392509810583,"sunAzimuth":64.05951991866706,"temperature":11.1,"relativehumidity_2m":84,"windspeed_10m":9.4},{"datetime":"2024-10-12T18:00:00.000+02:00","dcPower":169.56037805508723,"power":135.6483024440698,"sunTilt":1.4697694157713943,"sunAzimuth":76.0477365277625,"temperature":10.5,"relativehumidity_2m":87,"windspeed_10m":8.4},{"datetime":"2024-10-12T19:00:00.000+02:00","dcPower":26.236334691702652,"power":20.98906775336212,"sunTilt":-7.900822080898683,"sunAzimuth":87.62468730812897,"temperature":9.8,"relativehumidity_2m":90,"windspeed_10m":8.5},{"datetime":"2024-10-12T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-17.349008833561726,"sunAzimuth":99.4070709783674,"temperature":9.6,"relativehumidity_2m":92,"windspeed_10m":8.6},{"datetime":"2024-10-12T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-26.462114969564762,"sunAzimuth":112.09341375841275,"temperature":9.6,"relativehumidity_2m":92,"windspeed_10m":9.2},{"datetime":"2024-10-12T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-34.7271125456906,"sunAzimuth":126.48693033734844,"temperature":9.7,"relativehumidity_2m":92,"windspeed_10m":8},{"datetime":"2024-10-12T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.447828525061254,"sunAzimuth":143.38762883737587,"temperature":9.4,"relativehumidity_2m":94,"windspeed_10m":7.3},{"datetime":"2024-10-13T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.73675190204195,"sunAzimuth":163.1056210331007,"temperature":9.3,"relativehumidity_2m":94,"windspeed_10m":6.5},{"datetime":"2024-10-13T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.76906905918878,"sunAzimuth":-175.37909348313417,"temperature":9.1,"relativehumidity_2m":94,"windspeed_10m":7.4},{"datetime":"2024-10-13T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.30526573902631,"sunAzimuth":-154.3822860597556,"temperature":9.5,"relativehumidity_2m":92,"windspeed_10m":10},{"datetime":"2024-10-13T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-38.89221927072221,"sunAzimuth":-135.80926949668307,"temperature":9.6,"relativehumidity_2m":90,"windspeed_10m":16.3},{"datetime":"2024-10-13T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.436918053719957,"sunAzimuth":-120.03396199414307,"temperature":8.8,"relativehumidity_2m":87,"windspeed_10m":18},{"datetime":"2024-10-13T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-22.75867399010402,"sunAzimuth":-106.44816955814555,"temperature":8.4,"relativehumidity_2m":87,"windspeed_10m":15.5},{"datetime":"2024-10-13T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.469627601285604,"sunAzimuth":-94.21955537307969,"temperature":7.5,"relativehumidity_2m":83,"windspeed_10m":17},{"datetime":"2024-10-13T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.0315450153141486,"sunAzimuth":-82.58782406375519,"temperature":7.2,"relativehumidity_2m":82,"windspeed_10m":16.2},{"datetime":"2024-10-13T08:00:00.000+02:00","dcPower":1.0203611260867933,"power":0.8162889008694347,"sunTilt":5.159076534957485,"sunAzimuth":-70.89445910846419,"temperature":6.7,"relativehumidity_2m":84,"windspeed_10m":16.8},{"datetime":"2024-10-13T09:00:00.000+02:00","dcPower":139.76841563365483,"power":111.81473250692386,"sunTilt":13.698600583367673,"sunAzimuth":-58.55115047580995,"temperature":6.9,"relativehumidity_2m":86,"windspeed_10m":15.5},{"datetime":"2024-10-13T10:00:00.000+02:00","dcPower":403.3794838309505,"power":322.7035870647604,"sunTilt":21.12151408595382,"sunAzimuth":-45.043053146408546,"temperature":7.5,"relativehumidity_2m":83,"windspeed_10m":22.7},{"datetime":"2024-10-13T11:00:00.000+02:00","dcPower":502.01897470778454,"power":401.61517976622764,"sunTilt":26.877585132999467,"sunAzimuth":-30.028428502780528,"temperature":8.1,"relativehumidity_2m":83,"windspeed_10m":19.5},{"datetime":"2024-10-13T12:00:00.000+02:00","dcPower":848.8155858520288,"power":679.052468681623,"sunTilt":30.382147107830978,"sunAzimuth":-13.557685005032592,"temperature":8.5,"relativehumidity_2m":82,"windspeed_10m":18.9},{"datetime":"2024-10-13T13:00:00.000+02:00","dcPower":1354.2793646356383,"power":1083.4234917085107,"sunTilt":31.17904416002473,"sunAzimuth":3.731196531846679,"temperature":9.4,"relativehumidity_2m":79,"windspeed_10m":19.1},{"datetime":"2024-10-13T14:00:00.000+02:00","dcPower":941.4263314178322,"power":753.1410651342658,"sunTilt":29.150649828823855,"sunAzimuth":20.774587486422366,"temperature":10.4,"relativehumidity_2m":75,"windspeed_10m":17.7},{"datetime":"2024-10-13T15:00:00.000+02:00","dcPower":859.830381916628,"power":687.8643055333024,"sunTilt":24.583621654336596,"sunAzimuth":36.642703763191776,"temperature":10.3,"relativehumidity_2m":74,"windspeed_10m":17.6},{"datetime":"2024-10-13T16:00:00.000+02:00","dcPower":718.8465790980796,"power":575.0772632784636,"sunTilt":18.016365562424813,"sunAzimuth":50.96413031013026,"temperature":10.3,"relativehumidity_2m":77,"windspeed_10m":15.1},{"datetime":"2024-10-13T17:00:00.000+02:00","dcPower":533.6083803641718,"power":426.8867042913375,"sunTilt":10.030663139779685,"sunAzimuth":63.89195411454739,"temperature":9.9,"relativehumidity_2m":79,"windspeed_10m":13.7},{"datetime":"2024-10-13T18:00:00.000+02:00","dcPower":221.67228853371176,"power":177.33783082696942,"sunTilt":1.1390561362362333,"sunAzimuth":75.8636886240363,"temperature":9.1,"relativehumidity_2m":82,"windspeed_10m":10.8},{"datetime":"2024-10-13T19:00:00.000+02:00","dcPower":30.42969291242704,"power":24.343754329941632,"sunTilt":-8.226960953264081,"sunAzimuth":87.43095436456028,"temperature":8.3,"relativehumidity_2m":87,"windspeed_10m":6.2},{"datetime":"2024-10-13T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-17.676940156857277,"sunAzimuth":99.2093472034457,"temperature":8.1,"relativehumidity_2m":87,"windspeed_10m":6.4},{"datetime":"2024-10-13T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-26.79858696849319,"sunAzimuth":111.90025906076745,"temperature":7.6,"relativehumidity_2m":90,"windspeed_10m":6.8},{"datetime":"2024-10-13T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-35.0781256664598,"sunAzimuth":126.3155777234557,"temperature":7.1,"relativehumidity_2m":90,"windspeed_10m":5},{"datetime":"2024-10-13T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.815632684929426,"sunAzimuth":143.2709019404984,"temperature":6.5,"relativehumidity_2m":91,"windspeed_10m":2.6},{"datetime":"2024-10-14T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.11451301786215,"sunAzimuth":163.08983536166957,"temperature":6.3,"relativehumidity_2m":89,"windspeed_10m":2.4},{"datetime":"2024-10-14T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.138671848584934,"sunAzimuth":-175.2642016873541,"temperature":5.8,"relativehumidity_2m":89,"windspeed_10m":1.5},{"datetime":"2024-10-14T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.647478099904184,"sunAzimuth":-154.15814092455744,"temperature":5.3,"relativehumidity_2m":90,"windspeed_10m":4},{"datetime":"2024-10-14T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.1999672120048,"sunAzimuth":-135.52742842855076,"temperature":4.5,"relativehumidity_2m":93,"windspeed_10m":1.5},{"datetime":"2024-10-14T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.715244466780028,"sunAzimuth":-119.73450334119632,"temperature":4,"relativehumidity_2m":94,"windspeed_10m":4.5},{"datetime":"2024-10-14T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.01770469074795,"sunAzimuth":-106.15013533780943,"temperature":3.8,"relativehumidity_2m":94,"windspeed_10m":4.7},{"datetime":"2024-10-14T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.720095220219516,"sunAzimuth":-93.92913753819082,"temperature":4.2,"relativehumidity_2m":94,"windspeed_10m":5.8},{"datetime":"2024-10-14T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.283430715645694,"sunAzimuth":-82.30618839226909,"temperature":4.7,"relativehumidity_2m":94,"windspeed_10m":4.7},{"datetime":"2024-10-14T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.896654311121907,"sunAzimuth":-70.62246187023919,"temperature":5.1,"relativehumidity_2m":93,"windspeed_10m":4.3},{"datetime":"2024-10-14T09:00:00.000+02:00","dcPower":127.65465284846182,"power":102.12372227876946,"sunTilt":13.417455844515738,"sunAzimuth":-58.29261188464403,"temperature":5.6,"relativehumidity_2m":92,"windspeed_10m":3.8},{"datetime":"2024-10-14T10:00:00.000+02:00","dcPower":389.36843020647643,"power":311.49474416518115,"sunTilt":20.815136015137117,"sunAzimuth":-44.807755986987566,"temperature":6.7,"relativehumidity_2m":87,"windspeed_10m":6.2},{"datetime":"2024-10-14T11:00:00.000+02:00","dcPower":592.2220734252635,"power":473.7776587402108,"sunTilt":26.543021174019792,"sunAzimuth":-29.83407952105961,"temperature":7.5,"relativehumidity_2m":85,"windspeed_10m":10.1},{"datetime":"2024-10-14T12:00:00.000+02:00","dcPower":522.2723902421569,"power":417.81791219372553,"sunTilt":30.022594925866507,"sunAzimuth":-13.427153142476177,"temperature":7.8,"relativehumidity_2m":87,"windspeed_10m":7.4},{"datetime":"2024-10-14T13:00:00.000+02:00","dcPower":727.3222067032216,"power":581.8577653625773,"sunTilt":30.804692641790414,"sunAzimuth":3.780636799023051,"temperature":8.7,"relativehumidity_2m":84,"windspeed_10m":9.4},{"datetime":"2024-10-14T14:00:00.000+02:00","dcPower":731.9961730654917,"power":585.5969384523934,"sunTilt":28.775019978770835,"sunAzimuth":20.742907009369926,"temperature":8.8,"relativehumidity_2m":83,"windspeed_10m":7.7},{"datetime":"2024-10-14T15:00:00.000+02:00","dcPower":673.1869547969405,"power":538.5495638375525,"sunTilt":24.217486258022436,"sunAzimuth":36.546087194880954,"temperature":8.8,"relativehumidity_2m":85,"windspeed_10m":6.5},{"datetime":"2024-10-14T16:00:00.000+02:00","dcPower":565.1327402072765,"power":452.1061921658212,"sunTilt":17.664529576020236,"sunAzimuth":50.82342857831685,"temperature":8.7,"relativehumidity_2m":88,"windspeed_10m":5.2},{"datetime":"2024-10-14T17:00:00.000+02:00","dcPower":392.09431169870487,"power":313.67544935896393,"sunTilt":9.692668263612882,"sunAzimuth":63.7238891712367,"temperature":8.4,"relativehumidity_2m":90,"windspeed_10m":3.6},{"datetime":"2024-10-14T18:00:00.000+02:00","dcPower":181.97709304355863,"power":145.58167443484692,"sunTilt":0.8111983279457368,"sunAzimuth":75.67900710147994,"temperature":8.2,"relativehumidity_2m":91,"windspeed_10m":1.8},{"datetime":"2024-10-14T19:00:00.000+02:00","dcPower":30.46631439555601,"power":24.37305151644481,"sunTilt":-8.5501186243532,"sunAzimuth":87.23629074336492,"temperature":7.9,"relativehumidity_2m":93,"windspeed_10m":0.4},{"datetime":"2024-10-14T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.00178541748869,"sunAzimuth":99.01023762777291,"temperature":7.4,"relativehumidity_2m":94,"windspeed_10m":1.1},{"datetime":"2024-10-14T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-27.131935065748255,"sunAzimuth":111.70509440468732,"temperature":6.7,"relativehumidity_2m":96,"windspeed_10m":1.1},{"datetime":"2024-10-14T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-35.426113802819536,"sunAzimuth":126.14148133580082,"temperature":5.8,"relativehumidity_2m":98,"windspeed_10m":0.4},{"datetime":"2024-10-14T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.180713378529184,"sunAzimuth":143.15089515757862,"temperature":5,"relativehumidity_2m":100,"windspeed_10m":0.7},{"datetime":"2024-10-15T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.49001057641694,"sunAzimuth":163.07102046565072,"temperature":4.3,"relativehumidity_2m":100,"windspeed_10m":1.4},{"datetime":"2024-10-15T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.506419588733614,"sunAzimuth":-175.15128768425117,"temperature":3.8,"relativehumidity_2m":100,"windspeed_10m":1.9},{"datetime":"2024-10-15T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.988103658491234,"sunAzimuth":-153.9352385869432,"temperature":3.2,"relativehumidity_2m":100,"windspeed_10m":2.6},{"datetime":"2024-10-15T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.50640211284843,"sunAzimuth":-135.24690137263536,"temperature":2.4,"relativehumidity_2m":100,"windspeed_10m":2.9},{"datetime":"2024-10-15T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.992601433814595,"sunAzimuth":-119.43676351875516,"temperature":1.6,"relativehumidity_2m":100,"windspeed_10m":3.2},{"datetime":"2024-10-15T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.276123004228086,"sunAzimuth":-105.85422295783262,"temperature":1.2,"relativehumidity_2m":100,"windspeed_10m":3.6},{"datetime":"2024-10-15T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.970257710966642,"sunAzimuth":-93.64119828341282,"temperature":1.2,"relativehumidity_2m":100,"windspeed_10m":3.6},{"datetime":"2024-10-15T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.5352276078301,"sunAzimuth":-82.02738904900566,"temperature":1.6,"relativehumidity_2m":100,"windspeed_10m":3.6},{"datetime":"2024-10-15T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.63422819396966,"sunAzimuth":-70.35370359566531,"temperature":2.3,"relativehumidity_2m":100,"windspeed_10m":4},{"datetime":"2024-10-15T09:00:00.000+02:00","dcPower":154.33046643149038,"power":123.46437314519231,"sunTilt":13.136374944499462,"sunAzimuth":-58.037763824819606,"temperature":3.4,"relativehumidity_2m":98,"windspeed_10m":5},{"datetime":"2024-10-15T10:00:00.000+02:00","dcPower":437.4885594761827,"power":349.99084758094614,"sunTilt":20.50908861823578,"sunAzimuth":-44.57657122307415,"temperature":4.8,"relativehumidity_2m":94,"windspeed_10m":6.2},{"datetime":"2024-10-15T11:00:00.000+02:00","dcPower":659.6002948049094,"power":527.6802358439276,"sunTilt":26.20926450679345,"sunAzimuth":-29.644024765315514,"temperature":6.3,"relativehumidity_2m":91,"windspeed_10m":7.8},{"datetime":"2024-10-15T12:00:00.000+02:00","dcPower":778.8402349217745,"power":623.0721879374196,"sunTilt":29.66446288060627,"sunAzimuth":-13.300572957692536,"temperature":8,"relativehumidity_2m":88,"windspeed_10m":9.2},{"datetime":"2024-10-15T13:00:00.000+02:00","dcPower":1978.9817835346914,"power":1583.1854268277532,"sunTilt":30.43234097439692,"sunAzimuth":3.8270522061418095,"temperature":9.7,"relativehumidity_2m":84,"windspeed_10m":10.9},{"datetime":"2024-10-15T14:00:00.000+02:00","dcPower":752.5495986025528,"power":602.0396788820423,"sunTilt":28.401790922595836,"sunAzimuth":20.709329389098386,"temperature":10.8,"relativehumidity_2m":82,"windspeed_10m":11.9},{"datetime":"2024-10-15T15:00:00.000+02:00","dcPower":688.3741880723578,"power":550.6993504578862,"sunTilt":23.853972526435296,"sunAzimuth":36.448429487078144,"temperature":11.2,"relativehumidity_2m":81,"windspeed_10m":11.9},{"datetime":"2024-10-15T16:00:00.000+02:00","dcPower":586.2062141110889,"power":468.96497128887114,"sunTilt":17.315445485866938,"sunAzimuth":50.682117672382816,"temperature":11,"relativehumidity_2m":81,"windspeed_10m":11},{"datetime":"2024-10-15T17:00:00.000+02:00","dcPower":434.3328809254071,"power":347.4663047403257,"sunTilt":9.35753798215806,"sunAzimuth":63.55531186506398,"temperature":10.6,"relativehumidity_2m":82,"windspeed_10m":11.1},{"datetime":"2024-10-15T18:00:00.000+02:00","dcPower":236.41723235517372,"power":189.133785884139,"sunTilt":0.48632726290863104,"sunAzimuth":75.49368820866877,"temperature":9.7,"relativehumidity_2m":85,"windspeed_10m":12.1},{"datetime":"2024-10-15T19:00:00.000+02:00","dcPower":50.711744075262686,"power":40.56939526021015,"sunTilt":-8.870162619560801,"sunAzimuth":87.04069822248259,"temperature":8.5,"relativehumidity_2m":88,"windspeed_10m":13.6},{"datetime":"2024-10-15T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.323410184499085,"sunAzimuth":98.80974345652376,"temperature":7.6,"relativehumidity_2m":91,"windspeed_10m":14.3},{"datetime":"2024-10-15T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-27.462022150796383,"sunAzimuth":111.50791010170794,"temperature":7.2,"relativehumidity_2m":91,"windspeed_10m":13.9},{"datetime":"2024-10-15T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-35.770938188604354,"sunAzimuth":125.96460338334036,"temperature":7,"relativehumidity_2m":91,"windspeed_10m":12.9},{"datetime":"2024-10-15T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.54293600102064,"sunAzimuth":143.02752222319543,"temperature":6.8,"relativehumidity_2m":89,"windspeed_10m":12.7},{"datetime":"2024-10-16T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.86312551477473,"sunAzimuth":163.04903976266138,"temperature":6.7,"relativehumidity_2m":86,"windspeed_10m":13.8},{"datetime":"2024-10-16T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.87221785059982,"sunAzimuth":-175.04051110279474,"temperature":6.8,"relativehumidity_2m":83,"windspeed_10m":15.6},{"datetime":"2024-10-16T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.32707330350441,"sunAzimuth":-153.71374265034802,"temperature":6.8,"relativehumidity_2m":80,"windspeed_10m":16.5},{"datetime":"2024-10-16T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.81147561550361,"sunAzimuth":-134.96784827714956,"temperature":7,"relativehumidity_2m":78,"windspeed_10m":16.1},{"datetime":"2024-10-16T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.26895363243685,"sunAzimuth":-119.1408914506387,"temperature":7.3,"relativehumidity_2m":77,"windspeed_10m":15.1},{"datetime":"2024-10-16T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.53389843309148,"sunAzimuth":-105.56056815727264,"temperature":7.4,"relativehumidity_2m":75,"windspeed_10m":14.3},{"datetime":"2024-10-16T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-14.220082554609817,"sunAzimuth":-93.355861910257,"temperature":7.4,"relativehumidity_2m":73,"windspeed_10m":14.3},{"datetime":"2024-10-16T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.786895768698711,"sunAzimuth":-81.75154101774274,"temperature":7.3,"relativehumidity_2m":71,"windspeed_10m":14.7},{"datetime":"2024-10-16T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.371849783596975,"sunAzimuth":-70.08829035405888,"temperature":7.2,"relativehumidity_2m":70,"windspeed_10m":14.8},{"datetime":"2024-10-16T09:00:00.000+02:00","dcPower":115.85164932968384,"power":92.68131946374707,"sunTilt":12.855424254104108,"sunAzimuth":-57.78670104663053,"temperature":9.8,"relativehumidity_2m":72,"windspeed_10m":17},{"datetime":"2024-10-16T10:00:00.000+02:00","dcPower":335.28441038828294,"power":268.2275283106264,"sunTilt":20.203454185088123,"sunAzimuth":-44.34957719582011,"temperature":10.2,"relativehumidity_2m":75,"windspeed_10m":16.5},{"datetime":"2024-10-16T11:00:00.000+02:00","dcPower":527.1146116233759,"power":421.6916892987008,"sunTilt":25.87641150088954,"sunAzimuth":-29.45832187587005,"temperature":10.7,"relativehumidity_2m":77,"windspeed_10m":16.2},{"datetime":"2024-10-16T12:00:00.000+02:00","dcPower":710.6991019378397,"power":568.5592815502717,"sunTilt":29.30785715204484,"sunAzimuth":-13.177984892004138,"temperature":11.6,"relativehumidity_2m":77,"windspeed_10m":15.7},{"datetime":"2024-10-16T13:00:00.000+02:00","dcPower":1436.9262866801166,"power":1149.5410293440934,"sunTilt":30.062101719417093,"sunAzimuth":3.870407893111919,"temperature":12.5,"relativehumidity_2m":75,"windspeed_10m":15.3},{"datetime":"2024-10-16T14:00:00.000+02:00","dcPower":903.66353184464,"power":722.930825475712,"sunTilt":28.03108091352568,"sunAzimuth":20.673818848950724,"temperature":13.2,"relativehumidity_2m":75,"windspeed_10m":14.8},{"datetime":"2024-10-16T15:00:00.000+02:00","dcPower":821.4637948690453,"power":657.1710358952363,"sunTilt":23.49320409080551,"sunAzimuth":36.34969840216598,"temperature":13.5,"relativehumidity_2m":77,"windspeed_10m":14.3},{"datetime":"2024-10-16T16:00:00.000+02:00","dcPower":643.408791431554,"power":514.7270331452432,"sunTilt":16.969240740198778,"sunAzimuth":50.54017502787197,"temperature":13.5,"relativehumidity_2m":80,"windspeed_10m":13.7},{"datetime":"2024-10-16T17:00:00.000+02:00","dcPower":439.6091142498436,"power":351.68729139987494,"sunTilt":9.025401762418719,"sunAzimuth":63.386211071389155,"temperature":13.3,"relativehumidity_2m":82,"windspeed_10m":13.2},{"datetime":"2024-10-16T18:00:00.000+02:00","dcPower":218.69491379498575,"power":174.9559310359886,"sunTilt":0.16457346744538273,"sunAzimuth":75.30773046735078,"temperature":13,"relativehumidity_2m":82,"windspeed_10m":13},{"datetime":"2024-10-16T19:00:00.000+02:00","dcPower":44.96868965159397,"power":35.974951721275175,"sunTilt":-9.186961271997145,"sunAzimuth":86.84418120594421,"temperature":12.6,"relativehumidity_2m":81,"windspeed_10m":12.7},{"datetime":"2024-10-16T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.64168080965683,"sunAzimuth":98.60786901950698,"temperature":12.2,"relativehumidity_2m":80,"windspeed_10m":12.2},{"datetime":"2024-10-16T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-27.788711717705176,"sunAzimuth":111.30870010109864,"temperature":12,"relativehumidity_2m":80,"windspeed_10m":11.8},{"datetime":"2024-10-16T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-36.112460277357016,"sunAzimuth":125.78490981561183,"temperature":11.8,"relativehumidity_2m":81,"windspeed_10m":11},{"datetime":"2024-10-16T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.9021656490531,"sunAzimuth":142.90069940402603,"temperature":11.7,"relativehumidity_2m":82,"windspeed_10m":10.2},{"datetime":"2024-10-17T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.23373820466217,"sunAzimuth":163.02375644913673,"temperature":11.7,"relativehumidity_2m":82,"windspeed_10m":9.4},{"datetime":"2024-10-17T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-48.2359718752176,"sunAzimuth":-174.9320340577077,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":8.6},{"datetime":"2024-10-17T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.66431793404074,"sunAzimuth":-153.4938195445769,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":8.2},{"datetime":"2024-10-17T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-40.115139405653565,"sunAzimuth":-134.69043107615582,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":7.9},{"datetime":"2024-10-17T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.54426550294801,"sunAzimuth":-118.84703704658551,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":7.6},{"datetime":"2024-10-17T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.79099983796868,"sunAzimuth":-105.2693069294498,"temperature":11.7,"relativehumidity_2m":82,"windspeed_10m":7.6},{"datetime":"2024-10-17T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-14.469536195186127,"sunAzimuth":-93.07325245162968,"temperature":11.6,"relativehumidity_2m":82,"windspeed_10m":7.4},{"datetime":"2024-10-17T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-5.038393916921545,"sunAzimuth":-81.47875856041325,"temperature":11.4,"relativehumidity_2m":83,"windspeed_10m":7.3},{"datetime":"2024-10-17T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.109572239802723,"sunAzimuth":-69.8263270263417,"temperature":11.5,"relativehumidity_2m":83,"windspeed_10m":7.4},{"datetime":"2024-10-17T09:00:00.000+02:00","dcPower":105.03214056441247,"power":84.02571245152998,"sunTilt":12.574671747325786,"sunAzimuth":-57.53951661964237,"temperature":11.9,"relativehumidity_2m":83,"windspeed_10m":8},{"datetime":"2024-10-17T10:00:00.000+02:00","dcPower":312.8842945992691,"power":250.30743567941528,"sunTilt":19.89831645004539,"sunAzimuth":-44.1268501705138,"temperature":12.5,"relativehumidity_2m":82,"windspeed_10m":9.7},{"datetime":"2024-10-17T11:00:00.000+02:00","dcPower":488.55377841324116,"power":390.84302273059296,"sunTilt":25.54455964459646,"sunAzimuth":-29.277026273264024,"temperature":13.1,"relativehumidity_2m":82,"windspeed_10m":10.8},{"datetime":"2024-10-17T12:00:00.000+02:00","dcPower":633.4064482929499,"power":506.72515863435996,"sunTilt":28.952884649607554,"sunAzimuth":-13.059427258390235,"temperature":13.5,"relativehumidity_2m":83,"windspeed_10m":10.7},{"datetime":"2024-10-17T13:00:00.000+02:00","dcPower":729.049282498162,"power":583.2394259985297,"sunTilt":29.694087805098004,"sunAzimuth":3.9106711264578404,"temperature":13.8,"relativehumidity_2m":85,"windspeed_10m":10.8},{"datetime":"2024-10-17T14:00:00.000+02:00","dcPower":761.5535689723715,"power":609.2428551778972,"sunTilt":27.663008228484166,"sunAzimuth":20.63634185579284,"temperature":14.2,"relativehumidity_2m":86,"windspeed_10m":10.5},{"datetime":"2024-10-17T15:00:00.000+02:00","dcPower":726.9635320188225,"power":581.5708256150581,"sunTilt":23.13530429931852,"sunAzimuth":36.24986394147597,"temperature":14.6,"relativehumidity_2m":87,"windspeed_10m":9.8},{"datetime":"2024-10-17T16:00:00.000+02:00","dcPower":625.4301522062517,"power":500.3441217650014,"sunTilt":16.626042266391202,"sunAzimuth":50.39758024284303,"temperature":14.9,"relativehumidity_2m":88,"windspeed_10m":9.2},{"datetime":"2024-10-17T17:00:00.000+02:00","dcPower":451.1586680783196,"power":360.9269344626557,"sunTilt":8.696388379725821,"sunAzimuth":63.21657784217465,"temperature":15.1,"relativehumidity_2m":89,"windspeed_10m":8.7},{"datetime":"2024-10-17T18:00:00.000+02:00","dcPower":222.0746839182061,"power":177.6597471345649,"sunTilt":-0.15393334821361332,"sunAzimuth":75.12113476396313,"temperature":14.9,"relativehumidity_2m":90,"windspeed_10m":7.9},{"datetime":"2024-10-17T19:00:00.000+02:00","dcPower":39.6933615946055,"power":31.7546892756844,"sunTilt":-9.500383797971471,"sunAzimuth":86.64674682587622,"temperature":14.6,"relativehumidity_2m":92,"windspeed_10m":6.7},{"datetime":"2024-10-17T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.956464510241965,"sunAzimuth":98.40462190157557,"temperature":14.3,"relativehumidity_2m":93,"windspeed_10m":5.9},{"datetime":"2024-10-17T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-28.11186795253563,"sunAzimuth":111.10746217430679,"temperature":14.2,"relativehumidity_2m":94,"windspeed_10m":5.4},{"datetime":"2024-10-17T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-36.45054181856139,"sunAzimuth":125.60237057929713,"temperature":14.2,"relativehumidity_2m":94,"windspeed_10m":4.6},{"datetime":"2024-10-17T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.2582671659911,"sunAzimuth":142.77034580724174,"temperature":14.2,"relativehumidity_2m":95,"windspeed_10m":4.4}],[{"datetime":"2024-10-06T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.03892891605494,"sunAzimuth":163.14263622624128,"temperature":7,"relativehumidity_2m":88,"windspeed_10m":7.9},{"datetime":"2024-10-06T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.13778324543035,"sunAzimuth":-176.22585898864278,"temperature":6.5,"relativehumidity_2m":91,"windspeed_10m":6.8},{"datetime":"2024-10-06T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.87117274960936,"sunAzimuth":-155.9729639229445,"temperature":6,"relativehumidity_2m":91,"windspeed_10m":5.9},{"datetime":"2024-10-06T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-36.70531092777589,"sunAzimuth":-137.8059489226708,"temperature":5.5,"relativehumidity_2m":92,"windspeed_10m":5.1},{"datetime":"2024-10-06T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-29.46443142893699,"sunAzimuth":-122.16602054266892,"temperature":5.1,"relativehumidity_2m":92,"windspeed_10m":6.2},{"datetime":"2024-10-06T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-20.930765133481234,"sunAzimuth":-108.58249513077881,"temperature":4.9,"relativehumidity_2m":93,"windspeed_10m":5.8},{"datetime":"2024-10-06T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-11.710347315474053,"sunAzimuth":-96.31140508589108,"temperature":5.1,"relativehumidity_2m":92,"windspeed_10m":6.5},{"datetime":"2024-10-06T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-2.2689443207496223,"sunAzimuth":-84.62890292197706,"temperature":5.3,"relativehumidity_2m":92,"windspeed_10m":7.6},{"datetime":"2024-10-06T08:00:00.000+02:00","dcPower":2.705705892666875,"power":2.1645647141335003,"sunTilt":6.991906328571172,"sunAzimuth":-72.87999206290318,"temperature":5.5,"relativehumidity_2m":91,"windspeed_10m":8.4},{"datetime":"2024-10-06T09:00:00.000+02:00","dcPower":57.65254422751687,"power":46.1220353820135,"sunTilt":15.663160391528187,"sunAzimuth":-60.45596163553978,"temperature":6.3,"relativehumidity_2m":90,"windspeed_10m":9.3},{"datetime":"2024-10-06T10:00:00.000+02:00","dcPower":119.20917355200001,"power":95.36733884160002,"sunTilt":23.268816289666535,"sunAzimuth":-46.79827360798693,"temperature":8,"relativehumidity_2m":85,"windspeed_10m":11.6},{"datetime":"2024-10-06T11:00:00.000+02:00","dcPower":176.16728214926752,"power":140.93382571941402,"sunTilt":29.234287239795027,"sunAzimuth":-31.503805204051176,"temperature":9.5,"relativehumidity_2m":86,"windspeed_10m":15.1},{"datetime":"2024-10-06T12:00:00.000+02:00","dcPower":564.3026414176044,"power":451.4421131340835,"sunTilt":32.93002248275174,"sunAzimuth":-14.578212396799534,"temperature":10.8,"relativehumidity_2m":82,"windspeed_10m":16.3},{"datetime":"2024-10-06T13:00:00.000+02:00","dcPower":540.9369663099236,"power":432.7495730479389,"sunTilt":33.84613522696556,"sunAzimuth":3.3037874055175505,"temperature":10.9,"relativehumidity_2m":82,"windspeed_10m":16.9},{"datetime":"2024-10-06T14:00:00.000+02:00","dcPower":464.5359852589149,"power":371.62878820713195,"sunTilt":31.83736693728352,"sunAzimuth":20.94669333759787,"temperature":12.6,"relativehumidity_2m":74,"windspeed_10m":17.1},{"datetime":"2024-10-06T15:00:00.000+02:00","dcPower":477.45533013060344,"power":381.96426410448277,"sunTilt":27.209548486852757,"sunAzimuth":37.29302345489315,"temperature":12.8,"relativehumidity_2m":75,"windspeed_10m":17.8},{"datetime":"2024-10-06T16:00:00.000+02:00","dcPower":307.88619712830206,"power":246.30895770264166,"sunTilt":20.54547686442047,"sunAzimuth":51.93430385037965,"temperature":13.1,"relativehumidity_2m":73,"windspeed_10m":17.8},{"datetime":"2024-10-06T17:00:00.000+02:00","dcPower":187.53043014586999,"power":150.024344116696,"sunTilt":12.4658413410018,"sunAzimuth":65.05541740712634,"temperature":12.6,"relativehumidity_2m":72,"windspeed_10m":15.3},{"datetime":"2024-10-06T18:00:00.000+02:00","dcPower":99.74907463554689,"power":79.79925970843752,"sunTilt":3.5065849097251456,"sunAzimuth":77.13919140741508,"temperature":11.9,"relativehumidity_2m":76,"windspeed_10m":14.8},{"datetime":"2024-10-06T19:00:00.000+02:00","dcPower":19.860135578171874,"power":15.8881084625375,"sunTilt":-5.8888854618235795,"sunAzimuth":88.76774476136781,"temperature":11.1,"relativehumidity_2m":79,"windspeed_10m":15.1},{"datetime":"2024-10-06T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-15.324219942418523,"sunAzimuth":100.56460329657087,"temperature":10.6,"relativehumidity_2m":81,"windspeed_10m":12.2},{"datetime":"2024-10-06T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-24.385415066790006,"sunAzimuth":113.21108724923529,"temperature":10.3,"relativehumidity_2m":81,"windspeed_10m":13.4},{"datetime":"2024-10-06T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.56528997863786,"sunAzimuth":127.45995077522508,"temperature":10.3,"relativehumidity_2m":83,"windspeed_10m":13.4},{"datetime":"2024-10-06T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.19130152908581,"sunAzimuth":144.02419079232183,"temperature":10.7,"relativehumidity_2m":83,"windspeed_10m":13},{"datetime":"2024-10-07T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.4292477470776,"sunAzimuth":163.14429087891105,"temperature":11,"relativehumidity_2m":83,"windspeed_10m":13.6},{"datetime":"2024-10-07T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.517749495901406,"sunAzimuth":-176.10136944486192,"temperature":11,"relativehumidity_2m":87,"windspeed_10m":11.2},{"datetime":"2024-10-07T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.22254930467857,"sunAzimuth":-155.74445709329385,"temperature":10.9,"relativehumidity_2m":91,"windspeed_10m":9.8},{"datetime":"2024-10-07T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.020882886444426,"sunAzimuth":-137.5192133151141,"temperature":11,"relativehumidity_2m":93,"windspeed_10m":8.7},{"datetime":"2024-10-07T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-29.748563322135755,"sunAzimuth":-121.8586066543482,"temperature":11.4,"relativehumidity_2m":94,"windspeed_10m":8.9},{"datetime":"2024-10-07T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.193270783038106,"sunAzimuth":-108.27337691467278,"temperature":11.5,"relativehumidity_2m":95,"windspeed_10m":11},{"datetime":"2024-10-07T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-11.962117012521006,"sunAzimuth":-96.00713008699226,"temperature":12,"relativehumidity_2m":94,"windspeed_10m":8.4},{"datetime":"2024-10-07T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-2.520439907672165,"sunAzimuth":-84.33068309080377,"temperature":12.2,"relativehumidity_2m":95,"windspeed_10m":9.3},{"datetime":"2024-10-07T08:00:00.000+02:00","dcPower":1.1877547101875001,"power":0.9502037681500002,"sunTilt":6.730829735879827,"sunAzimuth":-72.58838243599898,"temperature":12.7,"relativehumidity_2m":94,"windspeed_10m":6.2},{"datetime":"2024-10-07T09:00:00.000+02:00","dcPower":24.298528725187502,"power":19.438822980150004,"sunTilt":15.383293627086166,"sunAzimuth":-60.174375329765816,"temperature":13.3,"relativehumidity_2m":94,"windspeed_10m":7.4},{"datetime":"2024-10-07T10:00:00.000+02:00","dcPower":99.00096165043,"power":79.20076932034401,"sunTilt":22.96230371458641,"sunAzimuth":-46.53655309716923,"temperature":14.4,"relativehumidity_2m":91,"windspeed_10m":8.9},{"datetime":"2024-10-07T11:00:00.000+02:00","dcPower":90.58295243867188,"power":72.46636195093751,"sunTilt":28.896671975172765,"sunAzimuth":-31.281195510232457,"temperature":15.2,"relativehumidity_2m":91,"windspeed_10m":10.9},{"datetime":"2024-10-07T12:00:00.000+02:00","dcPower":206.2311706601901,"power":164.98493652815208,"sunTilt":32.56343562699629,"sunAzimuth":-14.421329305847635,"temperature":16,"relativehumidity_2m":89,"windspeed_10m":8.4},{"datetime":"2024-10-07T13:00:00.000+02:00","dcPower":380.37752208740244,"power":304.30201766992195,"sunTilt":33.46089993111447,"sunAzimuth":3.3732496911031458,"temperature":17,"relativehumidity_2m":82,"windspeed_10m":10.5},{"datetime":"2024-10-07T14:00:00.000+02:00","dcPower":444.5766828263196,"power":355.6613462610557,"sunTilt":31.448234246769605,"sunAzimuth":20.927108911856653,"temperature":18,"relativehumidity_2m":75,"windspeed_10m":9.8},{"datetime":"2024-10-07T15:00:00.000+02:00","dcPower":374.63788289233753,"power":299.71030631387003,"sunTilt":26.828539273003113,"sunAzimuth":37.20261442198752,"temperature":18.6,"relativehumidity_2m":70,"windspeed_10m":5.8},{"datetime":"2024-10-07T16:00:00.000+02:00","dcPower":252.36015882335633,"power":201.8881270586851,"sunTilt":20.17798028996772,"sunAzimuth":51.797067137147856,"temperature":18.9,"relativehumidity_2m":70,"windspeed_10m":7.4},{"datetime":"2024-10-07T17:00:00.000+02:00","dcPower":185.30274165096753,"power":148.24219332077402,"sunTilt":12.11146577521795,"sunAzimuth":64.89046144901918,"temperature":18.4,"relativehumidity_2m":72,"windspeed_10m":7.2},{"datetime":"2024-10-07T18:00:00.000+02:00","dcPower":83.06339266979688,"power":66.45071413583752,"sunTilt":3.1615292467832945,"sunAzimuth":76.95875071433478,"temperature":17.4,"relativehumidity_2m":74,"windspeed_10m":9.5},{"datetime":"2024-10-07T19:00:00.000+02:00","dcPower":18.1767567334675,"power":14.541405386774,"sunTilt":-6.2300935503595385,"sunAzimuth":88.57949984494998,"temperature":16.4,"relativehumidity_2m":79,"windspeed_10m":7.6},{"datetime":"2024-10-07T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-15.667810875617224,"sunAzimuth":100.37506201699385,"temperature":15.4,"relativehumidity_2m":87,"windspeed_10m":9.2},{"datetime":"2024-10-07T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-24.737727405113922,"sunAzimuth":113.02960837119129,"temperature":14.9,"relativehumidity_2m":90,"windspeed_10m":10.9},{"datetime":"2024-10-07T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.93153539182831,"sunAzimuth":127.30408938398604,"temperature":14.5,"relativehumidity_2m":94,"windspeed_10m":10.7},{"datetime":"2024-10-07T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.572641175501424,"sunAzimuth":143.925225436442,"temperature":14.7,"relativehumidity_2m":94,"windspeed_10m":11.6},{"datetime":"2024-10-08T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.818121034022454,"sunAzimuth":163.14384998115503,"temperature":14.7,"relativehumidity_2m":94,"windspeed_10m":15.8},{"datetime":"2024-10-08T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.8965146817323,"sunAzimuth":-175.97781528741945,"temperature":14.8,"relativehumidity_2m":93,"windspeed_10m":14},{"datetime":"2024-10-08T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.572826067170936,"sunAzimuth":-155.51612909180187,"temperature":15.4,"relativehumidity_2m":94,"windspeed_10m":11.2},{"datetime":"2024-10-08T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.33548533853669,"sunAzimuth":-137.23273090041528,"temperature":15.4,"relativehumidity_2m":93,"windspeed_10m":12.2},{"datetime":"2024-10-08T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.031970973409337,"sunAzimuth":-121.55190085899577,"temperature":15.4,"relativehumidity_2m":93,"windspeed_10m":11.2},{"datetime":"2024-10-08T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.45536424486834,"sunAzimuth":-107.96544161465735,"temperature":15.8,"relativehumidity_2m":94,"windspeed_10m":10},{"datetime":"2024-10-08T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.213784351950519,"sunAzimuth":-95.70446004731738,"temperature":15.8,"relativehumidity_2m":93,"windspeed_10m":10.8},{"datetime":"2024-10-08T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-2.772091353585381,"sunAzimuth":-84.03447848078322,"temperature":15.7,"relativehumidity_2m":93,"windspeed_10m":10.5},{"datetime":"2024-10-08T08:00:00.000+02:00","dcPower":0.9403939745200003,"power":0.7523151796160003,"sunTilt":6.469429830924286,"sunAzimuth":-72.29923977528891,"temperature":15.7,"relativehumidity_2m":90,"windspeed_10m":10.2},{"datetime":"2024-10-08T09:00:00.000+02:00","dcPower":49.46079645283,"power":39.568637162264004,"sunTilt":15.10307050684314,"sunAzimuth":-59.895772492079,"temperature":15.7,"relativehumidity_2m":89,"windspeed_10m":8.3},{"datetime":"2024-10-08T10:00:00.000+02:00","dcPower":133.24586591603,"power":106.59669273282401,"sunTilt":22.655587204347487,"sunAzimuth":-46.27834028428006,"temperature":16.3,"relativehumidity_2m":86,"windspeed_10m":10.6},{"datetime":"2024-10-08T11:00:00.000+02:00","dcPower":196.52604667500003,"power":157.22083734000003,"sunTilt":28.55922255887939,"sunAzimuth":-31.06241498925654,"temperature":17,"relativehumidity_2m":85,"windspeed_10m":9},{"datetime":"2024-10-08T12:00:00.000+02:00","dcPower":334.8024958939491,"power":267.84199671515927,"sunTilt":32.19754822667087,"sunAzimuth":-14.26805544520534,"temperature":17.6,"relativehumidity_2m":82,"windspeed_10m":13.1},{"datetime":"2024-10-08T13:00:00.000+02:00","dcPower":455.8287658376337,"power":364.663012670107,"sunTilt":33.07688907994966,"sunAzimuth":3.4399896103944245,"temperature":18.3,"relativehumidity_2m":73,"windspeed_10m":12.7},{"datetime":"2024-10-08T14:00:00.000+02:00","dcPower":372.2582413893144,"power":297.8065931114515,"sunTilt":31.060677746554727,"sunAzimuth":20.90593811884074,"temperature":18.2,"relativehumidity_2m":71,"windspeed_10m":13.2},{"datetime":"2024-10-08T15:00:00.000+02:00","dcPower":311.9842847493126,"power":249.5874277994501,"sunTilt":26.44928138282813,"sunAzimuth":37.11144846293623,"temperature":18.1,"relativehumidity_2m":71,"windspeed_10m":13.3},{"datetime":"2024-10-08T16:00:00.000+02:00","dcPower":199.64949036591122,"power":159.71959229272898,"sunTilt":19.81233269039211,"sunAzimuth":51.65943401571543,"temperature":17.4,"relativehumidity_2m":73,"windspeed_10m":9.2},{"datetime":"2024-10-08T17:00:00.000+02:00","dcPower":141.4621015685675,"power":113.16968125485401,"sunTilt":11.759033809196055,"sunAzimuth":64.72512518734406,"temperature":16.9,"relativehumidity_2m":75,"windspeed_10m":6.3},{"datetime":"2024-10-08T18:00:00.000+02:00","dcPower":80.56004293366748,"power":64.44803434693398,"sunTilt":2.818529310708217,"sunAzimuth":76.77774147088243,"temperature":16,"relativehumidity_2m":75,"windspeed_10m":8.6},{"datetime":"2024-10-08T19:00:00.000+02:00","dcPower":18.238636997546877,"power":14.590909598037502,"sunTilt":-6.569128186596377,"sunAzimuth":88.39036262615889,"temperature":15,"relativehumidity_2m":82,"windspeed_10m":5.8},{"datetime":"2024-10-08T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-16.00913432264249,"sunAzimuth":100.18418560559792,"temperature":14.5,"relativehumidity_2m":89,"windspeed_10m":4.7},{"datetime":"2024-10-08T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-25.087746753502067,"sunAzimuth":112.84624373263145,"temperature":14,"relativehumidity_2m":93,"windspeed_10m":8.4},{"datetime":"2024-10-08T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-33.29558919415396,"sunAzimuth":127.1457755347392,"temperature":14,"relativehumidity_2m":88,"windspeed_10m":8.6},{"datetime":"2024-10-08T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.95205668980692,"sunAzimuth":143.82353531827584,"temperature":13,"relativehumidity_2m":91,"windspeed_10m":7.2},{"datetime":"2024-10-09T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.20543351779722,"sunAzimuth":163.1411836959831,"temperature":12.6,"relativehumidity_2m":92,"windspeed_10m":7.8},{"datetime":"2024-10-09T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.27398595213309,"sunAzimuth":-175.8553370630724,"temperature":12.9,"relativehumidity_2m":91,"windspeed_10m":10.5},{"datetime":"2024-10-09T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.92193289241474,"sunAzimuth":-155.28812310014723,"temperature":12.7,"relativehumidity_2m":92,"windspeed_10m":10.5},{"datetime":"2024-10-09T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.64906836752005,"sunAzimuth":-136.94664669208646,"temperature":12.9,"relativehumidity_2m":91,"windspeed_10m":12.3},{"datetime":"2024-10-09T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.314619206373006,"sunAzimuth":-121.24604384005964,"temperature":12.9,"relativehumidity_2m":91,"windspeed_10m":10.2},{"datetime":"2024-10-09T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.71701795569338,"sunAzimuth":-107.65882183814558,"temperature":13.2,"relativehumidity_2m":90,"windspeed_10m":12.9},{"datetime":"2024-10-09T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.465322674764078,"sunAzimuth":-95.40351983003244,"temperature":13.3,"relativehumidity_2m":89,"windspeed_10m":13.5},{"datetime":"2024-10-09T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.023867147662328,"sunAzimuth":-83.74040781223535,"temperature":12.9,"relativehumidity_2m":92,"windspeed_10m":13.2},{"datetime":"2024-10-09T08:00:00.000+02:00","dcPower":0.23740534840750008,"power":0.18992427872600007,"sunTilt":6.207747953736028,"sunAzimuth":-72.01267721735641,"temperature":12.9,"relativehumidity_2m":92,"windspeed_10m":11.8},{"datetime":"2024-10-09T09:00:00.000+02:00","dcPower":12.811284756270002,"power":10.249027805016002,"sunTilt":14.82254636430179,"sunAzimuth":-59.62025856421435,"temperature":12.8,"relativehumidity_2m":93,"windspeed_10m":11.8},{"datetime":"2024-10-09T10:00:00.000+02:00","dcPower":40.81670722668,"power":32.653365781344,"sunTilt":22.348738640203063,"sunAzimuth":-46.023727432629336,"temperature":13.1,"relativehumidity_2m":91,"windspeed_10m":13.7},{"datetime":"2024-10-09T11:00:00.000+02:00","dcPower":83.24077643426999,"power":66.592621147416,"sunTilt":28.22202694317921,"sunAzimuth":-30.847536638720733,"temperature":13.7,"relativehumidity_2m":92,"windspeed_10m":12.8},{"datetime":"2024-10-09T12:00:00.000+02:00","dcPower":126.537344683617,"power":101.2298757468936,"sunTilt":31.832460658762763,"sunAzimuth":-14.118446086753368,"temperature":13.8,"relativehumidity_2m":91,"windspeed_10m":12},{"datetime":"2024-10-09T13:00:00.000+02:00","dcPower":114.88404360475715,"power":91.90723488380573,"sunTilt":32.69421193791607,"sunAzimuth":3.503957762689472,"temperature":14.2,"relativehumidity_2m":90,"windspeed_10m":11.5},{"datetime":"2024-10-09T14:00:00.000+02:00","dcPower":84.81614681380752,"power":67.85291745104603,"sunTilt":30.674814714273392,"sunAzimuth":20.883130296493302,"temperature":13.9,"relativehumidity_2m":91,"windspeed_10m":13.7},{"datetime":"2024-10-09T15:00:00.000+02:00","dcPower":48.3547931762223,"power":38.68383454097784,"sunTilt":26.07189945210854,"sunAzimuth":37.01947906146245,"temperature":13.8,"relativehumidity_2m":92,"windspeed_10m":13.8},{"datetime":"2024-10-09T16:00:00.000+02:00","dcPower":37.58272513091204,"power":30.066180104729632,"sunTilt":19.448663917806936,"sunAzimuth":51.521368716140636,"temperature":13.8,"relativehumidity_2m":91,"windspeed_10m":14.5},{"datetime":"2024-10-09T17:00:00.000+02:00","dcPower":24.8262611926875,"power":19.86100895415,"sunTilt":11.408678227135676,"sunAzimuth":64.55938454107346,"temperature":13.5,"relativehumidity_2m":90,"windspeed_10m":15.8},{"datetime":"2024-10-09T18:00:00.000+02:00","dcPower":14.794745341796876,"power":11.835796273437502,"sunTilt":2.4777195309842384,"sunAzimuth":76.59614824640437,"temperature":13.4,"relativehumidity_2m":92,"windspeed_10m":13.4},{"datetime":"2024-10-09T19:00:00.000+02:00","dcPower":3.3148202878699995,"power":2.6518562302959996,"sunTilt":-6.905853552820109,"sunAzimuth":88.20032142925027,"temperature":13.6,"relativehumidity_2m":93,"windspeed_10m":14.5},{"datetime":"2024-10-09T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-16.348052794342024,"sunAzimuth":99.99195941586059,"temperature":13.7,"relativehumidity_2m":94,"windspeed_10m":15.3},{"datetime":"2024-10-09T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-25.43533401280622,"sunAzimuth":112.66096568522038,"temperature":14,"relativehumidity_2m":93,"windspeed_10m":15.5},{"datetime":"2024-10-09T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-33.657312701408955,"sunAzimuth":126.98495418142949,"temperature":14.2,"relativehumidity_2m":93,"windspeed_10m":14.3},{"datetime":"2024-10-09T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-40.32941598688323,"sunAzimuth":143.71902473598436,"temperature":14.8,"relativehumidity_2m":90,"windspeed_10m":17.6},{"datetime":"2024-10-10T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.59106942107243,"sunAzimuth":163.13616076353475,"temperature":15.3,"relativehumidity_2m":89,"windspeed_10m":16.9},{"datetime":"2024-10-10T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.65007030458014,"sunAzimuth":-175.73407816523158,"temperature":15,"relativehumidity_2m":92,"windspeed_10m":15.1},{"datetime":"2024-10-10T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.26979987634531,"sunAzimuth":-155.060585251648,"temperature":14.9,"relativehumidity_2m":91,"windspeed_10m":15.3},{"datetime":"2024-10-10T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.96158240518052,"sunAzimuth":-136.66110792848332,"temperature":13.8,"relativehumidity_2m":97,"windspeed_10m":18.8},{"datetime":"2024-10-10T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.59647297796838,"sunAzimuth":-120.94117758387233,"temperature":12.4,"relativehumidity_2m":94,"windspeed_10m":25.6},{"datetime":"2024-10-10T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.97820409915596,"sunAzimuth":-107.35365077473413,"temperature":12.1,"relativehumidity_2m":92,"windspeed_10m":22.8},{"datetime":"2024-10-10T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.716704637744286,"sunAzimuth":-95.1044343497123,"temperature":12,"relativehumidity_2m":95,"windspeed_10m":19.5},{"datetime":"2024-10-10T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.275734703378654,"sunAzimuth":-83.4485894065161,"temperature":11.8,"relativehumidity_2m":93,"windspeed_10m":17.2},{"datetime":"2024-10-10T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":5.945826827444097,"sunAzimuth":-71.72880701980833,"temperature":12.1,"relativehumidity_2m":95,"windspeed_10m":16.3},{"datetime":"2024-10-10T09:00:00.000+02:00","dcPower":6.570788212467501,"power":5.256630569974001,"sunTilt":14.541778076840487,"sunAzimuth":-59.34793757422427,"temperature":12.1,"relativehumidity_2m":94,"windspeed_10m":14.7},{"datetime":"2024-10-10T10:00:00.000+02:00","dcPower":19.246776201607496,"power":15.397420961285997,"sunTilt":22.041831409435048,"sunAzimuth":-45.7728048820313,"temperature":12.2,"relativehumidity_2m":92,"windspeed_10m":15},{"datetime":"2024-10-10T11:00:00.000+02:00","dcPower":35.79458163940749,"power":28.635665311525994,"sunTilt":27.885174335468335,"sunAzimuth":-30.63663127573816,"temperature":12.5,"relativehumidity_2m":92,"windspeed_10m":15.7},{"datetime":"2024-10-10T12:00:00.000+02:00","dcPower":212.3973794995887,"power":169.91790359967098,"sunTilt":31.46827419380231,"sunAzimuth":-13.972554382839954,"temperature":12.8,"relativehumidity_2m":89,"windspeed_10m":18.5},{"datetime":"2024-10-10T13:00:00.000+02:00","dcPower":107.04232470086383,"power":85.63385976069107,"sunTilt":32.31297830760232,"sunAzimuth":3.5651067967559134,"temperature":12.3,"relativehumidity_2m":91,"windspeed_10m":17.7},{"datetime":"2024-10-10T14:00:00.000+02:00","dcPower":260.1484069522973,"power":208.11872556183786,"sunTilt":30.29076264178465,"sunAzimuth":20.858636821509823,"temperature":13.1,"relativehumidity_2m":87,"windspeed_10m":16},{"datetime":"2024-10-10T15:00:00.000+02:00","dcPower":268.64868665722827,"power":214.91894932578262,"sunTilt":25.696518065354862,"sunAzimuth":36.92666158608413,"temperature":13.2,"relativehumidity_2m":86,"windspeed_10m":15.1},{"datetime":"2024-10-10T16:00:00.000+02:00","dcPower":187.07375066675246,"power":149.65900053340198,"sunTilt":19.087103602605772,"sunAzimuth":51.382837136526646,"temperature":13,"relativehumidity_2m":81,"windspeed_10m":15.1},{"datetime":"2024-10-10T17:00:00.000+02:00","dcPower":116.12954417192189,"power":92.90363533753752,"sunTilt":11.060531491249431,"sunAzimuth":64.39321702308736,"temperature":12.8,"relativehumidity_2m":75,"windspeed_10m":13.3},{"datetime":"2024-10-10T18:00:00.000+02:00","dcPower":79.50227134729688,"power":63.60181707783751,"sunTilt":2.1392339596675116,"sunAzimuth":76.4139573135511,"temperature":12.3,"relativehumidity_2m":79,"windspeed_10m":12.2},{"datetime":"2024-10-10T19:00:00.000+02:00","dcPower":14.266554068707503,"power":11.413243254966003,"sunTilt":-7.240134220715796,"sunAzimuth":88.00936653945188,"temperature":11,"relativehumidity_2m":80,"windspeed_10m":7},{"datetime":"2024-10-10T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-16.684429132286564,"sunAzimuth":99.79837109714164,"temperature":10.6,"relativehumidity_2m":84,"windspeed_10m":5.2},{"datetime":"2024-10-10T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-25.780350237977437,"sunAzimuth":112.47374911967749,"temperature":10.1,"relativehumidity_2m":85,"windspeed_10m":4.3},{"datetime":"2024-10-10T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-34.01656707008997,"sunAzimuth":126.82157256673277,"temperature":10.2,"relativehumidity_2m":84,"windspeed_10m":9.2},{"datetime":"2024-10-10T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-40.704586491662205,"sunAzimuth":143.61159893587703,"temperature":9.8,"relativehumidity_2m":90,"windspeed_10m":7.9},{"datetime":"2024-10-11T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.97491243886403,"sunAzimuth":163.128648637255,"temperature":9.3,"relativehumidity_2m":92,"windspeed_10m":10.8},{"datetime":"2024-10-11T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.02467456169168,"sunAzimuth":-175.6141848122969,"temperature":8.9,"relativehumidity_2m":94,"windspeed_10m":8.7},{"datetime":"2024-10-11T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.61635732682025,"sunAzimuth":-154.8336646265192,"temperature":8.3,"relativehumidity_2m":91,"windspeed_10m":2.9},{"datetime":"2024-10-11T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-38.27297819203817,"sunAzimuth":-136.37626404685486,"temperature":8.3,"relativehumidity_2m":93,"windspeed_10m":3.6},{"datetime":"2024-10-11T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.877497329298222,"sunAzimuth":-120.63744534201388,"temperature":8.3,"relativehumidity_2m":95,"windspeed_10m":8.7},{"datetime":"2024-10-11T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-22.238894548955713,"sunAzimuth":-107.05006215076084,"temperature":8.3,"relativehumidity_2m":98,"windspeed_10m":6.5},{"datetime":"2024-10-11T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.96790216264699,"sunAzimuth":-94.80732853145587,"temperature":8.3,"relativehumidity_2m":96,"windspeed_10m":8.6},{"datetime":"2024-10-11T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.5276603134629134,"sunAzimuth":-83.1591411410959,"temperature":7.9,"relativehumidity_2m":95,"windspeed_10m":7.8},{"datetime":"2024-10-11T08:00:00.000+02:00","dcPower":0.24182794840750005,"power":0.19346235872600004,"sunTilt":5.683710585945252,"sunAzimuth":-71.44774052199065,"temperature":7.5,"relativehumidity_2m":96,"windspeed_10m":6.9},{"datetime":"2024-10-11T09:00:00.000+02:00","dcPower":30.4231615824675,"power":24.338529265974003,"sunTilt":14.260824082236146,"sunAzimuth":-59.0789120948653,"temperature":7.8,"relativehumidity_2m":93,"windspeed_10m":8.6},{"datetime":"2024-10-11T10:00:00.000+02:00","dcPower":110.45511291227001,"power":88.36409032981601,"sunTilt":21.734940400779433,"sunAzimuth":-45.525661029390804,"temperature":8.1,"relativehumidity_2m":89,"windspeed_10m":8.2},{"datetime":"2024-10-11T11:00:00.000+02:00","dcPower":179.76265080683,"power":143.81012064546402,"sunTilt":27.54875518315372,"sunAzimuth":-30.429767533564867,"temperature":9,"relativehumidity_2m":84,"windspeed_10m":7.6},{"datetime":"2024-10-11T12:00:00.000+02:00","dcPower":648.5202747579858,"power":518.8162198063886,"sunTilt":31.105090976135774,"sunAzimuth":-13.830431372703888,"temperature":9.8,"relativehumidity_2m":79,"windspeed_10m":7.4},{"datetime":"2024-10-11T13:00:00.000+02:00","dcPower":602.7210414765614,"power":482.1768331812491,"sunTilt":31.9332985100557,"sunAzimuth":3.6233914143032355,"temperature":10.3,"relativehumidity_2m":74,"windspeed_10m":6.5},{"datetime":"2024-10-11T14:00:00.000+02:00","dcPower":612.5638197473248,"power":490.0510557978599,"sunTilt":29.908639212205873,"sunAzimuth":20.83241114244682,"temperature":10.8,"relativehumidity_2m":71,"windspeed_10m":5.1},{"datetime":"2024-10-11T15:00:00.000+02:00","dcPower":473.3573784004406,"power":378.6859027203525,"sunTilt":25.3232617284627,"sunAzimuth":36.83295334168066,"temperature":11.1,"relativehumidity_2m":69,"windspeed_10m":4.3},{"datetime":"2024-10-11T16:00:00.000+02:00","dcPower":275.36889679567673,"power":220.2951174365414,"sunTilt":18.727781114603793,"sunAzimuth":51.243806920166435,"temperature":11.2,"relativehumidity_2m":68,"windspeed_10m":4},{"datetime":"2024-10-11T17:00:00.000+02:00","dcPower":139.32802424290747,"power":111.46241939432599,"sunTilt":10.714725694488843,"sunAzimuth":64.22660182758023,"temperature":10.9,"relativehumidity_2m":71,"windspeed_10m":4.1},{"datetime":"2024-10-11T18:00:00.000+02:00","dcPower":74.31139897630752,"power":59.449119181046015,"sunTilt":1.803206213409536,"sunAzimuth":76.23115674859116,"temperature":10.3,"relativehumidity_2m":77,"windspeed_10m":0.5},{"datetime":"2024-10-11T19:00:00.000+02:00","dcPower":14.798395647266878,"power":11.838716517813502,"sunTilt":-7.571835214892863,"sunAzimuth":87.81749031617603,"temperature":9,"relativehumidity_2m":79,"windspeed_10m":1.9},{"datetime":"2024-10-11T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-17.0181265759899,"sunAzimuth":99.60341073267222,"temperature":7.9,"relativehumidity_2m":83,"windspeed_10m":2.4},{"datetime":"2024-10-11T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-26.122656701936815,"sunAzimuth":112.28457164140065,"temperature":7,"relativehumidity_2m":85,"windspeed_10m":2.9},{"datetime":"2024-10-11T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-34.37321335134456,"sunAzimuth":126.65558045028693,"temperature":6.5,"relativehumidity_2m":86,"windspeed_10m":3},{"datetime":"2024-10-11T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.07743516418665,"sunAzimuth":143.5011643499793,"temperature":6,"relativehumidity_2m":88,"windspeed_10m":3.3},{"datetime":"2024-10-12T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.35684572865986,"sunAzimuth":163.11851362268473,"temperature":5.4,"relativehumidity_2m":89,"windspeed_10m":4.8},{"datetime":"2024-10-12T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.397705346785955,"sunAzimuth":-175.49580600360676,"temperature":5.1,"relativehumidity_2m":90,"windspeed_10m":4.7},{"datetime":"2024-10-12T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.961535734103165,"sunAzimuth":-154.60751324634,"temperature":4.9,"relativehumidity_2m":90,"windspeed_10m":5.1},{"datetime":"2024-10-12T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-38.58320673599567,"sunAzimuth":-136.09226665392447,"temperature":4.9,"relativehumidity_2m":91,"windspeed_10m":5.1},{"datetime":"2024-10-12T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.157657336040163,"sunAzimuth":-120.33499159290702,"temperature":4.9,"relativehumidity_2m":91,"windspeed_10m":5.4},{"datetime":"2024-10-12T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-22.499060815350038,"sunAzimuth":-106.7481901878237,"temperature":4.8,"relativehumidity_2m":91,"windspeed_10m":5},{"datetime":"2024-10-12T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.218886384957228,"sunAzimuth":-94.51232726794028,"temperature":4.6,"relativehumidity_2m":91,"windspeed_10m":5.4},{"datetime":"2024-10-12T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.77960910849284,"sunAzimuth":-82.87218040699524,"temperature":4.5,"relativehumidity_2m":91,"windspeed_10m":5.4},{"datetime":"2024-10-12T08:00:00.000+02:00","dcPower":0.24412114840750007,"power":0.19529691872600008,"sunTilt":5.421444806545091,"sunAzimuth":-71.16958809655219,"temperature":4.7,"relativehumidity_2m":92,"windspeed_10m":6.6},{"datetime":"2024-10-12T09:00:00.000+02:00","dcPower":45.32712998912,"power":36.261703991296,"sunTilt":13.979744388367903,"sunAzimuth":-58.8132832097472,"temperature":5.9,"relativehumidity_2m":90,"windspeed_10m":7.9},{"datetime":"2024-10-12T10:00:00.000+02:00","dcPower":128.75802772929686,"power":103.0064221834375,"sunTilt":21.42814200059926,"sunAzimuth":-45.28238230412684,"temperature":7.3,"relativehumidity_2m":87,"windspeed_10m":9.9},{"datetime":"2024-10-12T11:00:00.000+02:00","dcPower":184.27716056428,"power":147.421728451424,"sunTilt":27.21286115693797,"sunAzimuth":-30.227011858140273,"temperature":8.4,"relativehumidity_2m":87,"windspeed_10m":10.4},{"datetime":"2024-10-12T12:00:00.000+02:00","dcPower":590.2420674249103,"power":472.19365393992825,"sunTilt":30.743014004100917,"sunAzimuth":-13.692125978099353,"temperature":10.1,"relativehumidity_2m":82,"windspeed_10m":12.3},{"datetime":"2024-10-12T13:00:00.000+02:00","dcPower":458.52745912891487,"power":366.82196730313194,"sunTilt":31.555283363449327,"sunAzimuth":3.6787683789403496,"temperature":10.6,"relativehumidity_2m":81,"windspeed_10m":12.4},{"datetime":"2024-10-12T14:00:00.000+02:00","dcPower":412.6964962453449,"power":330.15719699627596,"sunTilt":29.52856227644022,"sunAzimuth":20.80440880713897,"temperature":11.2,"relativehumidity_2m":80,"windspeed_10m":11.3},{"datetime":"2024-10-12T15:00:00.000+02:00","dcPower":285.17838825344444,"power":228.14271060275556,"sunTilt":24.95225483898691,"sunAzimuth":36.7383136221432,"temperature":11.7,"relativehumidity_2m":80,"windspeed_10m":9.7},{"datetime":"2024-10-12T16:00:00.000+02:00","dcPower":170.7828071423425,"power":136.626245713874,"sunTilt":18.37082552430316,"sunAzimuth":51.10424752804786,"temperature":11.5,"relativehumidity_2m":82,"windspeed_10m":8.4},{"datetime":"2024-10-12T17:00:00.000+02:00","dcPower":111.50468126820752,"power":89.20374501456602,"sunTilt":10.371392509810583,"sunAzimuth":64.05951991866706,"temperature":11.1,"relativehumidity_2m":84,"windspeed_10m":9.4},{"datetime":"2024-10-12T18:00:00.000+02:00","dcPower":40.324461466607495,"power":32.259569173285996,"sunTilt":1.4697694157713943,"sunAzimuth":76.0477365277625,"temperature":10.5,"relativehumidity_2m":87,"windspeed_10m":8.4},{"datetime":"2024-10-12T19:00:00.000+02:00","dcPower":6.235591923470001,"power":4.9884735387760015,"sunTilt":-7.900822080898683,"sunAzimuth":87.62468730812897,"temperature":9.8,"relativehumidity_2m":90,"windspeed_10m":8.5},{"datetime":"2024-10-12T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-17.349008833561726,"sunAzimuth":99.4070709783674,"temperature":9.6,"relativehumidity_2m":92,"windspeed_10m":8.6},{"datetime":"2024-10-12T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-26.462114969564762,"sunAzimuth":112.09341375841275,"temperature":9.6,"relativehumidity_2m":92,"windspeed_10m":9.2},{"datetime":"2024-10-12T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-34.7271125456906,"sunAzimuth":126.48693033734844,"temperature":9.7,"relativehumidity_2m":92,"windspeed_10m":8},{"datetime":"2024-10-12T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.447828525061254,"sunAzimuth":143.38762883737587,"temperature":9.4,"relativehumidity_2m":94,"windspeed_10m":7.3},{"datetime":"2024-10-13T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.73675190204195,"sunAzimuth":163.1056210331007,"temperature":9.3,"relativehumidity_2m":94,"windspeed_10m":6.5},{"datetime":"2024-10-13T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.76906905918878,"sunAzimuth":-175.37909348313417,"temperature":9.1,"relativehumidity_2m":94,"windspeed_10m":7.4},{"datetime":"2024-10-13T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.30526573902631,"sunAzimuth":-154.3822860597556,"temperature":9.5,"relativehumidity_2m":92,"windspeed_10m":10},{"datetime":"2024-10-13T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-38.89221927072221,"sunAzimuth":-135.80926949668307,"temperature":9.6,"relativehumidity_2m":90,"windspeed_10m":16.3},{"datetime":"2024-10-13T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.436918053719957,"sunAzimuth":-120.03396199414307,"temperature":8.8,"relativehumidity_2m":87,"windspeed_10m":18},{"datetime":"2024-10-13T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-22.75867399010402,"sunAzimuth":-106.44816955814555,"temperature":8.4,"relativehumidity_2m":87,"windspeed_10m":15.5},{"datetime":"2024-10-13T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.469627601285604,"sunAzimuth":-94.21955537307969,"temperature":7.5,"relativehumidity_2m":83,"windspeed_10m":17},{"datetime":"2024-10-13T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.0315450153141486,"sunAzimuth":-82.58782406375519,"temperature":7.2,"relativehumidity_2m":82,"windspeed_10m":16.2},{"datetime":"2024-10-13T08:00:00.000+02:00","dcPower":0.24248314840750004,"power":0.19398651872600003,"sunTilt":5.159076534957485,"sunAzimuth":-70.89445910846419,"temperature":6.7,"relativehumidity_2m":84,"windspeed_10m":16.8},{"datetime":"2024-10-13T09:00:00.000+02:00","dcPower":33.32620211254687,"power":26.6609616900375,"sunTilt":13.698600583367673,"sunAzimuth":-58.55115047580995,"temperature":6.9,"relativehumidity_2m":86,"windspeed_10m":15.5},{"datetime":"2024-10-13T10:00:00.000+02:00","dcPower":97.76344758208,"power":78.21075806566401,"sunTilt":21.12151408595382,"sunAzimuth":-45.043053146408546,"temperature":7.5,"relativehumidity_2m":83,"windspeed_10m":22.7},{"datetime":"2024-10-13T11:00:00.000+02:00","dcPower":121.8090532421875,"power":97.44724259375,"sunTilt":26.877585132999467,"sunAzimuth":-30.028428502780528,"temperature":8.1,"relativehumidity_2m":83,"windspeed_10m":19.5},{"datetime":"2024-10-13T12:00:00.000+02:00","dcPower":283.55361802384414,"power":226.84289441907532,"sunTilt":30.382147107830978,"sunAzimuth":-13.557685005032592,"temperature":8.5,"relativehumidity_2m":82,"windspeed_10m":18.9},{"datetime":"2024-10-13T13:00:00.000+02:00","dcPower":460.29733045829306,"power":368.2378643666345,"sunTilt":31.17904416002473,"sunAzimuth":3.731196531846679,"temperature":9.4,"relativehumidity_2m":79,"windspeed_10m":19.1},{"datetime":"2024-10-13T14:00:00.000+02:00","dcPower":448.5623290202257,"power":358.8498632161806,"sunTilt":29.150649828823855,"sunAzimuth":20.774587486422366,"temperature":10.4,"relativehumidity_2m":75,"windspeed_10m":17.7},{"datetime":"2024-10-13T15:00:00.000+02:00","dcPower":389.502009045802,"power":311.60160723664166,"sunTilt":24.583621654336596,"sunAzimuth":36.642703763191776,"temperature":10.3,"relativehumidity_2m":74,"windspeed_10m":17.6},{"datetime":"2024-10-13T16:00:00.000+02:00","dcPower":224.46273791123238,"power":179.57019032898592,"sunTilt":18.016365562424813,"sunAzimuth":50.96413031013026,"temperature":10.3,"relativehumidity_2m":77,"windspeed_10m":15.1},{"datetime":"2024-10-13T17:00:00.000+02:00","dcPower":133.5301222976875,"power":106.82409783815001,"sunTilt":10.030663139779685,"sunAzimuth":63.89195411454739,"temperature":9.9,"relativehumidity_2m":79,"windspeed_10m":13.7},{"datetime":"2024-10-13T18:00:00.000+02:00","dcPower":55.5378030151875,"power":44.43024241215,"sunTilt":1.1390561362362333,"sunAzimuth":75.8636886240363,"temperature":9.1,"relativehumidity_2m":82,"windspeed_10m":10.8},{"datetime":"2024-10-13T19:00:00.000+02:00","dcPower":7.3238773566875,"power":5.85910188535,"sunTilt":-8.226960953264081,"sunAzimuth":87.43095436456028,"temperature":8.3,"relativehumidity_2m":87,"windspeed_10m":6.2},{"datetime":"2024-10-13T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-17.676940156857277,"sunAzimuth":99.2093472034457,"temperature":8.1,"relativehumidity_2m":87,"windspeed_10m":6.4},{"datetime":"2024-10-13T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-26.79858696849319,"sunAzimuth":111.90025906076745,"temperature":7.6,"relativehumidity_2m":90,"windspeed_10m":6.8},{"datetime":"2024-10-13T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-35.0781256664598,"sunAzimuth":126.3155777234557,"temperature":7.1,"relativehumidity_2m":90,"windspeed_10m":5},{"datetime":"2024-10-13T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.815632684929426,"sunAzimuth":143.2709019404984,"temperature":6.5,"relativehumidity_2m":91,"windspeed_10m":2.6},{"datetime":"2024-10-14T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.11451301786215,"sunAzimuth":163.08983536166957,"temperature":6.3,"relativehumidity_2m":89,"windspeed_10m":2.4},{"datetime":"2024-10-14T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.138671848584934,"sunAzimuth":-175.2642016873541,"temperature":5.8,"relativehumidity_2m":89,"windspeed_10m":1.5},{"datetime":"2024-10-14T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.647478099904184,"sunAzimuth":-154.15814092455744,"temperature":5.3,"relativehumidity_2m":90,"windspeed_10m":4},{"datetime":"2024-10-14T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.1999672120048,"sunAzimuth":-135.52742842855076,"temperature":4.5,"relativehumidity_2m":93,"windspeed_10m":1.5},{"datetime":"2024-10-14T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.715244466780028,"sunAzimuth":-119.73450334119632,"temperature":4,"relativehumidity_2m":94,"windspeed_10m":4.5},{"datetime":"2024-10-14T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.01770469074795,"sunAzimuth":-106.15013533780943,"temperature":3.8,"relativehumidity_2m":94,"windspeed_10m":4.7},{"datetime":"2024-10-14T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.720095220219516,"sunAzimuth":-93.92913753819082,"temperature":4.2,"relativehumidity_2m":94,"windspeed_10m":5.8},{"datetime":"2024-10-14T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.283430715645694,"sunAzimuth":-82.30618839226909,"temperature":4.7,"relativehumidity_2m":94,"windspeed_10m":4.7},{"datetime":"2024-10-14T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.896654311121907,"sunAzimuth":-70.62246187023919,"temperature":5.1,"relativehumidity_2m":93,"windspeed_10m":4.3},{"datetime":"2024-10-14T09:00:00.000+02:00","dcPower":30.3524563671875,"power":24.281965093750003,"sunTilt":13.417455844515738,"sunAzimuth":-58.29261188464403,"temperature":5.6,"relativehumidity_2m":92,"windspeed_10m":3.8},{"datetime":"2024-10-14T10:00:00.000+02:00","dcPower":92.77502055675,"power":74.22001644539999,"sunTilt":20.815136015137117,"sunAzimuth":-44.807755986987566,"temperature":6.7,"relativehumidity_2m":87,"windspeed_10m":6.2},{"datetime":"2024-10-14T11:00:00.000+02:00","dcPower":141.1877117546875,"power":112.95016940375001,"sunTilt":26.543021174019792,"sunAzimuth":-29.83407952105961,"temperature":7.5,"relativehumidity_2m":85,"windspeed_10m":10.1},{"datetime":"2024-10-14T12:00:00.000+02:00","dcPower":124.394385388,"power":99.51550831040001,"sunTilt":30.022594925866507,"sunAzimuth":-13.427153142476177,"temperature":7.8,"relativehumidity_2m":87,"windspeed_10m":7.4},{"datetime":"2024-10-14T13:00:00.000+02:00","dcPower":173.39473735675,"power":138.7157898854,"sunTilt":30.804692641790414,"sunAzimuth":3.780636799023051,"temperature":8.7,"relativehumidity_2m":84,"windspeed_10m":9.4},{"datetime":"2024-10-14T14:00:00.000+02:00","dcPower":187.28123510318864,"power":149.8249880825509,"sunTilt":28.775019978770835,"sunAzimuth":20.742907009369926,"temperature":8.8,"relativehumidity_2m":83,"windspeed_10m":7.7},{"datetime":"2024-10-14T15:00:00.000+02:00","dcPower":166.78754287867994,"power":133.43003430294397,"sunTilt":24.217486258022436,"sunAzimuth":36.546087194880954,"temperature":8.8,"relativehumidity_2m":85,"windspeed_10m":6.5},{"datetime":"2024-10-14T16:00:00.000+02:00","dcPower":136.40005543196577,"power":109.12004434557262,"sunTilt":17.664529576020236,"sunAzimuth":50.82342857831685,"temperature":8.7,"relativehumidity_2m":88,"windspeed_10m":5.2},{"datetime":"2024-10-14T17:00:00.000+02:00","dcPower":93.42627162968749,"power":74.74101730375,"sunTilt":9.692668263612882,"sunAzimuth":63.7238891712367,"temperature":8.4,"relativehumidity_2m":90,"windspeed_10m":3.6},{"datetime":"2024-10-14T18:00:00.000+02:00","dcPower":43.279184403,"power":34.6233475224,"sunTilt":0.8111983279457368,"sunAzimuth":75.67900710147994,"temperature":8.2,"relativehumidity_2m":91,"windspeed_10m":1.8},{"datetime":"2024-10-14T19:00:00.000+02:00","dcPower":7.24105056675,"power":5.7928404534,"sunTilt":-8.5501186243532,"sunAzimuth":87.23629074336492,"temperature":7.9,"relativehumidity_2m":93,"windspeed_10m":0.4},{"datetime":"2024-10-14T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.00178541748869,"sunAzimuth":99.01023762777291,"temperature":7.4,"relativehumidity_2m":94,"windspeed_10m":1.1},{"datetime":"2024-10-14T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-27.131935065748255,"sunAzimuth":111.70509440468732,"temperature":6.7,"relativehumidity_2m":96,"windspeed_10m":1.1},{"datetime":"2024-10-14T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-35.426113802819536,"sunAzimuth":126.14148133580082,"temperature":5.8,"relativehumidity_2m":98,"windspeed_10m":0.4},{"datetime":"2024-10-14T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.180713378529184,"sunAzimuth":143.15089515757862,"temperature":5,"relativehumidity_2m":100,"windspeed_10m":0.7},{"datetime":"2024-10-15T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.49001057641694,"sunAzimuth":163.07102046565072,"temperature":4.3,"relativehumidity_2m":100,"windspeed_10m":1.4},{"datetime":"2024-10-15T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.506419588733614,"sunAzimuth":-175.15128768425117,"temperature":3.8,"relativehumidity_2m":100,"windspeed_10m":1.9},{"datetime":"2024-10-15T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.988103658491234,"sunAzimuth":-153.9352385869432,"temperature":3.2,"relativehumidity_2m":100,"windspeed_10m":2.6},{"datetime":"2024-10-15T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.50640211284843,"sunAzimuth":-135.24690137263536,"temperature":2.4,"relativehumidity_2m":100,"windspeed_10m":2.9},{"datetime":"2024-10-15T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.992601433814595,"sunAzimuth":-119.43676351875516,"temperature":1.6,"relativehumidity_2m":100,"windspeed_10m":3.2},{"datetime":"2024-10-15T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.276123004228086,"sunAzimuth":-105.85422295783262,"temperature":1.2,"relativehumidity_2m":100,"windspeed_10m":3.6},{"datetime":"2024-10-15T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.970257710966642,"sunAzimuth":-93.64119828341282,"temperature":1.2,"relativehumidity_2m":100,"windspeed_10m":3.6},{"datetime":"2024-10-15T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.5352276078301,"sunAzimuth":-82.02738904900566,"temperature":1.6,"relativehumidity_2m":100,"windspeed_10m":3.6},{"datetime":"2024-10-15T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.63422819396966,"sunAzimuth":-70.35370359566531,"temperature":2.3,"relativehumidity_2m":100,"windspeed_10m":4},{"datetime":"2024-10-15T09:00:00.000+02:00","dcPower":38.55145616875,"power":30.841164935000002,"sunTilt":13.136374944499462,"sunAzimuth":-58.037763824819606,"temperature":3.4,"relativehumidity_2m":98,"windspeed_10m":5},{"datetime":"2024-10-15T10:00:00.000+02:00","dcPower":109.08258472300001,"power":87.26606777840001,"sunTilt":20.50908861823578,"sunAzimuth":-44.57657122307415,"temperature":4.8,"relativehumidity_2m":94,"windspeed_10m":6.2},{"datetime":"2024-10-15T11:00:00.000+02:00","dcPower":165.55749042700003,"power":132.44599234160003,"sunTilt":26.20926450679345,"sunAzimuth":-29.644024765315514,"temperature":6.3,"relativehumidity_2m":91,"windspeed_10m":7.8},{"datetime":"2024-10-15T12:00:00.000+02:00","dcPower":200.0332693541875,"power":160.02661548335,"sunTilt":29.66446288060627,"sunAzimuth":-13.300572957692536,"temperature":8,"relativehumidity_2m":88,"windspeed_10m":9.2},{"datetime":"2024-10-15T13:00:00.000+02:00","dcPower":756.0843895583059,"power":604.8675116466447,"sunTilt":30.43234097439692,"sunAzimuth":3.8270522061418095,"temperature":9.7,"relativehumidity_2m":84,"windspeed_10m":10.9},{"datetime":"2024-10-15T14:00:00.000+02:00","dcPower":707.1329549971153,"power":565.7063639976923,"sunTilt":28.401790922595836,"sunAzimuth":20.709329389098386,"temperature":10.8,"relativehumidity_2m":82,"windspeed_10m":11.9},{"datetime":"2024-10-15T15:00:00.000+02:00","dcPower":526.100183335248,"power":420.8801466681984,"sunTilt":23.853972526435296,"sunAzimuth":36.448429487078144,"temperature":11.2,"relativehumidity_2m":81,"windspeed_10m":11.9},{"datetime":"2024-10-15T16:00:00.000+02:00","dcPower":280.5106590390066,"power":224.4085272312053,"sunTilt":17.315445485866938,"sunAzimuth":50.682117672382816,"temperature":11,"relativehumidity_2m":81,"windspeed_10m":11},{"datetime":"2024-10-15T17:00:00.000+02:00","dcPower":118.147749552,"power":94.5181996416,"sunTilt":9.35753798215806,"sunAzimuth":63.55531186506398,"temperature":10.6,"relativehumidity_2m":82,"windspeed_10m":11.1},{"datetime":"2024-10-15T18:00:00.000+02:00","dcPower":63.10571387268751,"power":50.48457109815001,"sunTilt":0.48632726290863104,"sunAzimuth":75.49368820866877,"temperature":9.7,"relativehumidity_2m":85,"windspeed_10m":12.1},{"datetime":"2024-10-15T19:00:00.000+02:00","dcPower":13.241973932687499,"power":10.593579146149999,"sunTilt":-8.870162619560801,"sunAzimuth":87.04069822248259,"temperature":8.5,"relativehumidity_2m":88,"windspeed_10m":13.6},{"datetime":"2024-10-15T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.323410184499085,"sunAzimuth":98.80974345652376,"temperature":7.6,"relativehumidity_2m":91,"windspeed_10m":14.3},{"datetime":"2024-10-15T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-27.462022150796383,"sunAzimuth":111.50791010170794,"temperature":7.2,"relativehumidity_2m":91,"windspeed_10m":13.9},{"datetime":"2024-10-15T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-35.770938188604354,"sunAzimuth":125.96460338334036,"temperature":7,"relativehumidity_2m":91,"windspeed_10m":12.9},{"datetime":"2024-10-15T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.54293600102064,"sunAzimuth":143.02752222319543,"temperature":6.8,"relativehumidity_2m":89,"windspeed_10m":12.7},{"datetime":"2024-10-16T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.86312551477473,"sunAzimuth":163.04903976266138,"temperature":6.7,"relativehumidity_2m":86,"windspeed_10m":13.8},{"datetime":"2024-10-16T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.87221785059982,"sunAzimuth":-175.04051110279474,"temperature":6.8,"relativehumidity_2m":83,"windspeed_10m":15.6},{"datetime":"2024-10-16T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.32707330350441,"sunAzimuth":-153.71374265034802,"temperature":6.8,"relativehumidity_2m":80,"windspeed_10m":16.5},{"datetime":"2024-10-16T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.81147561550361,"sunAzimuth":-134.96784827714956,"temperature":7,"relativehumidity_2m":78,"windspeed_10m":16.1},{"datetime":"2024-10-16T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.26895363243685,"sunAzimuth":-119.1408914506387,"temperature":7.3,"relativehumidity_2m":77,"windspeed_10m":15.1},{"datetime":"2024-10-16T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.53389843309148,"sunAzimuth":-105.56056815727264,"temperature":7.4,"relativehumidity_2m":75,"windspeed_10m":14.3},{"datetime":"2024-10-16T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-14.220082554609817,"sunAzimuth":-93.355861910257,"temperature":7.4,"relativehumidity_2m":73,"windspeed_10m":14.3},{"datetime":"2024-10-16T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.786895768698711,"sunAzimuth":-81.75154101774274,"temperature":7.3,"relativehumidity_2m":71,"windspeed_10m":14.7},{"datetime":"2024-10-16T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.371849783596975,"sunAzimuth":-70.08829035405888,"temperature":7.2,"relativehumidity_2m":70,"windspeed_10m":14.8},{"datetime":"2024-10-16T09:00:00.000+02:00","dcPower":28.4527034491875,"power":22.76216275935,"sunTilt":12.855424254104108,"sunAzimuth":-57.78670104663053,"temperature":9.8,"relativehumidity_2m":72,"windspeed_10m":17},{"datetime":"2024-10-16T10:00:00.000+02:00","dcPower":82.400416875,"power":65.92033350000001,"sunTilt":20.203454185088123,"sunAzimuth":-44.34957719582011,"temperature":10.2,"relativehumidity_2m":75,"windspeed_10m":16.5},{"datetime":"2024-10-16T11:00:00.000+02:00","dcPower":129.82925219075,"power":103.8634017526,"sunTilt":25.87641150088954,"sunAzimuth":-29.45832187587005,"temperature":10.7,"relativehumidity_2m":77,"windspeed_10m":16.2},{"datetime":"2024-10-16T12:00:00.000+02:00","dcPower":176.5629584026875,"power":141.25036672215,"sunTilt":29.30785715204484,"sunAzimuth":-13.177984892004138,"temperature":11.6,"relativehumidity_2m":77,"windspeed_10m":15.7},{"datetime":"2024-10-16T13:00:00.000+02:00","dcPower":486.87760328361003,"power":389.50208262688807,"sunTilt":30.062101719417093,"sunAzimuth":3.870407893111919,"temperature":12.5,"relativehumidity_2m":75,"windspeed_10m":15.3},{"datetime":"2024-10-16T14:00:00.000+02:00","dcPower":471.13085183462414,"power":376.90468146769933,"sunTilt":28.03108091352568,"sunAzimuth":20.673818848950724,"temperature":13.2,"relativehumidity_2m":75,"windspeed_10m":14.8},{"datetime":"2024-10-16T15:00:00.000+02:00","dcPower":366.0504129403436,"power":292.8403303522749,"sunTilt":23.49320409080551,"sunAzimuth":36.34969840216598,"temperature":13.5,"relativehumidity_2m":77,"windspeed_10m":14.3},{"datetime":"2024-10-16T16:00:00.000+02:00","dcPower":216.91827490634043,"power":173.53461992507235,"sunTilt":16.969240740198778,"sunAzimuth":50.54017502787197,"temperature":13.5,"relativehumidity_2m":80,"windspeed_10m":13.7},{"datetime":"2024-10-16T17:00:00.000+02:00","dcPower":110.78138314075,"power":88.6251065126,"sunTilt":9.025401762418719,"sunAzimuth":63.386211071389155,"temperature":13.3,"relativehumidity_2m":82,"windspeed_10m":13.2},{"datetime":"2024-10-16T18:00:00.000+02:00","dcPower":54.4351348016875,"power":43.54810784135,"sunTilt":0.16457346744538273,"sunAzimuth":75.30773046735078,"temperature":13,"relativehumidity_2m":82,"windspeed_10m":13},{"datetime":"2024-10-16T19:00:00.000+02:00","dcPower":10.9590243,"power":8.76721944,"sunTilt":-9.186961271997145,"sunAzimuth":86.84418120594421,"temperature":12.6,"relativehumidity_2m":81,"windspeed_10m":12.7},{"datetime":"2024-10-16T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.64168080965683,"sunAzimuth":98.60786901950698,"temperature":12.2,"relativehumidity_2m":80,"windspeed_10m":12.2},{"datetime":"2024-10-16T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-27.788711717705176,"sunAzimuth":111.30870010109864,"temperature":12,"relativehumidity_2m":80,"windspeed_10m":11.8},{"datetime":"2024-10-16T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-36.112460277357016,"sunAzimuth":125.78490981561183,"temperature":11.8,"relativehumidity_2m":81,"windspeed_10m":11},{"datetime":"2024-10-16T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.9021656490531,"sunAzimuth":142.90069940402603,"temperature":11.7,"relativehumidity_2m":82,"windspeed_10m":10.2},{"datetime":"2024-10-17T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.23373820466217,"sunAzimuth":163.02375644913673,"temperature":11.7,"relativehumidity_2m":82,"windspeed_10m":9.4},{"datetime":"2024-10-17T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-48.2359718752176,"sunAzimuth":-174.9320340577077,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":8.6},{"datetime":"2024-10-17T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.66431793404074,"sunAzimuth":-153.4938195445769,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":8.2},{"datetime":"2024-10-17T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-40.115139405653565,"sunAzimuth":-134.69043107615582,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":7.9},{"datetime":"2024-10-17T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.54426550294801,"sunAzimuth":-118.84703704658551,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":7.6},{"datetime":"2024-10-17T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.79099983796868,"sunAzimuth":-105.2693069294498,"temperature":11.7,"relativehumidity_2m":82,"windspeed_10m":7.6},{"datetime":"2024-10-17T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-14.469536195186127,"sunAzimuth":-93.07325245162968,"temperature":11.6,"relativehumidity_2m":82,"windspeed_10m":7.4},{"datetime":"2024-10-17T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-5.038393916921545,"sunAzimuth":-81.47875856041325,"temperature":11.4,"relativehumidity_2m":83,"windspeed_10m":7.3},{"datetime":"2024-10-17T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.109572239802723,"sunAzimuth":-69.8263270263417,"temperature":11.5,"relativehumidity_2m":83,"windspeed_10m":7.4},{"datetime":"2024-10-17T09:00:00.000+02:00","dcPower":25.602632300000003,"power":20.482105840000003,"sunTilt":12.574671747325786,"sunAzimuth":-57.53951661964237,"temperature":11.9,"relativehumidity_2m":83,"windspeed_10m":8},{"datetime":"2024-10-17T10:00:00.000+02:00","dcPower":76.2421036916875,"power":60.99368295335,"sunTilt":19.89831645004539,"sunAzimuth":-44.1268501705138,"temperature":12.5,"relativehumidity_2m":82,"windspeed_10m":9.7},{"datetime":"2024-10-17T11:00:00.000+02:00","dcPower":119.09589569674999,"power":95.2767165574,"sunTilt":25.54455964459646,"sunAzimuth":-29.277026273264024,"temperature":13.1,"relativehumidity_2m":82,"windspeed_10m":10.8},{"datetime":"2024-10-17T12:00:00.000+02:00","dcPower":153.93946101668752,"power":123.15156881335002,"sunTilt":28.952884649607554,"sunAzimuth":-13.059427258390235,"temperature":13.5,"relativehumidity_2m":83,"windspeed_10m":10.7},{"datetime":"2024-10-17T13:00:00.000+02:00","dcPower":248.22004161241605,"power":198.57603328993287,"sunTilt":29.694087805098004,"sunAzimuth":3.9106711264578404,"temperature":13.8,"relativehumidity_2m":85,"windspeed_10m":10.8},{"datetime":"2024-10-17T14:00:00.000+02:00","dcPower":229.15318902704783,"power":183.32255122163826,"sunTilt":27.663008228484166,"sunAzimuth":20.63634185579284,"temperature":14.2,"relativehumidity_2m":86,"windspeed_10m":10.5},{"datetime":"2024-10-17T15:00:00.000+02:00","dcPower":203.74729317905823,"power":162.9978345432466,"sunTilt":23.13530429931852,"sunAzimuth":36.24986394147597,"temperature":14.6,"relativehumidity_2m":87,"windspeed_10m":9.8},{"datetime":"2024-10-17T16:00:00.000+02:00","dcPower":161.97727115162724,"power":129.5818169213018,"sunTilt":16.626042266391202,"sunAzimuth":50.39758024284303,"temperature":14.9,"relativehumidity_2m":88,"windspeed_10m":9.2},{"datetime":"2024-10-17T17:00:00.000+02:00","dcPower":108.840563643,"power":87.07245091440001,"sunTilt":8.696388379725821,"sunAzimuth":63.21657784217465,"temperature":15.1,"relativehumidity_2m":89,"windspeed_10m":8.7},{"datetime":"2024-10-17T18:00:00.000+02:00","dcPower":53.53735983268749,"power":42.829887866149996,"sunTilt":-0.15393334821361332,"sunAzimuth":75.12113476396313,"temperature":14.9,"relativehumidity_2m":90,"windspeed_10m":7.9},{"datetime":"2024-10-17T19:00:00.000+02:00","dcPower":9.524056729687501,"power":7.619245383750002,"sunTilt":-9.500383797971471,"sunAzimuth":86.64674682587622,"temperature":14.6,"relativehumidity_2m":92,"windspeed_10m":6.7},{"datetime":"2024-10-17T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.956464510241965,"sunAzimuth":98.40462190157557,"temperature":14.3,"relativehumidity_2m":93,"windspeed_10m":5.9},{"datetime":"2024-10-17T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-28.11186795253563,"sunAzimuth":111.10746217430679,"temperature":14.2,"relativehumidity_2m":94,"windspeed_10m":5.4},{"datetime":"2024-10-17T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-36.45054181856139,"sunAzimuth":125.60237057929713,"temperature":14.2,"relativehumidity_2m":94,"windspeed_10m":4.6},{"datetime":"2024-10-17T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.2582671659911,"sunAzimuth":142.77034580724174,"temperature":14.2,"relativehumidity_2m":95,"windspeed_10m":4.4}],[{"datetime":"2024-10-06T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.03892891605494,"sunAzimuth":163.14263622624128,"temperature":7,"relativehumidity_2m":88,"windspeed_10m":7.9},{"datetime":"2024-10-06T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.13778324543035,"sunAzimuth":-176.22585898864278,"temperature":6.5,"relativehumidity_2m":91,"windspeed_10m":6.8},{"datetime":"2024-10-06T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.87117274960936,"sunAzimuth":-155.9729639229445,"temperature":6,"relativehumidity_2m":91,"windspeed_10m":5.9},{"datetime":"2024-10-06T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-36.70531092777589,"sunAzimuth":-137.8059489226708,"temperature":5.5,"relativehumidity_2m":92,"windspeed_10m":5.1},{"datetime":"2024-10-06T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-29.46443142893699,"sunAzimuth":-122.16602054266892,"temperature":5.1,"relativehumidity_2m":92,"windspeed_10m":6.2},{"datetime":"2024-10-06T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-20.930765133481234,"sunAzimuth":-108.58249513077881,"temperature":4.9,"relativehumidity_2m":93,"windspeed_10m":5.8},{"datetime":"2024-10-06T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-11.710347315474053,"sunAzimuth":-96.31140508589108,"temperature":5.1,"relativehumidity_2m":92,"windspeed_10m":6.5},{"datetime":"2024-10-06T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-2.2689443207496223,"sunAzimuth":-84.62890292197706,"temperature":5.3,"relativehumidity_2m":92,"windspeed_10m":7.6},{"datetime":"2024-10-06T08:00:00.000+02:00","dcPower":3.3713875541106932,"power":2.697110043288555,"sunTilt":6.991906328571172,"sunAzimuth":-72.87999206290318,"temperature":5.5,"relativehumidity_2m":91,"windspeed_10m":8.4},{"datetime":"2024-10-06T09:00:00.000+02:00","dcPower":70.82484417927611,"power":56.65987534342089,"sunTilt":15.663160391528187,"sunAzimuth":-60.45596163553978,"temperature":6.3,"relativehumidity_2m":90,"windspeed_10m":9.3},{"datetime":"2024-10-06T10:00:00.000+02:00","dcPower":143.48119878382155,"power":114.78495902705725,"sunTilt":23.268816289666535,"sunAzimuth":-46.79827360798693,"temperature":8,"relativehumidity_2m":85,"windspeed_10m":11.6},{"datetime":"2024-10-06T11:00:00.000+02:00","dcPower":811.9852773713835,"power":649.5882218971069,"sunTilt":29.234287239795027,"sunAzimuth":-31.503805204051176,"temperature":9.5,"relativehumidity_2m":86,"windspeed_10m":15.1},{"datetime":"2024-10-06T12:00:00.000+02:00","dcPower":670.9876969713171,"power":536.7901575770537,"sunTilt":32.93002248275174,"sunAzimuth":-14.578212396799534,"temperature":10.8,"relativehumidity_2m":82,"windspeed_10m":16.3},{"datetime":"2024-10-06T13:00:00.000+02:00","dcPower":702.4696779546789,"power":561.9757423637432,"sunTilt":33.84613522696556,"sunAzimuth":3.3037874055175505,"temperature":10.9,"relativehumidity_2m":82,"windspeed_10m":16.9},{"datetime":"2024-10-06T14:00:00.000+02:00","dcPower":644.8630403406012,"power":515.890432272481,"sunTilt":31.83736693728352,"sunAzimuth":20.94669333759787,"temperature":12.6,"relativehumidity_2m":74,"windspeed_10m":17.1},{"datetime":"2024-10-06T15:00:00.000+02:00","dcPower":329.8924014292663,"power":263.913921143413,"sunTilt":27.209548486852757,"sunAzimuth":37.29302345489315,"temperature":12.8,"relativehumidity_2m":75,"windspeed_10m":17.8},{"datetime":"2024-10-06T16:00:00.000+02:00","dcPower":256.92857639701907,"power":205.54286111761527,"sunTilt":20.54547686442047,"sunAzimuth":51.93430385037965,"temperature":13.1,"relativehumidity_2m":73,"windspeed_10m":17.8},{"datetime":"2024-10-06T17:00:00.000+02:00","dcPower":232.7996743539756,"power":186.2397394831805,"sunTilt":12.4658413410018,"sunAzimuth":65.05541740712634,"temperature":12.6,"relativehumidity_2m":72,"windspeed_10m":15.3},{"datetime":"2024-10-06T18:00:00.000+02:00","dcPower":123.82855203865259,"power":99.06284163092208,"sunTilt":3.5065849097251456,"sunAzimuth":77.13919140741508,"temperature":11.9,"relativehumidity_2m":76,"windspeed_10m":14.8},{"datetime":"2024-10-06T19:00:00.000+02:00","dcPower":24.756413134229224,"power":19.80513050738338,"sunTilt":-5.8888854618235795,"sunAzimuth":88.76774476136781,"temperature":11.1,"relativehumidity_2m":79,"windspeed_10m":15.1},{"datetime":"2024-10-06T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-15.324219942418523,"sunAzimuth":100.56460329657087,"temperature":10.6,"relativehumidity_2m":81,"windspeed_10m":12.2},{"datetime":"2024-10-06T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-24.385415066790006,"sunAzimuth":113.21108724923529,"temperature":10.3,"relativehumidity_2m":81,"windspeed_10m":13.4},{"datetime":"2024-10-06T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.56528997863786,"sunAzimuth":127.45995077522508,"temperature":10.3,"relativehumidity_2m":83,"windspeed_10m":13.4},{"datetime":"2024-10-06T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.19130152908581,"sunAzimuth":144.02419079232183,"temperature":10.7,"relativehumidity_2m":83,"windspeed_10m":13},{"datetime":"2024-10-07T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.4292477470776,"sunAzimuth":163.14429087891105,"temperature":11,"relativehumidity_2m":83,"windspeed_10m":13.6},{"datetime":"2024-10-07T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.517749495901406,"sunAzimuth":-176.10136944486192,"temperature":11,"relativehumidity_2m":87,"windspeed_10m":11.2},{"datetime":"2024-10-07T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.22254930467857,"sunAzimuth":-155.74445709329385,"temperature":10.9,"relativehumidity_2m":91,"windspeed_10m":9.8},{"datetime":"2024-10-07T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.020882886444426,"sunAzimuth":-137.5192133151141,"temperature":11,"relativehumidity_2m":93,"windspeed_10m":8.7},{"datetime":"2024-10-07T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-29.748563322135755,"sunAzimuth":-121.8586066543482,"temperature":11.4,"relativehumidity_2m":94,"windspeed_10m":8.9},{"datetime":"2024-10-07T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.193270783038106,"sunAzimuth":-108.27337691467278,"temperature":11.5,"relativehumidity_2m":95,"windspeed_10m":11},{"datetime":"2024-10-07T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-11.962117012521006,"sunAzimuth":-96.00713008699226,"temperature":12,"relativehumidity_2m":94,"windspeed_10m":8.4},{"datetime":"2024-10-07T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-2.520439907672165,"sunAzimuth":-84.33068309080377,"temperature":12.2,"relativehumidity_2m":95,"windspeed_10m":9.3},{"datetime":"2024-10-07T08:00:00.000+02:00","dcPower":1.4871743864343177,"power":1.189739509147454,"sunTilt":6.730829735879827,"sunAzimuth":-72.58838243599898,"temperature":12.7,"relativehumidity_2m":94,"windspeed_10m":6.2},{"datetime":"2024-10-07T09:00:00.000+02:00","dcPower":30.392000747748977,"power":24.313600598199184,"sunTilt":15.383293627086166,"sunAzimuth":-60.174375329765816,"temperature":13.3,"relativehumidity_2m":94,"windspeed_10m":7.4},{"datetime":"2024-10-07T10:00:00.000+02:00","dcPower":122.83253304737609,"power":98.26602643790088,"sunTilt":22.96230371458641,"sunAzimuth":-46.53655309716923,"temperature":14.4,"relativehumidity_2m":91,"windspeed_10m":8.9},{"datetime":"2024-10-07T11:00:00.000+02:00","dcPower":135.97403551360443,"power":108.77922841088355,"sunTilt":28.896671975172765,"sunAzimuth":-31.281195510232457,"temperature":15.2,"relativehumidity_2m":91,"windspeed_10m":10.9},{"datetime":"2024-10-07T12:00:00.000+02:00","dcPower":251.53152684611086,"power":201.2252214768887,"sunTilt":32.56343562699629,"sunAzimuth":-14.421329305847635,"temperature":16,"relativehumidity_2m":89,"windspeed_10m":8.4},{"datetime":"2024-10-07T13:00:00.000+02:00","dcPower":487.9224729067913,"power":390.3379783254331,"sunTilt":33.46089993111447,"sunAzimuth":3.3732496911031458,"temperature":17,"relativehumidity_2m":82,"windspeed_10m":10.5},{"datetime":"2024-10-07T14:00:00.000+02:00","dcPower":645.7510235050102,"power":516.6008188040081,"sunTilt":31.448234246769605,"sunAzimuth":20.927108911856653,"temperature":18,"relativehumidity_2m":75,"windspeed_10m":9.8},{"datetime":"2024-10-07T15:00:00.000+02:00","dcPower":310.6413374640256,"power":248.5130699712205,"sunTilt":26.828539273003113,"sunAzimuth":37.20261442198752,"temperature":18.6,"relativehumidity_2m":70,"windspeed_10m":5.8},{"datetime":"2024-10-07T16:00:00.000+02:00","dcPower":256.82161295176576,"power":205.45729036141262,"sunTilt":20.17798028996772,"sunAzimuth":51.797067137147856,"temperature":18.9,"relativehumidity_2m":70,"windspeed_10m":7.4},{"datetime":"2024-10-07T17:00:00.000+02:00","dcPower":229.1217228030218,"power":183.29737824241747,"sunTilt":12.11146577521795,"sunAzimuth":64.89046144901918,"temperature":18.4,"relativehumidity_2m":72,"windspeed_10m":7.2},{"datetime":"2024-10-07T18:00:00.000+02:00","dcPower":103.54709914126633,"power":82.83767931301307,"sunTilt":3.1615292467832945,"sunAzimuth":76.95875071433478,"temperature":17.4,"relativehumidity_2m":74,"windspeed_10m":9.5},{"datetime":"2024-10-07T19:00:00.000+02:00","dcPower":22.74012496621281,"power":18.19209997297025,"sunTilt":-6.2300935503595385,"sunAzimuth":88.57949984494998,"temperature":16.4,"relativehumidity_2m":79,"windspeed_10m":7.6},{"datetime":"2024-10-07T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-15.667810875617224,"sunAzimuth":100.37506201699385,"temperature":15.4,"relativehumidity_2m":87,"windspeed_10m":9.2},{"datetime":"2024-10-07T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-24.737727405113922,"sunAzimuth":113.02960837119129,"temperature":14.9,"relativehumidity_2m":90,"windspeed_10m":10.9},{"datetime":"2024-10-07T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.93153539182831,"sunAzimuth":127.30408938398604,"temperature":14.5,"relativehumidity_2m":94,"windspeed_10m":10.7},{"datetime":"2024-10-07T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.572641175501424,"sunAzimuth":143.925225436442,"temperature":14.7,"relativehumidity_2m":94,"windspeed_10m":11.6},{"datetime":"2024-10-08T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.818121034022454,"sunAzimuth":163.14384998115503,"temperature":14.7,"relativehumidity_2m":94,"windspeed_10m":15.8},{"datetime":"2024-10-08T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.8965146817323,"sunAzimuth":-175.97781528741945,"temperature":14.8,"relativehumidity_2m":93,"windspeed_10m":14},{"datetime":"2024-10-08T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.572826067170936,"sunAzimuth":-155.51612909180187,"temperature":15.4,"relativehumidity_2m":94,"windspeed_10m":11.2},{"datetime":"2024-10-08T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.33548533853669,"sunAzimuth":-137.23273090041528,"temperature":15.4,"relativehumidity_2m":93,"windspeed_10m":12.2},{"datetime":"2024-10-08T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.031970973409337,"sunAzimuth":-121.55190085899577,"temperature":15.4,"relativehumidity_2m":93,"windspeed_10m":11.2},{"datetime":"2024-10-08T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.45536424486834,"sunAzimuth":-107.96544161465735,"temperature":15.8,"relativehumidity_2m":94,"windspeed_10m":10},{"datetime":"2024-10-08T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.213784351950519,"sunAzimuth":-95.70446004731738,"temperature":15.8,"relativehumidity_2m":93,"windspeed_10m":10.8},{"datetime":"2024-10-08T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-2.772091353585381,"sunAzimuth":-84.03447848078322,"temperature":15.7,"relativehumidity_2m":93,"windspeed_10m":10.5},{"datetime":"2024-10-08T08:00:00.000+02:00","dcPower":1.1774588428322112,"power":0.9419670742657691,"sunTilt":6.469429830924286,"sunAzimuth":-72.29923977528891,"temperature":15.7,"relativehumidity_2m":90,"windspeed_10m":10.2},{"datetime":"2024-10-08T09:00:00.000+02:00","dcPower":61.738481173216655,"power":49.390784938573326,"sunTilt":15.10307050684314,"sunAzimuth":-59.895772492079,"temperature":15.7,"relativehumidity_2m":89,"windspeed_10m":8.3},{"datetime":"2024-10-08T10:00:00.000+02:00","dcPower":165.74955432771506,"power":132.59964346217205,"sunTilt":22.655587204347487,"sunAzimuth":-46.27834028428006,"temperature":16.3,"relativehumidity_2m":86,"windspeed_10m":10.6},{"datetime":"2024-10-08T11:00:00.000+02:00","dcPower":302.02175381156064,"power":241.61740304924854,"sunTilt":28.55922255887939,"sunAzimuth":-31.06241498925654,"temperature":17,"relativehumidity_2m":85,"windspeed_10m":9},{"datetime":"2024-10-08T12:00:00.000+02:00","dcPower":407.300701925971,"power":325.84056154077683,"sunTilt":32.19754822667087,"sunAzimuth":-14.26805544520534,"temperature":17.6,"relativehumidity_2m":82,"windspeed_10m":13.1},{"datetime":"2024-10-08T13:00:00.000+02:00","dcPower":587.8235107579072,"power":470.25880860632583,"sunTilt":33.07688907994966,"sunAzimuth":3.4399896103944245,"temperature":18.3,"relativehumidity_2m":73,"windspeed_10m":12.7},{"datetime":"2024-10-08T14:00:00.000+02:00","dcPower":499.10887945306024,"power":399.28710356244824,"sunTilt":31.060677746554727,"sunAzimuth":20.90593811884074,"temperature":18.2,"relativehumidity_2m":71,"windspeed_10m":13.2},{"datetime":"2024-10-08T15:00:00.000+02:00","dcPower":344.3210351561571,"power":275.4568281249257,"sunTilt":26.44928138282813,"sunAzimuth":37.11144846293623,"temperature":18.1,"relativehumidity_2m":71,"windspeed_10m":13.3},{"datetime":"2024-10-08T16:00:00.000+02:00","dcPower":247.53117087126986,"power":198.0249366970159,"sunTilt":19.81233269039211,"sunAzimuth":51.65943401571543,"temperature":17.4,"relativehumidity_2m":73,"windspeed_10m":9.2},{"datetime":"2024-10-08T17:00:00.000+02:00","dcPower":176.7268760826156,"power":141.3815008660925,"sunTilt":11.759033809196055,"sunAzimuth":64.72512518734406,"temperature":16.9,"relativehumidity_2m":75,"windspeed_10m":6.3},{"datetime":"2024-10-08T18:00:00.000+02:00","dcPower":100.76280838553514,"power":80.61024670842812,"sunTilt":2.818529310708217,"sunAzimuth":76.77774147088243,"temperature":16,"relativehumidity_2m":75,"windspeed_10m":8.6},{"datetime":"2024-10-08T19:00:00.000+02:00","dcPower":22.833330533924155,"power":18.266664427139325,"sunTilt":-6.569128186596377,"sunAzimuth":88.39036262615889,"temperature":15,"relativehumidity_2m":82,"windspeed_10m":5.8},{"datetime":"2024-10-08T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-16.00913432264249,"sunAzimuth":100.18418560559792,"temperature":14.5,"relativehumidity_2m":89,"windspeed_10m":4.7},{"datetime":"2024-10-08T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-25.087746753502067,"sunAzimuth":112.84624373263145,"temperature":14,"relativehumidity_2m":93,"windspeed_10m":8.4},{"datetime":"2024-10-08T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-33.29558919415396,"sunAzimuth":127.1457755347392,"temperature":14,"relativehumidity_2m":88,"windspeed_10m":8.6},{"datetime":"2024-10-08T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.95205668980692,"sunAzimuth":143.82353531827584,"temperature":13,"relativehumidity_2m":91,"windspeed_10m":7.2},{"datetime":"2024-10-09T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.20543351779722,"sunAzimuth":163.1411836959831,"temperature":12.6,"relativehumidity_2m":92,"windspeed_10m":7.8},{"datetime":"2024-10-09T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.27398595213309,"sunAzimuth":-175.8553370630724,"temperature":12.9,"relativehumidity_2m":91,"windspeed_10m":10.5},{"datetime":"2024-10-09T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.92193289241474,"sunAzimuth":-155.28812310014723,"temperature":12.7,"relativehumidity_2m":92,"windspeed_10m":10.5},{"datetime":"2024-10-09T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.64906836752005,"sunAzimuth":-136.94664669208646,"temperature":12.9,"relativehumidity_2m":91,"windspeed_10m":12.3},{"datetime":"2024-10-09T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.314619206373006,"sunAzimuth":-121.24604384005964,"temperature":12.9,"relativehumidity_2m":91,"windspeed_10m":10.2},{"datetime":"2024-10-09T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.71701795569338,"sunAzimuth":-107.65882183814558,"temperature":13.2,"relativehumidity_2m":90,"windspeed_10m":12.9},{"datetime":"2024-10-09T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.465322674764078,"sunAzimuth":-95.40351983003244,"temperature":13.3,"relativehumidity_2m":89,"windspeed_10m":13.5},{"datetime":"2024-10-09T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.023867147662328,"sunAzimuth":-83.74040781223535,"temperature":12.9,"relativehumidity_2m":92,"windspeed_10m":13.2},{"datetime":"2024-10-09T08:00:00.000+02:00","dcPower":0.29725475849939703,"power":0.23780380679951763,"sunTilt":6.207747953736028,"sunAzimuth":-72.01267721735641,"temperature":12.9,"relativehumidity_2m":92,"windspeed_10m":11.8},{"datetime":"2024-10-09T09:00:00.000+02:00","dcPower":16.039424714571386,"power":12.83153977165711,"sunTilt":14.82254636430179,"sunAzimuth":-59.62025856421435,"temperature":12.8,"relativehumidity_2m":93,"windspeed_10m":11.8},{"datetime":"2024-10-09T10:00:00.000+02:00","dcPower":51.0745453462637,"power":40.859636277010964,"sunTilt":22.348738640203063,"sunAzimuth":-46.023727432629336,"temperature":13.1,"relativehumidity_2m":91,"windspeed_10m":13.7},{"datetime":"2024-10-09T11:00:00.000+02:00","dcPower":104.15753243201114,"power":83.32602594560892,"sunTilt":28.22202694317921,"sunAzimuth":-30.847536638720733,"temperature":13.7,"relativehumidity_2m":92,"windspeed_10m":12.8},{"datetime":"2024-10-09T12:00:00.000+02:00","dcPower":157.65994959715988,"power":126.12795967772792,"sunTilt":31.832460658762763,"sunAzimuth":-14.118446086753368,"temperature":13.8,"relativehumidity_2m":91,"windspeed_10m":12},{"datetime":"2024-10-09T13:00:00.000+02:00","dcPower":143.9780319305286,"power":115.18242554442288,"sunTilt":32.69421193791607,"sunAzimuth":3.503957762689472,"temperature":14.2,"relativehumidity_2m":90,"windspeed_10m":11.5},{"datetime":"2024-10-09T14:00:00.000+02:00","dcPower":106.12732760501824,"power":84.9018620840146,"sunTilt":30.674814714273392,"sunAzimuth":20.883130296493302,"temperature":13.9,"relativehumidity_2m":91,"windspeed_10m":13.7},{"datetime":"2024-10-09T15:00:00.000+02:00","dcPower":59.78263600805569,"power":47.82610880644455,"sunTilt":26.07189945210854,"sunAzimuth":37.01947906146245,"temperature":13.8,"relativehumidity_2m":92,"windspeed_10m":13.8},{"datetime":"2024-10-09T16:00:00.000+02:00","dcPower":46.56073709140872,"power":37.24858967312698,"sunTilt":19.448663917806936,"sunAzimuth":51.521368716140636,"temperature":13.8,"relativehumidity_2m":91,"windspeed_10m":14.5},{"datetime":"2024-10-09T17:00:00.000+02:00","dcPower":31.078962623371577,"power":24.863170098697264,"sunTilt":11.408678227135676,"sunAzimuth":64.55938454107346,"temperature":13.5,"relativehumidity_2m":90,"windspeed_10m":15.8},{"datetime":"2024-10-09T18:00:00.000+02:00","dcPower":18.522376821489427,"power":14.817901457191542,"sunTilt":2.4777195309842384,"sunAzimuth":76.59614824640437,"temperature":13.4,"relativehumidity_2m":92,"windspeed_10m":13.4},{"datetime":"2024-10-09T19:00:00.000+02:00","dcPower":4.150380638374255,"power":3.3203045106994042,"sunTilt":-6.905853552820109,"sunAzimuth":88.20032142925027,"temperature":13.6,"relativehumidity_2m":93,"windspeed_10m":14.5},{"datetime":"2024-10-09T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-16.348052794342024,"sunAzimuth":99.99195941586059,"temperature":13.7,"relativehumidity_2m":94,"windspeed_10m":15.3},{"datetime":"2024-10-09T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-25.43533401280622,"sunAzimuth":112.66096568522038,"temperature":14,"relativehumidity_2m":93,"windspeed_10m":15.5},{"datetime":"2024-10-09T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-33.657312701408955,"sunAzimuth":126.98495418142949,"temperature":14.2,"relativehumidity_2m":93,"windspeed_10m":14.3},{"datetime":"2024-10-09T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-40.32941598688323,"sunAzimuth":143.71902473598436,"temperature":14.8,"relativehumidity_2m":90,"windspeed_10m":17.6},{"datetime":"2024-10-10T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.59106942107243,"sunAzimuth":163.13616076353475,"temperature":15.3,"relativehumidity_2m":89,"windspeed_10m":16.9},{"datetime":"2024-10-10T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.65007030458014,"sunAzimuth":-175.73407816523158,"temperature":15,"relativehumidity_2m":92,"windspeed_10m":15.1},{"datetime":"2024-10-10T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.26979987634531,"sunAzimuth":-155.060585251648,"temperature":14.9,"relativehumidity_2m":91,"windspeed_10m":15.3},{"datetime":"2024-10-10T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-37.96158240518052,"sunAzimuth":-136.66110792848332,"temperature":13.8,"relativehumidity_2m":97,"windspeed_10m":18.8},{"datetime":"2024-10-10T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.59647297796838,"sunAzimuth":-120.94117758387233,"temperature":12.4,"relativehumidity_2m":94,"windspeed_10m":25.6},{"datetime":"2024-10-10T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-21.97820409915596,"sunAzimuth":-107.35365077473413,"temperature":12.1,"relativehumidity_2m":92,"windspeed_10m":22.8},{"datetime":"2024-10-10T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.716704637744286,"sunAzimuth":-95.1044343497123,"temperature":12,"relativehumidity_2m":95,"windspeed_10m":19.5},{"datetime":"2024-10-10T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.275734703378654,"sunAzimuth":-83.4485894065161,"temperature":11.8,"relativehumidity_2m":93,"windspeed_10m":17.2},{"datetime":"2024-10-10T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":5.945826827444097,"sunAzimuth":-71.72880701980833,"temperature":12.1,"relativehumidity_2m":95,"windspeed_10m":16.3},{"datetime":"2024-10-10T09:00:00.000+02:00","dcPower":8.210884526192709,"power":6.568707620954168,"sunTilt":14.541778076840487,"sunAzimuth":-59.34793757422427,"temperature":12.1,"relativehumidity_2m":94,"windspeed_10m":14.7},{"datetime":"2024-10-10T10:00:00.000+02:00","dcPower":24.095319708538952,"power":19.276255766831163,"sunTilt":22.041831409435048,"sunAzimuth":-45.7728048820313,"temperature":12.2,"relativehumidity_2m":92,"windspeed_10m":15},{"datetime":"2024-10-10T11:00:00.000+02:00","dcPower":44.805984641630765,"power":35.84478771330461,"sunTilt":27.885174335468335,"sunAzimuth":-30.63663127573816,"temperature":12.5,"relativehumidity_2m":92,"windspeed_10m":15.7},{"datetime":"2024-10-10T12:00:00.000+02:00","dcPower":256.4594108943556,"power":205.16752871548448,"sunTilt":31.46827419380231,"sunAzimuth":-13.972554382839954,"temperature":12.8,"relativehumidity_2m":89,"windspeed_10m":18.5},{"datetime":"2024-10-10T13:00:00.000+02:00","dcPower":135.73154317876075,"power":108.5852345430086,"sunTilt":32.31297830760232,"sunAzimuth":3.5651067967559134,"temperature":12.3,"relativehumidity_2m":91,"windspeed_10m":17.7},{"datetime":"2024-10-10T14:00:00.000+02:00","dcPower":357.83816763055387,"power":286.27053410444313,"sunTilt":30.29076264178465,"sunAzimuth":20.858636821509823,"temperature":13.1,"relativehumidity_2m":87,"windspeed_10m":16},{"datetime":"2024-10-10T15:00:00.000+02:00","dcPower":210.28584459785964,"power":168.22867567828771,"sunTilt":25.696518065354862,"sunAzimuth":36.92666158608413,"temperature":13.2,"relativehumidity_2m":86,"windspeed_10m":15.1},{"datetime":"2024-10-10T16:00:00.000+02:00","dcPower":186.22904339805515,"power":148.98323471844412,"sunTilt":19.087103602605772,"sunAzimuth":51.382837136526646,"temperature":13,"relativehumidity_2m":81,"windspeed_10m":15.1},{"datetime":"2024-10-10T17:00:00.000+02:00","dcPower":144.10037101001555,"power":115.28029680801245,"sunTilt":11.060531491249431,"sunAzimuth":64.39321702308736,"temperature":12.8,"relativehumidity_2m":75,"windspeed_10m":13.3},{"datetime":"2024-10-10T18:00:00.000+02:00","dcPower":97.59079650367762,"power":78.0726372029421,"sunTilt":2.1392339596675116,"sunAzimuth":76.4139573135511,"temperature":12.3,"relativehumidity_2m":79,"windspeed_10m":12.2},{"datetime":"2024-10-10T19:00:00.000+02:00","dcPower":17.754377568726305,"power":14.203502054981044,"sunTilt":-7.240134220715796,"sunAzimuth":88.00936653945188,"temperature":11,"relativehumidity_2m":80,"windspeed_10m":7},{"datetime":"2024-10-10T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-16.684429132286564,"sunAzimuth":99.79837109714164,"temperature":10.6,"relativehumidity_2m":84,"windspeed_10m":5.2},{"datetime":"2024-10-10T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-25.780350237977437,"sunAzimuth":112.47374911967749,"temperature":10.1,"relativehumidity_2m":85,"windspeed_10m":4.3},{"datetime":"2024-10-10T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-34.01656707008997,"sunAzimuth":126.82157256673277,"temperature":10.2,"relativehumidity_2m":84,"windspeed_10m":9.2},{"datetime":"2024-10-10T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-40.704586491662205,"sunAzimuth":143.61159893587703,"temperature":9.8,"relativehumidity_2m":90,"windspeed_10m":7.9},{"datetime":"2024-10-11T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.97491243886403,"sunAzimuth":163.128648637255,"temperature":9.3,"relativehumidity_2m":92,"windspeed_10m":10.8},{"datetime":"2024-10-11T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.02467456169168,"sunAzimuth":-175.6141848122969,"temperature":8.9,"relativehumidity_2m":94,"windspeed_10m":8.7},{"datetime":"2024-10-11T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.61635732682025,"sunAzimuth":-154.8336646265192,"temperature":8.3,"relativehumidity_2m":91,"windspeed_10m":2.9},{"datetime":"2024-10-11T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-38.27297819203817,"sunAzimuth":-136.37626404685486,"temperature":8.3,"relativehumidity_2m":93,"windspeed_10m":3.6},{"datetime":"2024-10-11T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-30.877497329298222,"sunAzimuth":-120.63744534201388,"temperature":8.3,"relativehumidity_2m":95,"windspeed_10m":8.7},{"datetime":"2024-10-11T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-22.238894548955713,"sunAzimuth":-107.05006215076084,"temperature":8.3,"relativehumidity_2m":98,"windspeed_10m":6.5},{"datetime":"2024-10-11T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-12.96790216264699,"sunAzimuth":-94.80732853145587,"temperature":8.3,"relativehumidity_2m":96,"windspeed_10m":8.6},{"datetime":"2024-10-11T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.5276603134629134,"sunAzimuth":-83.1591411410959,"temperature":7.9,"relativehumidity_2m":95,"windspeed_10m":7.8},{"datetime":"2024-10-11T08:00:00.000+02:00","dcPower":0.302792297198549,"power":0.24223383775883922,"sunTilt":5.683710585945252,"sunAzimuth":-71.44774052199065,"temperature":7.5,"relativehumidity_2m":96,"windspeed_10m":6.9},{"datetime":"2024-10-11T09:00:00.000+02:00","dcPower":37.91183172590186,"power":30.32946538072149,"sunTilt":14.260824082236146,"sunAzimuth":-59.0789120948653,"temperature":7.8,"relativehumidity_2m":93,"windspeed_10m":8.6},{"datetime":"2024-10-11T10:00:00.000+02:00","dcPower":135.3300924208186,"power":108.26407393665488,"sunTilt":21.734940400779433,"sunAzimuth":-45.525661029390804,"temperature":8.1,"relativehumidity_2m":89,"windspeed_10m":8.2},{"datetime":"2024-10-11T11:00:00.000+02:00","dcPower":722.9159926052826,"power":578.3327940842261,"sunTilt":27.54875518315372,"sunAzimuth":-30.429767533564867,"temperature":9,"relativehumidity_2m":84,"windspeed_10m":7.6},{"datetime":"2024-10-11T12:00:00.000+02:00","dcPower":761.1134305872083,"power":608.8907444697667,"sunTilt":31.105090976135774,"sunAzimuth":-13.830431372703888,"temperature":9.8,"relativehumidity_2m":79,"windspeed_10m":7.4},{"datetime":"2024-10-11T13:00:00.000+02:00","dcPower":793.9765474576169,"power":635.1812379660936,"sunTilt":31.9332985100557,"sunAzimuth":3.6233914143032355,"temperature":10.3,"relativehumidity_2m":74,"windspeed_10m":6.5},{"datetime":"2024-10-11T14:00:00.000+02:00","dcPower":275.3528143308291,"power":220.28225146466332,"sunTilt":29.908639212205873,"sunAzimuth":20.83241114244682,"temperature":10.8,"relativehumidity_2m":71,"windspeed_10m":5.1},{"datetime":"2024-10-11T15:00:00.000+02:00","dcPower":242.57658474188835,"power":194.0612677935107,"sunTilt":25.3232617284627,"sunAzimuth":36.83295334168066,"temperature":11.1,"relativehumidity_2m":69,"windspeed_10m":4.3},{"datetime":"2024-10-11T16:00:00.000+02:00","dcPower":198.5838760223071,"power":158.86710081784568,"sunTilt":18.727781114603793,"sunAzimuth":51.243806920166435,"temperature":11.2,"relativehumidity_2m":68,"windspeed_10m":4},{"datetime":"2024-10-11T17:00:00.000+02:00","dcPower":167.6766368130286,"power":134.14130945042288,"sunTilt":10.714725694488843,"sunAzimuth":64.22660182758023,"temperature":10.9,"relativehumidity_2m":71,"windspeed_10m":4.1},{"datetime":"2024-10-11T18:00:00.000+02:00","dcPower":89.39926864717155,"power":71.51941491773725,"sunTilt":1.803206213409536,"sunAzimuth":76.23115674859116,"temperature":10.3,"relativehumidity_2m":77,"windspeed_10m":0.5},{"datetime":"2024-10-11T19:00:00.000+02:00","dcPower":18.16668170354839,"power":14.533345362838714,"sunTilt":-7.571835214892863,"sunAzimuth":87.81749031617603,"temperature":9,"relativehumidity_2m":79,"windspeed_10m":1.9},{"datetime":"2024-10-11T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-17.0181265759899,"sunAzimuth":99.60341073267222,"temperature":7.9,"relativehumidity_2m":83,"windspeed_10m":2.4},{"datetime":"2024-10-11T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-26.122656701936815,"sunAzimuth":112.28457164140065,"temperature":7,"relativehumidity_2m":85,"windspeed_10m":2.9},{"datetime":"2024-10-11T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-34.37321335134456,"sunAzimuth":126.65558045028693,"temperature":6.5,"relativehumidity_2m":86,"windspeed_10m":3},{"datetime":"2024-10-11T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.07743516418665,"sunAzimuth":143.5011643499793,"temperature":6,"relativehumidity_2m":88,"windspeed_10m":3.3},{"datetime":"2024-10-12T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.35684572865986,"sunAzimuth":163.11851362268473,"temperature":5.4,"relativehumidity_2m":89,"windspeed_10m":4.8},{"datetime":"2024-10-12T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.397705346785955,"sunAzimuth":-175.49580600360676,"temperature":5.1,"relativehumidity_2m":90,"windspeed_10m":4.7},{"datetime":"2024-10-12T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.961535734103165,"sunAzimuth":-154.60751324634,"temperature":4.9,"relativehumidity_2m":90,"windspeed_10m":5.1},{"datetime":"2024-10-12T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-38.58320673599567,"sunAzimuth":-136.09226665392447,"temperature":4.9,"relativehumidity_2m":91,"windspeed_10m":5.1},{"datetime":"2024-10-12T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.157657336040163,"sunAzimuth":-120.33499159290702,"temperature":4.9,"relativehumidity_2m":91,"windspeed_10m":5.4},{"datetime":"2024-10-12T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-22.499060815350038,"sunAzimuth":-106.7481901878237,"temperature":4.8,"relativehumidity_2m":91,"windspeed_10m":5},{"datetime":"2024-10-12T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.218886384957228,"sunAzimuth":-94.51232726794028,"temperature":4.6,"relativehumidity_2m":91,"windspeed_10m":5.4},{"datetime":"2024-10-12T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-3.77960910849284,"sunAzimuth":-82.87218040699524,"temperature":4.5,"relativehumidity_2m":91,"windspeed_10m":5.4},{"datetime":"2024-10-12T08:00:00.000+02:00","dcPower":0.3056636135610723,"power":0.24453089084885785,"sunTilt":5.421444806545091,"sunAzimuth":-71.16958809655219,"temperature":4.7,"relativehumidity_2m":92,"windspeed_10m":6.6},{"datetime":"2024-10-12T09:00:00.000+02:00","dcPower":56.5836564374369,"power":45.26692514994952,"sunTilt":13.979744388367903,"sunAzimuth":-58.8132832097472,"temperature":5.9,"relativehumidity_2m":90,"windspeed_10m":7.9},{"datetime":"2024-10-12T10:00:00.000+02:00","dcPower":159.33697905638047,"power":127.46958324510439,"sunTilt":21.42814200059926,"sunAzimuth":-45.28238230412684,"temperature":7.3,"relativehumidity_2m":87,"windspeed_10m":9.9},{"datetime":"2024-10-12T11:00:00.000+02:00","dcPower":309.3330857887113,"power":247.46646863096905,"sunTilt":27.21286115693797,"sunAzimuth":-30.227011858140273,"temperature":8.4,"relativehumidity_2m":87,"windspeed_10m":10.4},{"datetime":"2024-10-12T12:00:00.000+02:00","dcPower":698.9561093595228,"power":559.1648874876182,"sunTilt":30.743014004100917,"sunAzimuth":-13.692125978099353,"temperature":10.1,"relativehumidity_2m":82,"windspeed_10m":12.3},{"datetime":"2024-10-12T13:00:00.000+02:00","dcPower":592.5273272321114,"power":474.0218617856891,"sunTilt":31.555283363449327,"sunAzimuth":3.6787683789403496,"temperature":10.6,"relativehumidity_2m":81,"windspeed_10m":12.4},{"datetime":"2024-10-12T14:00:00.000+02:00","dcPower":358.1654792118635,"power":286.5323833694908,"sunTilt":29.52856227644022,"sunAzimuth":20.80440880713897,"temperature":11.2,"relativehumidity_2m":80,"windspeed_10m":11.3},{"datetime":"2024-10-12T15:00:00.000+02:00","dcPower":315.5891511722822,"power":252.47132093782577,"sunTilt":24.95225483898691,"sunAzimuth":36.7383136221432,"temperature":11.7,"relativehumidity_2m":80,"windspeed_10m":9.7},{"datetime":"2024-10-12T16:00:00.000+02:00","dcPower":212.23365097385258,"power":169.78692077908207,"sunTilt":18.37082552430316,"sunAzimuth":51.10424752804786,"temperature":11.5,"relativehumidity_2m":82,"windspeed_10m":8.4},{"datetime":"2024-10-12T17:00:00.000+02:00","dcPower":139.49419269628333,"power":111.59535415702668,"sunTilt":10.371392509810583,"sunAzimuth":64.05951991866706,"temperature":11.1,"relativehumidity_2m":84,"windspeed_10m":9.4},{"datetime":"2024-10-12T18:00:00.000+02:00","dcPower":50.4747106285505,"power":40.3797685028404,"sunTilt":1.4697694157713943,"sunAzimuth":76.0477365277625,"temperature":10.5,"relativehumidity_2m":87,"windspeed_10m":8.4},{"datetime":"2024-10-12T19:00:00.000+02:00","dcPower":7.807218137175268,"power":6.245774509740215,"sunTilt":-7.900822080898683,"sunAzimuth":87.62468730812897,"temperature":9.8,"relativehumidity_2m":90,"windspeed_10m":8.5},{"datetime":"2024-10-12T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-17.349008833561726,"sunAzimuth":99.4070709783674,"temperature":9.6,"relativehumidity_2m":92,"windspeed_10m":8.6},{"datetime":"2024-10-12T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-26.462114969564762,"sunAzimuth":112.09341375841275,"temperature":9.6,"relativehumidity_2m":92,"windspeed_10m":9.2},{"datetime":"2024-10-12T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-34.7271125456906,"sunAzimuth":126.48693033734844,"temperature":9.7,"relativehumidity_2m":92,"windspeed_10m":8},{"datetime":"2024-10-12T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.447828525061254,"sunAzimuth":143.38762883737587,"temperature":9.4,"relativehumidity_2m":94,"windspeed_10m":7.3},{"datetime":"2024-10-13T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.73675190204195,"sunAzimuth":163.1056210331007,"temperature":9.3,"relativehumidity_2m":94,"windspeed_10m":6.5},{"datetime":"2024-10-13T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.76906905918878,"sunAzimuth":-175.37909348313417,"temperature":9.1,"relativehumidity_2m":94,"windspeed_10m":7.4},{"datetime":"2024-10-13T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.30526573902631,"sunAzimuth":-154.3822860597556,"temperature":9.5,"relativehumidity_2m":92,"windspeed_10m":10},{"datetime":"2024-10-13T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-38.89221927072221,"sunAzimuth":-135.80926949668307,"temperature":9.6,"relativehumidity_2m":90,"windspeed_10m":16.3},{"datetime":"2024-10-13T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.436918053719957,"sunAzimuth":-120.03396199414307,"temperature":8.8,"relativehumidity_2m":87,"windspeed_10m":18},{"datetime":"2024-10-13T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-22.75867399010402,"sunAzimuth":-106.44816955814555,"temperature":8.4,"relativehumidity_2m":87,"windspeed_10m":15.5},{"datetime":"2024-10-13T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.469627601285604,"sunAzimuth":-94.21955537307969,"temperature":7.5,"relativehumidity_2m":83,"windspeed_10m":17},{"datetime":"2024-10-13T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.0315450153141486,"sunAzimuth":-82.58782406375519,"temperature":7.2,"relativehumidity_2m":82,"windspeed_10m":16.2},{"datetime":"2024-10-13T08:00:00.000+02:00","dcPower":0.30361267330212705,"power":0.24289013864170164,"sunTilt":5.159076534957485,"sunAzimuth":-70.89445910846419,"temperature":6.7,"relativehumidity_2m":84,"windspeed_10m":16.8},{"datetime":"2024-10-13T09:00:00.000+02:00","dcPower":41.66339591027437,"power":33.33071672821949,"sunTilt":13.698600583367673,"sunAzimuth":-58.55115047580995,"temperature":6.9,"relativehumidity_2m":86,"windspeed_10m":15.5},{"datetime":"2024-10-13T10:00:00.000+02:00","dcPower":121.29615381863722,"power":97.03692305490978,"sunTilt":21.12151408595382,"sunAzimuth":-45.043053146408546,"temperature":7.5,"relativehumidity_2m":83,"windspeed_10m":22.7},{"datetime":"2024-10-13T11:00:00.000+02:00","dcPower":247.51263219299824,"power":198.0101057543986,"sunTilt":26.877585132999467,"sunAzimuth":-30.028428502780528,"temperature":8.1,"relativehumidity_2m":83,"windspeed_10m":19.5},{"datetime":"2024-10-13T12:00:00.000+02:00","dcPower":338.6846185017703,"power":270.9476948014162,"sunTilt":30.382147107830978,"sunAzimuth":-13.557685005032592,"temperature":8.5,"relativehumidity_2m":82,"windspeed_10m":18.9},{"datetime":"2024-10-13T13:00:00.000+02:00","dcPower":605.5390983533022,"power":484.43127868264173,"sunTilt":31.17904416002473,"sunAzimuth":3.731196531846679,"temperature":9.4,"relativehumidity_2m":79,"windspeed_10m":19.1},{"datetime":"2024-10-13T14:00:00.000+02:00","dcPower":288.2119804513333,"power":230.56958436106666,"sunTilt":29.150649828823855,"sunAzimuth":20.774587486422366,"temperature":10.4,"relativehumidity_2m":75,"windspeed_10m":17.7},{"datetime":"2024-10-13T15:00:00.000+02:00","dcPower":265.18083697354695,"power":212.14466957883758,"sunTilt":24.583621654336596,"sunAzimuth":36.642703763191776,"temperature":10.3,"relativehumidity_2m":74,"windspeed_10m":17.6},{"datetime":"2024-10-13T16:00:00.000+02:00","dcPower":219.66624712152574,"power":175.7329976972206,"sunTilt":18.016365562424813,"sunAzimuth":50.96413031013026,"temperature":10.3,"relativehumidity_2m":77,"windspeed_10m":15.1},{"datetime":"2024-10-13T17:00:00.000+02:00","dcPower":163.24002688558107,"power":130.59202150846485,"sunTilt":10.030663139779685,"sunAzimuth":63.89195411454739,"temperature":9.9,"relativehumidity_2m":79,"windspeed_10m":13.7},{"datetime":"2024-10-13T18:00:00.000+02:00","dcPower":67.85462774565694,"power":54.28370219652555,"sunTilt":1.1390561362362333,"sunAzimuth":75.8636886240363,"temperature":9.1,"relativehumidity_2m":82,"windspeed_10m":10.8},{"datetime":"2024-10-13T19:00:00.000+02:00","dcPower":9.115748605658235,"power":7.292598884526588,"sunTilt":-8.226960953264081,"sunAzimuth":87.43095436456028,"temperature":8.3,"relativehumidity_2m":87,"windspeed_10m":6.2},{"datetime":"2024-10-13T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-17.676940156857277,"sunAzimuth":99.2093472034457,"temperature":8.1,"relativehumidity_2m":87,"windspeed_10m":6.4},{"datetime":"2024-10-13T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-26.79858696849319,"sunAzimuth":111.90025906076745,"temperature":7.6,"relativehumidity_2m":90,"windspeed_10m":6.8},{"datetime":"2024-10-13T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-35.0781256664598,"sunAzimuth":126.3155777234557,"temperature":7.1,"relativehumidity_2m":90,"windspeed_10m":5},{"datetime":"2024-10-13T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-41.815632684929426,"sunAzimuth":143.2709019404984,"temperature":6.5,"relativehumidity_2m":91,"windspeed_10m":2.6},{"datetime":"2024-10-14T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.11451301786215,"sunAzimuth":163.08983536166957,"temperature":6.3,"relativehumidity_2m":89,"windspeed_10m":2.4},{"datetime":"2024-10-14T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.138671848584934,"sunAzimuth":-175.2642016873541,"temperature":5.8,"relativehumidity_2m":89,"windspeed_10m":1.5},{"datetime":"2024-10-14T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.647478099904184,"sunAzimuth":-154.15814092455744,"temperature":5.3,"relativehumidity_2m":90,"windspeed_10m":4},{"datetime":"2024-10-14T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.1999672120048,"sunAzimuth":-135.52742842855076,"temperature":4.5,"relativehumidity_2m":93,"windspeed_10m":1.5},{"datetime":"2024-10-14T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.715244466780028,"sunAzimuth":-119.73450334119632,"temperature":4,"relativehumidity_2m":94,"windspeed_10m":4.5},{"datetime":"2024-10-14T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.01770469074795,"sunAzimuth":-106.15013533780943,"temperature":3.8,"relativehumidity_2m":94,"windspeed_10m":4.7},{"datetime":"2024-10-14T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.720095220219516,"sunAzimuth":-93.92913753819082,"temperature":4.2,"relativehumidity_2m":94,"windspeed_10m":5.8},{"datetime":"2024-10-14T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.283430715645694,"sunAzimuth":-82.30618839226909,"temperature":4.7,"relativehumidity_2m":94,"windspeed_10m":4.7},{"datetime":"2024-10-14T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.896654311121907,"sunAzimuth":-70.62246187023919,"temperature":5.1,"relativehumidity_2m":93,"windspeed_10m":4.3},{"datetime":"2024-10-14T09:00:00.000+02:00","dcPower":37.995807256660015,"power":30.396645805328014,"sunTilt":13.417455844515738,"sunAzimuth":-58.29261188464403,"temperature":5.6,"relativehumidity_2m":92,"windspeed_10m":3.8},{"datetime":"2024-10-14T10:00:00.000+02:00","dcPower":116.02924326198367,"power":92.82339460958694,"sunTilt":20.815136015137117,"sunAzimuth":-44.807755986987566,"temperature":6.7,"relativehumidity_2m":87,"windspeed_10m":6.2},{"datetime":"2024-10-14T11:00:00.000+02:00","dcPower":180.41800188431606,"power":144.33440150745284,"sunTilt":26.543021174019792,"sunAzimuth":-29.83407952105961,"temperature":7.5,"relativehumidity_2m":85,"windspeed_10m":10.1},{"datetime":"2024-10-14T12:00:00.000+02:00","dcPower":155.60694186631315,"power":124.48555349305053,"sunTilt":30.022594925866507,"sunAzimuth":-13.427153142476177,"temperature":7.8,"relativehumidity_2m":87,"windspeed_10m":7.4},{"datetime":"2024-10-14T13:00:00.000+02:00","dcPower":216.81729696297057,"power":173.45383757037646,"sunTilt":30.804692641790414,"sunAzimuth":3.780636799023051,"temperature":8.7,"relativehumidity_2m":84,"windspeed_10m":9.4},{"datetime":"2024-10-14T14:00:00.000+02:00","dcPower":218.6247681364855,"power":174.89981450918842,"sunTilt":28.775019978770835,"sunAzimuth":20.742907009369926,"temperature":8.8,"relativehumidity_2m":83,"windspeed_10m":7.7},{"datetime":"2024-10-14T15:00:00.000+02:00","dcPower":200.945630471392,"power":160.75650437711363,"sunTilt":24.217486258022436,"sunAzimuth":36.546087194880954,"temperature":8.8,"relativehumidity_2m":85,"windspeed_10m":6.5},{"datetime":"2024-10-14T16:00:00.000+02:00","dcPower":168.57441974497019,"power":134.85953579597614,"sunTilt":17.664529576020236,"sunAzimuth":50.82342857831685,"temperature":8.7,"relativehumidity_2m":88,"windspeed_10m":5.2},{"datetime":"2024-10-14T17:00:00.000+02:00","dcPower":116.8428850480738,"power":93.47430803845904,"sunTilt":9.692668263612882,"sunAzimuth":63.7238891712367,"temperature":8.4,"relativehumidity_2m":90,"windspeed_10m":3.6},{"datetime":"2024-10-14T18:00:00.000+02:00","dcPower":54.17222871388804,"power":43.337782971110435,"sunTilt":0.8111983279457368,"sunAzimuth":75.67900710147994,"temperature":8.2,"relativehumidity_2m":91,"windspeed_10m":1.8},{"datetime":"2024-10-14T19:00:00.000+02:00","dcPower":9.066031160044716,"power":7.252824928035773,"sunTilt":-8.5501186243532,"sunAzimuth":87.23629074336492,"temperature":7.9,"relativehumidity_2m":93,"windspeed_10m":0.4},{"datetime":"2024-10-14T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.00178541748869,"sunAzimuth":99.01023762777291,"temperature":7.4,"relativehumidity_2m":94,"windspeed_10m":1.1},{"datetime":"2024-10-14T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-27.131935065748255,"sunAzimuth":111.70509440468732,"temperature":6.7,"relativehumidity_2m":96,"windspeed_10m":1.1},{"datetime":"2024-10-14T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-35.426113802819536,"sunAzimuth":126.14148133580082,"temperature":5.8,"relativehumidity_2m":98,"windspeed_10m":0.4},{"datetime":"2024-10-14T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.180713378529184,"sunAzimuth":143.15089515757862,"temperature":5,"relativehumidity_2m":100,"windspeed_10m":0.7},{"datetime":"2024-10-15T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.49001057641694,"sunAzimuth":163.07102046565072,"temperature":4.3,"relativehumidity_2m":100,"windspeed_10m":1.4},{"datetime":"2024-10-15T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.506419588733614,"sunAzimuth":-175.15128768425117,"temperature":3.8,"relativehumidity_2m":100,"windspeed_10m":1.9},{"datetime":"2024-10-15T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-44.988103658491234,"sunAzimuth":-153.9352385869432,"temperature":3.2,"relativehumidity_2m":100,"windspeed_10m":2.6},{"datetime":"2024-10-15T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.50640211284843,"sunAzimuth":-135.24690137263536,"temperature":2.4,"relativehumidity_2m":100,"windspeed_10m":2.9},{"datetime":"2024-10-15T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-31.992601433814595,"sunAzimuth":-119.43676351875516,"temperature":1.6,"relativehumidity_2m":100,"windspeed_10m":3.2},{"datetime":"2024-10-15T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.276123004228086,"sunAzimuth":-105.85422295783262,"temperature":1.2,"relativehumidity_2m":100,"windspeed_10m":3.6},{"datetime":"2024-10-15T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-13.970257710966642,"sunAzimuth":-93.64119828341282,"temperature":1.2,"relativehumidity_2m":100,"windspeed_10m":3.6},{"datetime":"2024-10-15T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.5352276078301,"sunAzimuth":-82.02738904900566,"temperature":1.6,"relativehumidity_2m":100,"windspeed_10m":3.6},{"datetime":"2024-10-15T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.63422819396966,"sunAzimuth":-70.35370359566531,"temperature":2.3,"relativehumidity_2m":100,"windspeed_10m":4},{"datetime":"2024-10-15T09:00:00.000+02:00","dcPower":47.164824265677275,"power":37.73185941254182,"sunTilt":13.136374944499462,"sunAzimuth":-58.037763824819606,"temperature":3.4,"relativehumidity_2m":98,"windspeed_10m":5},{"datetime":"2024-10-15T10:00:00.000+02:00","dcPower":133.5723417231025,"power":106.85787337848201,"sunTilt":20.50908861823578,"sunAzimuth":-44.57657122307415,"temperature":4.8,"relativehumidity_2m":94,"windspeed_10m":6.2},{"datetime":"2024-10-15T11:00:00.000+02:00","dcPower":563.2310951818382,"power":450.5848761454706,"sunTilt":26.20926450679345,"sunAzimuth":-29.644024765315514,"temperature":6.3,"relativehumidity_2m":91,"windspeed_10m":7.8},{"datetime":"2024-10-15T12:00:00.000+02:00","dcPower":781.5834949272705,"power":625.2667959418164,"sunTilt":29.66446288060627,"sunAzimuth":-13.300572957692536,"temperature":8,"relativehumidity_2m":88,"windspeed_10m":9.2},{"datetime":"2024-10-15T13:00:00.000+02:00","dcPower":1002.397172852398,"power":801.9177382819184,"sunTilt":30.43234097439692,"sunAzimuth":3.8270522061418095,"temperature":9.7,"relativehumidity_2m":84,"windspeed_10m":10.9},{"datetime":"2024-10-15T14:00:00.000+02:00","dcPower":241.9896564816097,"power":193.59172518528777,"sunTilt":28.401790922595836,"sunAzimuth":20.709329389098386,"temperature":10.8,"relativehumidity_2m":82,"windspeed_10m":11.9},{"datetime":"2024-10-15T15:00:00.000+02:00","dcPower":222.3817911463646,"power":177.9054329170917,"sunTilt":23.853972526435296,"sunAzimuth":36.448429487078144,"temperature":11.2,"relativehumidity_2m":81,"windspeed_10m":11.9},{"datetime":"2024-10-15T16:00:00.000+02:00","dcPower":188.86845125050397,"power":151.09476100040317,"sunTilt":17.315445485866938,"sunAzimuth":50.682117672382816,"temperature":11,"relativehumidity_2m":81,"windspeed_10m":11},{"datetime":"2024-10-15T17:00:00.000+02:00","dcPower":139.12806007081542,"power":111.30244805665234,"sunTilt":9.35753798215806,"sunAzimuth":63.55531186506398,"temperature":10.6,"relativehumidity_2m":82,"windspeed_10m":11.1},{"datetime":"2024-10-15T18:00:00.000+02:00","dcPower":74.93247651101706,"power":59.94598120881365,"sunTilt":0.48632726290863104,"sunAzimuth":75.49368820866877,"temperature":9.7,"relativehumidity_2m":85,"windspeed_10m":12.1},{"datetime":"2024-10-15T19:00:00.000+02:00","dcPower":15.878086979814217,"power":12.702469583851375,"sunTilt":-8.870162619560801,"sunAzimuth":87.04069822248259,"temperature":8.5,"relativehumidity_2m":88,"windspeed_10m":13.6},{"datetime":"2024-10-15T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.323410184499085,"sunAzimuth":98.80974345652376,"temperature":7.6,"relativehumidity_2m":91,"windspeed_10m":14.3},{"datetime":"2024-10-15T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-27.462022150796383,"sunAzimuth":111.50791010170794,"temperature":7.2,"relativehumidity_2m":91,"windspeed_10m":13.9},{"datetime":"2024-10-15T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-35.770938188604354,"sunAzimuth":125.96460338334036,"temperature":7,"relativehumidity_2m":91,"windspeed_10m":12.9},{"datetime":"2024-10-15T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.54293600102064,"sunAzimuth":143.02752222319543,"temperature":6.8,"relativehumidity_2m":89,"windspeed_10m":12.7},{"datetime":"2024-10-16T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-46.86312551477473,"sunAzimuth":163.04903976266138,"temperature":6.7,"relativehumidity_2m":86,"windspeed_10m":13.8},{"datetime":"2024-10-16T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.87221785059982,"sunAzimuth":-175.04051110279474,"temperature":6.8,"relativehumidity_2m":83,"windspeed_10m":15.6},{"datetime":"2024-10-16T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.32707330350441,"sunAzimuth":-153.71374265034802,"temperature":6.8,"relativehumidity_2m":80,"windspeed_10m":16.5},{"datetime":"2024-10-16T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-39.81147561550361,"sunAzimuth":-134.96784827714956,"temperature":7,"relativehumidity_2m":78,"windspeed_10m":16.1},{"datetime":"2024-10-16T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.26895363243685,"sunAzimuth":-119.1408914506387,"temperature":7.3,"relativehumidity_2m":77,"windspeed_10m":15.1},{"datetime":"2024-10-16T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.53389843309148,"sunAzimuth":-105.56056815727264,"temperature":7.4,"relativehumidity_2m":75,"windspeed_10m":14.3},{"datetime":"2024-10-16T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-14.220082554609817,"sunAzimuth":-93.355861910257,"temperature":7.4,"relativehumidity_2m":73,"windspeed_10m":14.3},{"datetime":"2024-10-16T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-4.786895768698711,"sunAzimuth":-81.75154101774274,"temperature":7.3,"relativehumidity_2m":71,"windspeed_10m":14.7},{"datetime":"2024-10-16T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.371849783596975,"sunAzimuth":-70.08829035405888,"temperature":7.2,"relativehumidity_2m":70,"windspeed_10m":14.8},{"datetime":"2024-10-16T09:00:00.000+02:00","dcPower":35.08288202776703,"power":28.066305622213623,"sunTilt":12.855424254104108,"sunAzimuth":-57.78670104663053,"temperature":9.8,"relativehumidity_2m":72,"windspeed_10m":17},{"datetime":"2024-10-16T10:00:00.000+02:00","dcPower":101.57338329220217,"power":81.25870663376173,"sunTilt":20.203454185088123,"sunAzimuth":-44.34957719582011,"temperature":10.2,"relativehumidity_2m":75,"windspeed_10m":16.5},{"datetime":"2024-10-16T11:00:00.000+02:00","dcPower":349.42380002507434,"power":279.5390400200595,"sunTilt":25.87641150088954,"sunAzimuth":-29.45832187587005,"temperature":10.7,"relativehumidity_2m":77,"windspeed_10m":16.2},{"datetime":"2024-10-16T12:00:00.000+02:00","dcPower":494.1678347786919,"power":395.3342678229535,"sunTilt":29.30785715204484,"sunAzimuth":-13.177984892004138,"temperature":11.6,"relativehumidity_2m":77,"windspeed_10m":15.7},{"datetime":"2024-10-16T13:00:00.000+02:00","dcPower":639.0240315979279,"power":511.2192252783423,"sunTilt":30.062101719417093,"sunAzimuth":3.870407893111919,"temperature":12.5,"relativehumidity_2m":75,"windspeed_10m":15.3},{"datetime":"2024-10-16T14:00:00.000+02:00","dcPower":277.7856212217981,"power":222.2284969774385,"sunTilt":28.03108091352568,"sunAzimuth":20.673818848950724,"temperature":13.2,"relativehumidity_2m":75,"windspeed_10m":14.8},{"datetime":"2024-10-16T15:00:00.000+02:00","dcPower":252.83380974430276,"power":202.2670477954422,"sunTilt":23.49320409080551,"sunAzimuth":36.34969840216598,"temperature":13.5,"relativehumidity_2m":77,"windspeed_10m":14.3},{"datetime":"2024-10-16T16:00:00.000+02:00","dcPower":198.08712950041433,"power":158.46970360033148,"sunTilt":16.969240740198778,"sunAzimuth":50.54017502787197,"temperature":13.5,"relativehumidity_2m":80,"windspeed_10m":13.7},{"datetime":"2024-10-16T17:00:00.000+02:00","dcPower":134.9942461001432,"power":107.99539688011455,"sunTilt":9.025401762418719,"sunAzimuth":63.386211071389155,"temperature":13.3,"relativehumidity_2m":82,"windspeed_10m":13.2},{"datetime":"2024-10-16T18:00:00.000+02:00","dcPower":66.70716275854775,"power":53.36573020683821,"sunTilt":0.16457346744538273,"sunAzimuth":75.30773046735078,"temperature":13,"relativehumidity_2m":82,"windspeed_10m":13},{"datetime":"2024-10-16T19:00:00.000+02:00","dcPower":13.56117696026841,"power":10.848941568214729,"sunTilt":-9.186961271997145,"sunAzimuth":86.84418120594421,"temperature":12.6,"relativehumidity_2m":81,"windspeed_10m":12.7},{"datetime":"2024-10-16T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.64168080965683,"sunAzimuth":98.60786901950698,"temperature":12.2,"relativehumidity_2m":80,"windspeed_10m":12.2},{"datetime":"2024-10-16T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-27.788711717705176,"sunAzimuth":111.30870010109864,"temperature":12,"relativehumidity_2m":80,"windspeed_10m":11.8},{"datetime":"2024-10-16T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-36.112460277357016,"sunAzimuth":125.78490981561183,"temperature":11.8,"relativehumidity_2m":81,"windspeed_10m":11},{"datetime":"2024-10-16T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-42.9021656490531,"sunAzimuth":142.90069940402603,"temperature":11.7,"relativehumidity_2m":82,"windspeed_10m":10.2},{"datetime":"2024-10-17T00:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-47.23373820466217,"sunAzimuth":163.02375644913673,"temperature":11.7,"relativehumidity_2m":82,"windspeed_10m":9.4},{"datetime":"2024-10-17T01:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-48.2359718752176,"sunAzimuth":-174.9320340577077,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":8.6},{"datetime":"2024-10-17T02:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-45.66431793404074,"sunAzimuth":-153.4938195445769,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":8.2},{"datetime":"2024-10-17T03:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-40.115139405653565,"sunAzimuth":-134.69043107615582,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":7.9},{"datetime":"2024-10-17T04:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-32.54426550294801,"sunAzimuth":-118.84703704658551,"temperature":11.8,"relativehumidity_2m":82,"windspeed_10m":7.6},{"datetime":"2024-10-17T05:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-23.79099983796868,"sunAzimuth":-105.2693069294498,"temperature":11.7,"relativehumidity_2m":82,"windspeed_10m":7.6},{"datetime":"2024-10-17T06:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-14.469536195186127,"sunAzimuth":-93.07325245162968,"temperature":11.6,"relativehumidity_2m":82,"windspeed_10m":7.4},{"datetime":"2024-10-17T07:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-5.038393916921545,"sunAzimuth":-81.47875856041325,"temperature":11.4,"relativehumidity_2m":83,"windspeed_10m":7.3},{"datetime":"2024-10-17T08:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":4.109572239802723,"sunAzimuth":-69.8263270263417,"temperature":11.5,"relativehumidity_2m":83,"windspeed_10m":7.4},{"datetime":"2024-10-17T09:00:00.000+02:00","dcPower":31.67872965996608,"power":25.342983727972864,"sunTilt":12.574671747325786,"sunAzimuth":-57.53951661964237,"temperature":11.9,"relativehumidity_2m":83,"windspeed_10m":8},{"datetime":"2024-10-17T10:00:00.000+02:00","dcPower":94.35489246212374,"power":75.483913969699,"sunTilt":19.89831645004539,"sunAzimuth":-44.1268501705138,"temperature":12.5,"relativehumidity_2m":82,"windspeed_10m":9.7},{"datetime":"2024-10-17T11:00:00.000+02:00","dcPower":271.1188829478831,"power":216.8951063583065,"sunTilt":25.54455964459646,"sunAzimuth":-29.277026273264024,"temperature":13.1,"relativehumidity_2m":82,"windspeed_10m":10.8},{"datetime":"2024-10-17T12:00:00.000+02:00","dcPower":309.5618220679901,"power":247.64945765439208,"sunTilt":28.952884649607554,"sunAzimuth":-13.059427258390235,"temperature":13.5,"relativehumidity_2m":83,"windspeed_10m":10.7},{"datetime":"2024-10-17T13:00:00.000+02:00","dcPower":219.1359929657014,"power":175.30879437256112,"sunTilt":29.694087805098004,"sunAzimuth":3.9106711264578404,"temperature":13.8,"relativehumidity_2m":85,"windspeed_10m":10.8},{"datetime":"2024-10-17T14:00:00.000+02:00","dcPower":228.55502409292535,"power":182.8440192743403,"sunTilt":27.663008228484166,"sunAzimuth":20.63634185579284,"temperature":14.2,"relativehumidity_2m":86,"windspeed_10m":10.5},{"datetime":"2024-10-17T15:00:00.000+02:00","dcPower":218.107673955093,"power":174.48613916407442,"sunTilt":23.13530429931852,"sunAzimuth":36.24986394147597,"temperature":14.6,"relativehumidity_2m":87,"windspeed_10m":9.8},{"datetime":"2024-10-17T16:00:00.000+02:00","dcPower":187.6762781627061,"power":150.1410225301649,"sunTilt":16.626042266391202,"sunAzimuth":50.39758024284303,"temperature":14.9,"relativehumidity_2m":88,"windspeed_10m":9.2},{"datetime":"2024-10-17T17:00:00.000+02:00","dcPower":135.3327891382026,"power":108.26623131056209,"sunTilt":8.696388379725821,"sunAzimuth":63.21657784217465,"temperature":15.1,"relativehumidity_2m":89,"windspeed_10m":8.7},{"datetime":"2024-10-17T18:00:00.000+02:00","dcPower":66.58720027019501,"power":53.269760216156016,"sunTilt":-0.15393334821361332,"sunAzimuth":75.12113476396313,"temperature":14.9,"relativehumidity_2m":90,"windspeed_10m":7.9},{"datetime":"2024-10-17T19:00:00.000+02:00","dcPower":11.87138687150887,"power":9.497109497207097,"sunTilt":-9.500383797971471,"sunAzimuth":86.64674682587622,"temperature":14.6,"relativehumidity_2m":92,"windspeed_10m":6.7},{"datetime":"2024-10-17T20:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-18.956464510241965,"sunAzimuth":98.40462190157557,"temperature":14.3,"relativehumidity_2m":93,"windspeed_10m":5.9},{"datetime":"2024-10-17T21:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-28.11186795253563,"sunAzimuth":111.10746217430679,"temperature":14.2,"relativehumidity_2m":94,"windspeed_10m":5.4},{"datetime":"2024-10-17T22:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-36.45054181856139,"sunAzimuth":125.60237057929713,"temperature":14.2,"relativehumidity_2m":94,"windspeed_10m":4.6},{"datetime":"2024-10-17T23:00:00.000+02:00","dcPower":0,"power":0,"sunTilt":-43.2582671659911,"sunAzimuth":142.77034580724174,"temperature":14.2,"relativehumidity_2m":95,"windspeed_10m":4.4}]]} +{ + "meta": { + "lat": 52.52, + "lon": 13.405, + "power": [ + 5000, + 4800, + 1400, + 1600 + ], + "azimuth": [ + -10, + -90, + -40, + 5 + ], + "tilt": [ + 7, + 7, + 60, + 45 + ], + "timezone": "Europe/Berlin", + "albedo": 0.25, + "past_days": 5, + "inverterEfficiency": 0.8, + "powerInverter": [ + 5000, + 4800, + 1400, + 1600 + ], + "cellCoEff": -0.36, + "range": false, + "horizont": [ + [ + { + "altitude": 20, + "azimuthFrom": -180, + "azimuthTo": -90 + }, + { + "altitude": 27, + "azimuthFrom": -90, + "azimuthTo": 0 + }, + { + "altitude": 22, + "azimuthFrom": 0, + "azimuthTo": 90 + }, + { + "altitude": 20, + "azimuthFrom": 90, + "azimuthTo": 180 + } + ], + [ + { + "altitude": 30, + "azimuthFrom": -180, + "azimuthTo": -90 + }, + { + "altitude": 30, + "azimuthFrom": -90, + "azimuthTo": 0 + }, + { + "altitude": 30, + "azimuthFrom": 0, + "azimuthTo": 90 + }, + { + "altitude": 50, + "azimuthFrom": 90, + "azimuthTo": 180 + } + ], + [ + { + "altitude": 60, + "azimuthFrom": -180, + "azimuthTo": -90 + }, + { + "altitude": 30, + "azimuthFrom": -90, + "azimuthTo": 0 + }, + { + "altitude": 0, + "azimuthFrom": 0, + "azimuthTo": 90 + }, + { + "altitude": 30, + "azimuthFrom": 90, + "azimuthTo": 180 + } + ], + [ + { + "altitude": 45, + "azimuthFrom": -180, + "azimuthTo": -90 + }, + { + "altitude": 25, + "azimuthFrom": -90, + "azimuthTo": 0 + }, + { + "altitude": 30, + "azimuthFrom": 0, + "azimuthTo": 90 + }, + { + "altitude": 60, + "azimuthFrom": 90, + "azimuthTo": 180 + } + ] + ], + "horizontString": [ + "20,27,22,20", + "30,30,30,50", + "60,30,0,30", + "45,25,30,60" + ] + }, + "values": [ + [ + { + "datetime": "2024-10-06T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.03892891605494, + "sunAzimuth": 163.14263622624128, + "temperature": null, + "relativehumidity_2m": null, + "windspeed_10m": null + }, + { + "datetime": "2024-10-06T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.13778324543035, + "sunAzimuth": -176.22585898864278, + "temperature": 6.5, + "relativehumidity_2m": 91, + "windspeed_10m": 6.8 + }, + { + "datetime": "2024-10-06T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.87117274960936, + "sunAzimuth": -155.9729639229445, + "temperature": 6, + "relativehumidity_2m": 91, + "windspeed_10m": 5.9 + }, + { + "datetime": "2024-10-06T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -36.70531092777589, + "sunAzimuth": -137.8059489226708, + "temperature": 5.5, + "relativehumidity_2m": 92, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-06T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -29.46443142893699, + "sunAzimuth": -122.16602054266892, + "temperature": 5.1, + "relativehumidity_2m": 92, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-06T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -20.930765133481234, + "sunAzimuth": -108.58249513077881, + "temperature": 4.9, + "relativehumidity_2m": 93, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-06T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -11.710347315474053, + "sunAzimuth": -96.31140508589108, + "temperature": 5.1, + "relativehumidity_2m": 92, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-06T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -2.2689443207496223, + "sunAzimuth": -84.62890292197706, + "temperature": 5.3, + "relativehumidity_2m": 92, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-06T08:00:00.000+02:00", + "dcPower": 11.737826509478335, + "power": 9.390261207582668, + "sunTilt": 6.991906328571172, + "sunAzimuth": -72.87999206290318, + "temperature": 5.5, + "relativehumidity_2m": 91, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-06T09:00:00.000+02:00", + "dcPower": 242.57051171912266, + "power": 194.05640937529813, + "sunTilt": 15.663160391528187, + "sunAzimuth": -60.45596163553978, + "temperature": 6.3, + "relativehumidity_2m": 90, + "windspeed_10m": 9.3 + }, + { + "datetime": "2024-10-06T10:00:00.000+02:00", + "dcPower": 479.53210925713626, + "power": 383.625687405709, + "sunTilt": 23.268816289666535, + "sunAzimuth": -46.79827360798693, + "temperature": 8, + "relativehumidity_2m": 85, + "windspeed_10m": 11.6 + }, + { + "datetime": "2024-10-06T11:00:00.000+02:00", + "dcPower": 2020.1663735831366, + "power": 1616.1330988665095, + "sunTilt": 29.234287239795027, + "sunAzimuth": -31.503805204051176, + "temperature": 9.5, + "relativehumidity_2m": 86, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-06T12:00:00.000+02:00", + "dcPower": 1840.0674202135267, + "power": 1472.0539361708215, + "sunTilt": 32.93002248275174, + "sunAzimuth": -14.578212396799534, + "temperature": 10.8, + "relativehumidity_2m": 82, + "windspeed_10m": 16.3 + }, + { + "datetime": "2024-10-06T13:00:00.000+02:00", + "dcPower": 1958.118125361256, + "power": 1566.494500289005, + "sunTilt": 33.84613522696556, + "sunAzimuth": 3.3037874055175505, + "temperature": 10.9, + "relativehumidity_2m": 82, + "windspeed_10m": 16.9 + }, + { + "datetime": "2024-10-06T14:00:00.000+02:00", + "dcPower": 1862.34412446005, + "power": 1489.87529956804, + "sunTilt": 31.83736693728352, + "sunAzimuth": 20.94669333759787, + "temperature": 12.6, + "relativehumidity_2m": 74, + "windspeed_10m": 17.1 + }, + { + "datetime": "2024-10-06T15:00:00.000+02:00", + "dcPower": 2071.518360584685, + "power": 1657.2146884677481, + "sunTilt": 27.209548486852757, + "sunAzimuth": 37.29302345489315, + "temperature": 12.8, + "relativehumidity_2m": 75, + "windspeed_10m": 17.8 + }, + { + "datetime": "2024-10-06T16:00:00.000+02:00", + "dcPower": 856.2189711080925, + "power": 684.9751768864741, + "sunTilt": 20.54547686442047, + "sunAzimuth": 51.93430385037965, + "temperature": 13.1, + "relativehumidity_2m": 73, + "windspeed_10m": 17.8 + }, + { + "datetime": "2024-10-06T17:00:00.000+02:00", + "dcPower": 806.8246131382091, + "power": 645.4596905105673, + "sunTilt": 12.4658413410018, + "sunAzimuth": 65.05541740712634, + "temperature": 12.6, + "relativehumidity_2m": 72, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-06T18:00:00.000+02:00", + "dcPower": 429.22798847242814, + "power": 343.38239077794253, + "sunTilt": 3.5065849097251456, + "sunAzimuth": 77.13919140741508, + "temperature": 11.9, + "relativehumidity_2m": 76, + "windspeed_10m": 14.8 + }, + { + "datetime": "2024-10-06T19:00:00.000+02:00", + "dcPower": 86.22924149013942, + "power": 68.98339319211154, + "sunTilt": -5.8888854618235795, + "sunAzimuth": 88.76774476136781, + "temperature": 11.1, + "relativehumidity_2m": 79, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-06T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -15.324219942418523, + "sunAzimuth": 100.56460329657087, + "temperature": 10.6, + "relativehumidity_2m": 81, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-06T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -24.385415066790006, + "sunAzimuth": 113.21108724923529, + "temperature": 10.3, + "relativehumidity_2m": 81, + "windspeed_10m": 13.4 + }, + { + "datetime": "2024-10-06T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.56528997863786, + "sunAzimuth": 127.45995077522508, + "temperature": 10.3, + "relativehumidity_2m": 83, + "windspeed_10m": 13.4 + }, + { + "datetime": "2024-10-06T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.19130152908581, + "sunAzimuth": 144.02419079232183, + "temperature": 10.7, + "relativehumidity_2m": 83, + "windspeed_10m": 13 + }, + { + "datetime": "2024-10-07T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.4292477470776, + "sunAzimuth": 163.14429087891105, + "temperature": 11, + "relativehumidity_2m": 83, + "windspeed_10m": 13.6 + }, + { + "datetime": "2024-10-07T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.517749495901406, + "sunAzimuth": -176.10136944486192, + "temperature": 11, + "relativehumidity_2m": 87, + "windspeed_10m": 11.2 + }, + { + "datetime": "2024-10-07T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.22254930467857, + "sunAzimuth": -155.74445709329385, + "temperature": 10.9, + "relativehumidity_2m": 91, + "windspeed_10m": 9.8 + }, + { + "datetime": "2024-10-07T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.020882886444426, + "sunAzimuth": -137.5192133151141, + "temperature": 11, + "relativehumidity_2m": 93, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-07T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -29.748563322135755, + "sunAzimuth": -121.8586066543482, + "temperature": 11.4, + "relativehumidity_2m": 94, + "windspeed_10m": 8.9 + }, + { + "datetime": "2024-10-07T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.193270783038106, + "sunAzimuth": -108.27337691467278, + "temperature": 11.5, + "relativehumidity_2m": 95, + "windspeed_10m": 11 + }, + { + "datetime": "2024-10-07T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -11.962117012521006, + "sunAzimuth": -96.00713008699226, + "temperature": 12, + "relativehumidity_2m": 94, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-07T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -2.520439907672165, + "sunAzimuth": -84.33068309080377, + "temperature": 12.2, + "relativehumidity_2m": 95, + "windspeed_10m": 9.3 + }, + { + "datetime": "2024-10-07T08:00:00.000+02:00", + "dcPower": 5.20619301519954, + "power": 4.1649544121596325, + "sunTilt": 6.730829735879827, + "sunAzimuth": -72.58838243599898, + "temperature": 12.7, + "relativehumidity_2m": 94, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-07T09:00:00.000+02:00", + "dcPower": 106.2638790743732, + "power": 85.01110325949855, + "sunTilt": 15.383293627086166, + "sunAzimuth": -60.174375329765816, + "temperature": 13.3, + "relativehumidity_2m": 94, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-07T10:00:00.000+02:00", + "dcPower": 425.50881675323336, + "power": 340.4070534025867, + "sunTilt": 22.96230371458641, + "sunAzimuth": -46.53655309716923, + "temperature": 14.4, + "relativehumidity_2m": 91, + "windspeed_10m": 8.9 + }, + { + "datetime": "2024-10-07T11:00:00.000+02:00", + "dcPower": 443.2481574750867, + "power": 354.5985259800694, + "sunTilt": 28.896671975172765, + "sunAzimuth": -31.281195510232457, + "temperature": 15.2, + "relativehumidity_2m": 91, + "windspeed_10m": 10.9 + }, + { + "datetime": "2024-10-07T12:00:00.000+02:00", + "dcPower": 782.1822024422786, + "power": 625.7457619538229, + "sunTilt": 32.56343562699629, + "sunAzimuth": -14.421329305847635, + "temperature": 16, + "relativehumidity_2m": 89, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-07T13:00:00.000+02:00", + "dcPower": 1472.4584677473485, + "power": 1177.966774197879, + "sunTilt": 33.46089993111447, + "sunAzimuth": 3.3732496911031458, + "temperature": 17, + "relativehumidity_2m": 82, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-07T14:00:00.000+02:00", + "dcPower": 1709.702157101353, + "power": 1367.7617256810825, + "sunTilt": 31.448234246769605, + "sunAzimuth": 20.927108911856653, + "temperature": 18, + "relativehumidity_2m": 75, + "windspeed_10m": 9.8 + }, + { + "datetime": "2024-10-07T15:00:00.000+02:00", + "dcPower": 1624.9532433869356, + "power": 1299.9625947095485, + "sunTilt": 26.828539273003113, + "sunAzimuth": 37.20261442198752, + "temperature": 18.6, + "relativehumidity_2m": 70, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-07T16:00:00.000+02:00", + "dcPower": 878.2827125323747, + "power": 702.6261700258998, + "sunTilt": 20.17798028996772, + "sunAzimuth": 51.797067137147856, + "temperature": 18.9, + "relativehumidity_2m": 70, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-07T17:00:00.000+02:00", + "dcPower": 790.4767257839096, + "power": 632.3813806271278, + "sunTilt": 12.11146577521795, + "sunAzimuth": 64.89046144901918, + "temperature": 18.4, + "relativehumidity_2m": 72, + "windspeed_10m": 7.2 + }, + { + "datetime": "2024-10-07T18:00:00.000+02:00", + "dcPower": 360.64272843920315, + "power": 288.5141827513625, + "sunTilt": 3.1615292467832945, + "sunAzimuth": 76.95875071433478, + "temperature": 17.4, + "relativehumidity_2m": 74, + "windspeed_10m": 9.5 + }, + { + "datetime": "2024-10-07T19:00:00.000+02:00", + "dcPower": 79.53042904330093, + "power": 63.62434323464075, + "sunTilt": -6.2300935503595385, + "sunAzimuth": 88.57949984494998, + "temperature": 16.4, + "relativehumidity_2m": 79, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-07T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -15.667810875617224, + "sunAzimuth": 100.37506201699385, + "temperature": 15.4, + "relativehumidity_2m": 87, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-07T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -24.737727405113922, + "sunAzimuth": 113.02960837119129, + "temperature": 14.9, + "relativehumidity_2m": 90, + "windspeed_10m": 10.9 + }, + { + "datetime": "2024-10-07T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.93153539182831, + "sunAzimuth": 127.30408938398604, + "temperature": 14.5, + "relativehumidity_2m": 94, + "windspeed_10m": 10.7 + }, + { + "datetime": "2024-10-07T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.572641175501424, + "sunAzimuth": 143.925225436442, + "temperature": 14.7, + "relativehumidity_2m": 94, + "windspeed_10m": 11.6 + }, + { + "datetime": "2024-10-08T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.818121034022454, + "sunAzimuth": 163.14384998115503, + "temperature": 14.7, + "relativehumidity_2m": 94, + "windspeed_10m": 15.8 + }, + { + "datetime": "2024-10-08T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.8965146817323, + "sunAzimuth": -175.97781528741945, + "temperature": 14.8, + "relativehumidity_2m": 93, + "windspeed_10m": 14 + }, + { + "datetime": "2024-10-08T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.572826067170936, + "sunAzimuth": -155.51612909180187, + "temperature": 15.4, + "relativehumidity_2m": 94, + "windspeed_10m": 11.2 + }, + { + "datetime": "2024-10-08T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.33548533853669, + "sunAzimuth": -137.23273090041528, + "temperature": 15.4, + "relativehumidity_2m": 93, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-08T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.031970973409337, + "sunAzimuth": -121.55190085899577, + "temperature": 15.4, + "relativehumidity_2m": 93, + "windspeed_10m": 11.2 + }, + { + "datetime": "2024-10-08T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.45536424486834, + "sunAzimuth": -107.96544161465735, + "temperature": 15.8, + "relativehumidity_2m": 94, + "windspeed_10m": 10 + }, + { + "datetime": "2024-10-08T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.213784351950519, + "sunAzimuth": -95.70446004731738, + "temperature": 15.8, + "relativehumidity_2m": 93, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-08T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -2.772091353585381, + "sunAzimuth": -84.03447848078322, + "temperature": 15.7, + "relativehumidity_2m": 93, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-08T08:00:00.000+02:00", + "dcPower": 4.121973110641917, + "power": 3.2975784885135333, + "sunTilt": 6.469429830924286, + "sunAzimuth": -72.29923977528891, + "temperature": 15.7, + "relativehumidity_2m": 90, + "windspeed_10m": 10.2 + }, + { + "datetime": "2024-10-08T09:00:00.000+02:00", + "dcPower": 215.35955387207488, + "power": 172.28764309765992, + "sunTilt": 15.10307050684314, + "sunAzimuth": -59.895772492079, + "temperature": 15.7, + "relativehumidity_2m": 89, + "windspeed_10m": 8.3 + }, + { + "datetime": "2024-10-08T10:00:00.000+02:00", + "dcPower": 575.8348468079607, + "power": 460.6678774463686, + "sunTilt": 22.655587204347487, + "sunAzimuth": -46.27834028428006, + "temperature": 16.3, + "relativehumidity_2m": 86, + "windspeed_10m": 10.6 + }, + { + "datetime": "2024-10-08T11:00:00.000+02:00", + "dcPower": 973.7759889631144, + "power": 779.0207911704915, + "sunTilt": 28.55922255887939, + "sunAzimuth": -31.06241498925654, + "temperature": 17, + "relativehumidity_2m": 85, + "windspeed_10m": 9 + }, + { + "datetime": "2024-10-08T12:00:00.000+02:00", + "dcPower": 1253.7838457017754, + "power": 1003.0270765614204, + "sunTilt": 32.19754822667087, + "sunAzimuth": -14.26805544520534, + "temperature": 17.6, + "relativehumidity_2m": 82, + "windspeed_10m": 13.1 + }, + { + "datetime": "2024-10-08T13:00:00.000+02:00", + "dcPower": 1709.4582030972936, + "power": 1367.5665624778349, + "sunTilt": 33.07688907994966, + "sunAzimuth": 3.4399896103944245, + "temperature": 18.3, + "relativehumidity_2m": 73, + "windspeed_10m": 12.7 + }, + { + "datetime": "2024-10-08T14:00:00.000+02:00", + "dcPower": 1534.8297541086074, + "power": 1227.863803286886, + "sunTilt": 31.060677746554727, + "sunAzimuth": 20.90593811884074, + "temperature": 18.2, + "relativehumidity_2m": 71, + "windspeed_10m": 13.2 + }, + { + "datetime": "2024-10-08T15:00:00.000+02:00", + "dcPower": 1356.474994260473, + "power": 1085.1799954083785, + "sunTilt": 26.44928138282813, + "sunAzimuth": 37.11144846293623, + "temperature": 18.1, + "relativehumidity_2m": 71, + "windspeed_10m": 13.3 + }, + { + "datetime": "2024-10-08T16:00:00.000+02:00", + "dcPower": 863.9472141756544, + "power": 691.1577713405236, + "sunTilt": 19.81233269039211, + "sunAzimuth": 51.65943401571543, + "temperature": 17.4, + "relativehumidity_2m": 73, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-08T17:00:00.000+02:00", + "dcPower": 616.9390616093008, + "power": 493.55124928744067, + "sunTilt": 11.759033809196055, + "sunAzimuth": 64.72512518734406, + "temperature": 16.9, + "relativehumidity_2m": 75, + "windspeed_10m": 6.3 + }, + { + "datetime": "2024-10-08T18:00:00.000+02:00", + "dcPower": 352.2716884355315, + "power": 281.8173507484252, + "sunTilt": 2.818529310708217, + "sunAzimuth": 76.77774147088243, + "temperature": 16, + "relativehumidity_2m": 75, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-08T19:00:00.000+02:00", + "dcPower": 79.91850169407824, + "power": 63.9348013552626, + "sunTilt": -6.569128186596377, + "sunAzimuth": 88.39036262615889, + "temperature": 15, + "relativehumidity_2m": 82, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-08T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -16.00913432264249, + "sunAzimuth": 100.18418560559792, + "temperature": 14.5, + "relativehumidity_2m": 89, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-08T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -25.087746753502067, + "sunAzimuth": 112.84624373263145, + "temperature": 14, + "relativehumidity_2m": 93, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-08T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -33.29558919415396, + "sunAzimuth": 127.1457755347392, + "temperature": 14, + "relativehumidity_2m": 88, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-08T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.95205668980692, + "sunAzimuth": 143.82353531827584, + "temperature": 13, + "relativehumidity_2m": 91, + "windspeed_10m": 7.2 + }, + { + "datetime": "2024-10-09T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.20543351779722, + "sunAzimuth": 163.1411836959831, + "temperature": 12.6, + "relativehumidity_2m": 92, + "windspeed_10m": 7.8 + }, + { + "datetime": "2024-10-09T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.27398595213309, + "sunAzimuth": -175.8553370630724, + "temperature": 12.9, + "relativehumidity_2m": 91, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-09T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.92193289241474, + "sunAzimuth": -155.28812310014723, + "temperature": 12.7, + "relativehumidity_2m": 92, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-09T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.64906836752005, + "sunAzimuth": -136.94664669208646, + "temperature": 12.9, + "relativehumidity_2m": 91, + "windspeed_10m": 12.3 + }, + { + "datetime": "2024-10-09T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.314619206373006, + "sunAzimuth": -121.24604384005964, + "temperature": 12.9, + "relativehumidity_2m": 91, + "windspeed_10m": 10.2 + }, + { + "datetime": "2024-10-09T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.71701795569338, + "sunAzimuth": -107.65882183814558, + "temperature": 13.2, + "relativehumidity_2m": 90, + "windspeed_10m": 12.9 + }, + { + "datetime": "2024-10-09T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.465322674764078, + "sunAzimuth": -95.40351983003244, + "temperature": 13.3, + "relativehumidity_2m": 89, + "windspeed_10m": 13.5 + }, + { + "datetime": "2024-10-09T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.023867147662328, + "sunAzimuth": -83.74040781223535, + "temperature": 12.9, + "relativehumidity_2m": 92, + "windspeed_10m": 13.2 + }, + { + "datetime": "2024-10-09T08:00:00.000+02:00", + "dcPower": 1.0406185617178385, + "power": 0.8324948493742709, + "sunTilt": 6.207747953736028, + "sunAzimuth": -72.01267721735641, + "temperature": 12.9, + "relativehumidity_2m": 92, + "windspeed_10m": 11.8 + }, + { + "datetime": "2024-10-09T09:00:00.000+02:00", + "dcPower": 56.142707531844685, + "power": 44.91416602547575, + "sunTilt": 14.82254636430179, + "sunAzimuth": -59.62025856421435, + "temperature": 12.8, + "relativehumidity_2m": 93, + "windspeed_10m": 11.8 + }, + { + "datetime": "2024-10-09T10:00:00.000+02:00", + "dcPower": 178.65989116760815, + "power": 142.92791293408652, + "sunTilt": 22.348738640203063, + "sunAzimuth": -46.023727432629336, + "temperature": 13.1, + "relativehumidity_2m": 91, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-09T11:00:00.000+02:00", + "dcPower": 364.3024142519385, + "power": 291.4419314015508, + "sunTilt": 28.22202694317921, + "sunAzimuth": -30.847536638720733, + "temperature": 13.7, + "relativehumidity_2m": 92, + "windspeed_10m": 12.8 + }, + { + "datetime": "2024-10-09T12:00:00.000+02:00", + "dcPower": 541.4560120701284, + "power": 433.16480965610276, + "sunTilt": 31.832460658762763, + "sunAzimuth": -14.118446086753368, + "temperature": 13.8, + "relativehumidity_2m": 91, + "windspeed_10m": 12 + }, + { + "datetime": "2024-10-09T13:00:00.000+02:00", + "dcPower": 498.7759057406506, + "power": 399.02072459252054, + "sunTilt": 32.69421193791607, + "sunAzimuth": 3.503957762689472, + "temperature": 14.2, + "relativehumidity_2m": 90, + "windspeed_10m": 11.5 + }, + { + "datetime": "2024-10-09T14:00:00.000+02:00", + "dcPower": 371.1850633611338, + "power": 296.9480506889071, + "sunTilt": 30.674814714273392, + "sunAzimuth": 20.883130296493302, + "temperature": 13.9, + "relativehumidity_2m": 91, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-09T15:00:00.000+02:00", + "dcPower": 211.70593908566224, + "power": 169.3647512685298, + "sunTilt": 26.07189945210854, + "sunAzimuth": 37.01947906146245, + "temperature": 13.8, + "relativehumidity_2m": 92, + "windspeed_10m": 13.8 + }, + { + "datetime": "2024-10-09T16:00:00.000+02:00", + "dcPower": 162.78835470536214, + "power": 130.23068376428972, + "sunTilt": 19.448663917806936, + "sunAzimuth": 51.521368716140636, + "temperature": 13.8, + "relativehumidity_2m": 91, + "windspeed_10m": 14.5 + }, + { + "datetime": "2024-10-09T17:00:00.000+02:00", + "dcPower": 108.77138997105102, + "power": 87.01711197684082, + "sunTilt": 11.408678227135676, + "sunAzimuth": 64.55938454107346, + "temperature": 13.5, + "relativehumidity_2m": 90, + "windspeed_10m": 15.8 + }, + { + "datetime": "2024-10-09T18:00:00.000+02:00", + "dcPower": 64.83235444876868, + "power": 51.86588355901495, + "sunTilt": 2.4777195309842384, + "sunAzimuth": 76.59614824640437, + "temperature": 13.4, + "relativehumidity_2m": 92, + "windspeed_10m": 13.4 + }, + { + "datetime": "2024-10-09T19:00:00.000+02:00", + "dcPower": 14.529021929144772, + "power": 11.623217543315818, + "sunTilt": -6.905853552820109, + "sunAzimuth": 88.20032142925027, + "temperature": 13.6, + "relativehumidity_2m": 93, + "windspeed_10m": 14.5 + }, + { + "datetime": "2024-10-09T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -16.348052794342024, + "sunAzimuth": 99.99195941586059, + "temperature": 13.7, + "relativehumidity_2m": 94, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-09T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -25.43533401280622, + "sunAzimuth": 112.66096568522038, + "temperature": 14, + "relativehumidity_2m": 93, + "windspeed_10m": 15.5 + }, + { + "datetime": "2024-10-09T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -33.657312701408955, + "sunAzimuth": 126.98495418142949, + "temperature": 14.2, + "relativehumidity_2m": 93, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-09T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -40.32941598688323, + "sunAzimuth": 143.71902473598436, + "temperature": 14.8, + "relativehumidity_2m": 90, + "windspeed_10m": 17.6 + }, + { + "datetime": "2024-10-10T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.59106942107243, + "sunAzimuth": 163.13616076353475, + "temperature": 15.3, + "relativehumidity_2m": 89, + "windspeed_10m": 16.9 + }, + { + "datetime": "2024-10-10T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.65007030458014, + "sunAzimuth": -175.73407816523158, + "temperature": 15, + "relativehumidity_2m": 92, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-10T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.26979987634531, + "sunAzimuth": -155.060585251648, + "temperature": 14.9, + "relativehumidity_2m": 91, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-10T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.96158240518052, + "sunAzimuth": -136.66110792848332, + "temperature": 13.8, + "relativehumidity_2m": 97, + "windspeed_10m": 18.8 + }, + { + "datetime": "2024-10-10T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.59647297796838, + "sunAzimuth": -120.94117758387233, + "temperature": 12.4, + "relativehumidity_2m": 94, + "windspeed_10m": 25.6 + }, + { + "datetime": "2024-10-10T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.97820409915596, + "sunAzimuth": -107.35365077473413, + "temperature": 12.1, + "relativehumidity_2m": 92, + "windspeed_10m": 22.8 + }, + { + "datetime": "2024-10-10T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.716704637744286, + "sunAzimuth": -95.1044343497123, + "temperature": 12, + "relativehumidity_2m": 95, + "windspeed_10m": 19.5 + }, + { + "datetime": "2024-10-10T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.275734703378654, + "sunAzimuth": -83.4485894065161, + "temperature": 11.8, + "relativehumidity_2m": 93, + "windspeed_10m": 17.2 + }, + { + "datetime": "2024-10-10T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 5.945826827444097, + "sunAzimuth": -71.72880701980833, + "temperature": 12.1, + "relativehumidity_2m": 95, + "windspeed_10m": 16.3 + }, + { + "datetime": "2024-10-10T09:00:00.000+02:00", + "dcPower": 28.679605119169743, + "power": 22.943684095335797, + "sunTilt": 14.541778076840487, + "sunAzimuth": -59.34793757422427, + "temperature": 12.1, + "relativehumidity_2m": 94, + "windspeed_10m": 14.7 + }, + { + "datetime": "2024-10-10T10:00:00.000+02:00", + "dcPower": 84.33498019934706, + "power": 67.46798415947765, + "sunTilt": 22.041831409435048, + "sunAzimuth": -45.7728048820313, + "temperature": 12.2, + "relativehumidity_2m": 92, + "windspeed_10m": 15 + }, + { + "datetime": "2024-10-10T11:00:00.000+02:00", + "dcPower": 156.79561502122667, + "power": 125.43649201698133, + "sunTilt": 27.885174335468335, + "sunAzimuth": -30.63663127573816, + "temperature": 12.5, + "relativehumidity_2m": 92, + "windspeed_10m": 15.7 + }, + { + "datetime": "2024-10-10T12:00:00.000+02:00", + "dcPower": 752.5340778483028, + "power": 602.0272622786423, + "sunTilt": 31.46827419380231, + "sunAzimuth": -13.972554382839954, + "temperature": 12.8, + "relativehumidity_2m": 89, + "windspeed_10m": 18.5 + }, + { + "datetime": "2024-10-10T13:00:00.000+02:00", + "dcPower": 442.48615809817903, + "power": 353.98892647854325, + "sunTilt": 32.31297830760232, + "sunAzimuth": 3.5651067967559134, + "temperature": 12.3, + "relativehumidity_2m": 91, + "windspeed_10m": 17.7 + }, + { + "datetime": "2024-10-10T14:00:00.000+02:00", + "dcPower": 1051.0549131692967, + "power": 840.8439305354374, + "sunTilt": 30.29076264178465, + "sunAzimuth": 20.858636821509823, + "temperature": 13.1, + "relativehumidity_2m": 87, + "windspeed_10m": 16 + }, + { + "datetime": "2024-10-10T15:00:00.000+02:00", + "dcPower": 1158.2998809674602, + "power": 926.6399047739683, + "sunTilt": 25.696518065354862, + "sunAzimuth": 36.92666158608413, + "temperature": 13.2, + "relativehumidity_2m": 86, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-10T16:00:00.000+02:00", + "dcPower": 635.9116798103347, + "power": 508.7293438482678, + "sunTilt": 19.087103602605772, + "sunAzimuth": 51.382837136526646, + "temperature": 13, + "relativehumidity_2m": 81, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-10T17:00:00.000+02:00", + "dcPower": 499.23307173700306, + "power": 399.38645738960247, + "sunTilt": 11.060531491249431, + "sunAzimuth": 64.39321702308736, + "temperature": 12.8, + "relativehumidity_2m": 75, + "windspeed_10m": 13.3 + }, + { + "datetime": "2024-10-10T18:00:00.000+02:00", + "dcPower": 333.928005717175, + "power": 267.14240457374, + "sunTilt": 2.1392339596675116, + "sunAzimuth": 76.4139573135511, + "temperature": 12.3, + "relativehumidity_2m": 79, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-10T19:00:00.000+02:00", + "dcPower": 61.72489409515999, + "power": 49.379915276127996, + "sunTilt": -7.240134220715796, + "sunAzimuth": 88.00936653945188, + "temperature": 11, + "relativehumidity_2m": 80, + "windspeed_10m": 7 + }, + { + "datetime": "2024-10-10T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -16.684429132286564, + "sunAzimuth": 99.79837109714164, + "temperature": 10.6, + "relativehumidity_2m": 84, + "windspeed_10m": 5.2 + }, + { + "datetime": "2024-10-10T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -25.780350237977437, + "sunAzimuth": 112.47374911967749, + "temperature": 10.1, + "relativehumidity_2m": 85, + "windspeed_10m": 4.3 + }, + { + "datetime": "2024-10-10T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -34.01656707008997, + "sunAzimuth": 126.82157256673277, + "temperature": 10.2, + "relativehumidity_2m": 84, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-10T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -40.704586491662205, + "sunAzimuth": 143.61159893587703, + "temperature": 9.8, + "relativehumidity_2m": 90, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-11T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.97491243886403, + "sunAzimuth": 163.128648637255, + "temperature": 9.3, + "relativehumidity_2m": 92, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-11T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.02467456169168, + "sunAzimuth": -175.6141848122969, + "temperature": 8.9, + "relativehumidity_2m": 94, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-11T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.61635732682025, + "sunAzimuth": -154.8336646265192, + "temperature": 8.3, + "relativehumidity_2m": 91, + "windspeed_10m": 2.9 + }, + { + "datetime": "2024-10-11T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -38.27297819203817, + "sunAzimuth": -136.37626404685486, + "temperature": 8.3, + "relativehumidity_2m": 93, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-11T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.877497329298222, + "sunAzimuth": -120.63744534201388, + "temperature": 8.3, + "relativehumidity_2m": 95, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-11T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -22.238894548955713, + "sunAzimuth": -107.05006215076084, + "temperature": 8.3, + "relativehumidity_2m": 98, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-11T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.96790216264699, + "sunAzimuth": -94.80732853145587, + "temperature": 8.3, + "relativehumidity_2m": 96, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-11T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.5276603134629134, + "sunAzimuth": -83.1591411410959, + "temperature": 7.9, + "relativehumidity_2m": 95, + "windspeed_10m": 7.8 + }, + { + "datetime": "2024-10-11T08:00:00.000+02:00", + "dcPower": 1.0600042231633038, + "power": 0.8480033785306431, + "sunTilt": 5.683710585945252, + "sunAzimuth": -71.44774052199065, + "temperature": 7.5, + "relativehumidity_2m": 96, + "windspeed_10m": 6.9 + }, + { + "datetime": "2024-10-11T09:00:00.000+02:00", + "dcPower": 132.00210321891544, + "power": 105.60168257513236, + "sunTilt": 14.260824082236146, + "sunAzimuth": -59.0789120948653, + "temperature": 7.8, + "relativehumidity_2m": 93, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-11T10:00:00.000+02:00", + "dcPower": 462.0210524027087, + "power": 369.61684192216694, + "sunTilt": 21.734940400779433, + "sunAzimuth": -45.525661029390804, + "temperature": 8.1, + "relativehumidity_2m": 89, + "windspeed_10m": 8.2 + }, + { + "datetime": "2024-10-11T11:00:00.000+02:00", + "dcPower": 1798.689582839002, + "power": 1438.9516662712017, + "sunTilt": 27.54875518315372, + "sunAzimuth": -30.429767533564867, + "temperature": 9, + "relativehumidity_2m": 84, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-11T12:00:00.000+02:00", + "dcPower": 1894.8011928812136, + "power": 1515.840954304971, + "sunTilt": 31.105090976135774, + "sunAzimuth": -13.830431372703888, + "temperature": 9.8, + "relativehumidity_2m": 79, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-11T13:00:00.000+02:00", + "dcPower": 1985.9627540265499, + "power": 1588.77020322124, + "sunTilt": 31.9332985100557, + "sunAzimuth": 3.6233914143032355, + "temperature": 10.3, + "relativehumidity_2m": 74, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-11T14:00:00.000+02:00", + "dcPower": 2210.0949240181085, + "power": 1768.0759392144869, + "sunTilt": 29.908639212205873, + "sunAzimuth": 20.83241114244682, + "temperature": 10.8, + "relativehumidity_2m": 71, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-11T15:00:00.000+02:00", + "dcPower": 2011.3085922284695, + "power": 1609.0468737827757, + "sunTilt": 25.3232617284627, + "sunAzimuth": 36.83295334168066, + "temperature": 11.1, + "relativehumidity_2m": 69, + "windspeed_10m": 4.3 + }, + { + "datetime": "2024-10-11T16:00:00.000+02:00", + "dcPower": 648.2559726986733, + "power": 518.6047781589386, + "sunTilt": 18.727781114603793, + "sunAzimuth": 51.243806920166435, + "temperature": 11.2, + "relativehumidity_2m": 68, + "windspeed_10m": 4 + }, + { + "datetime": "2024-10-11T17:00:00.000+02:00", + "dcPower": 560.3066399417806, + "power": 448.24531195342456, + "sunTilt": 10.714725694488843, + "sunAzimuth": 64.22660182758023, + "temperature": 10.9, + "relativehumidity_2m": 71, + "windspeed_10m": 4.1 + }, + { + "datetime": "2024-10-11T18:00:00.000+02:00", + "dcPower": 298.6186217115864, + "power": 238.89489736926913, + "sunTilt": 1.803206213409536, + "sunAzimuth": 76.23115674859116, + "temperature": 10.3, + "relativehumidity_2m": 77, + "windspeed_10m": 0.5 + }, + { + "datetime": "2024-10-11T19:00:00.000+02:00", + "dcPower": 62.17166718764051, + "power": 49.73733375011241, + "sunTilt": -7.571835214892863, + "sunAzimuth": 87.81749031617603, + "temperature": 9, + "relativehumidity_2m": 79, + "windspeed_10m": 1.9 + }, + { + "datetime": "2024-10-11T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -17.0181265759899, + "sunAzimuth": 99.60341073267222, + "temperature": 7.9, + "relativehumidity_2m": 83, + "windspeed_10m": 2.4 + }, + { + "datetime": "2024-10-11T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -26.122656701936815, + "sunAzimuth": 112.28457164140065, + "temperature": 7, + "relativehumidity_2m": 85, + "windspeed_10m": 2.9 + }, + { + "datetime": "2024-10-11T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -34.37321335134456, + "sunAzimuth": 126.65558045028693, + "temperature": 6.5, + "relativehumidity_2m": 86, + "windspeed_10m": 3 + }, + { + "datetime": "2024-10-11T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.07743516418665, + "sunAzimuth": 143.5011643499793, + "temperature": 6, + "relativehumidity_2m": 88, + "windspeed_10m": 3.3 + }, + { + "datetime": "2024-10-12T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.35684572865986, + "sunAzimuth": 163.11851362268473, + "temperature": 5.4, + "relativehumidity_2m": 89, + "windspeed_10m": 4.8 + }, + { + "datetime": "2024-10-12T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.397705346785955, + "sunAzimuth": -175.49580600360676, + "temperature": 5.1, + "relativehumidity_2m": 90, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-12T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.961535734103165, + "sunAzimuth": -154.60751324634, + "temperature": 4.9, + "relativehumidity_2m": 90, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-12T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -38.58320673599567, + "sunAzimuth": -136.09226665392447, + "temperature": 4.9, + "relativehumidity_2m": 91, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-12T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.157657336040163, + "sunAzimuth": -120.33499159290702, + "temperature": 4.9, + "relativehumidity_2m": 91, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-12T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -22.499060815350038, + "sunAzimuth": -106.7481901878237, + "temperature": 4.8, + "relativehumidity_2m": 91, + "windspeed_10m": 5 + }, + { + "datetime": "2024-10-12T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.218886384957228, + "sunAzimuth": -94.51232726794028, + "temperature": 4.6, + "relativehumidity_2m": 91, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-12T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.77960910849284, + "sunAzimuth": -82.87218040699524, + "temperature": 4.5, + "relativehumidity_2m": 91, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-12T08:00:00.000+02:00", + "dcPower": 1.070056047616508, + "power": 0.8560448380932064, + "sunTilt": 5.421444806545091, + "sunAzimuth": -71.16958809655219, + "temperature": 4.7, + "relativehumidity_2m": 92, + "windspeed_10m": 6.6 + }, + { + "datetime": "2024-10-12T09:00:00.000+02:00", + "dcPower": 197.4003911897386, + "power": 157.9203129517909, + "sunTilt": 13.979744388367903, + "sunAzimuth": -58.8132832097472, + "temperature": 5.9, + "relativehumidity_2m": 90, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-12T10:00:00.000+02:00", + "dcPower": 550.3000645182516, + "power": 440.24005161460127, + "sunTilt": 21.42814200059926, + "sunAzimuth": -45.28238230412684, + "temperature": 7.3, + "relativehumidity_2m": 87, + "windspeed_10m": 9.9 + }, + { + "datetime": "2024-10-12T11:00:00.000+02:00", + "dcPower": 962.495254869171, + "power": 769.9962038953369, + "sunTilt": 27.21286115693797, + "sunAzimuth": -30.227011858140273, + "temperature": 8.4, + "relativehumidity_2m": 87, + "windspeed_10m": 10.4 + }, + { + "datetime": "2024-10-12T12:00:00.000+02:00", + "dcPower": 1839.8932783620644, + "power": 1471.9146226896517, + "sunTilt": 30.743014004100917, + "sunAzimuth": -13.692125978099353, + "temperature": 10.1, + "relativehumidity_2m": 82, + "windspeed_10m": 12.3 + }, + { + "datetime": "2024-10-12T13:00:00.000+02:00", + "dcPower": 1693.6453312654874, + "power": 1354.9162650123899, + "sunTilt": 31.555283363449327, + "sunAzimuth": 3.6787683789403496, + "temperature": 10.6, + "relativehumidity_2m": 81, + "windspeed_10m": 12.4 + }, + { + "datetime": "2024-10-12T14:00:00.000+02:00", + "dcPower": 1646.0264815435514, + "power": 1316.8211852348413, + "sunTilt": 29.52856227644022, + "sunAzimuth": 20.80440880713897, + "temperature": 11.2, + "relativehumidity_2m": 80, + "windspeed_10m": 11.3 + }, + { + "datetime": "2024-10-12T15:00:00.000+02:00", + "dcPower": 1236.85137350003, + "power": 989.481098800024, + "sunTilt": 24.95225483898691, + "sunAzimuth": 36.7383136221432, + "temperature": 11.7, + "relativehumidity_2m": 80, + "windspeed_10m": 9.7 + }, + { + "datetime": "2024-10-12T16:00:00.000+02:00", + "dcPower": 741.2076560280071, + "power": 592.9661248224057, + "sunTilt": 18.37082552430316, + "sunAzimuth": 51.10424752804786, + "temperature": 11.5, + "relativehumidity_2m": 82, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-12T17:00:00.000+02:00", + "dcPower": 487.7543072254275, + "power": 390.203445780342, + "sunTilt": 10.371392509810583, + "sunAzimuth": 64.05951991866706, + "temperature": 11.1, + "relativehumidity_2m": 84, + "windspeed_10m": 9.4 + }, + { + "datetime": "2024-10-12T18:00:00.000+02:00", + "dcPower": 176.62539380738255, + "power": 141.30031504590605, + "sunTilt": 1.4697694157713943, + "sunAzimuth": 76.0477365277625, + "temperature": 10.5, + "relativehumidity_2m": 87, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-12T19:00:00.000+02:00", + "dcPower": 27.32951530385693, + "power": 21.863612243085544, + "sunTilt": -7.900822080898683, + "sunAzimuth": 87.62468730812897, + "temperature": 9.8, + "relativehumidity_2m": 90, + "windspeed_10m": 8.5 + }, + { + "datetime": "2024-10-12T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -17.349008833561726, + "sunAzimuth": 99.4070709783674, + "temperature": 9.6, + "relativehumidity_2m": 92, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-12T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -26.462114969564762, + "sunAzimuth": 112.09341375841275, + "temperature": 9.6, + "relativehumidity_2m": 92, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-12T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -34.7271125456906, + "sunAzimuth": 126.48693033734844, + "temperature": 9.7, + "relativehumidity_2m": 92, + "windspeed_10m": 8 + }, + { + "datetime": "2024-10-12T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.447828525061254, + "sunAzimuth": 143.38762883737587, + "temperature": 9.4, + "relativehumidity_2m": 94, + "windspeed_10m": 7.3 + }, + { + "datetime": "2024-10-13T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.73675190204195, + "sunAzimuth": 163.1056210331007, + "temperature": 9.3, + "relativehumidity_2m": 94, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-13T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.76906905918878, + "sunAzimuth": -175.37909348313417, + "temperature": 9.1, + "relativehumidity_2m": 94, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-13T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.30526573902631, + "sunAzimuth": -154.3822860597556, + "temperature": 9.5, + "relativehumidity_2m": 92, + "windspeed_10m": 10 + }, + { + "datetime": "2024-10-13T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -38.89221927072221, + "sunAzimuth": -135.80926949668307, + "temperature": 9.6, + "relativehumidity_2m": 90, + "windspeed_10m": 16.3 + }, + { + "datetime": "2024-10-13T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.436918053719957, + "sunAzimuth": -120.03396199414307, + "temperature": 8.8, + "relativehumidity_2m": 87, + "windspeed_10m": 18 + }, + { + "datetime": "2024-10-13T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -22.75867399010402, + "sunAzimuth": -106.44816955814555, + "temperature": 8.4, + "relativehumidity_2m": 87, + "windspeed_10m": 15.5 + }, + { + "datetime": "2024-10-13T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.469627601285604, + "sunAzimuth": -94.21955537307969, + "temperature": 7.5, + "relativehumidity_2m": 83, + "windspeed_10m": 17 + }, + { + "datetime": "2024-10-13T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.0315450153141486, + "sunAzimuth": -82.58782406375519, + "temperature": 7.2, + "relativehumidity_2m": 82, + "windspeed_10m": 16.2 + }, + { + "datetime": "2024-10-13T08:00:00.000+02:00", + "dcPower": 1.0628761730070764, + "power": 0.8503009384056611, + "sunTilt": 5.159076534957485, + "sunAzimuth": -70.89445910846419, + "temperature": 6.7, + "relativehumidity_2m": 84, + "windspeed_10m": 16.8 + }, + { + "datetime": "2024-10-13T09:00:00.000+02:00", + "dcPower": 145.59209961839045, + "power": 116.47367969471236, + "sunTilt": 13.698600583367673, + "sunAzimuth": -58.55115047580995, + "temperature": 6.9, + "relativehumidity_2m": 86, + "windspeed_10m": 15.5 + }, + { + "datetime": "2024-10-13T10:00:00.000+02:00", + "dcPower": 420.1869623239068, + "power": 336.14956985912545, + "sunTilt": 21.12151408595382, + "sunAzimuth": -45.043053146408546, + "temperature": 7.5, + "relativehumidity_2m": 83, + "windspeed_10m": 22.7 + }, + { + "datetime": "2024-10-13T11:00:00.000+02:00", + "dcPower": 522.9364319872756, + "power": 418.34914558982047, + "sunTilt": 26.877585132999467, + "sunAzimuth": -30.028428502780528, + "temperature": 8.1, + "relativehumidity_2m": 83, + "windspeed_10m": 19.5 + }, + { + "datetime": "2024-10-13T12:00:00.000+02:00", + "dcPower": 928.7775408499571, + "power": 743.0220326799657, + "sunTilt": 30.382147107830978, + "sunAzimuth": -13.557685005032592, + "temperature": 8.5, + "relativehumidity_2m": 82, + "windspeed_10m": 18.9 + }, + { + "datetime": "2024-10-13T13:00:00.000+02:00", + "dcPower": 1538.0761562598432, + "power": 1230.4609250078747, + "sunTilt": 31.17904416002473, + "sunAzimuth": 3.731196531846679, + "temperature": 9.4, + "relativehumidity_2m": 79, + "windspeed_10m": 19.1 + }, + { + "datetime": "2024-10-13T14:00:00.000+02:00", + "dcPower": 1689.2405941284853, + "power": 1351.3924753027884, + "sunTilt": 29.150649828823855, + "sunAzimuth": 20.774587486422366, + "temperature": 10.4, + "relativehumidity_2m": 75, + "windspeed_10m": 17.7 + }, + { + "datetime": "2024-10-13T15:00:00.000+02:00", + "dcPower": 1654.777719219827, + "power": 1323.8221753758617, + "sunTilt": 24.583621654336596, + "sunAzimuth": 36.642703763191776, + "temperature": 10.3, + "relativehumidity_2m": 74, + "windspeed_10m": 17.6 + }, + { + "datetime": "2024-10-13T16:00:00.000+02:00", + "dcPower": 748.7985198938329, + "power": 599.0388159150664, + "sunTilt": 18.016365562424813, + "sunAzimuth": 50.96413031013026, + "temperature": 10.3, + "relativehumidity_2m": 77, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-13T17:00:00.000+02:00", + "dcPower": 555.8420628793457, + "power": 444.67365030347656, + "sunTilt": 10.030663139779685, + "sunAzimuth": 63.89195411454739, + "temperature": 9.9, + "relativehumidity_2m": 79, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-13T18:00:00.000+02:00", + "dcPower": 230.90863388928312, + "power": 184.7269071114265, + "sunTilt": 1.1390561362362333, + "sunAzimuth": 75.8636886240363, + "temperature": 9.1, + "relativehumidity_2m": 82, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-13T19:00:00.000+02:00", + "dcPower": 31.697596783778167, + "power": 25.358077427022536, + "sunTilt": -8.226960953264081, + "sunAzimuth": 87.43095436456028, + "temperature": 8.3, + "relativehumidity_2m": 87, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-13T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -17.676940156857277, + "sunAzimuth": 99.2093472034457, + "temperature": 8.1, + "relativehumidity_2m": 87, + "windspeed_10m": 6.4 + }, + { + "datetime": "2024-10-13T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -26.79858696849319, + "sunAzimuth": 111.90025906076745, + "temperature": 7.6, + "relativehumidity_2m": 90, + "windspeed_10m": 6.8 + }, + { + "datetime": "2024-10-13T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -35.0781256664598, + "sunAzimuth": 126.3155777234557, + "temperature": 7.1, + "relativehumidity_2m": 90, + "windspeed_10m": 5 + }, + { + "datetime": "2024-10-13T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.815632684929426, + "sunAzimuth": 143.2709019404984, + "temperature": 6.5, + "relativehumidity_2m": 91, + "windspeed_10m": 2.6 + }, + { + "datetime": "2024-10-14T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.11451301786215, + "sunAzimuth": 163.08983536166957, + "temperature": 6.3, + "relativehumidity_2m": 89, + "windspeed_10m": 2.4 + }, + { + "datetime": "2024-10-14T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.138671848584934, + "sunAzimuth": -175.2642016873541, + "temperature": 5.8, + "relativehumidity_2m": 89, + "windspeed_10m": 1.5 + }, + { + "datetime": "2024-10-14T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.647478099904184, + "sunAzimuth": -154.15814092455744, + "temperature": 5.3, + "relativehumidity_2m": 90, + "windspeed_10m": 4 + }, + { + "datetime": "2024-10-14T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.1999672120048, + "sunAzimuth": -135.52742842855076, + "temperature": 4.5, + "relativehumidity_2m": 93, + "windspeed_10m": 1.5 + }, + { + "datetime": "2024-10-14T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.715244466780028, + "sunAzimuth": -119.73450334119632, + "temperature": 4, + "relativehumidity_2m": 94, + "windspeed_10m": 4.5 + }, + { + "datetime": "2024-10-14T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.01770469074795, + "sunAzimuth": -106.15013533780943, + "temperature": 3.8, + "relativehumidity_2m": 94, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-14T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.720095220219516, + "sunAzimuth": -93.92913753819082, + "temperature": 4.2, + "relativehumidity_2m": 94, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-14T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.283430715645694, + "sunAzimuth": -82.30618839226909, + "temperature": 4.7, + "relativehumidity_2m": 94, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-14T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.896654311121907, + "sunAzimuth": -70.62246187023919, + "temperature": 5.1, + "relativehumidity_2m": 93, + "windspeed_10m": 4.3 + }, + { + "datetime": "2024-10-14T09:00:00.000+02:00", + "dcPower": 132.97359671714773, + "power": 106.37887737371818, + "sunTilt": 13.417455844515738, + "sunAzimuth": -58.29261188464403, + "temperature": 5.6, + "relativehumidity_2m": 92, + "windspeed_10m": 3.8 + }, + { + "datetime": "2024-10-14T10:00:00.000+02:00", + "dcPower": 405.59211479841304, + "power": 324.4736918387305, + "sunTilt": 20.815136015137117, + "sunAzimuth": -44.807755986987566, + "temperature": 6.7, + "relativehumidity_2m": 87, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-14T11:00:00.000+02:00", + "dcPower": 616.8979931513162, + "power": 493.518394521053, + "sunTilt": 26.543021174019792, + "sunAzimuth": -29.83407952105961, + "temperature": 7.5, + "relativehumidity_2m": 85, + "windspeed_10m": 10.1 + }, + { + "datetime": "2024-10-14T12:00:00.000+02:00", + "dcPower": 544.0337398355801, + "power": 435.22699186846415, + "sunTilt": 30.022594925866507, + "sunAzimuth": -13.427153142476177, + "temperature": 7.8, + "relativehumidity_2m": 87, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-14T13:00:00.000+02:00", + "dcPower": 757.6272986491891, + "power": 606.1018389193513, + "sunTilt": 30.804692641790414, + "sunAzimuth": 3.780636799023051, + "temperature": 8.7, + "relativehumidity_2m": 84, + "windspeed_10m": 9.4 + }, + { + "datetime": "2024-10-14T14:00:00.000+02:00", + "dcPower": 802.6332382442511, + "power": 642.1065905954009, + "sunTilt": 28.775019978770835, + "sunAzimuth": 20.742907009369926, + "temperature": 8.8, + "relativehumidity_2m": 83, + "windspeed_10m": 7.7 + }, + { + "datetime": "2024-10-14T15:00:00.000+02:00", + "dcPower": 727.2477881703447, + "power": 581.7982305362758, + "sunTilt": 24.217486258022436, + "sunAzimuth": 36.546087194880954, + "temperature": 8.8, + "relativehumidity_2m": 85, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-14T16:00:00.000+02:00", + "dcPower": 588.679937715913, + "power": 470.9439501727304, + "sunTilt": 17.664529576020236, + "sunAzimuth": 50.82342857831685, + "temperature": 8.7, + "relativehumidity_2m": 88, + "windspeed_10m": 5.2 + }, + { + "datetime": "2024-10-14T17:00:00.000+02:00", + "dcPower": 408.4315746861509, + "power": 326.7452597489207, + "sunTilt": 9.692668263612882, + "sunAzimuth": 63.7238891712367, + "temperature": 8.4, + "relativehumidity_2m": 90, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-14T18:00:00.000+02:00", + "dcPower": 189.55947192037354, + "power": 151.64757753629883, + "sunTilt": 0.8111983279457368, + "sunAzimuth": 75.67900710147994, + "temperature": 8.2, + "relativehumidity_2m": 91, + "windspeed_10m": 1.8 + }, + { + "datetime": "2024-10-14T19:00:00.000+02:00", + "dcPower": 31.73574416203751, + "power": 25.388595329630007, + "sunTilt": -8.5501186243532, + "sunAzimuth": 87.23629074336492, + "temperature": 7.9, + "relativehumidity_2m": 93, + "windspeed_10m": 0.4 + }, + { + "datetime": "2024-10-14T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.00178541748869, + "sunAzimuth": 99.01023762777291, + "temperature": 7.4, + "relativehumidity_2m": 94, + "windspeed_10m": 1.1 + }, + { + "datetime": "2024-10-14T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -27.131935065748255, + "sunAzimuth": 111.70509440468732, + "temperature": 6.7, + "relativehumidity_2m": 96, + "windspeed_10m": 1.1 + }, + { + "datetime": "2024-10-14T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -35.426113802819536, + "sunAzimuth": 126.14148133580082, + "temperature": 5.8, + "relativehumidity_2m": 98, + "windspeed_10m": 0.4 + }, + { + "datetime": "2024-10-14T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.180713378529184, + "sunAzimuth": 143.15089515757862, + "temperature": 5, + "relativehumidity_2m": 100, + "windspeed_10m": 0.7 + }, + { + "datetime": "2024-10-15T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.49001057641694, + "sunAzimuth": 163.07102046565072, + "temperature": 4.3, + "relativehumidity_2m": 100, + "windspeed_10m": 1.4 + }, + { + "datetime": "2024-10-15T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.506419588733614, + "sunAzimuth": -175.15128768425117, + "temperature": 3.8, + "relativehumidity_2m": 100, + "windspeed_10m": 1.9 + }, + { + "datetime": "2024-10-15T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.988103658491234, + "sunAzimuth": -153.9352385869432, + "temperature": 3.2, + "relativehumidity_2m": 100, + "windspeed_10m": 2.6 + }, + { + "datetime": "2024-10-15T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.50640211284843, + "sunAzimuth": -135.24690137263536, + "temperature": 2.4, + "relativehumidity_2m": 100, + "windspeed_10m": 2.9 + }, + { + "datetime": "2024-10-15T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.992601433814595, + "sunAzimuth": -119.43676351875516, + "temperature": 1.6, + "relativehumidity_2m": 100, + "windspeed_10m": 3.2 + }, + { + "datetime": "2024-10-15T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.276123004228086, + "sunAzimuth": -105.85422295783262, + "temperature": 1.2, + "relativehumidity_2m": 100, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-15T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.970257710966642, + "sunAzimuth": -93.64119828341282, + "temperature": 1.2, + "relativehumidity_2m": 100, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-15T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.5352276078301, + "sunAzimuth": -82.02738904900566, + "temperature": 1.6, + "relativehumidity_2m": 100, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-15T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.63422819396966, + "sunAzimuth": -70.35370359566531, + "temperature": 2.3, + "relativehumidity_2m": 100, + "windspeed_10m": 4 + }, + { + "datetime": "2024-10-15T09:00:00.000+02:00", + "dcPower": 160.7609025328025, + "power": 128.60872202624202, + "sunTilt": 13.136374944499462, + "sunAzimuth": -58.037763824819606, + "temperature": 3.4, + "relativehumidity_2m": 98, + "windspeed_10m": 5 + }, + { + "datetime": "2024-10-15T10:00:00.000+02:00", + "dcPower": 455.71724945435693, + "power": 364.5737995634856, + "sunTilt": 20.50908861823578, + "sunAzimuth": -44.57657122307415, + "temperature": 4.8, + "relativehumidity_2m": 94, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-15T11:00:00.000+02:00", + "dcPower": 687.0836404217806, + "power": 549.6669123374245, + "sunTilt": 26.20926450679345, + "sunAzimuth": -29.644024765315514, + "temperature": 6.3, + "relativehumidity_2m": 91, + "windspeed_10m": 7.8 + }, + { + "datetime": "2024-10-15T12:00:00.000+02:00", + "dcPower": 1904.2142151339715, + "power": 1523.3713721071772, + "sunTilt": 29.66446288060627, + "sunAzimuth": -13.300572957692536, + "temperature": 8, + "relativehumidity_2m": 88, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-15T13:00:00.000+02:00", + "dcPower": 2323.589968212759, + "power": 1858.8719745702072, + "sunTilt": 30.43234097439692, + "sunAzimuth": 3.8270522061418095, + "temperature": 9.7, + "relativehumidity_2m": 84, + "windspeed_10m": 10.9 + }, + { + "datetime": "2024-10-15T14:00:00.000+02:00", + "dcPower": 2439.6345315420713, + "power": 1951.7076252336572, + "sunTilt": 28.401790922595836, + "sunAzimuth": 20.709329389098386, + "temperature": 10.8, + "relativehumidity_2m": 82, + "windspeed_10m": 11.9 + }, + { + "datetime": "2024-10-15T15:00:00.000+02:00", + "dcPower": 2183.596181552923, + "power": 1746.8769452423385, + "sunTilt": 23.853972526435296, + "sunAzimuth": 36.448429487078144, + "temperature": 11.2, + "relativehumidity_2m": 81, + "windspeed_10m": 11.9 + }, + { + "datetime": "2024-10-15T16:00:00.000+02:00", + "dcPower": 610.6314730323843, + "power": 488.50517842590745, + "sunTilt": 17.315445485866938, + "sunAzimuth": 50.682117672382816, + "temperature": 11, + "relativehumidity_2m": 81, + "windspeed_10m": 11 + }, + { + "datetime": "2024-10-15T17:00:00.000+02:00", + "dcPower": 452.43008429729906, + "power": 361.9440674378393, + "sunTilt": 9.35753798215806, + "sunAzimuth": 63.55531186506398, + "temperature": 10.6, + "relativehumidity_2m": 82, + "windspeed_10m": 11.1 + }, + { + "datetime": "2024-10-15T18:00:00.000+02:00", + "dcPower": 246.26795036997265, + "power": 197.01436029597812, + "sunTilt": 0.48632726290863104, + "sunAzimuth": 75.49368820866877, + "temperature": 9.7, + "relativehumidity_2m": 85, + "windspeed_10m": 12.1 + }, + { + "datetime": "2024-10-15T19:00:00.000+02:00", + "dcPower": 52.82473341173196, + "power": 42.259786729385574, + "sunTilt": -8.870162619560801, + "sunAzimuth": 87.04069822248259, + "temperature": 8.5, + "relativehumidity_2m": 88, + "windspeed_10m": 13.6 + }, + { + "datetime": "2024-10-15T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.323410184499085, + "sunAzimuth": 98.80974345652376, + "temperature": 7.6, + "relativehumidity_2m": 91, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-15T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -27.462022150796383, + "sunAzimuth": 111.50791010170794, + "temperature": 7.2, + "relativehumidity_2m": 91, + "windspeed_10m": 13.9 + }, + { + "datetime": "2024-10-15T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -35.770938188604354, + "sunAzimuth": 125.96460338334036, + "temperature": 7, + "relativehumidity_2m": 91, + "windspeed_10m": 12.9 + }, + { + "datetime": "2024-10-15T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.54293600102064, + "sunAzimuth": 143.02752222319543, + "temperature": 6.8, + "relativehumidity_2m": 89, + "windspeed_10m": 12.7 + }, + { + "datetime": "2024-10-16T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.86312551477473, + "sunAzimuth": 163.04903976266138, + "temperature": 6.7, + "relativehumidity_2m": 86, + "windspeed_10m": 13.8 + }, + { + "datetime": "2024-10-16T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.87221785059982, + "sunAzimuth": -175.04051110279474, + "temperature": 6.8, + "relativehumidity_2m": 83, + "windspeed_10m": 15.6 + }, + { + "datetime": "2024-10-16T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.32707330350441, + "sunAzimuth": -153.71374265034802, + "temperature": 6.8, + "relativehumidity_2m": 80, + "windspeed_10m": 16.5 + }, + { + "datetime": "2024-10-16T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.81147561550361, + "sunAzimuth": -134.96784827714956, + "temperature": 7, + "relativehumidity_2m": 78, + "windspeed_10m": 16.1 + }, + { + "datetime": "2024-10-16T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.26895363243685, + "sunAzimuth": -119.1408914506387, + "temperature": 7.3, + "relativehumidity_2m": 77, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-16T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.53389843309148, + "sunAzimuth": -105.56056815727264, + "temperature": 7.4, + "relativehumidity_2m": 75, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-16T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -14.220082554609817, + "sunAzimuth": -93.355861910257, + "temperature": 7.4, + "relativehumidity_2m": 73, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-16T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.786895768698711, + "sunAzimuth": -81.75154101774274, + "temperature": 7.3, + "relativehumidity_2m": 71, + "windspeed_10m": 14.7 + }, + { + "datetime": "2024-10-16T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.371849783596975, + "sunAzimuth": -70.08829035405888, + "temperature": 7.2, + "relativehumidity_2m": 70, + "windspeed_10m": 14.8 + }, + { + "datetime": "2024-10-16T09:00:00.000+02:00", + "dcPower": 120.67880138508733, + "power": 96.54304110806987, + "sunTilt": 12.855424254104108, + "sunAzimuth": -57.78670104663053, + "temperature": 9.8, + "relativehumidity_2m": 72, + "windspeed_10m": 17 + }, + { + "datetime": "2024-10-16T10:00:00.000+02:00", + "dcPower": 349.2545941544614, + "power": 279.40367532356913, + "sunTilt": 20.203454185088123, + "sunAzimuth": -44.34957719582011, + "temperature": 10.2, + "relativehumidity_2m": 75, + "windspeed_10m": 16.5 + }, + { + "datetime": "2024-10-16T11:00:00.000+02:00", + "dcPower": 549.0777204410166, + "power": 439.2621763528133, + "sunTilt": 25.87641150088954, + "sunAzimuth": -29.45832187587005, + "temperature": 10.7, + "relativehumidity_2m": 77, + "windspeed_10m": 16.2 + }, + { + "datetime": "2024-10-16T12:00:00.000+02:00", + "dcPower": 1293.9533240813814, + "power": 1035.1626592651053, + "sunTilt": 29.30785715204484, + "sunAzimuth": -13.177984892004138, + "temperature": 11.6, + "relativehumidity_2m": 77, + "windspeed_10m": 15.7 + }, + { + "datetime": "2024-10-16T13:00:00.000+02:00", + "dcPower": 1629.0729841502784, + "power": 1303.258387320223, + "sunTilt": 30.062101719417093, + "sunAzimuth": 3.870407893111919, + "temperature": 12.5, + "relativehumidity_2m": 75, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-16T14:00:00.000+02:00", + "dcPower": 1733.765780840024, + "power": 1387.0126246720192, + "sunTilt": 28.03108091352568, + "sunAzimuth": 20.673818848950724, + "temperature": 13.2, + "relativehumidity_2m": 75, + "windspeed_10m": 14.8 + }, + { + "datetime": "2024-10-16T15:00:00.000+02:00", + "dcPower": 1540.2873204227294, + "power": 1232.2298563381837, + "sunTilt": 23.49320409080551, + "sunAzimuth": 36.34969840216598, + "temperature": 13.5, + "relativehumidity_2m": 77, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-16T16:00:00.000+02:00", + "dcPower": 670.2174910745355, + "power": 536.1739928596284, + "sunTilt": 16.969240740198778, + "sunAzimuth": 50.54017502787197, + "temperature": 13.5, + "relativehumidity_2m": 80, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-16T17:00:00.000+02:00", + "dcPower": 457.92616067692046, + "power": 366.3409285415364, + "sunTilt": 9.025401762418719, + "sunAzimuth": 63.386211071389155, + "temperature": 13.3, + "relativehumidity_2m": 82, + "windspeed_10m": 13.2 + }, + { + "datetime": "2024-10-16T18:00:00.000+02:00", + "dcPower": 227.80720186977683, + "power": 182.24576149582148, + "sunTilt": 0.16457346744538273, + "sunAzimuth": 75.30773046735078, + "temperature": 13, + "relativehumidity_2m": 82, + "windspeed_10m": 13 + }, + { + "datetime": "2024-10-16T19:00:00.000+02:00", + "dcPower": 46.84238505374372, + "power": 37.47390804299498, + "sunTilt": -9.186961271997145, + "sunAzimuth": 86.84418120594421, + "temperature": 12.6, + "relativehumidity_2m": 81, + "windspeed_10m": 12.7 + }, + { + "datetime": "2024-10-16T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.64168080965683, + "sunAzimuth": 98.60786901950698, + "temperature": 12.2, + "relativehumidity_2m": 80, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-16T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -27.788711717705176, + "sunAzimuth": 111.30870010109864, + "temperature": 12, + "relativehumidity_2m": 80, + "windspeed_10m": 11.8 + }, + { + "datetime": "2024-10-16T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -36.112460277357016, + "sunAzimuth": 125.78490981561183, + "temperature": 11.8, + "relativehumidity_2m": 81, + "windspeed_10m": 11 + }, + { + "datetime": "2024-10-16T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.9021656490531, + "sunAzimuth": 142.90069940402603, + "temperature": 11.7, + "relativehumidity_2m": 82, + "windspeed_10m": 10.2 + }, + { + "datetime": "2024-10-17T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.23373820466217, + "sunAzimuth": 163.02375644913673, + "temperature": 11.7, + "relativehumidity_2m": 82, + "windspeed_10m": 9.4 + }, + { + "datetime": "2024-10-17T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -48.2359718752176, + "sunAzimuth": -174.9320340577077, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-17T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.66431793404074, + "sunAzimuth": -153.4938195445769, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 8.2 + }, + { + "datetime": "2024-10-17T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -40.115139405653565, + "sunAzimuth": -134.69043107615582, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-17T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.54426550294801, + "sunAzimuth": -118.84703704658551, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-17T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.79099983796868, + "sunAzimuth": -105.2693069294498, + "temperature": 11.7, + "relativehumidity_2m": 82, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-17T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -14.469536195186127, + "sunAzimuth": -93.07325245162968, + "temperature": 11.6, + "relativehumidity_2m": 82, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-17T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -5.038393916921545, + "sunAzimuth": -81.47875856041325, + "temperature": 11.4, + "relativehumidity_2m": 83, + "windspeed_10m": 7.3 + }, + { + "datetime": "2024-10-17T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.109572239802723, + "sunAzimuth": -69.8263270263417, + "temperature": 11.5, + "relativehumidity_2m": 83, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-17T09:00:00.000+02:00", + "dcPower": 109.40847975459633, + "power": 87.52678380367706, + "sunTilt": 12.574671747325786, + "sunAzimuth": -57.53951661964237, + "temperature": 11.9, + "relativehumidity_2m": 83, + "windspeed_10m": 8 + }, + { + "datetime": "2024-10-17T10:00:00.000+02:00", + "dcPower": 325.9211402075719, + "power": 260.73691216605755, + "sunTilt": 19.89831645004539, + "sunAzimuth": -44.1268501705138, + "temperature": 12.5, + "relativehumidity_2m": 82, + "windspeed_10m": 9.7 + }, + { + "datetime": "2024-10-17T11:00:00.000+02:00", + "dcPower": 508.9101858471262, + "power": 407.12814867770095, + "sunTilt": 25.54455964459646, + "sunAzimuth": -29.277026273264024, + "temperature": 13.1, + "relativehumidity_2m": 82, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-17T12:00:00.000+02:00", + "dcPower": 894.0445396905282, + "power": 715.2356317524226, + "sunTilt": 28.952884649607554, + "sunAzimuth": -13.059427258390235, + "temperature": 13.5, + "relativehumidity_2m": 83, + "windspeed_10m": 10.7 + }, + { + "datetime": "2024-10-17T13:00:00.000+02:00", + "dcPower": 951.2372373763384, + "power": 760.9897899010707, + "sunTilt": 29.694087805098004, + "sunAzimuth": 3.9106711264578404, + "temperature": 13.8, + "relativehumidity_2m": 85, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-17T14:00:00.000+02:00", + "dcPower": 939.5640180555158, + "power": 751.6512144444127, + "sunTilt": 27.663008228484166, + "sunAzimuth": 20.63634185579284, + "temperature": 14.2, + "relativehumidity_2m": 86, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-17T15:00:00.000+02:00", + "dcPower": 879.0007445936827, + "power": 703.2005956749463, + "sunTilt": 23.13530429931852, + "sunAzimuth": 36.24986394147597, + "temperature": 14.6, + "relativehumidity_2m": 87, + "windspeed_10m": 9.8 + }, + { + "datetime": "2024-10-17T16:00:00.000+02:00", + "dcPower": 651.4897418815121, + "power": 521.1917935052097, + "sunTilt": 16.626042266391202, + "sunAzimuth": 50.39758024284303, + "temperature": 14.9, + "relativehumidity_2m": 88, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-17T17:00:00.000+02:00", + "dcPower": 469.9569459149162, + "power": 375.965556731933, + "sunTilt": 8.696388379725821, + "sunAzimuth": 63.21657784217465, + "temperature": 15.1, + "relativehumidity_2m": 89, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-17T18:00:00.000+02:00", + "dcPower": 231.32779574813136, + "power": 185.0622365985051, + "sunTilt": -0.15393334821361332, + "sunAzimuth": 75.12113476396313, + "temperature": 14.9, + "relativehumidity_2m": 90, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-17T19:00:00.000+02:00", + "dcPower": 41.347251661047395, + "power": 33.077801328837914, + "sunTilt": -9.500383797971471, + "sunAzimuth": 86.64674682587622, + "temperature": 14.6, + "relativehumidity_2m": 92, + "windspeed_10m": 6.7 + }, + { + "datetime": "2024-10-17T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.956464510241965, + "sunAzimuth": 98.40462190157557, + "temperature": 14.3, + "relativehumidity_2m": 93, + "windspeed_10m": 5.9 + }, + { + "datetime": "2024-10-17T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -28.11186795253563, + "sunAzimuth": 111.10746217430679, + "temperature": 14.2, + "relativehumidity_2m": 94, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-17T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -36.45054181856139, + "sunAzimuth": 125.60237057929713, + "temperature": 14.2, + "relativehumidity_2m": 94, + "windspeed_10m": 4.6 + }, + { + "datetime": "2024-10-17T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.2582671659911, + "sunAzimuth": 142.77034580724174, + "temperature": 14.2, + "relativehumidity_2m": 95, + "windspeed_10m": 4.4 + } + ], + [ + { + "datetime": "2024-10-06T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.03892891605494, + "sunAzimuth": 163.14263622624128, + "temperature": 7, + "relativehumidity_2m": 88, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-06T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.13778324543035, + "sunAzimuth": -176.22585898864278, + "temperature": 6.5, + "relativehumidity_2m": 91, + "windspeed_10m": 6.8 + }, + { + "datetime": "2024-10-06T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.87117274960936, + "sunAzimuth": -155.9729639229445, + "temperature": 6, + "relativehumidity_2m": 91, + "windspeed_10m": 5.9 + }, + { + "datetime": "2024-10-06T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -36.70531092777589, + "sunAzimuth": -137.8059489226708, + "temperature": 5.5, + "relativehumidity_2m": 92, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-06T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -29.46443142893699, + "sunAzimuth": -122.16602054266892, + "temperature": 5.1, + "relativehumidity_2m": 92, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-06T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -20.930765133481234, + "sunAzimuth": -108.58249513077881, + "temperature": 4.9, + "relativehumidity_2m": 93, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-06T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -11.710347315474053, + "sunAzimuth": -96.31140508589108, + "temperature": 5.1, + "relativehumidity_2m": 92, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-06T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -2.2689443207496223, + "sunAzimuth": -84.62890292197706, + "temperature": 5.3, + "relativehumidity_2m": 92, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-06T08:00:00.000+02:00", + "dcPower": 11.268313449099201, + "power": 9.01465075927936, + "sunTilt": 6.991906328571172, + "sunAzimuth": -72.87999206290318, + "temperature": 5.5, + "relativehumidity_2m": 91, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-06T09:00:00.000+02:00", + "dcPower": 232.86769125035775, + "power": 186.2941530002862, + "sunTilt": 15.663160391528187, + "sunAzimuth": -60.45596163553978, + "temperature": 6.3, + "relativehumidity_2m": 90, + "windspeed_10m": 9.3 + }, + { + "datetime": "2024-10-06T10:00:00.000+02:00", + "dcPower": 460.35082488685083, + "power": 368.2806599094807, + "sunTilt": 23.268816289666535, + "sunAzimuth": -46.79827360798693, + "temperature": 8, + "relativehumidity_2m": 85, + "windspeed_10m": 11.6 + }, + { + "datetime": "2024-10-06T11:00:00.000+02:00", + "dcPower": 672.3552091335482, + "power": 537.8841673068385, + "sunTilt": 29.234287239795027, + "sunAzimuth": -31.503805204051176, + "temperature": 9.5, + "relativehumidity_2m": 86, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-06T12:00:00.000+02:00", + "dcPower": 1681.9915426189737, + "power": 1345.593234095179, + "sunTilt": 32.93002248275174, + "sunAzimuth": -14.578212396799534, + "temperature": 10.8, + "relativehumidity_2m": 82, + "windspeed_10m": 16.3 + }, + { + "datetime": "2024-10-06T13:00:00.000+02:00", + "dcPower": 1774.549862136572, + "power": 1419.6398897092577, + "sunTilt": 33.84613522696556, + "sunAzimuth": 3.3037874055175505, + "temperature": 10.9, + "relativehumidity_2m": 82, + "windspeed_10m": 16.9 + }, + { + "datetime": "2024-10-06T14:00:00.000+02:00", + "dcPower": 1689.4756968481113, + "power": 1351.580557478489, + "sunTilt": 31.83736693728352, + "sunAzimuth": 20.94669333759787, + "temperature": 12.6, + "relativehumidity_2m": 74, + "windspeed_10m": 17.1 + }, + { + "datetime": "2024-10-06T15:00:00.000+02:00", + "dcPower": 1067.9359341691359, + "power": 854.3487473353088, + "sunTilt": 27.209548486852757, + "sunAzimuth": 37.29302345489315, + "temperature": 12.8, + "relativehumidity_2m": 75, + "windspeed_10m": 17.8 + }, + { + "datetime": "2024-10-06T16:00:00.000+02:00", + "dcPower": 821.9702122637689, + "power": 657.5761698110151, + "sunTilt": 20.54547686442047, + "sunAzimuth": 51.93430385037965, + "temperature": 13.1, + "relativehumidity_2m": 73, + "windspeed_10m": 17.8 + }, + { + "datetime": "2024-10-06T17:00:00.000+02:00", + "dcPower": 774.5516286126806, + "power": 619.6413028901445, + "sunTilt": 12.4658413410018, + "sunAzimuth": 65.05541740712634, + "temperature": 12.6, + "relativehumidity_2m": 72, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-06T18:00:00.000+02:00", + "dcPower": 412.058868933531, + "power": 329.6470951468248, + "sunTilt": 3.5065849097251456, + "sunAzimuth": 77.13919140741508, + "temperature": 11.9, + "relativehumidity_2m": 76, + "windspeed_10m": 14.8 + }, + { + "datetime": "2024-10-06T19:00:00.000+02:00", + "dcPower": 82.78007183053384, + "power": 66.22405746442708, + "sunTilt": -5.8888854618235795, + "sunAzimuth": 88.76774476136781, + "temperature": 11.1, + "relativehumidity_2m": 79, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-06T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -15.324219942418523, + "sunAzimuth": 100.56460329657087, + "temperature": 10.6, + "relativehumidity_2m": 81, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-06T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -24.385415066790006, + "sunAzimuth": 113.21108724923529, + "temperature": 10.3, + "relativehumidity_2m": 81, + "windspeed_10m": 13.4 + }, + { + "datetime": "2024-10-06T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.56528997863786, + "sunAzimuth": 127.45995077522508, + "temperature": 10.3, + "relativehumidity_2m": 83, + "windspeed_10m": 13.4 + }, + { + "datetime": "2024-10-06T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.19130152908581, + "sunAzimuth": 144.02419079232183, + "temperature": 10.7, + "relativehumidity_2m": 83, + "windspeed_10m": 13 + }, + { + "datetime": "2024-10-07T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.4292477470776, + "sunAzimuth": 163.14429087891105, + "temperature": 11, + "relativehumidity_2m": 83, + "windspeed_10m": 13.6 + }, + { + "datetime": "2024-10-07T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.517749495901406, + "sunAzimuth": -176.10136944486192, + "temperature": 11, + "relativehumidity_2m": 87, + "windspeed_10m": 11.2 + }, + { + "datetime": "2024-10-07T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.22254930467857, + "sunAzimuth": -155.74445709329385, + "temperature": 10.9, + "relativehumidity_2m": 91, + "windspeed_10m": 9.8 + }, + { + "datetime": "2024-10-07T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.020882886444426, + "sunAzimuth": -137.5192133151141, + "temperature": 11, + "relativehumidity_2m": 93, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-07T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -29.748563322135755, + "sunAzimuth": -121.8586066543482, + "temperature": 11.4, + "relativehumidity_2m": 94, + "windspeed_10m": 8.9 + }, + { + "datetime": "2024-10-07T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.193270783038106, + "sunAzimuth": -108.27337691467278, + "temperature": 11.5, + "relativehumidity_2m": 95, + "windspeed_10m": 11 + }, + { + "datetime": "2024-10-07T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -11.962117012521006, + "sunAzimuth": -96.00713008699226, + "temperature": 12, + "relativehumidity_2m": 94, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-07T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -2.520439907672165, + "sunAzimuth": -84.33068309080377, + "temperature": 12.2, + "relativehumidity_2m": 95, + "windspeed_10m": 9.3 + }, + { + "datetime": "2024-10-07T08:00:00.000+02:00", + "dcPower": 4.997945294591559, + "power": 3.9983562356732474, + "sunTilt": 6.730829735879827, + "sunAzimuth": -72.58838243599898, + "temperature": 12.7, + "relativehumidity_2m": 94, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-07T09:00:00.000+02:00", + "dcPower": 102.01332391139826, + "power": 81.61065912911862, + "sunTilt": 15.383293627086166, + "sunAzimuth": -60.174375329765816, + "temperature": 13.3, + "relativehumidity_2m": 94, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-07T10:00:00.000+02:00", + "dcPower": 408.4884640831041, + "power": 326.79077126648326, + "sunTilt": 22.96230371458641, + "sunAzimuth": -46.53655309716923, + "temperature": 14.4, + "relativehumidity_2m": 91, + "windspeed_10m": 8.9 + }, + { + "datetime": "2024-10-07T11:00:00.000+02:00", + "dcPower": 378.1151467220305, + "power": 302.4921173776244, + "sunTilt": 28.896671975172765, + "sunAzimuth": -31.281195510232457, + "temperature": 15.2, + "relativehumidity_2m": 91, + "windspeed_10m": 10.9 + }, + { + "datetime": "2024-10-07T12:00:00.000+02:00", + "dcPower": 734.6436488825714, + "power": 587.7149191060571, + "sunTilt": 32.56343562699629, + "sunAzimuth": -14.421329305847635, + "temperature": 16, + "relativehumidity_2m": 89, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-07T13:00:00.000+02:00", + "dcPower": 1364.6506150490802, + "power": 1091.7204920392642, + "sunTilt": 33.46089993111447, + "sunAzimuth": 3.3732496911031458, + "temperature": 17, + "relativehumidity_2m": 82, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-07T14:00:00.000+02:00", + "dcPower": 1502.5040978903205, + "power": 1202.0032783122565, + "sunTilt": 31.448234246769605, + "sunAzimuth": 20.927108911856653, + "temperature": 18, + "relativehumidity_2m": 75, + "windspeed_10m": 9.8 + }, + { + "datetime": "2024-10-07T15:00:00.000+02:00", + "dcPower": 1019.1998220923691, + "power": 815.3598576738954, + "sunTilt": 26.828539273003113, + "sunAzimuth": 37.20261442198752, + "temperature": 18.6, + "relativehumidity_2m": 70, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-07T16:00:00.000+02:00", + "dcPower": 843.1514040310797, + "power": 674.5211232248638, + "sunTilt": 20.17798028996772, + "sunAzimuth": 51.797067137147856, + "temperature": 18.9, + "relativehumidity_2m": 70, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-07T17:00:00.000+02:00", + "dcPower": 758.8576567525531, + "power": 607.0861254020425, + "sunTilt": 12.11146577521795, + "sunAzimuth": 64.89046144901918, + "temperature": 18.4, + "relativehumidity_2m": 72, + "windspeed_10m": 7.2 + }, + { + "datetime": "2024-10-07T18:00:00.000+02:00", + "dcPower": 346.21701930163505, + "power": 276.973615441308, + "sunTilt": 3.1615292467832945, + "sunAzimuth": 76.95875071433478, + "temperature": 17.4, + "relativehumidity_2m": 74, + "windspeed_10m": 9.5 + }, + { + "datetime": "2024-10-07T19:00:00.000+02:00", + "dcPower": 76.34921188156889, + "power": 61.079369505255116, + "sunTilt": -6.2300935503595385, + "sunAzimuth": 88.57949984494998, + "temperature": 16.4, + "relativehumidity_2m": 79, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-07T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -15.667810875617224, + "sunAzimuth": 100.37506201699385, + "temperature": 15.4, + "relativehumidity_2m": 87, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-07T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -24.737727405113922, + "sunAzimuth": 113.02960837119129, + "temperature": 14.9, + "relativehumidity_2m": 90, + "windspeed_10m": 10.9 + }, + { + "datetime": "2024-10-07T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.93153539182831, + "sunAzimuth": 127.30408938398604, + "temperature": 14.5, + "relativehumidity_2m": 94, + "windspeed_10m": 10.7 + }, + { + "datetime": "2024-10-07T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.572641175501424, + "sunAzimuth": 143.925225436442, + "temperature": 14.7, + "relativehumidity_2m": 94, + "windspeed_10m": 11.6 + }, + { + "datetime": "2024-10-08T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.818121034022454, + "sunAzimuth": 163.14384998115503, + "temperature": 14.7, + "relativehumidity_2m": 94, + "windspeed_10m": 15.8 + }, + { + "datetime": "2024-10-08T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.8965146817323, + "sunAzimuth": -175.97781528741945, + "temperature": 14.8, + "relativehumidity_2m": 93, + "windspeed_10m": 14 + }, + { + "datetime": "2024-10-08T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.572826067170936, + "sunAzimuth": -155.51612909180187, + "temperature": 15.4, + "relativehumidity_2m": 94, + "windspeed_10m": 11.2 + }, + { + "datetime": "2024-10-08T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.33548533853669, + "sunAzimuth": -137.23273090041528, + "temperature": 15.4, + "relativehumidity_2m": 93, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-08T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.031970973409337, + "sunAzimuth": -121.55190085899577, + "temperature": 15.4, + "relativehumidity_2m": 93, + "windspeed_10m": 11.2 + }, + { + "datetime": "2024-10-08T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.45536424486834, + "sunAzimuth": -107.96544161465735, + "temperature": 15.8, + "relativehumidity_2m": 94, + "windspeed_10m": 10 + }, + { + "datetime": "2024-10-08T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.213784351950519, + "sunAzimuth": -95.70446004731738, + "temperature": 15.8, + "relativehumidity_2m": 93, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-08T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -2.772091353585381, + "sunAzimuth": -84.03447848078322, + "temperature": 15.7, + "relativehumidity_2m": 93, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-08T08:00:00.000+02:00", + "dcPower": 3.9570941862162403, + "power": 3.1656753489729925, + "sunTilt": 6.469429830924286, + "sunAzimuth": -72.29923977528891, + "temperature": 15.7, + "relativehumidity_2m": 90, + "windspeed_10m": 10.2 + }, + { + "datetime": "2024-10-08T09:00:00.000+02:00", + "dcPower": 206.74517171719188, + "power": 165.3961373737535, + "sunTilt": 15.10307050684314, + "sunAzimuth": -59.895772492079, + "temperature": 15.7, + "relativehumidity_2m": 89, + "windspeed_10m": 8.3 + }, + { + "datetime": "2024-10-08T10:00:00.000+02:00", + "dcPower": 552.8014529356424, + "power": 442.2411623485139, + "sunTilt": 22.655587204347487, + "sunAzimuth": -46.27834028428006, + "temperature": 16.3, + "relativehumidity_2m": 86, + "windspeed_10m": 10.6 + }, + { + "datetime": "2024-10-08T11:00:00.000+02:00", + "dcPower": 817.8807593131021, + "power": 654.3046074504817, + "sunTilt": 28.55922255887939, + "sunAzimuth": -31.06241498925654, + "temperature": 17, + "relativehumidity_2m": 85, + "windspeed_10m": 9 + }, + { + "datetime": "2024-10-08T12:00:00.000+02:00", + "dcPower": 1175.4689911230503, + "power": 940.3751928984402, + "sunTilt": 32.19754822667087, + "sunAzimuth": -14.26805544520534, + "temperature": 17.6, + "relativehumidity_2m": 82, + "windspeed_10m": 13.1 + }, + { + "datetime": "2024-10-08T13:00:00.000+02:00", + "dcPower": 1568.6417485623892, + "power": 1254.9133988499116, + "sunTilt": 33.07688907994966, + "sunAzimuth": 3.4399896103944245, + "temperature": 18.3, + "relativehumidity_2m": 73, + "windspeed_10m": 12.7 + }, + { + "datetime": "2024-10-08T14:00:00.000+02:00", + "dcPower": 1421.4294036606193, + "power": 1137.1435229284955, + "sunTilt": 31.060677746554727, + "sunAzimuth": 20.90593811884074, + "temperature": 18.2, + "relativehumidity_2m": 71, + "windspeed_10m": 13.2 + }, + { + "datetime": "2024-10-08T15:00:00.000+02:00", + "dcPower": 1147.3071758445456, + "power": 917.8457406756365, + "sunTilt": 26.44928138282813, + "sunAzimuth": 37.11144846293623, + "temperature": 18.1, + "relativehumidity_2m": 71, + "windspeed_10m": 13.3 + }, + { + "datetime": "2024-10-08T16:00:00.000+02:00", + "dcPower": 829.3893256086282, + "power": 663.5114604869026, + "sunTilt": 19.81233269039211, + "sunAzimuth": 51.65943401571543, + "temperature": 17.4, + "relativehumidity_2m": 73, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-08T17:00:00.000+02:00", + "dcPower": 592.2614991449287, + "power": 473.80919931594303, + "sunTilt": 11.759033809196055, + "sunAzimuth": 64.72512518734406, + "temperature": 16.9, + "relativehumidity_2m": 75, + "windspeed_10m": 6.3 + }, + { + "datetime": "2024-10-08T18:00:00.000+02:00", + "dcPower": 338.1808208981102, + "power": 270.54465671848817, + "sunTilt": 2.818529310708217, + "sunAzimuth": 76.77774147088243, + "temperature": 16, + "relativehumidity_2m": 75, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-08T19:00:00.000+02:00", + "dcPower": 76.72176162631511, + "power": 61.3774093010521, + "sunTilt": -6.569128186596377, + "sunAzimuth": 88.39036262615889, + "temperature": 15, + "relativehumidity_2m": 82, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-08T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -16.00913432264249, + "sunAzimuth": 100.18418560559792, + "temperature": 14.5, + "relativehumidity_2m": 89, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-08T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -25.087746753502067, + "sunAzimuth": 112.84624373263145, + "temperature": 14, + "relativehumidity_2m": 93, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-08T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -33.29558919415396, + "sunAzimuth": 127.1457755347392, + "temperature": 14, + "relativehumidity_2m": 88, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-08T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.95205668980692, + "sunAzimuth": 143.82353531827584, + "temperature": 13, + "relativehumidity_2m": 91, + "windspeed_10m": 7.2 + }, + { + "datetime": "2024-10-09T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.20543351779722, + "sunAzimuth": 163.1411836959831, + "temperature": 12.6, + "relativehumidity_2m": 92, + "windspeed_10m": 7.8 + }, + { + "datetime": "2024-10-09T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.27398595213309, + "sunAzimuth": -175.8553370630724, + "temperature": 12.9, + "relativehumidity_2m": 91, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-09T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.92193289241474, + "sunAzimuth": -155.28812310014723, + "temperature": 12.7, + "relativehumidity_2m": 92, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-09T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.64906836752005, + "sunAzimuth": -136.94664669208646, + "temperature": 12.9, + "relativehumidity_2m": 91, + "windspeed_10m": 12.3 + }, + { + "datetime": "2024-10-09T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.314619206373006, + "sunAzimuth": -121.24604384005964, + "temperature": 12.9, + "relativehumidity_2m": 91, + "windspeed_10m": 10.2 + }, + { + "datetime": "2024-10-09T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.71701795569338, + "sunAzimuth": -107.65882183814558, + "temperature": 13.2, + "relativehumidity_2m": 90, + "windspeed_10m": 12.9 + }, + { + "datetime": "2024-10-09T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.465322674764078, + "sunAzimuth": -95.40351983003244, + "temperature": 13.3, + "relativehumidity_2m": 89, + "windspeed_10m": 13.5 + }, + { + "datetime": "2024-10-09T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.023867147662328, + "sunAzimuth": -83.74040781223535, + "temperature": 12.9, + "relativehumidity_2m": 92, + "windspeed_10m": 13.2 + }, + { + "datetime": "2024-10-09T08:00:00.000+02:00", + "dcPower": 0.9989938192491249, + "power": 0.7991950553992999, + "sunTilt": 6.207747953736028, + "sunAzimuth": -72.01267721735641, + "temperature": 12.9, + "relativehumidity_2m": 92, + "windspeed_10m": 11.8 + }, + { + "datetime": "2024-10-09T09:00:00.000+02:00", + "dcPower": 53.8969992305709, + "power": 43.117599384456724, + "sunTilt": 14.82254636430179, + "sunAzimuth": -59.62025856421435, + "temperature": 12.8, + "relativehumidity_2m": 93, + "windspeed_10m": 11.8 + }, + { + "datetime": "2024-10-09T10:00:00.000+02:00", + "dcPower": 171.5134955209038, + "power": 137.21079641672304, + "sunTilt": 22.348738640203063, + "sunAzimuth": -46.023727432629336, + "temperature": 13.1, + "relativehumidity_2m": 91, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-09T11:00:00.000+02:00", + "dcPower": 349.730317681861, + "power": 279.7842541454888, + "sunTilt": 28.22202694317921, + "sunAzimuth": -30.847536638720733, + "temperature": 13.7, + "relativehumidity_2m": 92, + "windspeed_10m": 12.8 + }, + { + "datetime": "2024-10-09T12:00:00.000+02:00", + "dcPower": 518.1643251136576, + "power": 414.5314600909261, + "sunTilt": 31.832460658762763, + "sunAzimuth": -14.118446086753368, + "temperature": 13.8, + "relativehumidity_2m": 91, + "windspeed_10m": 12 + }, + { + "datetime": "2024-10-09T13:00:00.000+02:00", + "dcPower": 477.84371999495954, + "power": 382.2749759959677, + "sunTilt": 32.69421193791607, + "sunAzimuth": 3.503957762689472, + "temperature": 14.2, + "relativehumidity_2m": 90, + "windspeed_10m": 11.5 + }, + { + "datetime": "2024-10-09T14:00:00.000+02:00", + "dcPower": 356.3376608266884, + "power": 285.07012866135074, + "sunTilt": 30.674814714273392, + "sunAzimuth": 20.883130296493302, + "temperature": 13.9, + "relativehumidity_2m": 91, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-09T15:00:00.000+02:00", + "dcPower": 200.71128030166, + "power": 160.569024241328, + "sunTilt": 26.07189945210854, + "sunAzimuth": 37.01947906146245, + "temperature": 13.8, + "relativehumidity_2m": 92, + "windspeed_10m": 13.8 + }, + { + "datetime": "2024-10-09T16:00:00.000+02:00", + "dcPower": 156.27682051714766, + "power": 125.02145641371813, + "sunTilt": 19.448663917806936, + "sunAzimuth": 51.521368716140636, + "temperature": 13.8, + "relativehumidity_2m": 91, + "windspeed_10m": 14.5 + }, + { + "datetime": "2024-10-09T17:00:00.000+02:00", + "dcPower": 104.42053437220898, + "power": 83.53642749776719, + "sunTilt": 11.408678227135676, + "sunAzimuth": 64.55938454107346, + "temperature": 13.5, + "relativehumidity_2m": 90, + "windspeed_10m": 15.8 + }, + { + "datetime": "2024-10-09T18:00:00.000+02:00", + "dcPower": 62.23906027081793, + "power": 49.791248216654346, + "sunTilt": 2.4777195309842384, + "sunAzimuth": 76.59614824640437, + "temperature": 13.4, + "relativehumidity_2m": 92, + "windspeed_10m": 13.4 + }, + { + "datetime": "2024-10-09T19:00:00.000+02:00", + "dcPower": 13.94786105197898, + "power": 11.158288841583186, + "sunTilt": -6.905853552820109, + "sunAzimuth": 88.20032142925027, + "temperature": 13.6, + "relativehumidity_2m": 93, + "windspeed_10m": 14.5 + }, + { + "datetime": "2024-10-09T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -16.348052794342024, + "sunAzimuth": 99.99195941586059, + "temperature": 13.7, + "relativehumidity_2m": 94, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-09T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -25.43533401280622, + "sunAzimuth": 112.66096568522038, + "temperature": 14, + "relativehumidity_2m": 93, + "windspeed_10m": 15.5 + }, + { + "datetime": "2024-10-09T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -33.657312701408955, + "sunAzimuth": 126.98495418142949, + "temperature": 14.2, + "relativehumidity_2m": 93, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-09T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -40.32941598688323, + "sunAzimuth": 143.71902473598436, + "temperature": 14.8, + "relativehumidity_2m": 90, + "windspeed_10m": 17.6 + }, + { + "datetime": "2024-10-10T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.59106942107243, + "sunAzimuth": 163.13616076353475, + "temperature": 15.3, + "relativehumidity_2m": 89, + "windspeed_10m": 16.9 + }, + { + "datetime": "2024-10-10T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.65007030458014, + "sunAzimuth": -175.73407816523158, + "temperature": 15, + "relativehumidity_2m": 92, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-10T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.26979987634531, + "sunAzimuth": -155.060585251648, + "temperature": 14.9, + "relativehumidity_2m": 91, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-10T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.96158240518052, + "sunAzimuth": -136.66110792848332, + "temperature": 13.8, + "relativehumidity_2m": 97, + "windspeed_10m": 18.8 + }, + { + "datetime": "2024-10-10T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.59647297796838, + "sunAzimuth": -120.94117758387233, + "temperature": 12.4, + "relativehumidity_2m": 94, + "windspeed_10m": 25.6 + }, + { + "datetime": "2024-10-10T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.97820409915596, + "sunAzimuth": -107.35365077473413, + "temperature": 12.1, + "relativehumidity_2m": 92, + "windspeed_10m": 22.8 + }, + { + "datetime": "2024-10-10T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.716704637744286, + "sunAzimuth": -95.1044343497123, + "temperature": 12, + "relativehumidity_2m": 95, + "windspeed_10m": 19.5 + }, + { + "datetime": "2024-10-10T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.275734703378654, + "sunAzimuth": -83.4485894065161, + "temperature": 11.8, + "relativehumidity_2m": 93, + "windspeed_10m": 17.2 + }, + { + "datetime": "2024-10-10T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 5.945826827444097, + "sunAzimuth": -71.72880701980833, + "temperature": 12.1, + "relativehumidity_2m": 95, + "windspeed_10m": 16.3 + }, + { + "datetime": "2024-10-10T09:00:00.000+02:00", + "dcPower": 27.532420914402955, + "power": 22.025936731522364, + "sunTilt": 14.541778076840487, + "sunAzimuth": -59.34793757422427, + "temperature": 12.1, + "relativehumidity_2m": 94, + "windspeed_10m": 14.7 + }, + { + "datetime": "2024-10-10T10:00:00.000+02:00", + "dcPower": 80.96158099137317, + "power": 64.76926479309854, + "sunTilt": 22.041831409435048, + "sunAzimuth": -45.7728048820313, + "temperature": 12.2, + "relativehumidity_2m": 92, + "windspeed_10m": 15 + }, + { + "datetime": "2024-10-10T11:00:00.000+02:00", + "dcPower": 150.5237904203776, + "power": 120.41903233630208, + "sunTilt": 27.885174335468335, + "sunAzimuth": -30.63663127573816, + "temperature": 12.5, + "relativehumidity_2m": 92, + "windspeed_10m": 15.7 + }, + { + "datetime": "2024-10-10T12:00:00.000+02:00", + "dcPower": 698.2747101395488, + "power": 558.619768111639, + "sunTilt": 31.46827419380231, + "sunAzimuth": -13.972554382839954, + "temperature": 12.8, + "relativehumidity_2m": 89, + "windspeed_10m": 18.5 + }, + { + "datetime": "2024-10-10T13:00:00.000+02:00", + "dcPower": 417.97423461812605, + "power": 334.37938769450085, + "sunTilt": 32.31297830760232, + "sunAzimuth": 3.5651067967559134, + "temperature": 12.3, + "relativehumidity_2m": 91, + "windspeed_10m": 17.7 + }, + { + "datetime": "2024-10-10T14:00:00.000+02:00", + "dcPower": 958.9876822522824, + "power": 767.190145801826, + "sunTilt": 30.29076264178465, + "sunAzimuth": 20.858636821509823, + "temperature": 13.1, + "relativehumidity_2m": 87, + "windspeed_10m": 16 + }, + { + "datetime": "2024-10-10T15:00:00.000+02:00", + "dcPower": 688.4299066938424, + "power": 550.743925355074, + "sunTilt": 25.696518065354862, + "sunAzimuth": 36.92666158608413, + "temperature": 13.2, + "relativehumidity_2m": 86, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-10T16:00:00.000+02:00", + "dcPower": 610.4752126179212, + "power": 488.380170094337, + "sunTilt": 19.087103602605772, + "sunAzimuth": 51.382837136526646, + "temperature": 13, + "relativehumidity_2m": 81, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-10T17:00:00.000+02:00", + "dcPower": 479.2637488675229, + "power": 383.41099909401834, + "sunTilt": 11.060531491249431, + "sunAzimuth": 64.39321702308736, + "temperature": 12.8, + "relativehumidity_2m": 75, + "windspeed_10m": 13.3 + }, + { + "datetime": "2024-10-10T18:00:00.000+02:00", + "dcPower": 320.570885488488, + "power": 256.4567083907904, + "sunTilt": 2.1392339596675116, + "sunAzimuth": 76.4139573135511, + "temperature": 12.3, + "relativehumidity_2m": 79, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-10T19:00:00.000+02:00", + "dcPower": 59.25589833135359, + "power": 47.404718665082875, + "sunTilt": -7.240134220715796, + "sunAzimuth": 88.00936653945188, + "temperature": 11, + "relativehumidity_2m": 80, + "windspeed_10m": 7 + }, + { + "datetime": "2024-10-10T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -16.684429132286564, + "sunAzimuth": 99.79837109714164, + "temperature": 10.6, + "relativehumidity_2m": 84, + "windspeed_10m": 5.2 + }, + { + "datetime": "2024-10-10T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -25.780350237977437, + "sunAzimuth": 112.47374911967749, + "temperature": 10.1, + "relativehumidity_2m": 85, + "windspeed_10m": 4.3 + }, + { + "datetime": "2024-10-10T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -34.01656707008997, + "sunAzimuth": 126.82157256673277, + "temperature": 10.2, + "relativehumidity_2m": 84, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-10T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -40.704586491662205, + "sunAzimuth": 143.61159893587703, + "temperature": 9.8, + "relativehumidity_2m": 90, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-11T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.97491243886403, + "sunAzimuth": 163.128648637255, + "temperature": 9.3, + "relativehumidity_2m": 92, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-11T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.02467456169168, + "sunAzimuth": -175.6141848122969, + "temperature": 8.9, + "relativehumidity_2m": 94, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-11T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.61635732682025, + "sunAzimuth": -154.8336646265192, + "temperature": 8.3, + "relativehumidity_2m": 91, + "windspeed_10m": 2.9 + }, + { + "datetime": "2024-10-11T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -38.27297819203817, + "sunAzimuth": -136.37626404685486, + "temperature": 8.3, + "relativehumidity_2m": 93, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-11T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.877497329298222, + "sunAzimuth": -120.63744534201388, + "temperature": 8.3, + "relativehumidity_2m": 95, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-11T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -22.238894548955713, + "sunAzimuth": -107.05006215076084, + "temperature": 8.3, + "relativehumidity_2m": 98, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-11T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.96790216264699, + "sunAzimuth": -94.80732853145587, + "temperature": 8.3, + "relativehumidity_2m": 96, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-11T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.5276603134629134, + "sunAzimuth": -83.1591411410959, + "temperature": 7.9, + "relativehumidity_2m": 95, + "windspeed_10m": 7.8 + }, + { + "datetime": "2024-10-11T08:00:00.000+02:00", + "dcPower": 1.0176040542367717, + "power": 0.8140832433894174, + "sunTilt": 5.683710585945252, + "sunAzimuth": -71.44774052199065, + "temperature": 7.5, + "relativehumidity_2m": 96, + "windspeed_10m": 6.9 + }, + { + "datetime": "2024-10-11T09:00:00.000+02:00", + "dcPower": 126.72201909015881, + "power": 101.37761527212706, + "sunTilt": 14.260824082236146, + "sunAzimuth": -59.0789120948653, + "temperature": 7.8, + "relativehumidity_2m": 93, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-11T10:00:00.000+02:00", + "dcPower": 443.54021030660033, + "power": 354.8321682452803, + "sunTilt": 21.734940400779433, + "sunAzimuth": -45.525661029390804, + "temperature": 8.1, + "relativehumidity_2m": 89, + "windspeed_10m": 8.2 + }, + { + "datetime": "2024-10-11T11:00:00.000+02:00", + "dcPower": 701.7623472438349, + "power": 561.4098777950679, + "sunTilt": 27.54875518315372, + "sunAzimuth": -30.429767533564867, + "temperature": 9, + "relativehumidity_2m": 84, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-11T12:00:00.000+02:00", + "dcPower": 1689.8795805363357, + "power": 1351.9036644290686, + "sunTilt": 31.105090976135774, + "sunAzimuth": -13.830431372703888, + "temperature": 9.8, + "relativehumidity_2m": 79, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-11T13:00:00.000+02:00", + "dcPower": 1738.8014116916338, + "power": 1391.041129353307, + "sunTilt": 31.9332985100557, + "sunAzimuth": 3.6233914143032355, + "temperature": 10.3, + "relativehumidity_2m": 74, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-11T14:00:00.000+02:00", + "dcPower": 877.0554642263434, + "power": 701.6443713810747, + "sunTilt": 29.908639212205873, + "sunAzimuth": 20.83241114244682, + "temperature": 10.8, + "relativehumidity_2m": 71, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-11T15:00:00.000+02:00", + "dcPower": 766.0323265356332, + "power": 612.8258612285066, + "sunTilt": 25.3232617284627, + "sunAzimuth": 36.83295334168066, + "temperature": 11.1, + "relativehumidity_2m": 69, + "windspeed_10m": 4.3 + }, + { + "datetime": "2024-10-11T16:00:00.000+02:00", + "dcPower": 622.3257337907264, + "power": 497.8605870325812, + "sunTilt": 18.727781114603793, + "sunAzimuth": 51.243806920166435, + "temperature": 11.2, + "relativehumidity_2m": 68, + "windspeed_10m": 4 + }, + { + "datetime": "2024-10-11T17:00:00.000+02:00", + "dcPower": 537.8943743441093, + "power": 430.3154994752875, + "sunTilt": 10.714725694488843, + "sunAzimuth": 64.22660182758023, + "temperature": 10.9, + "relativehumidity_2m": 71, + "windspeed_10m": 4.1 + }, + { + "datetime": "2024-10-11T18:00:00.000+02:00", + "dcPower": 286.67387684312297, + "power": 229.3391014744984, + "sunTilt": 1.803206213409536, + "sunAzimuth": 76.23115674859116, + "temperature": 10.3, + "relativehumidity_2m": 77, + "windspeed_10m": 0.5 + }, + { + "datetime": "2024-10-11T19:00:00.000+02:00", + "dcPower": 59.684800500134884, + "power": 47.74784040010791, + "sunTilt": -7.571835214892863, + "sunAzimuth": 87.81749031617603, + "temperature": 9, + "relativehumidity_2m": 79, + "windspeed_10m": 1.9 + }, + { + "datetime": "2024-10-11T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -17.0181265759899, + "sunAzimuth": 99.60341073267222, + "temperature": 7.9, + "relativehumidity_2m": 83, + "windspeed_10m": 2.4 + }, + { + "datetime": "2024-10-11T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -26.122656701936815, + "sunAzimuth": 112.28457164140065, + "temperature": 7, + "relativehumidity_2m": 85, + "windspeed_10m": 2.9 + }, + { + "datetime": "2024-10-11T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -34.37321335134456, + "sunAzimuth": 126.65558045028693, + "temperature": 6.5, + "relativehumidity_2m": 86, + "windspeed_10m": 3 + }, + { + "datetime": "2024-10-11T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.07743516418665, + "sunAzimuth": 143.5011643499793, + "temperature": 6, + "relativehumidity_2m": 88, + "windspeed_10m": 3.3 + }, + { + "datetime": "2024-10-12T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.35684572865986, + "sunAzimuth": 163.11851362268473, + "temperature": 5.4, + "relativehumidity_2m": 89, + "windspeed_10m": 4.8 + }, + { + "datetime": "2024-10-12T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.397705346785955, + "sunAzimuth": -175.49580600360676, + "temperature": 5.1, + "relativehumidity_2m": 90, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-12T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.961535734103165, + "sunAzimuth": -154.60751324634, + "temperature": 4.9, + "relativehumidity_2m": 90, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-12T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -38.58320673599567, + "sunAzimuth": -136.09226665392447, + "temperature": 4.9, + "relativehumidity_2m": 91, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-12T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.157657336040163, + "sunAzimuth": -120.33499159290702, + "temperature": 4.9, + "relativehumidity_2m": 91, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-12T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -22.499060815350038, + "sunAzimuth": -106.7481901878237, + "temperature": 4.8, + "relativehumidity_2m": 91, + "windspeed_10m": 5 + }, + { + "datetime": "2024-10-12T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.218886384957228, + "sunAzimuth": -94.51232726794028, + "temperature": 4.6, + "relativehumidity_2m": 91, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-12T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.77960910849284, + "sunAzimuth": -82.87218040699524, + "temperature": 4.5, + "relativehumidity_2m": 91, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-12T08:00:00.000+02:00", + "dcPower": 1.0272538057118477, + "power": 0.8218030445694782, + "sunTilt": 5.421444806545091, + "sunAzimuth": -71.16958809655219, + "temperature": 4.7, + "relativehumidity_2m": 92, + "windspeed_10m": 6.6 + }, + { + "datetime": "2024-10-12T09:00:00.000+02:00", + "dcPower": 189.50437554214903, + "power": 151.60350043371923, + "sunTilt": 13.979744388367903, + "sunAzimuth": -58.8132832097472, + "temperature": 5.9, + "relativehumidity_2m": 90, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-12T10:00:00.000+02:00", + "dcPower": 528.2880619375215, + "power": 422.63044955001726, + "sunTilt": 21.42814200059926, + "sunAzimuth": -45.28238230412684, + "temperature": 7.3, + "relativehumidity_2m": 87, + "windspeed_10m": 9.9 + }, + { + "datetime": "2024-10-12T11:00:00.000+02:00", + "dcPower": 764.8989677490279, + "power": 611.9191741992223, + "sunTilt": 27.21286115693797, + "sunAzimuth": -30.227011858140273, + "temperature": 8.4, + "relativehumidity_2m": 87, + "windspeed_10m": 10.4 + }, + { + "datetime": "2024-10-12T12:00:00.000+02:00", + "dcPower": 1665.2058569778644, + "power": 1332.1646855822917, + "sunTilt": 30.743014004100917, + "sunAzimuth": -13.692125978099353, + "temperature": 10.1, + "relativehumidity_2m": 82, + "windspeed_10m": 12.3 + }, + { + "datetime": "2024-10-12T13:00:00.000+02:00", + "dcPower": 1547.0060348694196, + "power": 1237.604827895536, + "sunTilt": 31.555283363449327, + "sunAzimuth": 3.6787683789403496, + "temperature": 10.6, + "relativehumidity_2m": 81, + "windspeed_10m": 12.4 + }, + { + "datetime": "2024-10-12T14:00:00.000+02:00", + "dcPower": 1185.607045814405, + "power": 948.485636651524, + "sunTilt": 29.52856227644022, + "sunAzimuth": 20.80440880713897, + "temperature": 11.2, + "relativehumidity_2m": 80, + "windspeed_10m": 11.3 + }, + { + "datetime": "2024-10-12T15:00:00.000+02:00", + "dcPower": 1052.3012345518403, + "power": 841.8409876414722, + "sunTilt": 24.95225483898691, + "sunAzimuth": 36.7383136221432, + "temperature": 11.7, + "relativehumidity_2m": 80, + "windspeed_10m": 9.7 + }, + { + "datetime": "2024-10-12T16:00:00.000+02:00", + "dcPower": 711.5593497868869, + "power": 569.2474798295095, + "sunTilt": 18.37082552430316, + "sunAzimuth": 51.10424752804786, + "temperature": 11.5, + "relativehumidity_2m": 82, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-12T17:00:00.000+02:00", + "dcPower": 468.24413493641043, + "power": 374.59530794912837, + "sunTilt": 10.371392509810583, + "sunAzimuth": 64.05951991866706, + "temperature": 11.1, + "relativehumidity_2m": 84, + "windspeed_10m": 9.4 + }, + { + "datetime": "2024-10-12T18:00:00.000+02:00", + "dcPower": 169.56037805508723, + "power": 135.6483024440698, + "sunTilt": 1.4697694157713943, + "sunAzimuth": 76.0477365277625, + "temperature": 10.5, + "relativehumidity_2m": 87, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-12T19:00:00.000+02:00", + "dcPower": 26.236334691702652, + "power": 20.98906775336212, + "sunTilt": -7.900822080898683, + "sunAzimuth": 87.62468730812897, + "temperature": 9.8, + "relativehumidity_2m": 90, + "windspeed_10m": 8.5 + }, + { + "datetime": "2024-10-12T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -17.349008833561726, + "sunAzimuth": 99.4070709783674, + "temperature": 9.6, + "relativehumidity_2m": 92, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-12T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -26.462114969564762, + "sunAzimuth": 112.09341375841275, + "temperature": 9.6, + "relativehumidity_2m": 92, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-12T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -34.7271125456906, + "sunAzimuth": 126.48693033734844, + "temperature": 9.7, + "relativehumidity_2m": 92, + "windspeed_10m": 8 + }, + { + "datetime": "2024-10-12T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.447828525061254, + "sunAzimuth": 143.38762883737587, + "temperature": 9.4, + "relativehumidity_2m": 94, + "windspeed_10m": 7.3 + }, + { + "datetime": "2024-10-13T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.73675190204195, + "sunAzimuth": 163.1056210331007, + "temperature": 9.3, + "relativehumidity_2m": 94, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-13T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.76906905918878, + "sunAzimuth": -175.37909348313417, + "temperature": 9.1, + "relativehumidity_2m": 94, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-13T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.30526573902631, + "sunAzimuth": -154.3822860597556, + "temperature": 9.5, + "relativehumidity_2m": 92, + "windspeed_10m": 10 + }, + { + "datetime": "2024-10-13T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -38.89221927072221, + "sunAzimuth": -135.80926949668307, + "temperature": 9.6, + "relativehumidity_2m": 90, + "windspeed_10m": 16.3 + }, + { + "datetime": "2024-10-13T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.436918053719957, + "sunAzimuth": -120.03396199414307, + "temperature": 8.8, + "relativehumidity_2m": 87, + "windspeed_10m": 18 + }, + { + "datetime": "2024-10-13T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -22.75867399010402, + "sunAzimuth": -106.44816955814555, + "temperature": 8.4, + "relativehumidity_2m": 87, + "windspeed_10m": 15.5 + }, + { + "datetime": "2024-10-13T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.469627601285604, + "sunAzimuth": -94.21955537307969, + "temperature": 7.5, + "relativehumidity_2m": 83, + "windspeed_10m": 17 + }, + { + "datetime": "2024-10-13T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.0315450153141486, + "sunAzimuth": -82.58782406375519, + "temperature": 7.2, + "relativehumidity_2m": 82, + "windspeed_10m": 16.2 + }, + { + "datetime": "2024-10-13T08:00:00.000+02:00", + "dcPower": 1.0203611260867933, + "power": 0.8162889008694347, + "sunTilt": 5.159076534957485, + "sunAzimuth": -70.89445910846419, + "temperature": 6.7, + "relativehumidity_2m": 84, + "windspeed_10m": 16.8 + }, + { + "datetime": "2024-10-13T09:00:00.000+02:00", + "dcPower": 139.76841563365483, + "power": 111.81473250692386, + "sunTilt": 13.698600583367673, + "sunAzimuth": -58.55115047580995, + "temperature": 6.9, + "relativehumidity_2m": 86, + "windspeed_10m": 15.5 + }, + { + "datetime": "2024-10-13T10:00:00.000+02:00", + "dcPower": 403.3794838309505, + "power": 322.7035870647604, + "sunTilt": 21.12151408595382, + "sunAzimuth": -45.043053146408546, + "temperature": 7.5, + "relativehumidity_2m": 83, + "windspeed_10m": 22.7 + }, + { + "datetime": "2024-10-13T11:00:00.000+02:00", + "dcPower": 502.01897470778454, + "power": 401.61517976622764, + "sunTilt": 26.877585132999467, + "sunAzimuth": -30.028428502780528, + "temperature": 8.1, + "relativehumidity_2m": 83, + "windspeed_10m": 19.5 + }, + { + "datetime": "2024-10-13T12:00:00.000+02:00", + "dcPower": 848.8155858520288, + "power": 679.052468681623, + "sunTilt": 30.382147107830978, + "sunAzimuth": -13.557685005032592, + "temperature": 8.5, + "relativehumidity_2m": 82, + "windspeed_10m": 18.9 + }, + { + "datetime": "2024-10-13T13:00:00.000+02:00", + "dcPower": 1354.2793646356383, + "power": 1083.4234917085107, + "sunTilt": 31.17904416002473, + "sunAzimuth": 3.731196531846679, + "temperature": 9.4, + "relativehumidity_2m": 79, + "windspeed_10m": 19.1 + }, + { + "datetime": "2024-10-13T14:00:00.000+02:00", + "dcPower": 941.4263314178322, + "power": 753.1410651342658, + "sunTilt": 29.150649828823855, + "sunAzimuth": 20.774587486422366, + "temperature": 10.4, + "relativehumidity_2m": 75, + "windspeed_10m": 17.7 + }, + { + "datetime": "2024-10-13T15:00:00.000+02:00", + "dcPower": 859.830381916628, + "power": 687.8643055333024, + "sunTilt": 24.583621654336596, + "sunAzimuth": 36.642703763191776, + "temperature": 10.3, + "relativehumidity_2m": 74, + "windspeed_10m": 17.6 + }, + { + "datetime": "2024-10-13T16:00:00.000+02:00", + "dcPower": 718.8465790980796, + "power": 575.0772632784636, + "sunTilt": 18.016365562424813, + "sunAzimuth": 50.96413031013026, + "temperature": 10.3, + "relativehumidity_2m": 77, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-13T17:00:00.000+02:00", + "dcPower": 533.6083803641718, + "power": 426.8867042913375, + "sunTilt": 10.030663139779685, + "sunAzimuth": 63.89195411454739, + "temperature": 9.9, + "relativehumidity_2m": 79, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-13T18:00:00.000+02:00", + "dcPower": 221.67228853371176, + "power": 177.33783082696942, + "sunTilt": 1.1390561362362333, + "sunAzimuth": 75.8636886240363, + "temperature": 9.1, + "relativehumidity_2m": 82, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-13T19:00:00.000+02:00", + "dcPower": 30.42969291242704, + "power": 24.343754329941632, + "sunTilt": -8.226960953264081, + "sunAzimuth": 87.43095436456028, + "temperature": 8.3, + "relativehumidity_2m": 87, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-13T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -17.676940156857277, + "sunAzimuth": 99.2093472034457, + "temperature": 8.1, + "relativehumidity_2m": 87, + "windspeed_10m": 6.4 + }, + { + "datetime": "2024-10-13T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -26.79858696849319, + "sunAzimuth": 111.90025906076745, + "temperature": 7.6, + "relativehumidity_2m": 90, + "windspeed_10m": 6.8 + }, + { + "datetime": "2024-10-13T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -35.0781256664598, + "sunAzimuth": 126.3155777234557, + "temperature": 7.1, + "relativehumidity_2m": 90, + "windspeed_10m": 5 + }, + { + "datetime": "2024-10-13T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.815632684929426, + "sunAzimuth": 143.2709019404984, + "temperature": 6.5, + "relativehumidity_2m": 91, + "windspeed_10m": 2.6 + }, + { + "datetime": "2024-10-14T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.11451301786215, + "sunAzimuth": 163.08983536166957, + "temperature": 6.3, + "relativehumidity_2m": 89, + "windspeed_10m": 2.4 + }, + { + "datetime": "2024-10-14T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.138671848584934, + "sunAzimuth": -175.2642016873541, + "temperature": 5.8, + "relativehumidity_2m": 89, + "windspeed_10m": 1.5 + }, + { + "datetime": "2024-10-14T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.647478099904184, + "sunAzimuth": -154.15814092455744, + "temperature": 5.3, + "relativehumidity_2m": 90, + "windspeed_10m": 4 + }, + { + "datetime": "2024-10-14T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.1999672120048, + "sunAzimuth": -135.52742842855076, + "temperature": 4.5, + "relativehumidity_2m": 93, + "windspeed_10m": 1.5 + }, + { + "datetime": "2024-10-14T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.715244466780028, + "sunAzimuth": -119.73450334119632, + "temperature": 4, + "relativehumidity_2m": 94, + "windspeed_10m": 4.5 + }, + { + "datetime": "2024-10-14T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.01770469074795, + "sunAzimuth": -106.15013533780943, + "temperature": 3.8, + "relativehumidity_2m": 94, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-14T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.720095220219516, + "sunAzimuth": -93.92913753819082, + "temperature": 4.2, + "relativehumidity_2m": 94, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-14T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.283430715645694, + "sunAzimuth": -82.30618839226909, + "temperature": 4.7, + "relativehumidity_2m": 94, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-14T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.896654311121907, + "sunAzimuth": -70.62246187023919, + "temperature": 5.1, + "relativehumidity_2m": 93, + "windspeed_10m": 4.3 + }, + { + "datetime": "2024-10-14T09:00:00.000+02:00", + "dcPower": 127.65465284846182, + "power": 102.12372227876946, + "sunTilt": 13.417455844515738, + "sunAzimuth": -58.29261188464403, + "temperature": 5.6, + "relativehumidity_2m": 92, + "windspeed_10m": 3.8 + }, + { + "datetime": "2024-10-14T10:00:00.000+02:00", + "dcPower": 389.36843020647643, + "power": 311.49474416518115, + "sunTilt": 20.815136015137117, + "sunAzimuth": -44.807755986987566, + "temperature": 6.7, + "relativehumidity_2m": 87, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-14T11:00:00.000+02:00", + "dcPower": 592.2220734252635, + "power": 473.7776587402108, + "sunTilt": 26.543021174019792, + "sunAzimuth": -29.83407952105961, + "temperature": 7.5, + "relativehumidity_2m": 85, + "windspeed_10m": 10.1 + }, + { + "datetime": "2024-10-14T12:00:00.000+02:00", + "dcPower": 522.2723902421569, + "power": 417.81791219372553, + "sunTilt": 30.022594925866507, + "sunAzimuth": -13.427153142476177, + "temperature": 7.8, + "relativehumidity_2m": 87, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-14T13:00:00.000+02:00", + "dcPower": 727.3222067032216, + "power": 581.8577653625773, + "sunTilt": 30.804692641790414, + "sunAzimuth": 3.780636799023051, + "temperature": 8.7, + "relativehumidity_2m": 84, + "windspeed_10m": 9.4 + }, + { + "datetime": "2024-10-14T14:00:00.000+02:00", + "dcPower": 731.9961730654917, + "power": 585.5969384523934, + "sunTilt": 28.775019978770835, + "sunAzimuth": 20.742907009369926, + "temperature": 8.8, + "relativehumidity_2m": 83, + "windspeed_10m": 7.7 + }, + { + "datetime": "2024-10-14T15:00:00.000+02:00", + "dcPower": 673.1869547969405, + "power": 538.5495638375525, + "sunTilt": 24.217486258022436, + "sunAzimuth": 36.546087194880954, + "temperature": 8.8, + "relativehumidity_2m": 85, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-14T16:00:00.000+02:00", + "dcPower": 565.1327402072765, + "power": 452.1061921658212, + "sunTilt": 17.664529576020236, + "sunAzimuth": 50.82342857831685, + "temperature": 8.7, + "relativehumidity_2m": 88, + "windspeed_10m": 5.2 + }, + { + "datetime": "2024-10-14T17:00:00.000+02:00", + "dcPower": 392.09431169870487, + "power": 313.67544935896393, + "sunTilt": 9.692668263612882, + "sunAzimuth": 63.7238891712367, + "temperature": 8.4, + "relativehumidity_2m": 90, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-14T18:00:00.000+02:00", + "dcPower": 181.97709304355863, + "power": 145.58167443484692, + "sunTilt": 0.8111983279457368, + "sunAzimuth": 75.67900710147994, + "temperature": 8.2, + "relativehumidity_2m": 91, + "windspeed_10m": 1.8 + }, + { + "datetime": "2024-10-14T19:00:00.000+02:00", + "dcPower": 30.46631439555601, + "power": 24.37305151644481, + "sunTilt": -8.5501186243532, + "sunAzimuth": 87.23629074336492, + "temperature": 7.9, + "relativehumidity_2m": 93, + "windspeed_10m": 0.4 + }, + { + "datetime": "2024-10-14T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.00178541748869, + "sunAzimuth": 99.01023762777291, + "temperature": 7.4, + "relativehumidity_2m": 94, + "windspeed_10m": 1.1 + }, + { + "datetime": "2024-10-14T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -27.131935065748255, + "sunAzimuth": 111.70509440468732, + "temperature": 6.7, + "relativehumidity_2m": 96, + "windspeed_10m": 1.1 + }, + { + "datetime": "2024-10-14T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -35.426113802819536, + "sunAzimuth": 126.14148133580082, + "temperature": 5.8, + "relativehumidity_2m": 98, + "windspeed_10m": 0.4 + }, + { + "datetime": "2024-10-14T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.180713378529184, + "sunAzimuth": 143.15089515757862, + "temperature": 5, + "relativehumidity_2m": 100, + "windspeed_10m": 0.7 + }, + { + "datetime": "2024-10-15T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.49001057641694, + "sunAzimuth": 163.07102046565072, + "temperature": 4.3, + "relativehumidity_2m": 100, + "windspeed_10m": 1.4 + }, + { + "datetime": "2024-10-15T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.506419588733614, + "sunAzimuth": -175.15128768425117, + "temperature": 3.8, + "relativehumidity_2m": 100, + "windspeed_10m": 1.9 + }, + { + "datetime": "2024-10-15T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.988103658491234, + "sunAzimuth": -153.9352385869432, + "temperature": 3.2, + "relativehumidity_2m": 100, + "windspeed_10m": 2.6 + }, + { + "datetime": "2024-10-15T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.50640211284843, + "sunAzimuth": -135.24690137263536, + "temperature": 2.4, + "relativehumidity_2m": 100, + "windspeed_10m": 2.9 + }, + { + "datetime": "2024-10-15T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.992601433814595, + "sunAzimuth": -119.43676351875516, + "temperature": 1.6, + "relativehumidity_2m": 100, + "windspeed_10m": 3.2 + }, + { + "datetime": "2024-10-15T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.276123004228086, + "sunAzimuth": -105.85422295783262, + "temperature": 1.2, + "relativehumidity_2m": 100, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-15T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.970257710966642, + "sunAzimuth": -93.64119828341282, + "temperature": 1.2, + "relativehumidity_2m": 100, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-15T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.5352276078301, + "sunAzimuth": -82.02738904900566, + "temperature": 1.6, + "relativehumidity_2m": 100, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-15T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.63422819396966, + "sunAzimuth": -70.35370359566531, + "temperature": 2.3, + "relativehumidity_2m": 100, + "windspeed_10m": 4 + }, + { + "datetime": "2024-10-15T09:00:00.000+02:00", + "dcPower": 154.33046643149038, + "power": 123.46437314519231, + "sunTilt": 13.136374944499462, + "sunAzimuth": -58.037763824819606, + "temperature": 3.4, + "relativehumidity_2m": 98, + "windspeed_10m": 5 + }, + { + "datetime": "2024-10-15T10:00:00.000+02:00", + "dcPower": 437.4885594761827, + "power": 349.99084758094614, + "sunTilt": 20.50908861823578, + "sunAzimuth": -44.57657122307415, + "temperature": 4.8, + "relativehumidity_2m": 94, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-15T11:00:00.000+02:00", + "dcPower": 659.6002948049094, + "power": 527.6802358439276, + "sunTilt": 26.20926450679345, + "sunAzimuth": -29.644024765315514, + "temperature": 6.3, + "relativehumidity_2m": 91, + "windspeed_10m": 7.8 + }, + { + "datetime": "2024-10-15T12:00:00.000+02:00", + "dcPower": 778.8402349217745, + "power": 623.0721879374196, + "sunTilt": 29.66446288060627, + "sunAzimuth": -13.300572957692536, + "temperature": 8, + "relativehumidity_2m": 88, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-15T13:00:00.000+02:00", + "dcPower": 1978.9817835346914, + "power": 1583.1854268277532, + "sunTilt": 30.43234097439692, + "sunAzimuth": 3.8270522061418095, + "temperature": 9.7, + "relativehumidity_2m": 84, + "windspeed_10m": 10.9 + }, + { + "datetime": "2024-10-15T14:00:00.000+02:00", + "dcPower": 752.5495986025528, + "power": 602.0396788820423, + "sunTilt": 28.401790922595836, + "sunAzimuth": 20.709329389098386, + "temperature": 10.8, + "relativehumidity_2m": 82, + "windspeed_10m": 11.9 + }, + { + "datetime": "2024-10-15T15:00:00.000+02:00", + "dcPower": 688.3741880723578, + "power": 550.6993504578862, + "sunTilt": 23.853972526435296, + "sunAzimuth": 36.448429487078144, + "temperature": 11.2, + "relativehumidity_2m": 81, + "windspeed_10m": 11.9 + }, + { + "datetime": "2024-10-15T16:00:00.000+02:00", + "dcPower": 586.2062141110889, + "power": 468.96497128887114, + "sunTilt": 17.315445485866938, + "sunAzimuth": 50.682117672382816, + "temperature": 11, + "relativehumidity_2m": 81, + "windspeed_10m": 11 + }, + { + "datetime": "2024-10-15T17:00:00.000+02:00", + "dcPower": 434.3328809254071, + "power": 347.4663047403257, + "sunTilt": 9.35753798215806, + "sunAzimuth": 63.55531186506398, + "temperature": 10.6, + "relativehumidity_2m": 82, + "windspeed_10m": 11.1 + }, + { + "datetime": "2024-10-15T18:00:00.000+02:00", + "dcPower": 236.41723235517372, + "power": 189.133785884139, + "sunTilt": 0.48632726290863104, + "sunAzimuth": 75.49368820866877, + "temperature": 9.7, + "relativehumidity_2m": 85, + "windspeed_10m": 12.1 + }, + { + "datetime": "2024-10-15T19:00:00.000+02:00", + "dcPower": 50.711744075262686, + "power": 40.56939526021015, + "sunTilt": -8.870162619560801, + "sunAzimuth": 87.04069822248259, + "temperature": 8.5, + "relativehumidity_2m": 88, + "windspeed_10m": 13.6 + }, + { + "datetime": "2024-10-15T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.323410184499085, + "sunAzimuth": 98.80974345652376, + "temperature": 7.6, + "relativehumidity_2m": 91, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-15T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -27.462022150796383, + "sunAzimuth": 111.50791010170794, + "temperature": 7.2, + "relativehumidity_2m": 91, + "windspeed_10m": 13.9 + }, + { + "datetime": "2024-10-15T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -35.770938188604354, + "sunAzimuth": 125.96460338334036, + "temperature": 7, + "relativehumidity_2m": 91, + "windspeed_10m": 12.9 + }, + { + "datetime": "2024-10-15T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.54293600102064, + "sunAzimuth": 143.02752222319543, + "temperature": 6.8, + "relativehumidity_2m": 89, + "windspeed_10m": 12.7 + }, + { + "datetime": "2024-10-16T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.86312551477473, + "sunAzimuth": 163.04903976266138, + "temperature": 6.7, + "relativehumidity_2m": 86, + "windspeed_10m": 13.8 + }, + { + "datetime": "2024-10-16T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.87221785059982, + "sunAzimuth": -175.04051110279474, + "temperature": 6.8, + "relativehumidity_2m": 83, + "windspeed_10m": 15.6 + }, + { + "datetime": "2024-10-16T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.32707330350441, + "sunAzimuth": -153.71374265034802, + "temperature": 6.8, + "relativehumidity_2m": 80, + "windspeed_10m": 16.5 + }, + { + "datetime": "2024-10-16T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.81147561550361, + "sunAzimuth": -134.96784827714956, + "temperature": 7, + "relativehumidity_2m": 78, + "windspeed_10m": 16.1 + }, + { + "datetime": "2024-10-16T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.26895363243685, + "sunAzimuth": -119.1408914506387, + "temperature": 7.3, + "relativehumidity_2m": 77, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-16T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.53389843309148, + "sunAzimuth": -105.56056815727264, + "temperature": 7.4, + "relativehumidity_2m": 75, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-16T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -14.220082554609817, + "sunAzimuth": -93.355861910257, + "temperature": 7.4, + "relativehumidity_2m": 73, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-16T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.786895768698711, + "sunAzimuth": -81.75154101774274, + "temperature": 7.3, + "relativehumidity_2m": 71, + "windspeed_10m": 14.7 + }, + { + "datetime": "2024-10-16T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.371849783596975, + "sunAzimuth": -70.08829035405888, + "temperature": 7.2, + "relativehumidity_2m": 70, + "windspeed_10m": 14.8 + }, + { + "datetime": "2024-10-16T09:00:00.000+02:00", + "dcPower": 115.85164932968384, + "power": 92.68131946374707, + "sunTilt": 12.855424254104108, + "sunAzimuth": -57.78670104663053, + "temperature": 9.8, + "relativehumidity_2m": 72, + "windspeed_10m": 17 + }, + { + "datetime": "2024-10-16T10:00:00.000+02:00", + "dcPower": 335.28441038828294, + "power": 268.2275283106264, + "sunTilt": 20.203454185088123, + "sunAzimuth": -44.34957719582011, + "temperature": 10.2, + "relativehumidity_2m": 75, + "windspeed_10m": 16.5 + }, + { + "datetime": "2024-10-16T11:00:00.000+02:00", + "dcPower": 527.1146116233759, + "power": 421.6916892987008, + "sunTilt": 25.87641150088954, + "sunAzimuth": -29.45832187587005, + "temperature": 10.7, + "relativehumidity_2m": 77, + "windspeed_10m": 16.2 + }, + { + "datetime": "2024-10-16T12:00:00.000+02:00", + "dcPower": 710.6991019378397, + "power": 568.5592815502717, + "sunTilt": 29.30785715204484, + "sunAzimuth": -13.177984892004138, + "temperature": 11.6, + "relativehumidity_2m": 77, + "windspeed_10m": 15.7 + }, + { + "datetime": "2024-10-16T13:00:00.000+02:00", + "dcPower": 1436.9262866801166, + "power": 1149.5410293440934, + "sunTilt": 30.062101719417093, + "sunAzimuth": 3.870407893111919, + "temperature": 12.5, + "relativehumidity_2m": 75, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-16T14:00:00.000+02:00", + "dcPower": 903.66353184464, + "power": 722.930825475712, + "sunTilt": 28.03108091352568, + "sunAzimuth": 20.673818848950724, + "temperature": 13.2, + "relativehumidity_2m": 75, + "windspeed_10m": 14.8 + }, + { + "datetime": "2024-10-16T15:00:00.000+02:00", + "dcPower": 821.4637948690453, + "power": 657.1710358952363, + "sunTilt": 23.49320409080551, + "sunAzimuth": 36.34969840216598, + "temperature": 13.5, + "relativehumidity_2m": 77, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-16T16:00:00.000+02:00", + "dcPower": 643.408791431554, + "power": 514.7270331452432, + "sunTilt": 16.969240740198778, + "sunAzimuth": 50.54017502787197, + "temperature": 13.5, + "relativehumidity_2m": 80, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-16T17:00:00.000+02:00", + "dcPower": 439.6091142498436, + "power": 351.68729139987494, + "sunTilt": 9.025401762418719, + "sunAzimuth": 63.386211071389155, + "temperature": 13.3, + "relativehumidity_2m": 82, + "windspeed_10m": 13.2 + }, + { + "datetime": "2024-10-16T18:00:00.000+02:00", + "dcPower": 218.69491379498575, + "power": 174.9559310359886, + "sunTilt": 0.16457346744538273, + "sunAzimuth": 75.30773046735078, + "temperature": 13, + "relativehumidity_2m": 82, + "windspeed_10m": 13 + }, + { + "datetime": "2024-10-16T19:00:00.000+02:00", + "dcPower": 44.96868965159397, + "power": 35.974951721275175, + "sunTilt": -9.186961271997145, + "sunAzimuth": 86.84418120594421, + "temperature": 12.6, + "relativehumidity_2m": 81, + "windspeed_10m": 12.7 + }, + { + "datetime": "2024-10-16T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.64168080965683, + "sunAzimuth": 98.60786901950698, + "temperature": 12.2, + "relativehumidity_2m": 80, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-16T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -27.788711717705176, + "sunAzimuth": 111.30870010109864, + "temperature": 12, + "relativehumidity_2m": 80, + "windspeed_10m": 11.8 + }, + { + "datetime": "2024-10-16T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -36.112460277357016, + "sunAzimuth": 125.78490981561183, + "temperature": 11.8, + "relativehumidity_2m": 81, + "windspeed_10m": 11 + }, + { + "datetime": "2024-10-16T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.9021656490531, + "sunAzimuth": 142.90069940402603, + "temperature": 11.7, + "relativehumidity_2m": 82, + "windspeed_10m": 10.2 + }, + { + "datetime": "2024-10-17T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.23373820466217, + "sunAzimuth": 163.02375644913673, + "temperature": 11.7, + "relativehumidity_2m": 82, + "windspeed_10m": 9.4 + }, + { + "datetime": "2024-10-17T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -48.2359718752176, + "sunAzimuth": -174.9320340577077, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-17T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.66431793404074, + "sunAzimuth": -153.4938195445769, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 8.2 + }, + { + "datetime": "2024-10-17T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -40.115139405653565, + "sunAzimuth": -134.69043107615582, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-17T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.54426550294801, + "sunAzimuth": -118.84703704658551, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-17T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.79099983796868, + "sunAzimuth": -105.2693069294498, + "temperature": 11.7, + "relativehumidity_2m": 82, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-17T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -14.469536195186127, + "sunAzimuth": -93.07325245162968, + "temperature": 11.6, + "relativehumidity_2m": 82, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-17T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -5.038393916921545, + "sunAzimuth": -81.47875856041325, + "temperature": 11.4, + "relativehumidity_2m": 83, + "windspeed_10m": 7.3 + }, + { + "datetime": "2024-10-17T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.109572239802723, + "sunAzimuth": -69.8263270263417, + "temperature": 11.5, + "relativehumidity_2m": 83, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-17T09:00:00.000+02:00", + "dcPower": 105.03214056441247, + "power": 84.02571245152998, + "sunTilt": 12.574671747325786, + "sunAzimuth": -57.53951661964237, + "temperature": 11.9, + "relativehumidity_2m": 83, + "windspeed_10m": 8 + }, + { + "datetime": "2024-10-17T10:00:00.000+02:00", + "dcPower": 312.8842945992691, + "power": 250.30743567941528, + "sunTilt": 19.89831645004539, + "sunAzimuth": -44.1268501705138, + "temperature": 12.5, + "relativehumidity_2m": 82, + "windspeed_10m": 9.7 + }, + { + "datetime": "2024-10-17T11:00:00.000+02:00", + "dcPower": 488.55377841324116, + "power": 390.84302273059296, + "sunTilt": 25.54455964459646, + "sunAzimuth": -29.277026273264024, + "temperature": 13.1, + "relativehumidity_2m": 82, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-17T12:00:00.000+02:00", + "dcPower": 633.4064482929499, + "power": 506.72515863435996, + "sunTilt": 28.952884649607554, + "sunAzimuth": -13.059427258390235, + "temperature": 13.5, + "relativehumidity_2m": 83, + "windspeed_10m": 10.7 + }, + { + "datetime": "2024-10-17T13:00:00.000+02:00", + "dcPower": 729.049282498162, + "power": 583.2394259985297, + "sunTilt": 29.694087805098004, + "sunAzimuth": 3.9106711264578404, + "temperature": 13.8, + "relativehumidity_2m": 85, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-17T14:00:00.000+02:00", + "dcPower": 761.5535689723715, + "power": 609.2428551778972, + "sunTilt": 27.663008228484166, + "sunAzimuth": 20.63634185579284, + "temperature": 14.2, + "relativehumidity_2m": 86, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-17T15:00:00.000+02:00", + "dcPower": 726.9635320188225, + "power": 581.5708256150581, + "sunTilt": 23.13530429931852, + "sunAzimuth": 36.24986394147597, + "temperature": 14.6, + "relativehumidity_2m": 87, + "windspeed_10m": 9.8 + }, + { + "datetime": "2024-10-17T16:00:00.000+02:00", + "dcPower": 625.4301522062517, + "power": 500.3441217650014, + "sunTilt": 16.626042266391202, + "sunAzimuth": 50.39758024284303, + "temperature": 14.9, + "relativehumidity_2m": 88, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-17T17:00:00.000+02:00", + "dcPower": 451.1586680783196, + "power": 360.9269344626557, + "sunTilt": 8.696388379725821, + "sunAzimuth": 63.21657784217465, + "temperature": 15.1, + "relativehumidity_2m": 89, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-17T18:00:00.000+02:00", + "dcPower": 222.0746839182061, + "power": 177.6597471345649, + "sunTilt": -0.15393334821361332, + "sunAzimuth": 75.12113476396313, + "temperature": 14.9, + "relativehumidity_2m": 90, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-17T19:00:00.000+02:00", + "dcPower": 39.6933615946055, + "power": 31.7546892756844, + "sunTilt": -9.500383797971471, + "sunAzimuth": 86.64674682587622, + "temperature": 14.6, + "relativehumidity_2m": 92, + "windspeed_10m": 6.7 + }, + { + "datetime": "2024-10-17T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.956464510241965, + "sunAzimuth": 98.40462190157557, + "temperature": 14.3, + "relativehumidity_2m": 93, + "windspeed_10m": 5.9 + }, + { + "datetime": "2024-10-17T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -28.11186795253563, + "sunAzimuth": 111.10746217430679, + "temperature": 14.2, + "relativehumidity_2m": 94, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-17T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -36.45054181856139, + "sunAzimuth": 125.60237057929713, + "temperature": 14.2, + "relativehumidity_2m": 94, + "windspeed_10m": 4.6 + }, + { + "datetime": "2024-10-17T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.2582671659911, + "sunAzimuth": 142.77034580724174, + "temperature": 14.2, + "relativehumidity_2m": 95, + "windspeed_10m": 4.4 + } + ], + [ + { + "datetime": "2024-10-06T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.03892891605494, + "sunAzimuth": 163.14263622624128, + "temperature": 7, + "relativehumidity_2m": 88, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-06T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.13778324543035, + "sunAzimuth": -176.22585898864278, + "temperature": 6.5, + "relativehumidity_2m": 91, + "windspeed_10m": 6.8 + }, + { + "datetime": "2024-10-06T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.87117274960936, + "sunAzimuth": -155.9729639229445, + "temperature": 6, + "relativehumidity_2m": 91, + "windspeed_10m": 5.9 + }, + { + "datetime": "2024-10-06T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -36.70531092777589, + "sunAzimuth": -137.8059489226708, + "temperature": 5.5, + "relativehumidity_2m": 92, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-06T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -29.46443142893699, + "sunAzimuth": -122.16602054266892, + "temperature": 5.1, + "relativehumidity_2m": 92, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-06T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -20.930765133481234, + "sunAzimuth": -108.58249513077881, + "temperature": 4.9, + "relativehumidity_2m": 93, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-06T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -11.710347315474053, + "sunAzimuth": -96.31140508589108, + "temperature": 5.1, + "relativehumidity_2m": 92, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-06T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -2.2689443207496223, + "sunAzimuth": -84.62890292197706, + "temperature": 5.3, + "relativehumidity_2m": 92, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-06T08:00:00.000+02:00", + "dcPower": 2.705705892666875, + "power": 2.1645647141335003, + "sunTilt": 6.991906328571172, + "sunAzimuth": -72.87999206290318, + "temperature": 5.5, + "relativehumidity_2m": 91, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-06T09:00:00.000+02:00", + "dcPower": 57.65254422751687, + "power": 46.1220353820135, + "sunTilt": 15.663160391528187, + "sunAzimuth": -60.45596163553978, + "temperature": 6.3, + "relativehumidity_2m": 90, + "windspeed_10m": 9.3 + }, + { + "datetime": "2024-10-06T10:00:00.000+02:00", + "dcPower": 119.20917355200001, + "power": 95.36733884160002, + "sunTilt": 23.268816289666535, + "sunAzimuth": -46.79827360798693, + "temperature": 8, + "relativehumidity_2m": 85, + "windspeed_10m": 11.6 + }, + { + "datetime": "2024-10-06T11:00:00.000+02:00", + "dcPower": 176.16728214926752, + "power": 140.93382571941402, + "sunTilt": 29.234287239795027, + "sunAzimuth": -31.503805204051176, + "temperature": 9.5, + "relativehumidity_2m": 86, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-06T12:00:00.000+02:00", + "dcPower": 564.3026414176044, + "power": 451.4421131340835, + "sunTilt": 32.93002248275174, + "sunAzimuth": -14.578212396799534, + "temperature": 10.8, + "relativehumidity_2m": 82, + "windspeed_10m": 16.3 + }, + { + "datetime": "2024-10-06T13:00:00.000+02:00", + "dcPower": 540.9369663099236, + "power": 432.7495730479389, + "sunTilt": 33.84613522696556, + "sunAzimuth": 3.3037874055175505, + "temperature": 10.9, + "relativehumidity_2m": 82, + "windspeed_10m": 16.9 + }, + { + "datetime": "2024-10-06T14:00:00.000+02:00", + "dcPower": 464.5359852589149, + "power": 371.62878820713195, + "sunTilt": 31.83736693728352, + "sunAzimuth": 20.94669333759787, + "temperature": 12.6, + "relativehumidity_2m": 74, + "windspeed_10m": 17.1 + }, + { + "datetime": "2024-10-06T15:00:00.000+02:00", + "dcPower": 477.45533013060344, + "power": 381.96426410448277, + "sunTilt": 27.209548486852757, + "sunAzimuth": 37.29302345489315, + "temperature": 12.8, + "relativehumidity_2m": 75, + "windspeed_10m": 17.8 + }, + { + "datetime": "2024-10-06T16:00:00.000+02:00", + "dcPower": 307.88619712830206, + "power": 246.30895770264166, + "sunTilt": 20.54547686442047, + "sunAzimuth": 51.93430385037965, + "temperature": 13.1, + "relativehumidity_2m": 73, + "windspeed_10m": 17.8 + }, + { + "datetime": "2024-10-06T17:00:00.000+02:00", + "dcPower": 187.53043014586999, + "power": 150.024344116696, + "sunTilt": 12.4658413410018, + "sunAzimuth": 65.05541740712634, + "temperature": 12.6, + "relativehumidity_2m": 72, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-06T18:00:00.000+02:00", + "dcPower": 99.74907463554689, + "power": 79.79925970843752, + "sunTilt": 3.5065849097251456, + "sunAzimuth": 77.13919140741508, + "temperature": 11.9, + "relativehumidity_2m": 76, + "windspeed_10m": 14.8 + }, + { + "datetime": "2024-10-06T19:00:00.000+02:00", + "dcPower": 19.860135578171874, + "power": 15.8881084625375, + "sunTilt": -5.8888854618235795, + "sunAzimuth": 88.76774476136781, + "temperature": 11.1, + "relativehumidity_2m": 79, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-06T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -15.324219942418523, + "sunAzimuth": 100.56460329657087, + "temperature": 10.6, + "relativehumidity_2m": 81, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-06T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -24.385415066790006, + "sunAzimuth": 113.21108724923529, + "temperature": 10.3, + "relativehumidity_2m": 81, + "windspeed_10m": 13.4 + }, + { + "datetime": "2024-10-06T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.56528997863786, + "sunAzimuth": 127.45995077522508, + "temperature": 10.3, + "relativehumidity_2m": 83, + "windspeed_10m": 13.4 + }, + { + "datetime": "2024-10-06T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.19130152908581, + "sunAzimuth": 144.02419079232183, + "temperature": 10.7, + "relativehumidity_2m": 83, + "windspeed_10m": 13 + }, + { + "datetime": "2024-10-07T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.4292477470776, + "sunAzimuth": 163.14429087891105, + "temperature": 11, + "relativehumidity_2m": 83, + "windspeed_10m": 13.6 + }, + { + "datetime": "2024-10-07T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.517749495901406, + "sunAzimuth": -176.10136944486192, + "temperature": 11, + "relativehumidity_2m": 87, + "windspeed_10m": 11.2 + }, + { + "datetime": "2024-10-07T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.22254930467857, + "sunAzimuth": -155.74445709329385, + "temperature": 10.9, + "relativehumidity_2m": 91, + "windspeed_10m": 9.8 + }, + { + "datetime": "2024-10-07T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.020882886444426, + "sunAzimuth": -137.5192133151141, + "temperature": 11, + "relativehumidity_2m": 93, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-07T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -29.748563322135755, + "sunAzimuth": -121.8586066543482, + "temperature": 11.4, + "relativehumidity_2m": 94, + "windspeed_10m": 8.9 + }, + { + "datetime": "2024-10-07T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.193270783038106, + "sunAzimuth": -108.27337691467278, + "temperature": 11.5, + "relativehumidity_2m": 95, + "windspeed_10m": 11 + }, + { + "datetime": "2024-10-07T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -11.962117012521006, + "sunAzimuth": -96.00713008699226, + "temperature": 12, + "relativehumidity_2m": 94, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-07T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -2.520439907672165, + "sunAzimuth": -84.33068309080377, + "temperature": 12.2, + "relativehumidity_2m": 95, + "windspeed_10m": 9.3 + }, + { + "datetime": "2024-10-07T08:00:00.000+02:00", + "dcPower": 1.1877547101875001, + "power": 0.9502037681500002, + "sunTilt": 6.730829735879827, + "sunAzimuth": -72.58838243599898, + "temperature": 12.7, + "relativehumidity_2m": 94, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-07T09:00:00.000+02:00", + "dcPower": 24.298528725187502, + "power": 19.438822980150004, + "sunTilt": 15.383293627086166, + "sunAzimuth": -60.174375329765816, + "temperature": 13.3, + "relativehumidity_2m": 94, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-07T10:00:00.000+02:00", + "dcPower": 99.00096165043, + "power": 79.20076932034401, + "sunTilt": 22.96230371458641, + "sunAzimuth": -46.53655309716923, + "temperature": 14.4, + "relativehumidity_2m": 91, + "windspeed_10m": 8.9 + }, + { + "datetime": "2024-10-07T11:00:00.000+02:00", + "dcPower": 90.58295243867188, + "power": 72.46636195093751, + "sunTilt": 28.896671975172765, + "sunAzimuth": -31.281195510232457, + "temperature": 15.2, + "relativehumidity_2m": 91, + "windspeed_10m": 10.9 + }, + { + "datetime": "2024-10-07T12:00:00.000+02:00", + "dcPower": 206.2311706601901, + "power": 164.98493652815208, + "sunTilt": 32.56343562699629, + "sunAzimuth": -14.421329305847635, + "temperature": 16, + "relativehumidity_2m": 89, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-07T13:00:00.000+02:00", + "dcPower": 380.37752208740244, + "power": 304.30201766992195, + "sunTilt": 33.46089993111447, + "sunAzimuth": 3.3732496911031458, + "temperature": 17, + "relativehumidity_2m": 82, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-07T14:00:00.000+02:00", + "dcPower": 444.5766828263196, + "power": 355.6613462610557, + "sunTilt": 31.448234246769605, + "sunAzimuth": 20.927108911856653, + "temperature": 18, + "relativehumidity_2m": 75, + "windspeed_10m": 9.8 + }, + { + "datetime": "2024-10-07T15:00:00.000+02:00", + "dcPower": 374.63788289233753, + "power": 299.71030631387003, + "sunTilt": 26.828539273003113, + "sunAzimuth": 37.20261442198752, + "temperature": 18.6, + "relativehumidity_2m": 70, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-07T16:00:00.000+02:00", + "dcPower": 252.36015882335633, + "power": 201.8881270586851, + "sunTilt": 20.17798028996772, + "sunAzimuth": 51.797067137147856, + "temperature": 18.9, + "relativehumidity_2m": 70, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-07T17:00:00.000+02:00", + "dcPower": 185.30274165096753, + "power": 148.24219332077402, + "sunTilt": 12.11146577521795, + "sunAzimuth": 64.89046144901918, + "temperature": 18.4, + "relativehumidity_2m": 72, + "windspeed_10m": 7.2 + }, + { + "datetime": "2024-10-07T18:00:00.000+02:00", + "dcPower": 83.06339266979688, + "power": 66.45071413583752, + "sunTilt": 3.1615292467832945, + "sunAzimuth": 76.95875071433478, + "temperature": 17.4, + "relativehumidity_2m": 74, + "windspeed_10m": 9.5 + }, + { + "datetime": "2024-10-07T19:00:00.000+02:00", + "dcPower": 18.1767567334675, + "power": 14.541405386774, + "sunTilt": -6.2300935503595385, + "sunAzimuth": 88.57949984494998, + "temperature": 16.4, + "relativehumidity_2m": 79, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-07T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -15.667810875617224, + "sunAzimuth": 100.37506201699385, + "temperature": 15.4, + "relativehumidity_2m": 87, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-07T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -24.737727405113922, + "sunAzimuth": 113.02960837119129, + "temperature": 14.9, + "relativehumidity_2m": 90, + "windspeed_10m": 10.9 + }, + { + "datetime": "2024-10-07T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.93153539182831, + "sunAzimuth": 127.30408938398604, + "temperature": 14.5, + "relativehumidity_2m": 94, + "windspeed_10m": 10.7 + }, + { + "datetime": "2024-10-07T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.572641175501424, + "sunAzimuth": 143.925225436442, + "temperature": 14.7, + "relativehumidity_2m": 94, + "windspeed_10m": 11.6 + }, + { + "datetime": "2024-10-08T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.818121034022454, + "sunAzimuth": 163.14384998115503, + "temperature": 14.7, + "relativehumidity_2m": 94, + "windspeed_10m": 15.8 + }, + { + "datetime": "2024-10-08T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.8965146817323, + "sunAzimuth": -175.97781528741945, + "temperature": 14.8, + "relativehumidity_2m": 93, + "windspeed_10m": 14 + }, + { + "datetime": "2024-10-08T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.572826067170936, + "sunAzimuth": -155.51612909180187, + "temperature": 15.4, + "relativehumidity_2m": 94, + "windspeed_10m": 11.2 + }, + { + "datetime": "2024-10-08T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.33548533853669, + "sunAzimuth": -137.23273090041528, + "temperature": 15.4, + "relativehumidity_2m": 93, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-08T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.031970973409337, + "sunAzimuth": -121.55190085899577, + "temperature": 15.4, + "relativehumidity_2m": 93, + "windspeed_10m": 11.2 + }, + { + "datetime": "2024-10-08T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.45536424486834, + "sunAzimuth": -107.96544161465735, + "temperature": 15.8, + "relativehumidity_2m": 94, + "windspeed_10m": 10 + }, + { + "datetime": "2024-10-08T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.213784351950519, + "sunAzimuth": -95.70446004731738, + "temperature": 15.8, + "relativehumidity_2m": 93, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-08T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -2.772091353585381, + "sunAzimuth": -84.03447848078322, + "temperature": 15.7, + "relativehumidity_2m": 93, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-08T08:00:00.000+02:00", + "dcPower": 0.9403939745200003, + "power": 0.7523151796160003, + "sunTilt": 6.469429830924286, + "sunAzimuth": -72.29923977528891, + "temperature": 15.7, + "relativehumidity_2m": 90, + "windspeed_10m": 10.2 + }, + { + "datetime": "2024-10-08T09:00:00.000+02:00", + "dcPower": 49.46079645283, + "power": 39.568637162264004, + "sunTilt": 15.10307050684314, + "sunAzimuth": -59.895772492079, + "temperature": 15.7, + "relativehumidity_2m": 89, + "windspeed_10m": 8.3 + }, + { + "datetime": "2024-10-08T10:00:00.000+02:00", + "dcPower": 133.24586591603, + "power": 106.59669273282401, + "sunTilt": 22.655587204347487, + "sunAzimuth": -46.27834028428006, + "temperature": 16.3, + "relativehumidity_2m": 86, + "windspeed_10m": 10.6 + }, + { + "datetime": "2024-10-08T11:00:00.000+02:00", + "dcPower": 196.52604667500003, + "power": 157.22083734000003, + "sunTilt": 28.55922255887939, + "sunAzimuth": -31.06241498925654, + "temperature": 17, + "relativehumidity_2m": 85, + "windspeed_10m": 9 + }, + { + "datetime": "2024-10-08T12:00:00.000+02:00", + "dcPower": 334.8024958939491, + "power": 267.84199671515927, + "sunTilt": 32.19754822667087, + "sunAzimuth": -14.26805544520534, + "temperature": 17.6, + "relativehumidity_2m": 82, + "windspeed_10m": 13.1 + }, + { + "datetime": "2024-10-08T13:00:00.000+02:00", + "dcPower": 455.8287658376337, + "power": 364.663012670107, + "sunTilt": 33.07688907994966, + "sunAzimuth": 3.4399896103944245, + "temperature": 18.3, + "relativehumidity_2m": 73, + "windspeed_10m": 12.7 + }, + { + "datetime": "2024-10-08T14:00:00.000+02:00", + "dcPower": 372.2582413893144, + "power": 297.8065931114515, + "sunTilt": 31.060677746554727, + "sunAzimuth": 20.90593811884074, + "temperature": 18.2, + "relativehumidity_2m": 71, + "windspeed_10m": 13.2 + }, + { + "datetime": "2024-10-08T15:00:00.000+02:00", + "dcPower": 311.9842847493126, + "power": 249.5874277994501, + "sunTilt": 26.44928138282813, + "sunAzimuth": 37.11144846293623, + "temperature": 18.1, + "relativehumidity_2m": 71, + "windspeed_10m": 13.3 + }, + { + "datetime": "2024-10-08T16:00:00.000+02:00", + "dcPower": 199.64949036591122, + "power": 159.71959229272898, + "sunTilt": 19.81233269039211, + "sunAzimuth": 51.65943401571543, + "temperature": 17.4, + "relativehumidity_2m": 73, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-08T17:00:00.000+02:00", + "dcPower": 141.4621015685675, + "power": 113.16968125485401, + "sunTilt": 11.759033809196055, + "sunAzimuth": 64.72512518734406, + "temperature": 16.9, + "relativehumidity_2m": 75, + "windspeed_10m": 6.3 + }, + { + "datetime": "2024-10-08T18:00:00.000+02:00", + "dcPower": 80.56004293366748, + "power": 64.44803434693398, + "sunTilt": 2.818529310708217, + "sunAzimuth": 76.77774147088243, + "temperature": 16, + "relativehumidity_2m": 75, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-08T19:00:00.000+02:00", + "dcPower": 18.238636997546877, + "power": 14.590909598037502, + "sunTilt": -6.569128186596377, + "sunAzimuth": 88.39036262615889, + "temperature": 15, + "relativehumidity_2m": 82, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-08T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -16.00913432264249, + "sunAzimuth": 100.18418560559792, + "temperature": 14.5, + "relativehumidity_2m": 89, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-08T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -25.087746753502067, + "sunAzimuth": 112.84624373263145, + "temperature": 14, + "relativehumidity_2m": 93, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-08T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -33.29558919415396, + "sunAzimuth": 127.1457755347392, + "temperature": 14, + "relativehumidity_2m": 88, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-08T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.95205668980692, + "sunAzimuth": 143.82353531827584, + "temperature": 13, + "relativehumidity_2m": 91, + "windspeed_10m": 7.2 + }, + { + "datetime": "2024-10-09T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.20543351779722, + "sunAzimuth": 163.1411836959831, + "temperature": 12.6, + "relativehumidity_2m": 92, + "windspeed_10m": 7.8 + }, + { + "datetime": "2024-10-09T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.27398595213309, + "sunAzimuth": -175.8553370630724, + "temperature": 12.9, + "relativehumidity_2m": 91, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-09T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.92193289241474, + "sunAzimuth": -155.28812310014723, + "temperature": 12.7, + "relativehumidity_2m": 92, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-09T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.64906836752005, + "sunAzimuth": -136.94664669208646, + "temperature": 12.9, + "relativehumidity_2m": 91, + "windspeed_10m": 12.3 + }, + { + "datetime": "2024-10-09T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.314619206373006, + "sunAzimuth": -121.24604384005964, + "temperature": 12.9, + "relativehumidity_2m": 91, + "windspeed_10m": 10.2 + }, + { + "datetime": "2024-10-09T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.71701795569338, + "sunAzimuth": -107.65882183814558, + "temperature": 13.2, + "relativehumidity_2m": 90, + "windspeed_10m": 12.9 + }, + { + "datetime": "2024-10-09T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.465322674764078, + "sunAzimuth": -95.40351983003244, + "temperature": 13.3, + "relativehumidity_2m": 89, + "windspeed_10m": 13.5 + }, + { + "datetime": "2024-10-09T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.023867147662328, + "sunAzimuth": -83.74040781223535, + "temperature": 12.9, + "relativehumidity_2m": 92, + "windspeed_10m": 13.2 + }, + { + "datetime": "2024-10-09T08:00:00.000+02:00", + "dcPower": 0.23740534840750008, + "power": 0.18992427872600007, + "sunTilt": 6.207747953736028, + "sunAzimuth": -72.01267721735641, + "temperature": 12.9, + "relativehumidity_2m": 92, + "windspeed_10m": 11.8 + }, + { + "datetime": "2024-10-09T09:00:00.000+02:00", + "dcPower": 12.811284756270002, + "power": 10.249027805016002, + "sunTilt": 14.82254636430179, + "sunAzimuth": -59.62025856421435, + "temperature": 12.8, + "relativehumidity_2m": 93, + "windspeed_10m": 11.8 + }, + { + "datetime": "2024-10-09T10:00:00.000+02:00", + "dcPower": 40.81670722668, + "power": 32.653365781344, + "sunTilt": 22.348738640203063, + "sunAzimuth": -46.023727432629336, + "temperature": 13.1, + "relativehumidity_2m": 91, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-09T11:00:00.000+02:00", + "dcPower": 83.24077643426999, + "power": 66.592621147416, + "sunTilt": 28.22202694317921, + "sunAzimuth": -30.847536638720733, + "temperature": 13.7, + "relativehumidity_2m": 92, + "windspeed_10m": 12.8 + }, + { + "datetime": "2024-10-09T12:00:00.000+02:00", + "dcPower": 126.537344683617, + "power": 101.2298757468936, + "sunTilt": 31.832460658762763, + "sunAzimuth": -14.118446086753368, + "temperature": 13.8, + "relativehumidity_2m": 91, + "windspeed_10m": 12 + }, + { + "datetime": "2024-10-09T13:00:00.000+02:00", + "dcPower": 114.88404360475715, + "power": 91.90723488380573, + "sunTilt": 32.69421193791607, + "sunAzimuth": 3.503957762689472, + "temperature": 14.2, + "relativehumidity_2m": 90, + "windspeed_10m": 11.5 + }, + { + "datetime": "2024-10-09T14:00:00.000+02:00", + "dcPower": 84.81614681380752, + "power": 67.85291745104603, + "sunTilt": 30.674814714273392, + "sunAzimuth": 20.883130296493302, + "temperature": 13.9, + "relativehumidity_2m": 91, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-09T15:00:00.000+02:00", + "dcPower": 48.3547931762223, + "power": 38.68383454097784, + "sunTilt": 26.07189945210854, + "sunAzimuth": 37.01947906146245, + "temperature": 13.8, + "relativehumidity_2m": 92, + "windspeed_10m": 13.8 + }, + { + "datetime": "2024-10-09T16:00:00.000+02:00", + "dcPower": 37.58272513091204, + "power": 30.066180104729632, + "sunTilt": 19.448663917806936, + "sunAzimuth": 51.521368716140636, + "temperature": 13.8, + "relativehumidity_2m": 91, + "windspeed_10m": 14.5 + }, + { + "datetime": "2024-10-09T17:00:00.000+02:00", + "dcPower": 24.8262611926875, + "power": 19.86100895415, + "sunTilt": 11.408678227135676, + "sunAzimuth": 64.55938454107346, + "temperature": 13.5, + "relativehumidity_2m": 90, + "windspeed_10m": 15.8 + }, + { + "datetime": "2024-10-09T18:00:00.000+02:00", + "dcPower": 14.794745341796876, + "power": 11.835796273437502, + "sunTilt": 2.4777195309842384, + "sunAzimuth": 76.59614824640437, + "temperature": 13.4, + "relativehumidity_2m": 92, + "windspeed_10m": 13.4 + }, + { + "datetime": "2024-10-09T19:00:00.000+02:00", + "dcPower": 3.3148202878699995, + "power": 2.6518562302959996, + "sunTilt": -6.905853552820109, + "sunAzimuth": 88.20032142925027, + "temperature": 13.6, + "relativehumidity_2m": 93, + "windspeed_10m": 14.5 + }, + { + "datetime": "2024-10-09T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -16.348052794342024, + "sunAzimuth": 99.99195941586059, + "temperature": 13.7, + "relativehumidity_2m": 94, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-09T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -25.43533401280622, + "sunAzimuth": 112.66096568522038, + "temperature": 14, + "relativehumidity_2m": 93, + "windspeed_10m": 15.5 + }, + { + "datetime": "2024-10-09T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -33.657312701408955, + "sunAzimuth": 126.98495418142949, + "temperature": 14.2, + "relativehumidity_2m": 93, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-09T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -40.32941598688323, + "sunAzimuth": 143.71902473598436, + "temperature": 14.8, + "relativehumidity_2m": 90, + "windspeed_10m": 17.6 + }, + { + "datetime": "2024-10-10T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.59106942107243, + "sunAzimuth": 163.13616076353475, + "temperature": 15.3, + "relativehumidity_2m": 89, + "windspeed_10m": 16.9 + }, + { + "datetime": "2024-10-10T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.65007030458014, + "sunAzimuth": -175.73407816523158, + "temperature": 15, + "relativehumidity_2m": 92, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-10T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.26979987634531, + "sunAzimuth": -155.060585251648, + "temperature": 14.9, + "relativehumidity_2m": 91, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-10T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.96158240518052, + "sunAzimuth": -136.66110792848332, + "temperature": 13.8, + "relativehumidity_2m": 97, + "windspeed_10m": 18.8 + }, + { + "datetime": "2024-10-10T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.59647297796838, + "sunAzimuth": -120.94117758387233, + "temperature": 12.4, + "relativehumidity_2m": 94, + "windspeed_10m": 25.6 + }, + { + "datetime": "2024-10-10T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.97820409915596, + "sunAzimuth": -107.35365077473413, + "temperature": 12.1, + "relativehumidity_2m": 92, + "windspeed_10m": 22.8 + }, + { + "datetime": "2024-10-10T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.716704637744286, + "sunAzimuth": -95.1044343497123, + "temperature": 12, + "relativehumidity_2m": 95, + "windspeed_10m": 19.5 + }, + { + "datetime": "2024-10-10T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.275734703378654, + "sunAzimuth": -83.4485894065161, + "temperature": 11.8, + "relativehumidity_2m": 93, + "windspeed_10m": 17.2 + }, + { + "datetime": "2024-10-10T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 5.945826827444097, + "sunAzimuth": -71.72880701980833, + "temperature": 12.1, + "relativehumidity_2m": 95, + "windspeed_10m": 16.3 + }, + { + "datetime": "2024-10-10T09:00:00.000+02:00", + "dcPower": 6.570788212467501, + "power": 5.256630569974001, + "sunTilt": 14.541778076840487, + "sunAzimuth": -59.34793757422427, + "temperature": 12.1, + "relativehumidity_2m": 94, + "windspeed_10m": 14.7 + }, + { + "datetime": "2024-10-10T10:00:00.000+02:00", + "dcPower": 19.246776201607496, + "power": 15.397420961285997, + "sunTilt": 22.041831409435048, + "sunAzimuth": -45.7728048820313, + "temperature": 12.2, + "relativehumidity_2m": 92, + "windspeed_10m": 15 + }, + { + "datetime": "2024-10-10T11:00:00.000+02:00", + "dcPower": 35.79458163940749, + "power": 28.635665311525994, + "sunTilt": 27.885174335468335, + "sunAzimuth": -30.63663127573816, + "temperature": 12.5, + "relativehumidity_2m": 92, + "windspeed_10m": 15.7 + }, + { + "datetime": "2024-10-10T12:00:00.000+02:00", + "dcPower": 212.3973794995887, + "power": 169.91790359967098, + "sunTilt": 31.46827419380231, + "sunAzimuth": -13.972554382839954, + "temperature": 12.8, + "relativehumidity_2m": 89, + "windspeed_10m": 18.5 + }, + { + "datetime": "2024-10-10T13:00:00.000+02:00", + "dcPower": 107.04232470086383, + "power": 85.63385976069107, + "sunTilt": 32.31297830760232, + "sunAzimuth": 3.5651067967559134, + "temperature": 12.3, + "relativehumidity_2m": 91, + "windspeed_10m": 17.7 + }, + { + "datetime": "2024-10-10T14:00:00.000+02:00", + "dcPower": 260.1484069522973, + "power": 208.11872556183786, + "sunTilt": 30.29076264178465, + "sunAzimuth": 20.858636821509823, + "temperature": 13.1, + "relativehumidity_2m": 87, + "windspeed_10m": 16 + }, + { + "datetime": "2024-10-10T15:00:00.000+02:00", + "dcPower": 268.64868665722827, + "power": 214.91894932578262, + "sunTilt": 25.696518065354862, + "sunAzimuth": 36.92666158608413, + "temperature": 13.2, + "relativehumidity_2m": 86, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-10T16:00:00.000+02:00", + "dcPower": 187.07375066675246, + "power": 149.65900053340198, + "sunTilt": 19.087103602605772, + "sunAzimuth": 51.382837136526646, + "temperature": 13, + "relativehumidity_2m": 81, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-10T17:00:00.000+02:00", + "dcPower": 116.12954417192189, + "power": 92.90363533753752, + "sunTilt": 11.060531491249431, + "sunAzimuth": 64.39321702308736, + "temperature": 12.8, + "relativehumidity_2m": 75, + "windspeed_10m": 13.3 + }, + { + "datetime": "2024-10-10T18:00:00.000+02:00", + "dcPower": 79.50227134729688, + "power": 63.60181707783751, + "sunTilt": 2.1392339596675116, + "sunAzimuth": 76.4139573135511, + "temperature": 12.3, + "relativehumidity_2m": 79, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-10T19:00:00.000+02:00", + "dcPower": 14.266554068707503, + "power": 11.413243254966003, + "sunTilt": -7.240134220715796, + "sunAzimuth": 88.00936653945188, + "temperature": 11, + "relativehumidity_2m": 80, + "windspeed_10m": 7 + }, + { + "datetime": "2024-10-10T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -16.684429132286564, + "sunAzimuth": 99.79837109714164, + "temperature": 10.6, + "relativehumidity_2m": 84, + "windspeed_10m": 5.2 + }, + { + "datetime": "2024-10-10T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -25.780350237977437, + "sunAzimuth": 112.47374911967749, + "temperature": 10.1, + "relativehumidity_2m": 85, + "windspeed_10m": 4.3 + }, + { + "datetime": "2024-10-10T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -34.01656707008997, + "sunAzimuth": 126.82157256673277, + "temperature": 10.2, + "relativehumidity_2m": 84, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-10T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -40.704586491662205, + "sunAzimuth": 143.61159893587703, + "temperature": 9.8, + "relativehumidity_2m": 90, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-11T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.97491243886403, + "sunAzimuth": 163.128648637255, + "temperature": 9.3, + "relativehumidity_2m": 92, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-11T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.02467456169168, + "sunAzimuth": -175.6141848122969, + "temperature": 8.9, + "relativehumidity_2m": 94, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-11T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.61635732682025, + "sunAzimuth": -154.8336646265192, + "temperature": 8.3, + "relativehumidity_2m": 91, + "windspeed_10m": 2.9 + }, + { + "datetime": "2024-10-11T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -38.27297819203817, + "sunAzimuth": -136.37626404685486, + "temperature": 8.3, + "relativehumidity_2m": 93, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-11T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.877497329298222, + "sunAzimuth": -120.63744534201388, + "temperature": 8.3, + "relativehumidity_2m": 95, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-11T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -22.238894548955713, + "sunAzimuth": -107.05006215076084, + "temperature": 8.3, + "relativehumidity_2m": 98, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-11T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.96790216264699, + "sunAzimuth": -94.80732853145587, + "temperature": 8.3, + "relativehumidity_2m": 96, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-11T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.5276603134629134, + "sunAzimuth": -83.1591411410959, + "temperature": 7.9, + "relativehumidity_2m": 95, + "windspeed_10m": 7.8 + }, + { + "datetime": "2024-10-11T08:00:00.000+02:00", + "dcPower": 0.24182794840750005, + "power": 0.19346235872600004, + "sunTilt": 5.683710585945252, + "sunAzimuth": -71.44774052199065, + "temperature": 7.5, + "relativehumidity_2m": 96, + "windspeed_10m": 6.9 + }, + { + "datetime": "2024-10-11T09:00:00.000+02:00", + "dcPower": 30.4231615824675, + "power": 24.338529265974003, + "sunTilt": 14.260824082236146, + "sunAzimuth": -59.0789120948653, + "temperature": 7.8, + "relativehumidity_2m": 93, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-11T10:00:00.000+02:00", + "dcPower": 110.45511291227001, + "power": 88.36409032981601, + "sunTilt": 21.734940400779433, + "sunAzimuth": -45.525661029390804, + "temperature": 8.1, + "relativehumidity_2m": 89, + "windspeed_10m": 8.2 + }, + { + "datetime": "2024-10-11T11:00:00.000+02:00", + "dcPower": 179.76265080683, + "power": 143.81012064546402, + "sunTilt": 27.54875518315372, + "sunAzimuth": -30.429767533564867, + "temperature": 9, + "relativehumidity_2m": 84, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-11T12:00:00.000+02:00", + "dcPower": 648.5202747579858, + "power": 518.8162198063886, + "sunTilt": 31.105090976135774, + "sunAzimuth": -13.830431372703888, + "temperature": 9.8, + "relativehumidity_2m": 79, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-11T13:00:00.000+02:00", + "dcPower": 602.7210414765614, + "power": 482.1768331812491, + "sunTilt": 31.9332985100557, + "sunAzimuth": 3.6233914143032355, + "temperature": 10.3, + "relativehumidity_2m": 74, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-11T14:00:00.000+02:00", + "dcPower": 612.5638197473248, + "power": 490.0510557978599, + "sunTilt": 29.908639212205873, + "sunAzimuth": 20.83241114244682, + "temperature": 10.8, + "relativehumidity_2m": 71, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-11T15:00:00.000+02:00", + "dcPower": 473.3573784004406, + "power": 378.6859027203525, + "sunTilt": 25.3232617284627, + "sunAzimuth": 36.83295334168066, + "temperature": 11.1, + "relativehumidity_2m": 69, + "windspeed_10m": 4.3 + }, + { + "datetime": "2024-10-11T16:00:00.000+02:00", + "dcPower": 275.36889679567673, + "power": 220.2951174365414, + "sunTilt": 18.727781114603793, + "sunAzimuth": 51.243806920166435, + "temperature": 11.2, + "relativehumidity_2m": 68, + "windspeed_10m": 4 + }, + { + "datetime": "2024-10-11T17:00:00.000+02:00", + "dcPower": 139.32802424290747, + "power": 111.46241939432599, + "sunTilt": 10.714725694488843, + "sunAzimuth": 64.22660182758023, + "temperature": 10.9, + "relativehumidity_2m": 71, + "windspeed_10m": 4.1 + }, + { + "datetime": "2024-10-11T18:00:00.000+02:00", + "dcPower": 74.31139897630752, + "power": 59.449119181046015, + "sunTilt": 1.803206213409536, + "sunAzimuth": 76.23115674859116, + "temperature": 10.3, + "relativehumidity_2m": 77, + "windspeed_10m": 0.5 + }, + { + "datetime": "2024-10-11T19:00:00.000+02:00", + "dcPower": 14.798395647266878, + "power": 11.838716517813502, + "sunTilt": -7.571835214892863, + "sunAzimuth": 87.81749031617603, + "temperature": 9, + "relativehumidity_2m": 79, + "windspeed_10m": 1.9 + }, + { + "datetime": "2024-10-11T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -17.0181265759899, + "sunAzimuth": 99.60341073267222, + "temperature": 7.9, + "relativehumidity_2m": 83, + "windspeed_10m": 2.4 + }, + { + "datetime": "2024-10-11T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -26.122656701936815, + "sunAzimuth": 112.28457164140065, + "temperature": 7, + "relativehumidity_2m": 85, + "windspeed_10m": 2.9 + }, + { + "datetime": "2024-10-11T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -34.37321335134456, + "sunAzimuth": 126.65558045028693, + "temperature": 6.5, + "relativehumidity_2m": 86, + "windspeed_10m": 3 + }, + { + "datetime": "2024-10-11T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.07743516418665, + "sunAzimuth": 143.5011643499793, + "temperature": 6, + "relativehumidity_2m": 88, + "windspeed_10m": 3.3 + }, + { + "datetime": "2024-10-12T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.35684572865986, + "sunAzimuth": 163.11851362268473, + "temperature": 5.4, + "relativehumidity_2m": 89, + "windspeed_10m": 4.8 + }, + { + "datetime": "2024-10-12T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.397705346785955, + "sunAzimuth": -175.49580600360676, + "temperature": 5.1, + "relativehumidity_2m": 90, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-12T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.961535734103165, + "sunAzimuth": -154.60751324634, + "temperature": 4.9, + "relativehumidity_2m": 90, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-12T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -38.58320673599567, + "sunAzimuth": -136.09226665392447, + "temperature": 4.9, + "relativehumidity_2m": 91, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-12T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.157657336040163, + "sunAzimuth": -120.33499159290702, + "temperature": 4.9, + "relativehumidity_2m": 91, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-12T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -22.499060815350038, + "sunAzimuth": -106.7481901878237, + "temperature": 4.8, + "relativehumidity_2m": 91, + "windspeed_10m": 5 + }, + { + "datetime": "2024-10-12T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.218886384957228, + "sunAzimuth": -94.51232726794028, + "temperature": 4.6, + "relativehumidity_2m": 91, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-12T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.77960910849284, + "sunAzimuth": -82.87218040699524, + "temperature": 4.5, + "relativehumidity_2m": 91, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-12T08:00:00.000+02:00", + "dcPower": 0.24412114840750007, + "power": 0.19529691872600008, + "sunTilt": 5.421444806545091, + "sunAzimuth": -71.16958809655219, + "temperature": 4.7, + "relativehumidity_2m": 92, + "windspeed_10m": 6.6 + }, + { + "datetime": "2024-10-12T09:00:00.000+02:00", + "dcPower": 45.32712998912, + "power": 36.261703991296, + "sunTilt": 13.979744388367903, + "sunAzimuth": -58.8132832097472, + "temperature": 5.9, + "relativehumidity_2m": 90, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-12T10:00:00.000+02:00", + "dcPower": 128.75802772929686, + "power": 103.0064221834375, + "sunTilt": 21.42814200059926, + "sunAzimuth": -45.28238230412684, + "temperature": 7.3, + "relativehumidity_2m": 87, + "windspeed_10m": 9.9 + }, + { + "datetime": "2024-10-12T11:00:00.000+02:00", + "dcPower": 184.27716056428, + "power": 147.421728451424, + "sunTilt": 27.21286115693797, + "sunAzimuth": -30.227011858140273, + "temperature": 8.4, + "relativehumidity_2m": 87, + "windspeed_10m": 10.4 + }, + { + "datetime": "2024-10-12T12:00:00.000+02:00", + "dcPower": 590.2420674249103, + "power": 472.19365393992825, + "sunTilt": 30.743014004100917, + "sunAzimuth": -13.692125978099353, + "temperature": 10.1, + "relativehumidity_2m": 82, + "windspeed_10m": 12.3 + }, + { + "datetime": "2024-10-12T13:00:00.000+02:00", + "dcPower": 458.52745912891487, + "power": 366.82196730313194, + "sunTilt": 31.555283363449327, + "sunAzimuth": 3.6787683789403496, + "temperature": 10.6, + "relativehumidity_2m": 81, + "windspeed_10m": 12.4 + }, + { + "datetime": "2024-10-12T14:00:00.000+02:00", + "dcPower": 412.6964962453449, + "power": 330.15719699627596, + "sunTilt": 29.52856227644022, + "sunAzimuth": 20.80440880713897, + "temperature": 11.2, + "relativehumidity_2m": 80, + "windspeed_10m": 11.3 + }, + { + "datetime": "2024-10-12T15:00:00.000+02:00", + "dcPower": 285.17838825344444, + "power": 228.14271060275556, + "sunTilt": 24.95225483898691, + "sunAzimuth": 36.7383136221432, + "temperature": 11.7, + "relativehumidity_2m": 80, + "windspeed_10m": 9.7 + }, + { + "datetime": "2024-10-12T16:00:00.000+02:00", + "dcPower": 170.7828071423425, + "power": 136.626245713874, + "sunTilt": 18.37082552430316, + "sunAzimuth": 51.10424752804786, + "temperature": 11.5, + "relativehumidity_2m": 82, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-12T17:00:00.000+02:00", + "dcPower": 111.50468126820752, + "power": 89.20374501456602, + "sunTilt": 10.371392509810583, + "sunAzimuth": 64.05951991866706, + "temperature": 11.1, + "relativehumidity_2m": 84, + "windspeed_10m": 9.4 + }, + { + "datetime": "2024-10-12T18:00:00.000+02:00", + "dcPower": 40.324461466607495, + "power": 32.259569173285996, + "sunTilt": 1.4697694157713943, + "sunAzimuth": 76.0477365277625, + "temperature": 10.5, + "relativehumidity_2m": 87, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-12T19:00:00.000+02:00", + "dcPower": 6.235591923470001, + "power": 4.9884735387760015, + "sunTilt": -7.900822080898683, + "sunAzimuth": 87.62468730812897, + "temperature": 9.8, + "relativehumidity_2m": 90, + "windspeed_10m": 8.5 + }, + { + "datetime": "2024-10-12T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -17.349008833561726, + "sunAzimuth": 99.4070709783674, + "temperature": 9.6, + "relativehumidity_2m": 92, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-12T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -26.462114969564762, + "sunAzimuth": 112.09341375841275, + "temperature": 9.6, + "relativehumidity_2m": 92, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-12T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -34.7271125456906, + "sunAzimuth": 126.48693033734844, + "temperature": 9.7, + "relativehumidity_2m": 92, + "windspeed_10m": 8 + }, + { + "datetime": "2024-10-12T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.447828525061254, + "sunAzimuth": 143.38762883737587, + "temperature": 9.4, + "relativehumidity_2m": 94, + "windspeed_10m": 7.3 + }, + { + "datetime": "2024-10-13T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.73675190204195, + "sunAzimuth": 163.1056210331007, + "temperature": 9.3, + "relativehumidity_2m": 94, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-13T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.76906905918878, + "sunAzimuth": -175.37909348313417, + "temperature": 9.1, + "relativehumidity_2m": 94, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-13T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.30526573902631, + "sunAzimuth": -154.3822860597556, + "temperature": 9.5, + "relativehumidity_2m": 92, + "windspeed_10m": 10 + }, + { + "datetime": "2024-10-13T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -38.89221927072221, + "sunAzimuth": -135.80926949668307, + "temperature": 9.6, + "relativehumidity_2m": 90, + "windspeed_10m": 16.3 + }, + { + "datetime": "2024-10-13T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.436918053719957, + "sunAzimuth": -120.03396199414307, + "temperature": 8.8, + "relativehumidity_2m": 87, + "windspeed_10m": 18 + }, + { + "datetime": "2024-10-13T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -22.75867399010402, + "sunAzimuth": -106.44816955814555, + "temperature": 8.4, + "relativehumidity_2m": 87, + "windspeed_10m": 15.5 + }, + { + "datetime": "2024-10-13T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.469627601285604, + "sunAzimuth": -94.21955537307969, + "temperature": 7.5, + "relativehumidity_2m": 83, + "windspeed_10m": 17 + }, + { + "datetime": "2024-10-13T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.0315450153141486, + "sunAzimuth": -82.58782406375519, + "temperature": 7.2, + "relativehumidity_2m": 82, + "windspeed_10m": 16.2 + }, + { + "datetime": "2024-10-13T08:00:00.000+02:00", + "dcPower": 0.24248314840750004, + "power": 0.19398651872600003, + "sunTilt": 5.159076534957485, + "sunAzimuth": -70.89445910846419, + "temperature": 6.7, + "relativehumidity_2m": 84, + "windspeed_10m": 16.8 + }, + { + "datetime": "2024-10-13T09:00:00.000+02:00", + "dcPower": 33.32620211254687, + "power": 26.6609616900375, + "sunTilt": 13.698600583367673, + "sunAzimuth": -58.55115047580995, + "temperature": 6.9, + "relativehumidity_2m": 86, + "windspeed_10m": 15.5 + }, + { + "datetime": "2024-10-13T10:00:00.000+02:00", + "dcPower": 97.76344758208, + "power": 78.21075806566401, + "sunTilt": 21.12151408595382, + "sunAzimuth": -45.043053146408546, + "temperature": 7.5, + "relativehumidity_2m": 83, + "windspeed_10m": 22.7 + }, + { + "datetime": "2024-10-13T11:00:00.000+02:00", + "dcPower": 121.8090532421875, + "power": 97.44724259375, + "sunTilt": 26.877585132999467, + "sunAzimuth": -30.028428502780528, + "temperature": 8.1, + "relativehumidity_2m": 83, + "windspeed_10m": 19.5 + }, + { + "datetime": "2024-10-13T12:00:00.000+02:00", + "dcPower": 283.55361802384414, + "power": 226.84289441907532, + "sunTilt": 30.382147107830978, + "sunAzimuth": -13.557685005032592, + "temperature": 8.5, + "relativehumidity_2m": 82, + "windspeed_10m": 18.9 + }, + { + "datetime": "2024-10-13T13:00:00.000+02:00", + "dcPower": 460.29733045829306, + "power": 368.2378643666345, + "sunTilt": 31.17904416002473, + "sunAzimuth": 3.731196531846679, + "temperature": 9.4, + "relativehumidity_2m": 79, + "windspeed_10m": 19.1 + }, + { + "datetime": "2024-10-13T14:00:00.000+02:00", + "dcPower": 448.5623290202257, + "power": 358.8498632161806, + "sunTilt": 29.150649828823855, + "sunAzimuth": 20.774587486422366, + "temperature": 10.4, + "relativehumidity_2m": 75, + "windspeed_10m": 17.7 + }, + { + "datetime": "2024-10-13T15:00:00.000+02:00", + "dcPower": 389.502009045802, + "power": 311.60160723664166, + "sunTilt": 24.583621654336596, + "sunAzimuth": 36.642703763191776, + "temperature": 10.3, + "relativehumidity_2m": 74, + "windspeed_10m": 17.6 + }, + { + "datetime": "2024-10-13T16:00:00.000+02:00", + "dcPower": 224.46273791123238, + "power": 179.57019032898592, + "sunTilt": 18.016365562424813, + "sunAzimuth": 50.96413031013026, + "temperature": 10.3, + "relativehumidity_2m": 77, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-13T17:00:00.000+02:00", + "dcPower": 133.5301222976875, + "power": 106.82409783815001, + "sunTilt": 10.030663139779685, + "sunAzimuth": 63.89195411454739, + "temperature": 9.9, + "relativehumidity_2m": 79, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-13T18:00:00.000+02:00", + "dcPower": 55.5378030151875, + "power": 44.43024241215, + "sunTilt": 1.1390561362362333, + "sunAzimuth": 75.8636886240363, + "temperature": 9.1, + "relativehumidity_2m": 82, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-13T19:00:00.000+02:00", + "dcPower": 7.3238773566875, + "power": 5.85910188535, + "sunTilt": -8.226960953264081, + "sunAzimuth": 87.43095436456028, + "temperature": 8.3, + "relativehumidity_2m": 87, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-13T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -17.676940156857277, + "sunAzimuth": 99.2093472034457, + "temperature": 8.1, + "relativehumidity_2m": 87, + "windspeed_10m": 6.4 + }, + { + "datetime": "2024-10-13T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -26.79858696849319, + "sunAzimuth": 111.90025906076745, + "temperature": 7.6, + "relativehumidity_2m": 90, + "windspeed_10m": 6.8 + }, + { + "datetime": "2024-10-13T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -35.0781256664598, + "sunAzimuth": 126.3155777234557, + "temperature": 7.1, + "relativehumidity_2m": 90, + "windspeed_10m": 5 + }, + { + "datetime": "2024-10-13T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.815632684929426, + "sunAzimuth": 143.2709019404984, + "temperature": 6.5, + "relativehumidity_2m": 91, + "windspeed_10m": 2.6 + }, + { + "datetime": "2024-10-14T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.11451301786215, + "sunAzimuth": 163.08983536166957, + "temperature": 6.3, + "relativehumidity_2m": 89, + "windspeed_10m": 2.4 + }, + { + "datetime": "2024-10-14T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.138671848584934, + "sunAzimuth": -175.2642016873541, + "temperature": 5.8, + "relativehumidity_2m": 89, + "windspeed_10m": 1.5 + }, + { + "datetime": "2024-10-14T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.647478099904184, + "sunAzimuth": -154.15814092455744, + "temperature": 5.3, + "relativehumidity_2m": 90, + "windspeed_10m": 4 + }, + { + "datetime": "2024-10-14T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.1999672120048, + "sunAzimuth": -135.52742842855076, + "temperature": 4.5, + "relativehumidity_2m": 93, + "windspeed_10m": 1.5 + }, + { + "datetime": "2024-10-14T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.715244466780028, + "sunAzimuth": -119.73450334119632, + "temperature": 4, + "relativehumidity_2m": 94, + "windspeed_10m": 4.5 + }, + { + "datetime": "2024-10-14T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.01770469074795, + "sunAzimuth": -106.15013533780943, + "temperature": 3.8, + "relativehumidity_2m": 94, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-14T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.720095220219516, + "sunAzimuth": -93.92913753819082, + "temperature": 4.2, + "relativehumidity_2m": 94, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-14T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.283430715645694, + "sunAzimuth": -82.30618839226909, + "temperature": 4.7, + "relativehumidity_2m": 94, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-14T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.896654311121907, + "sunAzimuth": -70.62246187023919, + "temperature": 5.1, + "relativehumidity_2m": 93, + "windspeed_10m": 4.3 + }, + { + "datetime": "2024-10-14T09:00:00.000+02:00", + "dcPower": 30.3524563671875, + "power": 24.281965093750003, + "sunTilt": 13.417455844515738, + "sunAzimuth": -58.29261188464403, + "temperature": 5.6, + "relativehumidity_2m": 92, + "windspeed_10m": 3.8 + }, + { + "datetime": "2024-10-14T10:00:00.000+02:00", + "dcPower": 92.77502055675, + "power": 74.22001644539999, + "sunTilt": 20.815136015137117, + "sunAzimuth": -44.807755986987566, + "temperature": 6.7, + "relativehumidity_2m": 87, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-14T11:00:00.000+02:00", + "dcPower": 141.1877117546875, + "power": 112.95016940375001, + "sunTilt": 26.543021174019792, + "sunAzimuth": -29.83407952105961, + "temperature": 7.5, + "relativehumidity_2m": 85, + "windspeed_10m": 10.1 + }, + { + "datetime": "2024-10-14T12:00:00.000+02:00", + "dcPower": 124.394385388, + "power": 99.51550831040001, + "sunTilt": 30.022594925866507, + "sunAzimuth": -13.427153142476177, + "temperature": 7.8, + "relativehumidity_2m": 87, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-14T13:00:00.000+02:00", + "dcPower": 173.39473735675, + "power": 138.7157898854, + "sunTilt": 30.804692641790414, + "sunAzimuth": 3.780636799023051, + "temperature": 8.7, + "relativehumidity_2m": 84, + "windspeed_10m": 9.4 + }, + { + "datetime": "2024-10-14T14:00:00.000+02:00", + "dcPower": 187.28123510318864, + "power": 149.8249880825509, + "sunTilt": 28.775019978770835, + "sunAzimuth": 20.742907009369926, + "temperature": 8.8, + "relativehumidity_2m": 83, + "windspeed_10m": 7.7 + }, + { + "datetime": "2024-10-14T15:00:00.000+02:00", + "dcPower": 166.78754287867994, + "power": 133.43003430294397, + "sunTilt": 24.217486258022436, + "sunAzimuth": 36.546087194880954, + "temperature": 8.8, + "relativehumidity_2m": 85, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-14T16:00:00.000+02:00", + "dcPower": 136.40005543196577, + "power": 109.12004434557262, + "sunTilt": 17.664529576020236, + "sunAzimuth": 50.82342857831685, + "temperature": 8.7, + "relativehumidity_2m": 88, + "windspeed_10m": 5.2 + }, + { + "datetime": "2024-10-14T17:00:00.000+02:00", + "dcPower": 93.42627162968749, + "power": 74.74101730375, + "sunTilt": 9.692668263612882, + "sunAzimuth": 63.7238891712367, + "temperature": 8.4, + "relativehumidity_2m": 90, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-14T18:00:00.000+02:00", + "dcPower": 43.279184403, + "power": 34.6233475224, + "sunTilt": 0.8111983279457368, + "sunAzimuth": 75.67900710147994, + "temperature": 8.2, + "relativehumidity_2m": 91, + "windspeed_10m": 1.8 + }, + { + "datetime": "2024-10-14T19:00:00.000+02:00", + "dcPower": 7.24105056675, + "power": 5.7928404534, + "sunTilt": -8.5501186243532, + "sunAzimuth": 87.23629074336492, + "temperature": 7.9, + "relativehumidity_2m": 93, + "windspeed_10m": 0.4 + }, + { + "datetime": "2024-10-14T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.00178541748869, + "sunAzimuth": 99.01023762777291, + "temperature": 7.4, + "relativehumidity_2m": 94, + "windspeed_10m": 1.1 + }, + { + "datetime": "2024-10-14T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -27.131935065748255, + "sunAzimuth": 111.70509440468732, + "temperature": 6.7, + "relativehumidity_2m": 96, + "windspeed_10m": 1.1 + }, + { + "datetime": "2024-10-14T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -35.426113802819536, + "sunAzimuth": 126.14148133580082, + "temperature": 5.8, + "relativehumidity_2m": 98, + "windspeed_10m": 0.4 + }, + { + "datetime": "2024-10-14T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.180713378529184, + "sunAzimuth": 143.15089515757862, + "temperature": 5, + "relativehumidity_2m": 100, + "windspeed_10m": 0.7 + }, + { + "datetime": "2024-10-15T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.49001057641694, + "sunAzimuth": 163.07102046565072, + "temperature": 4.3, + "relativehumidity_2m": 100, + "windspeed_10m": 1.4 + }, + { + "datetime": "2024-10-15T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.506419588733614, + "sunAzimuth": -175.15128768425117, + "temperature": 3.8, + "relativehumidity_2m": 100, + "windspeed_10m": 1.9 + }, + { + "datetime": "2024-10-15T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.988103658491234, + "sunAzimuth": -153.9352385869432, + "temperature": 3.2, + "relativehumidity_2m": 100, + "windspeed_10m": 2.6 + }, + { + "datetime": "2024-10-15T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.50640211284843, + "sunAzimuth": -135.24690137263536, + "temperature": 2.4, + "relativehumidity_2m": 100, + "windspeed_10m": 2.9 + }, + { + "datetime": "2024-10-15T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.992601433814595, + "sunAzimuth": -119.43676351875516, + "temperature": 1.6, + "relativehumidity_2m": 100, + "windspeed_10m": 3.2 + }, + { + "datetime": "2024-10-15T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.276123004228086, + "sunAzimuth": -105.85422295783262, + "temperature": 1.2, + "relativehumidity_2m": 100, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-15T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.970257710966642, + "sunAzimuth": -93.64119828341282, + "temperature": 1.2, + "relativehumidity_2m": 100, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-15T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.5352276078301, + "sunAzimuth": -82.02738904900566, + "temperature": 1.6, + "relativehumidity_2m": 100, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-15T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.63422819396966, + "sunAzimuth": -70.35370359566531, + "temperature": 2.3, + "relativehumidity_2m": 100, + "windspeed_10m": 4 + }, + { + "datetime": "2024-10-15T09:00:00.000+02:00", + "dcPower": 38.55145616875, + "power": 30.841164935000002, + "sunTilt": 13.136374944499462, + "sunAzimuth": -58.037763824819606, + "temperature": 3.4, + "relativehumidity_2m": 98, + "windspeed_10m": 5 + }, + { + "datetime": "2024-10-15T10:00:00.000+02:00", + "dcPower": 109.08258472300001, + "power": 87.26606777840001, + "sunTilt": 20.50908861823578, + "sunAzimuth": -44.57657122307415, + "temperature": 4.8, + "relativehumidity_2m": 94, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-15T11:00:00.000+02:00", + "dcPower": 165.55749042700003, + "power": 132.44599234160003, + "sunTilt": 26.20926450679345, + "sunAzimuth": -29.644024765315514, + "temperature": 6.3, + "relativehumidity_2m": 91, + "windspeed_10m": 7.8 + }, + { + "datetime": "2024-10-15T12:00:00.000+02:00", + "dcPower": 200.0332693541875, + "power": 160.02661548335, + "sunTilt": 29.66446288060627, + "sunAzimuth": -13.300572957692536, + "temperature": 8, + "relativehumidity_2m": 88, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-15T13:00:00.000+02:00", + "dcPower": 756.0843895583059, + "power": 604.8675116466447, + "sunTilt": 30.43234097439692, + "sunAzimuth": 3.8270522061418095, + "temperature": 9.7, + "relativehumidity_2m": 84, + "windspeed_10m": 10.9 + }, + { + "datetime": "2024-10-15T14:00:00.000+02:00", + "dcPower": 707.1329549971153, + "power": 565.7063639976923, + "sunTilt": 28.401790922595836, + "sunAzimuth": 20.709329389098386, + "temperature": 10.8, + "relativehumidity_2m": 82, + "windspeed_10m": 11.9 + }, + { + "datetime": "2024-10-15T15:00:00.000+02:00", + "dcPower": 526.100183335248, + "power": 420.8801466681984, + "sunTilt": 23.853972526435296, + "sunAzimuth": 36.448429487078144, + "temperature": 11.2, + "relativehumidity_2m": 81, + "windspeed_10m": 11.9 + }, + { + "datetime": "2024-10-15T16:00:00.000+02:00", + "dcPower": 280.5106590390066, + "power": 224.4085272312053, + "sunTilt": 17.315445485866938, + "sunAzimuth": 50.682117672382816, + "temperature": 11, + "relativehumidity_2m": 81, + "windspeed_10m": 11 + }, + { + "datetime": "2024-10-15T17:00:00.000+02:00", + "dcPower": 118.147749552, + "power": 94.5181996416, + "sunTilt": 9.35753798215806, + "sunAzimuth": 63.55531186506398, + "temperature": 10.6, + "relativehumidity_2m": 82, + "windspeed_10m": 11.1 + }, + { + "datetime": "2024-10-15T18:00:00.000+02:00", + "dcPower": 63.10571387268751, + "power": 50.48457109815001, + "sunTilt": 0.48632726290863104, + "sunAzimuth": 75.49368820866877, + "temperature": 9.7, + "relativehumidity_2m": 85, + "windspeed_10m": 12.1 + }, + { + "datetime": "2024-10-15T19:00:00.000+02:00", + "dcPower": 13.241973932687499, + "power": 10.593579146149999, + "sunTilt": -8.870162619560801, + "sunAzimuth": 87.04069822248259, + "temperature": 8.5, + "relativehumidity_2m": 88, + "windspeed_10m": 13.6 + }, + { + "datetime": "2024-10-15T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.323410184499085, + "sunAzimuth": 98.80974345652376, + "temperature": 7.6, + "relativehumidity_2m": 91, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-15T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -27.462022150796383, + "sunAzimuth": 111.50791010170794, + "temperature": 7.2, + "relativehumidity_2m": 91, + "windspeed_10m": 13.9 + }, + { + "datetime": "2024-10-15T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -35.770938188604354, + "sunAzimuth": 125.96460338334036, + "temperature": 7, + "relativehumidity_2m": 91, + "windspeed_10m": 12.9 + }, + { + "datetime": "2024-10-15T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.54293600102064, + "sunAzimuth": 143.02752222319543, + "temperature": 6.8, + "relativehumidity_2m": 89, + "windspeed_10m": 12.7 + }, + { + "datetime": "2024-10-16T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.86312551477473, + "sunAzimuth": 163.04903976266138, + "temperature": 6.7, + "relativehumidity_2m": 86, + "windspeed_10m": 13.8 + }, + { + "datetime": "2024-10-16T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.87221785059982, + "sunAzimuth": -175.04051110279474, + "temperature": 6.8, + "relativehumidity_2m": 83, + "windspeed_10m": 15.6 + }, + { + "datetime": "2024-10-16T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.32707330350441, + "sunAzimuth": -153.71374265034802, + "temperature": 6.8, + "relativehumidity_2m": 80, + "windspeed_10m": 16.5 + }, + { + "datetime": "2024-10-16T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.81147561550361, + "sunAzimuth": -134.96784827714956, + "temperature": 7, + "relativehumidity_2m": 78, + "windspeed_10m": 16.1 + }, + { + "datetime": "2024-10-16T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.26895363243685, + "sunAzimuth": -119.1408914506387, + "temperature": 7.3, + "relativehumidity_2m": 77, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-16T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.53389843309148, + "sunAzimuth": -105.56056815727264, + "temperature": 7.4, + "relativehumidity_2m": 75, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-16T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -14.220082554609817, + "sunAzimuth": -93.355861910257, + "temperature": 7.4, + "relativehumidity_2m": 73, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-16T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.786895768698711, + "sunAzimuth": -81.75154101774274, + "temperature": 7.3, + "relativehumidity_2m": 71, + "windspeed_10m": 14.7 + }, + { + "datetime": "2024-10-16T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.371849783596975, + "sunAzimuth": -70.08829035405888, + "temperature": 7.2, + "relativehumidity_2m": 70, + "windspeed_10m": 14.8 + }, + { + "datetime": "2024-10-16T09:00:00.000+02:00", + "dcPower": 28.4527034491875, + "power": 22.76216275935, + "sunTilt": 12.855424254104108, + "sunAzimuth": -57.78670104663053, + "temperature": 9.8, + "relativehumidity_2m": 72, + "windspeed_10m": 17 + }, + { + "datetime": "2024-10-16T10:00:00.000+02:00", + "dcPower": 82.400416875, + "power": 65.92033350000001, + "sunTilt": 20.203454185088123, + "sunAzimuth": -44.34957719582011, + "temperature": 10.2, + "relativehumidity_2m": 75, + "windspeed_10m": 16.5 + }, + { + "datetime": "2024-10-16T11:00:00.000+02:00", + "dcPower": 129.82925219075, + "power": 103.8634017526, + "sunTilt": 25.87641150088954, + "sunAzimuth": -29.45832187587005, + "temperature": 10.7, + "relativehumidity_2m": 77, + "windspeed_10m": 16.2 + }, + { + "datetime": "2024-10-16T12:00:00.000+02:00", + "dcPower": 176.5629584026875, + "power": 141.25036672215, + "sunTilt": 29.30785715204484, + "sunAzimuth": -13.177984892004138, + "temperature": 11.6, + "relativehumidity_2m": 77, + "windspeed_10m": 15.7 + }, + { + "datetime": "2024-10-16T13:00:00.000+02:00", + "dcPower": 486.87760328361003, + "power": 389.50208262688807, + "sunTilt": 30.062101719417093, + "sunAzimuth": 3.870407893111919, + "temperature": 12.5, + "relativehumidity_2m": 75, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-16T14:00:00.000+02:00", + "dcPower": 471.13085183462414, + "power": 376.90468146769933, + "sunTilt": 28.03108091352568, + "sunAzimuth": 20.673818848950724, + "temperature": 13.2, + "relativehumidity_2m": 75, + "windspeed_10m": 14.8 + }, + { + "datetime": "2024-10-16T15:00:00.000+02:00", + "dcPower": 366.0504129403436, + "power": 292.8403303522749, + "sunTilt": 23.49320409080551, + "sunAzimuth": 36.34969840216598, + "temperature": 13.5, + "relativehumidity_2m": 77, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-16T16:00:00.000+02:00", + "dcPower": 216.91827490634043, + "power": 173.53461992507235, + "sunTilt": 16.969240740198778, + "sunAzimuth": 50.54017502787197, + "temperature": 13.5, + "relativehumidity_2m": 80, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-16T17:00:00.000+02:00", + "dcPower": 110.78138314075, + "power": 88.6251065126, + "sunTilt": 9.025401762418719, + "sunAzimuth": 63.386211071389155, + "temperature": 13.3, + "relativehumidity_2m": 82, + "windspeed_10m": 13.2 + }, + { + "datetime": "2024-10-16T18:00:00.000+02:00", + "dcPower": 54.4351348016875, + "power": 43.54810784135, + "sunTilt": 0.16457346744538273, + "sunAzimuth": 75.30773046735078, + "temperature": 13, + "relativehumidity_2m": 82, + "windspeed_10m": 13 + }, + { + "datetime": "2024-10-16T19:00:00.000+02:00", + "dcPower": 10.9590243, + "power": 8.76721944, + "sunTilt": -9.186961271997145, + "sunAzimuth": 86.84418120594421, + "temperature": 12.6, + "relativehumidity_2m": 81, + "windspeed_10m": 12.7 + }, + { + "datetime": "2024-10-16T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.64168080965683, + "sunAzimuth": 98.60786901950698, + "temperature": 12.2, + "relativehumidity_2m": 80, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-16T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -27.788711717705176, + "sunAzimuth": 111.30870010109864, + "temperature": 12, + "relativehumidity_2m": 80, + "windspeed_10m": 11.8 + }, + { + "datetime": "2024-10-16T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -36.112460277357016, + "sunAzimuth": 125.78490981561183, + "temperature": 11.8, + "relativehumidity_2m": 81, + "windspeed_10m": 11 + }, + { + "datetime": "2024-10-16T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.9021656490531, + "sunAzimuth": 142.90069940402603, + "temperature": 11.7, + "relativehumidity_2m": 82, + "windspeed_10m": 10.2 + }, + { + "datetime": "2024-10-17T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.23373820466217, + "sunAzimuth": 163.02375644913673, + "temperature": 11.7, + "relativehumidity_2m": 82, + "windspeed_10m": 9.4 + }, + { + "datetime": "2024-10-17T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -48.2359718752176, + "sunAzimuth": -174.9320340577077, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-17T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.66431793404074, + "sunAzimuth": -153.4938195445769, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 8.2 + }, + { + "datetime": "2024-10-17T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -40.115139405653565, + "sunAzimuth": -134.69043107615582, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-17T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.54426550294801, + "sunAzimuth": -118.84703704658551, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-17T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.79099983796868, + "sunAzimuth": -105.2693069294498, + "temperature": 11.7, + "relativehumidity_2m": 82, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-17T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -14.469536195186127, + "sunAzimuth": -93.07325245162968, + "temperature": 11.6, + "relativehumidity_2m": 82, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-17T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -5.038393916921545, + "sunAzimuth": -81.47875856041325, + "temperature": 11.4, + "relativehumidity_2m": 83, + "windspeed_10m": 7.3 + }, + { + "datetime": "2024-10-17T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.109572239802723, + "sunAzimuth": -69.8263270263417, + "temperature": 11.5, + "relativehumidity_2m": 83, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-17T09:00:00.000+02:00", + "dcPower": 25.602632300000003, + "power": 20.482105840000003, + "sunTilt": 12.574671747325786, + "sunAzimuth": -57.53951661964237, + "temperature": 11.9, + "relativehumidity_2m": 83, + "windspeed_10m": 8 + }, + { + "datetime": "2024-10-17T10:00:00.000+02:00", + "dcPower": 76.2421036916875, + "power": 60.99368295335, + "sunTilt": 19.89831645004539, + "sunAzimuth": -44.1268501705138, + "temperature": 12.5, + "relativehumidity_2m": 82, + "windspeed_10m": 9.7 + }, + { + "datetime": "2024-10-17T11:00:00.000+02:00", + "dcPower": 119.09589569674999, + "power": 95.2767165574, + "sunTilt": 25.54455964459646, + "sunAzimuth": -29.277026273264024, + "temperature": 13.1, + "relativehumidity_2m": 82, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-17T12:00:00.000+02:00", + "dcPower": 153.93946101668752, + "power": 123.15156881335002, + "sunTilt": 28.952884649607554, + "sunAzimuth": -13.059427258390235, + "temperature": 13.5, + "relativehumidity_2m": 83, + "windspeed_10m": 10.7 + }, + { + "datetime": "2024-10-17T13:00:00.000+02:00", + "dcPower": 248.22004161241605, + "power": 198.57603328993287, + "sunTilt": 29.694087805098004, + "sunAzimuth": 3.9106711264578404, + "temperature": 13.8, + "relativehumidity_2m": 85, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-17T14:00:00.000+02:00", + "dcPower": 229.15318902704783, + "power": 183.32255122163826, + "sunTilt": 27.663008228484166, + "sunAzimuth": 20.63634185579284, + "temperature": 14.2, + "relativehumidity_2m": 86, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-17T15:00:00.000+02:00", + "dcPower": 203.74729317905823, + "power": 162.9978345432466, + "sunTilt": 23.13530429931852, + "sunAzimuth": 36.24986394147597, + "temperature": 14.6, + "relativehumidity_2m": 87, + "windspeed_10m": 9.8 + }, + { + "datetime": "2024-10-17T16:00:00.000+02:00", + "dcPower": 161.97727115162724, + "power": 129.5818169213018, + "sunTilt": 16.626042266391202, + "sunAzimuth": 50.39758024284303, + "temperature": 14.9, + "relativehumidity_2m": 88, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-17T17:00:00.000+02:00", + "dcPower": 108.840563643, + "power": 87.07245091440001, + "sunTilt": 8.696388379725821, + "sunAzimuth": 63.21657784217465, + "temperature": 15.1, + "relativehumidity_2m": 89, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-17T18:00:00.000+02:00", + "dcPower": 53.53735983268749, + "power": 42.829887866149996, + "sunTilt": -0.15393334821361332, + "sunAzimuth": 75.12113476396313, + "temperature": 14.9, + "relativehumidity_2m": 90, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-17T19:00:00.000+02:00", + "dcPower": 9.524056729687501, + "power": 7.619245383750002, + "sunTilt": -9.500383797971471, + "sunAzimuth": 86.64674682587622, + "temperature": 14.6, + "relativehumidity_2m": 92, + "windspeed_10m": 6.7 + }, + { + "datetime": "2024-10-17T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.956464510241965, + "sunAzimuth": 98.40462190157557, + "temperature": 14.3, + "relativehumidity_2m": 93, + "windspeed_10m": 5.9 + }, + { + "datetime": "2024-10-17T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -28.11186795253563, + "sunAzimuth": 111.10746217430679, + "temperature": 14.2, + "relativehumidity_2m": 94, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-17T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -36.45054181856139, + "sunAzimuth": 125.60237057929713, + "temperature": 14.2, + "relativehumidity_2m": 94, + "windspeed_10m": 4.6 + }, + { + "datetime": "2024-10-17T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.2582671659911, + "sunAzimuth": 142.77034580724174, + "temperature": 14.2, + "relativehumidity_2m": 95, + "windspeed_10m": 4.4 + } + ], + [ + { + "datetime": "2024-10-06T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.03892891605494, + "sunAzimuth": 163.14263622624128, + "temperature": 7, + "relativehumidity_2m": 88, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-06T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.13778324543035, + "sunAzimuth": -176.22585898864278, + "temperature": 6.5, + "relativehumidity_2m": 91, + "windspeed_10m": 6.8 + }, + { + "datetime": "2024-10-06T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.87117274960936, + "sunAzimuth": -155.9729639229445, + "temperature": 6, + "relativehumidity_2m": 91, + "windspeed_10m": 5.9 + }, + { + "datetime": "2024-10-06T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -36.70531092777589, + "sunAzimuth": -137.8059489226708, + "temperature": 5.5, + "relativehumidity_2m": 92, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-06T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -29.46443142893699, + "sunAzimuth": -122.16602054266892, + "temperature": 5.1, + "relativehumidity_2m": 92, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-06T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -20.930765133481234, + "sunAzimuth": -108.58249513077881, + "temperature": 4.9, + "relativehumidity_2m": 93, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-06T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -11.710347315474053, + "sunAzimuth": -96.31140508589108, + "temperature": 5.1, + "relativehumidity_2m": 92, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-06T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -2.2689443207496223, + "sunAzimuth": -84.62890292197706, + "temperature": 5.3, + "relativehumidity_2m": 92, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-06T08:00:00.000+02:00", + "dcPower": 3.3713875541106932, + "power": 2.697110043288555, + "sunTilt": 6.991906328571172, + "sunAzimuth": -72.87999206290318, + "temperature": 5.5, + "relativehumidity_2m": 91, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-06T09:00:00.000+02:00", + "dcPower": 70.82484417927611, + "power": 56.65987534342089, + "sunTilt": 15.663160391528187, + "sunAzimuth": -60.45596163553978, + "temperature": 6.3, + "relativehumidity_2m": 90, + "windspeed_10m": 9.3 + }, + { + "datetime": "2024-10-06T10:00:00.000+02:00", + "dcPower": 143.48119878382155, + "power": 114.78495902705725, + "sunTilt": 23.268816289666535, + "sunAzimuth": -46.79827360798693, + "temperature": 8, + "relativehumidity_2m": 85, + "windspeed_10m": 11.6 + }, + { + "datetime": "2024-10-06T11:00:00.000+02:00", + "dcPower": 811.9852773713835, + "power": 649.5882218971069, + "sunTilt": 29.234287239795027, + "sunAzimuth": -31.503805204051176, + "temperature": 9.5, + "relativehumidity_2m": 86, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-06T12:00:00.000+02:00", + "dcPower": 670.9876969713171, + "power": 536.7901575770537, + "sunTilt": 32.93002248275174, + "sunAzimuth": -14.578212396799534, + "temperature": 10.8, + "relativehumidity_2m": 82, + "windspeed_10m": 16.3 + }, + { + "datetime": "2024-10-06T13:00:00.000+02:00", + "dcPower": 702.4696779546789, + "power": 561.9757423637432, + "sunTilt": 33.84613522696556, + "sunAzimuth": 3.3037874055175505, + "temperature": 10.9, + "relativehumidity_2m": 82, + "windspeed_10m": 16.9 + }, + { + "datetime": "2024-10-06T14:00:00.000+02:00", + "dcPower": 644.8630403406012, + "power": 515.890432272481, + "sunTilt": 31.83736693728352, + "sunAzimuth": 20.94669333759787, + "temperature": 12.6, + "relativehumidity_2m": 74, + "windspeed_10m": 17.1 + }, + { + "datetime": "2024-10-06T15:00:00.000+02:00", + "dcPower": 329.8924014292663, + "power": 263.913921143413, + "sunTilt": 27.209548486852757, + "sunAzimuth": 37.29302345489315, + "temperature": 12.8, + "relativehumidity_2m": 75, + "windspeed_10m": 17.8 + }, + { + "datetime": "2024-10-06T16:00:00.000+02:00", + "dcPower": 256.92857639701907, + "power": 205.54286111761527, + "sunTilt": 20.54547686442047, + "sunAzimuth": 51.93430385037965, + "temperature": 13.1, + "relativehumidity_2m": 73, + "windspeed_10m": 17.8 + }, + { + "datetime": "2024-10-06T17:00:00.000+02:00", + "dcPower": 232.7996743539756, + "power": 186.2397394831805, + "sunTilt": 12.4658413410018, + "sunAzimuth": 65.05541740712634, + "temperature": 12.6, + "relativehumidity_2m": 72, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-06T18:00:00.000+02:00", + "dcPower": 123.82855203865259, + "power": 99.06284163092208, + "sunTilt": 3.5065849097251456, + "sunAzimuth": 77.13919140741508, + "temperature": 11.9, + "relativehumidity_2m": 76, + "windspeed_10m": 14.8 + }, + { + "datetime": "2024-10-06T19:00:00.000+02:00", + "dcPower": 24.756413134229224, + "power": 19.80513050738338, + "sunTilt": -5.8888854618235795, + "sunAzimuth": 88.76774476136781, + "temperature": 11.1, + "relativehumidity_2m": 79, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-06T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -15.324219942418523, + "sunAzimuth": 100.56460329657087, + "temperature": 10.6, + "relativehumidity_2m": 81, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-06T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -24.385415066790006, + "sunAzimuth": 113.21108724923529, + "temperature": 10.3, + "relativehumidity_2m": 81, + "windspeed_10m": 13.4 + }, + { + "datetime": "2024-10-06T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.56528997863786, + "sunAzimuth": 127.45995077522508, + "temperature": 10.3, + "relativehumidity_2m": 83, + "windspeed_10m": 13.4 + }, + { + "datetime": "2024-10-06T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.19130152908581, + "sunAzimuth": 144.02419079232183, + "temperature": 10.7, + "relativehumidity_2m": 83, + "windspeed_10m": 13 + }, + { + "datetime": "2024-10-07T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.4292477470776, + "sunAzimuth": 163.14429087891105, + "temperature": 11, + "relativehumidity_2m": 83, + "windspeed_10m": 13.6 + }, + { + "datetime": "2024-10-07T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.517749495901406, + "sunAzimuth": -176.10136944486192, + "temperature": 11, + "relativehumidity_2m": 87, + "windspeed_10m": 11.2 + }, + { + "datetime": "2024-10-07T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.22254930467857, + "sunAzimuth": -155.74445709329385, + "temperature": 10.9, + "relativehumidity_2m": 91, + "windspeed_10m": 9.8 + }, + { + "datetime": "2024-10-07T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.020882886444426, + "sunAzimuth": -137.5192133151141, + "temperature": 11, + "relativehumidity_2m": 93, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-07T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -29.748563322135755, + "sunAzimuth": -121.8586066543482, + "temperature": 11.4, + "relativehumidity_2m": 94, + "windspeed_10m": 8.9 + }, + { + "datetime": "2024-10-07T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.193270783038106, + "sunAzimuth": -108.27337691467278, + "temperature": 11.5, + "relativehumidity_2m": 95, + "windspeed_10m": 11 + }, + { + "datetime": "2024-10-07T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -11.962117012521006, + "sunAzimuth": -96.00713008699226, + "temperature": 12, + "relativehumidity_2m": 94, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-07T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -2.520439907672165, + "sunAzimuth": -84.33068309080377, + "temperature": 12.2, + "relativehumidity_2m": 95, + "windspeed_10m": 9.3 + }, + { + "datetime": "2024-10-07T08:00:00.000+02:00", + "dcPower": 1.4871743864343177, + "power": 1.189739509147454, + "sunTilt": 6.730829735879827, + "sunAzimuth": -72.58838243599898, + "temperature": 12.7, + "relativehumidity_2m": 94, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-07T09:00:00.000+02:00", + "dcPower": 30.392000747748977, + "power": 24.313600598199184, + "sunTilt": 15.383293627086166, + "sunAzimuth": -60.174375329765816, + "temperature": 13.3, + "relativehumidity_2m": 94, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-07T10:00:00.000+02:00", + "dcPower": 122.83253304737609, + "power": 98.26602643790088, + "sunTilt": 22.96230371458641, + "sunAzimuth": -46.53655309716923, + "temperature": 14.4, + "relativehumidity_2m": 91, + "windspeed_10m": 8.9 + }, + { + "datetime": "2024-10-07T11:00:00.000+02:00", + "dcPower": 135.97403551360443, + "power": 108.77922841088355, + "sunTilt": 28.896671975172765, + "sunAzimuth": -31.281195510232457, + "temperature": 15.2, + "relativehumidity_2m": 91, + "windspeed_10m": 10.9 + }, + { + "datetime": "2024-10-07T12:00:00.000+02:00", + "dcPower": 251.53152684611086, + "power": 201.2252214768887, + "sunTilt": 32.56343562699629, + "sunAzimuth": -14.421329305847635, + "temperature": 16, + "relativehumidity_2m": 89, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-07T13:00:00.000+02:00", + "dcPower": 487.9224729067913, + "power": 390.3379783254331, + "sunTilt": 33.46089993111447, + "sunAzimuth": 3.3732496911031458, + "temperature": 17, + "relativehumidity_2m": 82, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-07T14:00:00.000+02:00", + "dcPower": 645.7510235050102, + "power": 516.6008188040081, + "sunTilt": 31.448234246769605, + "sunAzimuth": 20.927108911856653, + "temperature": 18, + "relativehumidity_2m": 75, + "windspeed_10m": 9.8 + }, + { + "datetime": "2024-10-07T15:00:00.000+02:00", + "dcPower": 310.6413374640256, + "power": 248.5130699712205, + "sunTilt": 26.828539273003113, + "sunAzimuth": 37.20261442198752, + "temperature": 18.6, + "relativehumidity_2m": 70, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-07T16:00:00.000+02:00", + "dcPower": 256.82161295176576, + "power": 205.45729036141262, + "sunTilt": 20.17798028996772, + "sunAzimuth": 51.797067137147856, + "temperature": 18.9, + "relativehumidity_2m": 70, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-07T17:00:00.000+02:00", + "dcPower": 229.1217228030218, + "power": 183.29737824241747, + "sunTilt": 12.11146577521795, + "sunAzimuth": 64.89046144901918, + "temperature": 18.4, + "relativehumidity_2m": 72, + "windspeed_10m": 7.2 + }, + { + "datetime": "2024-10-07T18:00:00.000+02:00", + "dcPower": 103.54709914126633, + "power": 82.83767931301307, + "sunTilt": 3.1615292467832945, + "sunAzimuth": 76.95875071433478, + "temperature": 17.4, + "relativehumidity_2m": 74, + "windspeed_10m": 9.5 + }, + { + "datetime": "2024-10-07T19:00:00.000+02:00", + "dcPower": 22.74012496621281, + "power": 18.19209997297025, + "sunTilt": -6.2300935503595385, + "sunAzimuth": 88.57949984494998, + "temperature": 16.4, + "relativehumidity_2m": 79, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-07T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -15.667810875617224, + "sunAzimuth": 100.37506201699385, + "temperature": 15.4, + "relativehumidity_2m": 87, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-07T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -24.737727405113922, + "sunAzimuth": 113.02960837119129, + "temperature": 14.9, + "relativehumidity_2m": 90, + "windspeed_10m": 10.9 + }, + { + "datetime": "2024-10-07T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.93153539182831, + "sunAzimuth": 127.30408938398604, + "temperature": 14.5, + "relativehumidity_2m": 94, + "windspeed_10m": 10.7 + }, + { + "datetime": "2024-10-07T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.572641175501424, + "sunAzimuth": 143.925225436442, + "temperature": 14.7, + "relativehumidity_2m": 94, + "windspeed_10m": 11.6 + }, + { + "datetime": "2024-10-08T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.818121034022454, + "sunAzimuth": 163.14384998115503, + "temperature": 14.7, + "relativehumidity_2m": 94, + "windspeed_10m": 15.8 + }, + { + "datetime": "2024-10-08T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.8965146817323, + "sunAzimuth": -175.97781528741945, + "temperature": 14.8, + "relativehumidity_2m": 93, + "windspeed_10m": 14 + }, + { + "datetime": "2024-10-08T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.572826067170936, + "sunAzimuth": -155.51612909180187, + "temperature": 15.4, + "relativehumidity_2m": 94, + "windspeed_10m": 11.2 + }, + { + "datetime": "2024-10-08T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.33548533853669, + "sunAzimuth": -137.23273090041528, + "temperature": 15.4, + "relativehumidity_2m": 93, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-08T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.031970973409337, + "sunAzimuth": -121.55190085899577, + "temperature": 15.4, + "relativehumidity_2m": 93, + "windspeed_10m": 11.2 + }, + { + "datetime": "2024-10-08T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.45536424486834, + "sunAzimuth": -107.96544161465735, + "temperature": 15.8, + "relativehumidity_2m": 94, + "windspeed_10m": 10 + }, + { + "datetime": "2024-10-08T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.213784351950519, + "sunAzimuth": -95.70446004731738, + "temperature": 15.8, + "relativehumidity_2m": 93, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-08T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -2.772091353585381, + "sunAzimuth": -84.03447848078322, + "temperature": 15.7, + "relativehumidity_2m": 93, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-08T08:00:00.000+02:00", + "dcPower": 1.1774588428322112, + "power": 0.9419670742657691, + "sunTilt": 6.469429830924286, + "sunAzimuth": -72.29923977528891, + "temperature": 15.7, + "relativehumidity_2m": 90, + "windspeed_10m": 10.2 + }, + { + "datetime": "2024-10-08T09:00:00.000+02:00", + "dcPower": 61.738481173216655, + "power": 49.390784938573326, + "sunTilt": 15.10307050684314, + "sunAzimuth": -59.895772492079, + "temperature": 15.7, + "relativehumidity_2m": 89, + "windspeed_10m": 8.3 + }, + { + "datetime": "2024-10-08T10:00:00.000+02:00", + "dcPower": 165.74955432771506, + "power": 132.59964346217205, + "sunTilt": 22.655587204347487, + "sunAzimuth": -46.27834028428006, + "temperature": 16.3, + "relativehumidity_2m": 86, + "windspeed_10m": 10.6 + }, + { + "datetime": "2024-10-08T11:00:00.000+02:00", + "dcPower": 302.02175381156064, + "power": 241.61740304924854, + "sunTilt": 28.55922255887939, + "sunAzimuth": -31.06241498925654, + "temperature": 17, + "relativehumidity_2m": 85, + "windspeed_10m": 9 + }, + { + "datetime": "2024-10-08T12:00:00.000+02:00", + "dcPower": 407.300701925971, + "power": 325.84056154077683, + "sunTilt": 32.19754822667087, + "sunAzimuth": -14.26805544520534, + "temperature": 17.6, + "relativehumidity_2m": 82, + "windspeed_10m": 13.1 + }, + { + "datetime": "2024-10-08T13:00:00.000+02:00", + "dcPower": 587.8235107579072, + "power": 470.25880860632583, + "sunTilt": 33.07688907994966, + "sunAzimuth": 3.4399896103944245, + "temperature": 18.3, + "relativehumidity_2m": 73, + "windspeed_10m": 12.7 + }, + { + "datetime": "2024-10-08T14:00:00.000+02:00", + "dcPower": 499.10887945306024, + "power": 399.28710356244824, + "sunTilt": 31.060677746554727, + "sunAzimuth": 20.90593811884074, + "temperature": 18.2, + "relativehumidity_2m": 71, + "windspeed_10m": 13.2 + }, + { + "datetime": "2024-10-08T15:00:00.000+02:00", + "dcPower": 344.3210351561571, + "power": 275.4568281249257, + "sunTilt": 26.44928138282813, + "sunAzimuth": 37.11144846293623, + "temperature": 18.1, + "relativehumidity_2m": 71, + "windspeed_10m": 13.3 + }, + { + "datetime": "2024-10-08T16:00:00.000+02:00", + "dcPower": 247.53117087126986, + "power": 198.0249366970159, + "sunTilt": 19.81233269039211, + "sunAzimuth": 51.65943401571543, + "temperature": 17.4, + "relativehumidity_2m": 73, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-08T17:00:00.000+02:00", + "dcPower": 176.7268760826156, + "power": 141.3815008660925, + "sunTilt": 11.759033809196055, + "sunAzimuth": 64.72512518734406, + "temperature": 16.9, + "relativehumidity_2m": 75, + "windspeed_10m": 6.3 + }, + { + "datetime": "2024-10-08T18:00:00.000+02:00", + "dcPower": 100.76280838553514, + "power": 80.61024670842812, + "sunTilt": 2.818529310708217, + "sunAzimuth": 76.77774147088243, + "temperature": 16, + "relativehumidity_2m": 75, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-08T19:00:00.000+02:00", + "dcPower": 22.833330533924155, + "power": 18.266664427139325, + "sunTilt": -6.569128186596377, + "sunAzimuth": 88.39036262615889, + "temperature": 15, + "relativehumidity_2m": 82, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-08T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -16.00913432264249, + "sunAzimuth": 100.18418560559792, + "temperature": 14.5, + "relativehumidity_2m": 89, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-08T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -25.087746753502067, + "sunAzimuth": 112.84624373263145, + "temperature": 14, + "relativehumidity_2m": 93, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-08T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -33.29558919415396, + "sunAzimuth": 127.1457755347392, + "temperature": 14, + "relativehumidity_2m": 88, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-08T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.95205668980692, + "sunAzimuth": 143.82353531827584, + "temperature": 13, + "relativehumidity_2m": 91, + "windspeed_10m": 7.2 + }, + { + "datetime": "2024-10-09T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.20543351779722, + "sunAzimuth": 163.1411836959831, + "temperature": 12.6, + "relativehumidity_2m": 92, + "windspeed_10m": 7.8 + }, + { + "datetime": "2024-10-09T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.27398595213309, + "sunAzimuth": -175.8553370630724, + "temperature": 12.9, + "relativehumidity_2m": 91, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-09T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.92193289241474, + "sunAzimuth": -155.28812310014723, + "temperature": 12.7, + "relativehumidity_2m": 92, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-09T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.64906836752005, + "sunAzimuth": -136.94664669208646, + "temperature": 12.9, + "relativehumidity_2m": 91, + "windspeed_10m": 12.3 + }, + { + "datetime": "2024-10-09T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.314619206373006, + "sunAzimuth": -121.24604384005964, + "temperature": 12.9, + "relativehumidity_2m": 91, + "windspeed_10m": 10.2 + }, + { + "datetime": "2024-10-09T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.71701795569338, + "sunAzimuth": -107.65882183814558, + "temperature": 13.2, + "relativehumidity_2m": 90, + "windspeed_10m": 12.9 + }, + { + "datetime": "2024-10-09T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.465322674764078, + "sunAzimuth": -95.40351983003244, + "temperature": 13.3, + "relativehumidity_2m": 89, + "windspeed_10m": 13.5 + }, + { + "datetime": "2024-10-09T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.023867147662328, + "sunAzimuth": -83.74040781223535, + "temperature": 12.9, + "relativehumidity_2m": 92, + "windspeed_10m": 13.2 + }, + { + "datetime": "2024-10-09T08:00:00.000+02:00", + "dcPower": 0.29725475849939703, + "power": 0.23780380679951763, + "sunTilt": 6.207747953736028, + "sunAzimuth": -72.01267721735641, + "temperature": 12.9, + "relativehumidity_2m": 92, + "windspeed_10m": 11.8 + }, + { + "datetime": "2024-10-09T09:00:00.000+02:00", + "dcPower": 16.039424714571386, + "power": 12.83153977165711, + "sunTilt": 14.82254636430179, + "sunAzimuth": -59.62025856421435, + "temperature": 12.8, + "relativehumidity_2m": 93, + "windspeed_10m": 11.8 + }, + { + "datetime": "2024-10-09T10:00:00.000+02:00", + "dcPower": 51.0745453462637, + "power": 40.859636277010964, + "sunTilt": 22.348738640203063, + "sunAzimuth": -46.023727432629336, + "temperature": 13.1, + "relativehumidity_2m": 91, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-09T11:00:00.000+02:00", + "dcPower": 104.15753243201114, + "power": 83.32602594560892, + "sunTilt": 28.22202694317921, + "sunAzimuth": -30.847536638720733, + "temperature": 13.7, + "relativehumidity_2m": 92, + "windspeed_10m": 12.8 + }, + { + "datetime": "2024-10-09T12:00:00.000+02:00", + "dcPower": 157.65994959715988, + "power": 126.12795967772792, + "sunTilt": 31.832460658762763, + "sunAzimuth": -14.118446086753368, + "temperature": 13.8, + "relativehumidity_2m": 91, + "windspeed_10m": 12 + }, + { + "datetime": "2024-10-09T13:00:00.000+02:00", + "dcPower": 143.9780319305286, + "power": 115.18242554442288, + "sunTilt": 32.69421193791607, + "sunAzimuth": 3.503957762689472, + "temperature": 14.2, + "relativehumidity_2m": 90, + "windspeed_10m": 11.5 + }, + { + "datetime": "2024-10-09T14:00:00.000+02:00", + "dcPower": 106.12732760501824, + "power": 84.9018620840146, + "sunTilt": 30.674814714273392, + "sunAzimuth": 20.883130296493302, + "temperature": 13.9, + "relativehumidity_2m": 91, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-09T15:00:00.000+02:00", + "dcPower": 59.78263600805569, + "power": 47.82610880644455, + "sunTilt": 26.07189945210854, + "sunAzimuth": 37.01947906146245, + "temperature": 13.8, + "relativehumidity_2m": 92, + "windspeed_10m": 13.8 + }, + { + "datetime": "2024-10-09T16:00:00.000+02:00", + "dcPower": 46.56073709140872, + "power": 37.24858967312698, + "sunTilt": 19.448663917806936, + "sunAzimuth": 51.521368716140636, + "temperature": 13.8, + "relativehumidity_2m": 91, + "windspeed_10m": 14.5 + }, + { + "datetime": "2024-10-09T17:00:00.000+02:00", + "dcPower": 31.078962623371577, + "power": 24.863170098697264, + "sunTilt": 11.408678227135676, + "sunAzimuth": 64.55938454107346, + "temperature": 13.5, + "relativehumidity_2m": 90, + "windspeed_10m": 15.8 + }, + { + "datetime": "2024-10-09T18:00:00.000+02:00", + "dcPower": 18.522376821489427, + "power": 14.817901457191542, + "sunTilt": 2.4777195309842384, + "sunAzimuth": 76.59614824640437, + "temperature": 13.4, + "relativehumidity_2m": 92, + "windspeed_10m": 13.4 + }, + { + "datetime": "2024-10-09T19:00:00.000+02:00", + "dcPower": 4.150380638374255, + "power": 3.3203045106994042, + "sunTilt": -6.905853552820109, + "sunAzimuth": 88.20032142925027, + "temperature": 13.6, + "relativehumidity_2m": 93, + "windspeed_10m": 14.5 + }, + { + "datetime": "2024-10-09T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -16.348052794342024, + "sunAzimuth": 99.99195941586059, + "temperature": 13.7, + "relativehumidity_2m": 94, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-09T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -25.43533401280622, + "sunAzimuth": 112.66096568522038, + "temperature": 14, + "relativehumidity_2m": 93, + "windspeed_10m": 15.5 + }, + { + "datetime": "2024-10-09T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -33.657312701408955, + "sunAzimuth": 126.98495418142949, + "temperature": 14.2, + "relativehumidity_2m": 93, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-09T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -40.32941598688323, + "sunAzimuth": 143.71902473598436, + "temperature": 14.8, + "relativehumidity_2m": 90, + "windspeed_10m": 17.6 + }, + { + "datetime": "2024-10-10T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.59106942107243, + "sunAzimuth": 163.13616076353475, + "temperature": 15.3, + "relativehumidity_2m": 89, + "windspeed_10m": 16.9 + }, + { + "datetime": "2024-10-10T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.65007030458014, + "sunAzimuth": -175.73407816523158, + "temperature": 15, + "relativehumidity_2m": 92, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-10T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.26979987634531, + "sunAzimuth": -155.060585251648, + "temperature": 14.9, + "relativehumidity_2m": 91, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-10T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -37.96158240518052, + "sunAzimuth": -136.66110792848332, + "temperature": 13.8, + "relativehumidity_2m": 97, + "windspeed_10m": 18.8 + }, + { + "datetime": "2024-10-10T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.59647297796838, + "sunAzimuth": -120.94117758387233, + "temperature": 12.4, + "relativehumidity_2m": 94, + "windspeed_10m": 25.6 + }, + { + "datetime": "2024-10-10T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -21.97820409915596, + "sunAzimuth": -107.35365077473413, + "temperature": 12.1, + "relativehumidity_2m": 92, + "windspeed_10m": 22.8 + }, + { + "datetime": "2024-10-10T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.716704637744286, + "sunAzimuth": -95.1044343497123, + "temperature": 12, + "relativehumidity_2m": 95, + "windspeed_10m": 19.5 + }, + { + "datetime": "2024-10-10T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.275734703378654, + "sunAzimuth": -83.4485894065161, + "temperature": 11.8, + "relativehumidity_2m": 93, + "windspeed_10m": 17.2 + }, + { + "datetime": "2024-10-10T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 5.945826827444097, + "sunAzimuth": -71.72880701980833, + "temperature": 12.1, + "relativehumidity_2m": 95, + "windspeed_10m": 16.3 + }, + { + "datetime": "2024-10-10T09:00:00.000+02:00", + "dcPower": 8.210884526192709, + "power": 6.568707620954168, + "sunTilt": 14.541778076840487, + "sunAzimuth": -59.34793757422427, + "temperature": 12.1, + "relativehumidity_2m": 94, + "windspeed_10m": 14.7 + }, + { + "datetime": "2024-10-10T10:00:00.000+02:00", + "dcPower": 24.095319708538952, + "power": 19.276255766831163, + "sunTilt": 22.041831409435048, + "sunAzimuth": -45.7728048820313, + "temperature": 12.2, + "relativehumidity_2m": 92, + "windspeed_10m": 15 + }, + { + "datetime": "2024-10-10T11:00:00.000+02:00", + "dcPower": 44.805984641630765, + "power": 35.84478771330461, + "sunTilt": 27.885174335468335, + "sunAzimuth": -30.63663127573816, + "temperature": 12.5, + "relativehumidity_2m": 92, + "windspeed_10m": 15.7 + }, + { + "datetime": "2024-10-10T12:00:00.000+02:00", + "dcPower": 256.4594108943556, + "power": 205.16752871548448, + "sunTilt": 31.46827419380231, + "sunAzimuth": -13.972554382839954, + "temperature": 12.8, + "relativehumidity_2m": 89, + "windspeed_10m": 18.5 + }, + { + "datetime": "2024-10-10T13:00:00.000+02:00", + "dcPower": 135.73154317876075, + "power": 108.5852345430086, + "sunTilt": 32.31297830760232, + "sunAzimuth": 3.5651067967559134, + "temperature": 12.3, + "relativehumidity_2m": 91, + "windspeed_10m": 17.7 + }, + { + "datetime": "2024-10-10T14:00:00.000+02:00", + "dcPower": 357.83816763055387, + "power": 286.27053410444313, + "sunTilt": 30.29076264178465, + "sunAzimuth": 20.858636821509823, + "temperature": 13.1, + "relativehumidity_2m": 87, + "windspeed_10m": 16 + }, + { + "datetime": "2024-10-10T15:00:00.000+02:00", + "dcPower": 210.28584459785964, + "power": 168.22867567828771, + "sunTilt": 25.696518065354862, + "sunAzimuth": 36.92666158608413, + "temperature": 13.2, + "relativehumidity_2m": 86, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-10T16:00:00.000+02:00", + "dcPower": 186.22904339805515, + "power": 148.98323471844412, + "sunTilt": 19.087103602605772, + "sunAzimuth": 51.382837136526646, + "temperature": 13, + "relativehumidity_2m": 81, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-10T17:00:00.000+02:00", + "dcPower": 144.10037101001555, + "power": 115.28029680801245, + "sunTilt": 11.060531491249431, + "sunAzimuth": 64.39321702308736, + "temperature": 12.8, + "relativehumidity_2m": 75, + "windspeed_10m": 13.3 + }, + { + "datetime": "2024-10-10T18:00:00.000+02:00", + "dcPower": 97.59079650367762, + "power": 78.0726372029421, + "sunTilt": 2.1392339596675116, + "sunAzimuth": 76.4139573135511, + "temperature": 12.3, + "relativehumidity_2m": 79, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-10T19:00:00.000+02:00", + "dcPower": 17.754377568726305, + "power": 14.203502054981044, + "sunTilt": -7.240134220715796, + "sunAzimuth": 88.00936653945188, + "temperature": 11, + "relativehumidity_2m": 80, + "windspeed_10m": 7 + }, + { + "datetime": "2024-10-10T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -16.684429132286564, + "sunAzimuth": 99.79837109714164, + "temperature": 10.6, + "relativehumidity_2m": 84, + "windspeed_10m": 5.2 + }, + { + "datetime": "2024-10-10T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -25.780350237977437, + "sunAzimuth": 112.47374911967749, + "temperature": 10.1, + "relativehumidity_2m": 85, + "windspeed_10m": 4.3 + }, + { + "datetime": "2024-10-10T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -34.01656707008997, + "sunAzimuth": 126.82157256673277, + "temperature": 10.2, + "relativehumidity_2m": 84, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-10T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -40.704586491662205, + "sunAzimuth": 143.61159893587703, + "temperature": 9.8, + "relativehumidity_2m": 90, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-11T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.97491243886403, + "sunAzimuth": 163.128648637255, + "temperature": 9.3, + "relativehumidity_2m": 92, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-11T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.02467456169168, + "sunAzimuth": -175.6141848122969, + "temperature": 8.9, + "relativehumidity_2m": 94, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-11T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.61635732682025, + "sunAzimuth": -154.8336646265192, + "temperature": 8.3, + "relativehumidity_2m": 91, + "windspeed_10m": 2.9 + }, + { + "datetime": "2024-10-11T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -38.27297819203817, + "sunAzimuth": -136.37626404685486, + "temperature": 8.3, + "relativehumidity_2m": 93, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-11T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -30.877497329298222, + "sunAzimuth": -120.63744534201388, + "temperature": 8.3, + "relativehumidity_2m": 95, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-11T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -22.238894548955713, + "sunAzimuth": -107.05006215076084, + "temperature": 8.3, + "relativehumidity_2m": 98, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-11T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -12.96790216264699, + "sunAzimuth": -94.80732853145587, + "temperature": 8.3, + "relativehumidity_2m": 96, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-11T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.5276603134629134, + "sunAzimuth": -83.1591411410959, + "temperature": 7.9, + "relativehumidity_2m": 95, + "windspeed_10m": 7.8 + }, + { + "datetime": "2024-10-11T08:00:00.000+02:00", + "dcPower": 0.302792297198549, + "power": 0.24223383775883922, + "sunTilt": 5.683710585945252, + "sunAzimuth": -71.44774052199065, + "temperature": 7.5, + "relativehumidity_2m": 96, + "windspeed_10m": 6.9 + }, + { + "datetime": "2024-10-11T09:00:00.000+02:00", + "dcPower": 37.91183172590186, + "power": 30.32946538072149, + "sunTilt": 14.260824082236146, + "sunAzimuth": -59.0789120948653, + "temperature": 7.8, + "relativehumidity_2m": 93, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-11T10:00:00.000+02:00", + "dcPower": 135.3300924208186, + "power": 108.26407393665488, + "sunTilt": 21.734940400779433, + "sunAzimuth": -45.525661029390804, + "temperature": 8.1, + "relativehumidity_2m": 89, + "windspeed_10m": 8.2 + }, + { + "datetime": "2024-10-11T11:00:00.000+02:00", + "dcPower": 722.9159926052826, + "power": 578.3327940842261, + "sunTilt": 27.54875518315372, + "sunAzimuth": -30.429767533564867, + "temperature": 9, + "relativehumidity_2m": 84, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-11T12:00:00.000+02:00", + "dcPower": 761.1134305872083, + "power": 608.8907444697667, + "sunTilt": 31.105090976135774, + "sunAzimuth": -13.830431372703888, + "temperature": 9.8, + "relativehumidity_2m": 79, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-11T13:00:00.000+02:00", + "dcPower": 793.9765474576169, + "power": 635.1812379660936, + "sunTilt": 31.9332985100557, + "sunAzimuth": 3.6233914143032355, + "temperature": 10.3, + "relativehumidity_2m": 74, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-11T14:00:00.000+02:00", + "dcPower": 275.3528143308291, + "power": 220.28225146466332, + "sunTilt": 29.908639212205873, + "sunAzimuth": 20.83241114244682, + "temperature": 10.8, + "relativehumidity_2m": 71, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-11T15:00:00.000+02:00", + "dcPower": 242.57658474188835, + "power": 194.0612677935107, + "sunTilt": 25.3232617284627, + "sunAzimuth": 36.83295334168066, + "temperature": 11.1, + "relativehumidity_2m": 69, + "windspeed_10m": 4.3 + }, + { + "datetime": "2024-10-11T16:00:00.000+02:00", + "dcPower": 198.5838760223071, + "power": 158.86710081784568, + "sunTilt": 18.727781114603793, + "sunAzimuth": 51.243806920166435, + "temperature": 11.2, + "relativehumidity_2m": 68, + "windspeed_10m": 4 + }, + { + "datetime": "2024-10-11T17:00:00.000+02:00", + "dcPower": 167.6766368130286, + "power": 134.14130945042288, + "sunTilt": 10.714725694488843, + "sunAzimuth": 64.22660182758023, + "temperature": 10.9, + "relativehumidity_2m": 71, + "windspeed_10m": 4.1 + }, + { + "datetime": "2024-10-11T18:00:00.000+02:00", + "dcPower": 89.39926864717155, + "power": 71.51941491773725, + "sunTilt": 1.803206213409536, + "sunAzimuth": 76.23115674859116, + "temperature": 10.3, + "relativehumidity_2m": 77, + "windspeed_10m": 0.5 + }, + { + "datetime": "2024-10-11T19:00:00.000+02:00", + "dcPower": 18.16668170354839, + "power": 14.533345362838714, + "sunTilt": -7.571835214892863, + "sunAzimuth": 87.81749031617603, + "temperature": 9, + "relativehumidity_2m": 79, + "windspeed_10m": 1.9 + }, + { + "datetime": "2024-10-11T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -17.0181265759899, + "sunAzimuth": 99.60341073267222, + "temperature": 7.9, + "relativehumidity_2m": 83, + "windspeed_10m": 2.4 + }, + { + "datetime": "2024-10-11T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -26.122656701936815, + "sunAzimuth": 112.28457164140065, + "temperature": 7, + "relativehumidity_2m": 85, + "windspeed_10m": 2.9 + }, + { + "datetime": "2024-10-11T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -34.37321335134456, + "sunAzimuth": 126.65558045028693, + "temperature": 6.5, + "relativehumidity_2m": 86, + "windspeed_10m": 3 + }, + { + "datetime": "2024-10-11T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.07743516418665, + "sunAzimuth": 143.5011643499793, + "temperature": 6, + "relativehumidity_2m": 88, + "windspeed_10m": 3.3 + }, + { + "datetime": "2024-10-12T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.35684572865986, + "sunAzimuth": 163.11851362268473, + "temperature": 5.4, + "relativehumidity_2m": 89, + "windspeed_10m": 4.8 + }, + { + "datetime": "2024-10-12T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.397705346785955, + "sunAzimuth": -175.49580600360676, + "temperature": 5.1, + "relativehumidity_2m": 90, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-12T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.961535734103165, + "sunAzimuth": -154.60751324634, + "temperature": 4.9, + "relativehumidity_2m": 90, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-12T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -38.58320673599567, + "sunAzimuth": -136.09226665392447, + "temperature": 4.9, + "relativehumidity_2m": 91, + "windspeed_10m": 5.1 + }, + { + "datetime": "2024-10-12T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.157657336040163, + "sunAzimuth": -120.33499159290702, + "temperature": 4.9, + "relativehumidity_2m": 91, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-12T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -22.499060815350038, + "sunAzimuth": -106.7481901878237, + "temperature": 4.8, + "relativehumidity_2m": 91, + "windspeed_10m": 5 + }, + { + "datetime": "2024-10-12T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.218886384957228, + "sunAzimuth": -94.51232726794028, + "temperature": 4.6, + "relativehumidity_2m": 91, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-12T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -3.77960910849284, + "sunAzimuth": -82.87218040699524, + "temperature": 4.5, + "relativehumidity_2m": 91, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-12T08:00:00.000+02:00", + "dcPower": 0.3056636135610723, + "power": 0.24453089084885785, + "sunTilt": 5.421444806545091, + "sunAzimuth": -71.16958809655219, + "temperature": 4.7, + "relativehumidity_2m": 92, + "windspeed_10m": 6.6 + }, + { + "datetime": "2024-10-12T09:00:00.000+02:00", + "dcPower": 56.5836564374369, + "power": 45.26692514994952, + "sunTilt": 13.979744388367903, + "sunAzimuth": -58.8132832097472, + "temperature": 5.9, + "relativehumidity_2m": 90, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-12T10:00:00.000+02:00", + "dcPower": 159.33697905638047, + "power": 127.46958324510439, + "sunTilt": 21.42814200059926, + "sunAzimuth": -45.28238230412684, + "temperature": 7.3, + "relativehumidity_2m": 87, + "windspeed_10m": 9.9 + }, + { + "datetime": "2024-10-12T11:00:00.000+02:00", + "dcPower": 309.3330857887113, + "power": 247.46646863096905, + "sunTilt": 27.21286115693797, + "sunAzimuth": -30.227011858140273, + "temperature": 8.4, + "relativehumidity_2m": 87, + "windspeed_10m": 10.4 + }, + { + "datetime": "2024-10-12T12:00:00.000+02:00", + "dcPower": 698.9561093595228, + "power": 559.1648874876182, + "sunTilt": 30.743014004100917, + "sunAzimuth": -13.692125978099353, + "temperature": 10.1, + "relativehumidity_2m": 82, + "windspeed_10m": 12.3 + }, + { + "datetime": "2024-10-12T13:00:00.000+02:00", + "dcPower": 592.5273272321114, + "power": 474.0218617856891, + "sunTilt": 31.555283363449327, + "sunAzimuth": 3.6787683789403496, + "temperature": 10.6, + "relativehumidity_2m": 81, + "windspeed_10m": 12.4 + }, + { + "datetime": "2024-10-12T14:00:00.000+02:00", + "dcPower": 358.1654792118635, + "power": 286.5323833694908, + "sunTilt": 29.52856227644022, + "sunAzimuth": 20.80440880713897, + "temperature": 11.2, + "relativehumidity_2m": 80, + "windspeed_10m": 11.3 + }, + { + "datetime": "2024-10-12T15:00:00.000+02:00", + "dcPower": 315.5891511722822, + "power": 252.47132093782577, + "sunTilt": 24.95225483898691, + "sunAzimuth": 36.7383136221432, + "temperature": 11.7, + "relativehumidity_2m": 80, + "windspeed_10m": 9.7 + }, + { + "datetime": "2024-10-12T16:00:00.000+02:00", + "dcPower": 212.23365097385258, + "power": 169.78692077908207, + "sunTilt": 18.37082552430316, + "sunAzimuth": 51.10424752804786, + "temperature": 11.5, + "relativehumidity_2m": 82, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-12T17:00:00.000+02:00", + "dcPower": 139.49419269628333, + "power": 111.59535415702668, + "sunTilt": 10.371392509810583, + "sunAzimuth": 64.05951991866706, + "temperature": 11.1, + "relativehumidity_2m": 84, + "windspeed_10m": 9.4 + }, + { + "datetime": "2024-10-12T18:00:00.000+02:00", + "dcPower": 50.4747106285505, + "power": 40.3797685028404, + "sunTilt": 1.4697694157713943, + "sunAzimuth": 76.0477365277625, + "temperature": 10.5, + "relativehumidity_2m": 87, + "windspeed_10m": 8.4 + }, + { + "datetime": "2024-10-12T19:00:00.000+02:00", + "dcPower": 7.807218137175268, + "power": 6.245774509740215, + "sunTilt": -7.900822080898683, + "sunAzimuth": 87.62468730812897, + "temperature": 9.8, + "relativehumidity_2m": 90, + "windspeed_10m": 8.5 + }, + { + "datetime": "2024-10-12T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -17.349008833561726, + "sunAzimuth": 99.4070709783674, + "temperature": 9.6, + "relativehumidity_2m": 92, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-12T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -26.462114969564762, + "sunAzimuth": 112.09341375841275, + "temperature": 9.6, + "relativehumidity_2m": 92, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-12T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -34.7271125456906, + "sunAzimuth": 126.48693033734844, + "temperature": 9.7, + "relativehumidity_2m": 92, + "windspeed_10m": 8 + }, + { + "datetime": "2024-10-12T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.447828525061254, + "sunAzimuth": 143.38762883737587, + "temperature": 9.4, + "relativehumidity_2m": 94, + "windspeed_10m": 7.3 + }, + { + "datetime": "2024-10-13T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.73675190204195, + "sunAzimuth": 163.1056210331007, + "temperature": 9.3, + "relativehumidity_2m": 94, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-13T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.76906905918878, + "sunAzimuth": -175.37909348313417, + "temperature": 9.1, + "relativehumidity_2m": 94, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-13T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.30526573902631, + "sunAzimuth": -154.3822860597556, + "temperature": 9.5, + "relativehumidity_2m": 92, + "windspeed_10m": 10 + }, + { + "datetime": "2024-10-13T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -38.89221927072221, + "sunAzimuth": -135.80926949668307, + "temperature": 9.6, + "relativehumidity_2m": 90, + "windspeed_10m": 16.3 + }, + { + "datetime": "2024-10-13T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.436918053719957, + "sunAzimuth": -120.03396199414307, + "temperature": 8.8, + "relativehumidity_2m": 87, + "windspeed_10m": 18 + }, + { + "datetime": "2024-10-13T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -22.75867399010402, + "sunAzimuth": -106.44816955814555, + "temperature": 8.4, + "relativehumidity_2m": 87, + "windspeed_10m": 15.5 + }, + { + "datetime": "2024-10-13T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.469627601285604, + "sunAzimuth": -94.21955537307969, + "temperature": 7.5, + "relativehumidity_2m": 83, + "windspeed_10m": 17 + }, + { + "datetime": "2024-10-13T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.0315450153141486, + "sunAzimuth": -82.58782406375519, + "temperature": 7.2, + "relativehumidity_2m": 82, + "windspeed_10m": 16.2 + }, + { + "datetime": "2024-10-13T08:00:00.000+02:00", + "dcPower": 0.30361267330212705, + "power": 0.24289013864170164, + "sunTilt": 5.159076534957485, + "sunAzimuth": -70.89445910846419, + "temperature": 6.7, + "relativehumidity_2m": 84, + "windspeed_10m": 16.8 + }, + { + "datetime": "2024-10-13T09:00:00.000+02:00", + "dcPower": 41.66339591027437, + "power": 33.33071672821949, + "sunTilt": 13.698600583367673, + "sunAzimuth": -58.55115047580995, + "temperature": 6.9, + "relativehumidity_2m": 86, + "windspeed_10m": 15.5 + }, + { + "datetime": "2024-10-13T10:00:00.000+02:00", + "dcPower": 121.29615381863722, + "power": 97.03692305490978, + "sunTilt": 21.12151408595382, + "sunAzimuth": -45.043053146408546, + "temperature": 7.5, + "relativehumidity_2m": 83, + "windspeed_10m": 22.7 + }, + { + "datetime": "2024-10-13T11:00:00.000+02:00", + "dcPower": 247.51263219299824, + "power": 198.0101057543986, + "sunTilt": 26.877585132999467, + "sunAzimuth": -30.028428502780528, + "temperature": 8.1, + "relativehumidity_2m": 83, + "windspeed_10m": 19.5 + }, + { + "datetime": "2024-10-13T12:00:00.000+02:00", + "dcPower": 338.6846185017703, + "power": 270.9476948014162, + "sunTilt": 30.382147107830978, + "sunAzimuth": -13.557685005032592, + "temperature": 8.5, + "relativehumidity_2m": 82, + "windspeed_10m": 18.9 + }, + { + "datetime": "2024-10-13T13:00:00.000+02:00", + "dcPower": 605.5390983533022, + "power": 484.43127868264173, + "sunTilt": 31.17904416002473, + "sunAzimuth": 3.731196531846679, + "temperature": 9.4, + "relativehumidity_2m": 79, + "windspeed_10m": 19.1 + }, + { + "datetime": "2024-10-13T14:00:00.000+02:00", + "dcPower": 288.2119804513333, + "power": 230.56958436106666, + "sunTilt": 29.150649828823855, + "sunAzimuth": 20.774587486422366, + "temperature": 10.4, + "relativehumidity_2m": 75, + "windspeed_10m": 17.7 + }, + { + "datetime": "2024-10-13T15:00:00.000+02:00", + "dcPower": 265.18083697354695, + "power": 212.14466957883758, + "sunTilt": 24.583621654336596, + "sunAzimuth": 36.642703763191776, + "temperature": 10.3, + "relativehumidity_2m": 74, + "windspeed_10m": 17.6 + }, + { + "datetime": "2024-10-13T16:00:00.000+02:00", + "dcPower": 219.66624712152574, + "power": 175.7329976972206, + "sunTilt": 18.016365562424813, + "sunAzimuth": 50.96413031013026, + "temperature": 10.3, + "relativehumidity_2m": 77, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-13T17:00:00.000+02:00", + "dcPower": 163.24002688558107, + "power": 130.59202150846485, + "sunTilt": 10.030663139779685, + "sunAzimuth": 63.89195411454739, + "temperature": 9.9, + "relativehumidity_2m": 79, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-13T18:00:00.000+02:00", + "dcPower": 67.85462774565694, + "power": 54.28370219652555, + "sunTilt": 1.1390561362362333, + "sunAzimuth": 75.8636886240363, + "temperature": 9.1, + "relativehumidity_2m": 82, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-13T19:00:00.000+02:00", + "dcPower": 9.115748605658235, + "power": 7.292598884526588, + "sunTilt": -8.226960953264081, + "sunAzimuth": 87.43095436456028, + "temperature": 8.3, + "relativehumidity_2m": 87, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-13T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -17.676940156857277, + "sunAzimuth": 99.2093472034457, + "temperature": 8.1, + "relativehumidity_2m": 87, + "windspeed_10m": 6.4 + }, + { + "datetime": "2024-10-13T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -26.79858696849319, + "sunAzimuth": 111.90025906076745, + "temperature": 7.6, + "relativehumidity_2m": 90, + "windspeed_10m": 6.8 + }, + { + "datetime": "2024-10-13T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -35.0781256664598, + "sunAzimuth": 126.3155777234557, + "temperature": 7.1, + "relativehumidity_2m": 90, + "windspeed_10m": 5 + }, + { + "datetime": "2024-10-13T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -41.815632684929426, + "sunAzimuth": 143.2709019404984, + "temperature": 6.5, + "relativehumidity_2m": 91, + "windspeed_10m": 2.6 + }, + { + "datetime": "2024-10-14T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.11451301786215, + "sunAzimuth": 163.08983536166957, + "temperature": 6.3, + "relativehumidity_2m": 89, + "windspeed_10m": 2.4 + }, + { + "datetime": "2024-10-14T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.138671848584934, + "sunAzimuth": -175.2642016873541, + "temperature": 5.8, + "relativehumidity_2m": 89, + "windspeed_10m": 1.5 + }, + { + "datetime": "2024-10-14T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.647478099904184, + "sunAzimuth": -154.15814092455744, + "temperature": 5.3, + "relativehumidity_2m": 90, + "windspeed_10m": 4 + }, + { + "datetime": "2024-10-14T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.1999672120048, + "sunAzimuth": -135.52742842855076, + "temperature": 4.5, + "relativehumidity_2m": 93, + "windspeed_10m": 1.5 + }, + { + "datetime": "2024-10-14T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.715244466780028, + "sunAzimuth": -119.73450334119632, + "temperature": 4, + "relativehumidity_2m": 94, + "windspeed_10m": 4.5 + }, + { + "datetime": "2024-10-14T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.01770469074795, + "sunAzimuth": -106.15013533780943, + "temperature": 3.8, + "relativehumidity_2m": 94, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-14T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.720095220219516, + "sunAzimuth": -93.92913753819082, + "temperature": 4.2, + "relativehumidity_2m": 94, + "windspeed_10m": 5.8 + }, + { + "datetime": "2024-10-14T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.283430715645694, + "sunAzimuth": -82.30618839226909, + "temperature": 4.7, + "relativehumidity_2m": 94, + "windspeed_10m": 4.7 + }, + { + "datetime": "2024-10-14T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.896654311121907, + "sunAzimuth": -70.62246187023919, + "temperature": 5.1, + "relativehumidity_2m": 93, + "windspeed_10m": 4.3 + }, + { + "datetime": "2024-10-14T09:00:00.000+02:00", + "dcPower": 37.995807256660015, + "power": 30.396645805328014, + "sunTilt": 13.417455844515738, + "sunAzimuth": -58.29261188464403, + "temperature": 5.6, + "relativehumidity_2m": 92, + "windspeed_10m": 3.8 + }, + { + "datetime": "2024-10-14T10:00:00.000+02:00", + "dcPower": 116.02924326198367, + "power": 92.82339460958694, + "sunTilt": 20.815136015137117, + "sunAzimuth": -44.807755986987566, + "temperature": 6.7, + "relativehumidity_2m": 87, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-14T11:00:00.000+02:00", + "dcPower": 180.41800188431606, + "power": 144.33440150745284, + "sunTilt": 26.543021174019792, + "sunAzimuth": -29.83407952105961, + "temperature": 7.5, + "relativehumidity_2m": 85, + "windspeed_10m": 10.1 + }, + { + "datetime": "2024-10-14T12:00:00.000+02:00", + "dcPower": 155.60694186631315, + "power": 124.48555349305053, + "sunTilt": 30.022594925866507, + "sunAzimuth": -13.427153142476177, + "temperature": 7.8, + "relativehumidity_2m": 87, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-14T13:00:00.000+02:00", + "dcPower": 216.81729696297057, + "power": 173.45383757037646, + "sunTilt": 30.804692641790414, + "sunAzimuth": 3.780636799023051, + "temperature": 8.7, + "relativehumidity_2m": 84, + "windspeed_10m": 9.4 + }, + { + "datetime": "2024-10-14T14:00:00.000+02:00", + "dcPower": 218.6247681364855, + "power": 174.89981450918842, + "sunTilt": 28.775019978770835, + "sunAzimuth": 20.742907009369926, + "temperature": 8.8, + "relativehumidity_2m": 83, + "windspeed_10m": 7.7 + }, + { + "datetime": "2024-10-14T15:00:00.000+02:00", + "dcPower": 200.945630471392, + "power": 160.75650437711363, + "sunTilt": 24.217486258022436, + "sunAzimuth": 36.546087194880954, + "temperature": 8.8, + "relativehumidity_2m": 85, + "windspeed_10m": 6.5 + }, + { + "datetime": "2024-10-14T16:00:00.000+02:00", + "dcPower": 168.57441974497019, + "power": 134.85953579597614, + "sunTilt": 17.664529576020236, + "sunAzimuth": 50.82342857831685, + "temperature": 8.7, + "relativehumidity_2m": 88, + "windspeed_10m": 5.2 + }, + { + "datetime": "2024-10-14T17:00:00.000+02:00", + "dcPower": 116.8428850480738, + "power": 93.47430803845904, + "sunTilt": 9.692668263612882, + "sunAzimuth": 63.7238891712367, + "temperature": 8.4, + "relativehumidity_2m": 90, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-14T18:00:00.000+02:00", + "dcPower": 54.17222871388804, + "power": 43.337782971110435, + "sunTilt": 0.8111983279457368, + "sunAzimuth": 75.67900710147994, + "temperature": 8.2, + "relativehumidity_2m": 91, + "windspeed_10m": 1.8 + }, + { + "datetime": "2024-10-14T19:00:00.000+02:00", + "dcPower": 9.066031160044716, + "power": 7.252824928035773, + "sunTilt": -8.5501186243532, + "sunAzimuth": 87.23629074336492, + "temperature": 7.9, + "relativehumidity_2m": 93, + "windspeed_10m": 0.4 + }, + { + "datetime": "2024-10-14T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.00178541748869, + "sunAzimuth": 99.01023762777291, + "temperature": 7.4, + "relativehumidity_2m": 94, + "windspeed_10m": 1.1 + }, + { + "datetime": "2024-10-14T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -27.131935065748255, + "sunAzimuth": 111.70509440468732, + "temperature": 6.7, + "relativehumidity_2m": 96, + "windspeed_10m": 1.1 + }, + { + "datetime": "2024-10-14T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -35.426113802819536, + "sunAzimuth": 126.14148133580082, + "temperature": 5.8, + "relativehumidity_2m": 98, + "windspeed_10m": 0.4 + }, + { + "datetime": "2024-10-14T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.180713378529184, + "sunAzimuth": 143.15089515757862, + "temperature": 5, + "relativehumidity_2m": 100, + "windspeed_10m": 0.7 + }, + { + "datetime": "2024-10-15T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.49001057641694, + "sunAzimuth": 163.07102046565072, + "temperature": 4.3, + "relativehumidity_2m": 100, + "windspeed_10m": 1.4 + }, + { + "datetime": "2024-10-15T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.506419588733614, + "sunAzimuth": -175.15128768425117, + "temperature": 3.8, + "relativehumidity_2m": 100, + "windspeed_10m": 1.9 + }, + { + "datetime": "2024-10-15T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -44.988103658491234, + "sunAzimuth": -153.9352385869432, + "temperature": 3.2, + "relativehumidity_2m": 100, + "windspeed_10m": 2.6 + }, + { + "datetime": "2024-10-15T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.50640211284843, + "sunAzimuth": -135.24690137263536, + "temperature": 2.4, + "relativehumidity_2m": 100, + "windspeed_10m": 2.9 + }, + { + "datetime": "2024-10-15T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -31.992601433814595, + "sunAzimuth": -119.43676351875516, + "temperature": 1.6, + "relativehumidity_2m": 100, + "windspeed_10m": 3.2 + }, + { + "datetime": "2024-10-15T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.276123004228086, + "sunAzimuth": -105.85422295783262, + "temperature": 1.2, + "relativehumidity_2m": 100, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-15T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -13.970257710966642, + "sunAzimuth": -93.64119828341282, + "temperature": 1.2, + "relativehumidity_2m": 100, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-15T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.5352276078301, + "sunAzimuth": -82.02738904900566, + "temperature": 1.6, + "relativehumidity_2m": 100, + "windspeed_10m": 3.6 + }, + { + "datetime": "2024-10-15T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.63422819396966, + "sunAzimuth": -70.35370359566531, + "temperature": 2.3, + "relativehumidity_2m": 100, + "windspeed_10m": 4 + }, + { + "datetime": "2024-10-15T09:00:00.000+02:00", + "dcPower": 47.164824265677275, + "power": 37.73185941254182, + "sunTilt": 13.136374944499462, + "sunAzimuth": -58.037763824819606, + "temperature": 3.4, + "relativehumidity_2m": 98, + "windspeed_10m": 5 + }, + { + "datetime": "2024-10-15T10:00:00.000+02:00", + "dcPower": 133.5723417231025, + "power": 106.85787337848201, + "sunTilt": 20.50908861823578, + "sunAzimuth": -44.57657122307415, + "temperature": 4.8, + "relativehumidity_2m": 94, + "windspeed_10m": 6.2 + }, + { + "datetime": "2024-10-15T11:00:00.000+02:00", + "dcPower": 563.2310951818382, + "power": 450.5848761454706, + "sunTilt": 26.20926450679345, + "sunAzimuth": -29.644024765315514, + "temperature": 6.3, + "relativehumidity_2m": 91, + "windspeed_10m": 7.8 + }, + { + "datetime": "2024-10-15T12:00:00.000+02:00", + "dcPower": 781.5834949272705, + "power": 625.2667959418164, + "sunTilt": 29.66446288060627, + "sunAzimuth": -13.300572957692536, + "temperature": 8, + "relativehumidity_2m": 88, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-15T13:00:00.000+02:00", + "dcPower": 1002.397172852398, + "power": 801.9177382819184, + "sunTilt": 30.43234097439692, + "sunAzimuth": 3.8270522061418095, + "temperature": 9.7, + "relativehumidity_2m": 84, + "windspeed_10m": 10.9 + }, + { + "datetime": "2024-10-15T14:00:00.000+02:00", + "dcPower": 241.9896564816097, + "power": 193.59172518528777, + "sunTilt": 28.401790922595836, + "sunAzimuth": 20.709329389098386, + "temperature": 10.8, + "relativehumidity_2m": 82, + "windspeed_10m": 11.9 + }, + { + "datetime": "2024-10-15T15:00:00.000+02:00", + "dcPower": 222.3817911463646, + "power": 177.9054329170917, + "sunTilt": 23.853972526435296, + "sunAzimuth": 36.448429487078144, + "temperature": 11.2, + "relativehumidity_2m": 81, + "windspeed_10m": 11.9 + }, + { + "datetime": "2024-10-15T16:00:00.000+02:00", + "dcPower": 188.86845125050397, + "power": 151.09476100040317, + "sunTilt": 17.315445485866938, + "sunAzimuth": 50.682117672382816, + "temperature": 11, + "relativehumidity_2m": 81, + "windspeed_10m": 11 + }, + { + "datetime": "2024-10-15T17:00:00.000+02:00", + "dcPower": 139.12806007081542, + "power": 111.30244805665234, + "sunTilt": 9.35753798215806, + "sunAzimuth": 63.55531186506398, + "temperature": 10.6, + "relativehumidity_2m": 82, + "windspeed_10m": 11.1 + }, + { + "datetime": "2024-10-15T18:00:00.000+02:00", + "dcPower": 74.93247651101706, + "power": 59.94598120881365, + "sunTilt": 0.48632726290863104, + "sunAzimuth": 75.49368820866877, + "temperature": 9.7, + "relativehumidity_2m": 85, + "windspeed_10m": 12.1 + }, + { + "datetime": "2024-10-15T19:00:00.000+02:00", + "dcPower": 15.878086979814217, + "power": 12.702469583851375, + "sunTilt": -8.870162619560801, + "sunAzimuth": 87.04069822248259, + "temperature": 8.5, + "relativehumidity_2m": 88, + "windspeed_10m": 13.6 + }, + { + "datetime": "2024-10-15T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.323410184499085, + "sunAzimuth": 98.80974345652376, + "temperature": 7.6, + "relativehumidity_2m": 91, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-15T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -27.462022150796383, + "sunAzimuth": 111.50791010170794, + "temperature": 7.2, + "relativehumidity_2m": 91, + "windspeed_10m": 13.9 + }, + { + "datetime": "2024-10-15T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -35.770938188604354, + "sunAzimuth": 125.96460338334036, + "temperature": 7, + "relativehumidity_2m": 91, + "windspeed_10m": 12.9 + }, + { + "datetime": "2024-10-15T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.54293600102064, + "sunAzimuth": 143.02752222319543, + "temperature": 6.8, + "relativehumidity_2m": 89, + "windspeed_10m": 12.7 + }, + { + "datetime": "2024-10-16T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -46.86312551477473, + "sunAzimuth": 163.04903976266138, + "temperature": 6.7, + "relativehumidity_2m": 86, + "windspeed_10m": 13.8 + }, + { + "datetime": "2024-10-16T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.87221785059982, + "sunAzimuth": -175.04051110279474, + "temperature": 6.8, + "relativehumidity_2m": 83, + "windspeed_10m": 15.6 + }, + { + "datetime": "2024-10-16T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.32707330350441, + "sunAzimuth": -153.71374265034802, + "temperature": 6.8, + "relativehumidity_2m": 80, + "windspeed_10m": 16.5 + }, + { + "datetime": "2024-10-16T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -39.81147561550361, + "sunAzimuth": -134.96784827714956, + "temperature": 7, + "relativehumidity_2m": 78, + "windspeed_10m": 16.1 + }, + { + "datetime": "2024-10-16T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.26895363243685, + "sunAzimuth": -119.1408914506387, + "temperature": 7.3, + "relativehumidity_2m": 77, + "windspeed_10m": 15.1 + }, + { + "datetime": "2024-10-16T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.53389843309148, + "sunAzimuth": -105.56056815727264, + "temperature": 7.4, + "relativehumidity_2m": 75, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-16T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -14.220082554609817, + "sunAzimuth": -93.355861910257, + "temperature": 7.4, + "relativehumidity_2m": 73, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-16T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -4.786895768698711, + "sunAzimuth": -81.75154101774274, + "temperature": 7.3, + "relativehumidity_2m": 71, + "windspeed_10m": 14.7 + }, + { + "datetime": "2024-10-16T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.371849783596975, + "sunAzimuth": -70.08829035405888, + "temperature": 7.2, + "relativehumidity_2m": 70, + "windspeed_10m": 14.8 + }, + { + "datetime": "2024-10-16T09:00:00.000+02:00", + "dcPower": 35.08288202776703, + "power": 28.066305622213623, + "sunTilt": 12.855424254104108, + "sunAzimuth": -57.78670104663053, + "temperature": 9.8, + "relativehumidity_2m": 72, + "windspeed_10m": 17 + }, + { + "datetime": "2024-10-16T10:00:00.000+02:00", + "dcPower": 101.57338329220217, + "power": 81.25870663376173, + "sunTilt": 20.203454185088123, + "sunAzimuth": -44.34957719582011, + "temperature": 10.2, + "relativehumidity_2m": 75, + "windspeed_10m": 16.5 + }, + { + "datetime": "2024-10-16T11:00:00.000+02:00", + "dcPower": 349.42380002507434, + "power": 279.5390400200595, + "sunTilt": 25.87641150088954, + "sunAzimuth": -29.45832187587005, + "temperature": 10.7, + "relativehumidity_2m": 77, + "windspeed_10m": 16.2 + }, + { + "datetime": "2024-10-16T12:00:00.000+02:00", + "dcPower": 494.1678347786919, + "power": 395.3342678229535, + "sunTilt": 29.30785715204484, + "sunAzimuth": -13.177984892004138, + "temperature": 11.6, + "relativehumidity_2m": 77, + "windspeed_10m": 15.7 + }, + { + "datetime": "2024-10-16T13:00:00.000+02:00", + "dcPower": 639.0240315979279, + "power": 511.2192252783423, + "sunTilt": 30.062101719417093, + "sunAzimuth": 3.870407893111919, + "temperature": 12.5, + "relativehumidity_2m": 75, + "windspeed_10m": 15.3 + }, + { + "datetime": "2024-10-16T14:00:00.000+02:00", + "dcPower": 277.7856212217981, + "power": 222.2284969774385, + "sunTilt": 28.03108091352568, + "sunAzimuth": 20.673818848950724, + "temperature": 13.2, + "relativehumidity_2m": 75, + "windspeed_10m": 14.8 + }, + { + "datetime": "2024-10-16T15:00:00.000+02:00", + "dcPower": 252.83380974430276, + "power": 202.2670477954422, + "sunTilt": 23.49320409080551, + "sunAzimuth": 36.34969840216598, + "temperature": 13.5, + "relativehumidity_2m": 77, + "windspeed_10m": 14.3 + }, + { + "datetime": "2024-10-16T16:00:00.000+02:00", + "dcPower": 198.08712950041433, + "power": 158.46970360033148, + "sunTilt": 16.969240740198778, + "sunAzimuth": 50.54017502787197, + "temperature": 13.5, + "relativehumidity_2m": 80, + "windspeed_10m": 13.7 + }, + { + "datetime": "2024-10-16T17:00:00.000+02:00", + "dcPower": 134.9942461001432, + "power": 107.99539688011455, + "sunTilt": 9.025401762418719, + "sunAzimuth": 63.386211071389155, + "temperature": 13.3, + "relativehumidity_2m": 82, + "windspeed_10m": 13.2 + }, + { + "datetime": "2024-10-16T18:00:00.000+02:00", + "dcPower": 66.70716275854775, + "power": 53.36573020683821, + "sunTilt": 0.16457346744538273, + "sunAzimuth": 75.30773046735078, + "temperature": 13, + "relativehumidity_2m": 82, + "windspeed_10m": 13 + }, + { + "datetime": "2024-10-16T19:00:00.000+02:00", + "dcPower": 13.56117696026841, + "power": 10.848941568214729, + "sunTilt": -9.186961271997145, + "sunAzimuth": 86.84418120594421, + "temperature": 12.6, + "relativehumidity_2m": 81, + "windspeed_10m": 12.7 + }, + { + "datetime": "2024-10-16T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.64168080965683, + "sunAzimuth": 98.60786901950698, + "temperature": 12.2, + "relativehumidity_2m": 80, + "windspeed_10m": 12.2 + }, + { + "datetime": "2024-10-16T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -27.788711717705176, + "sunAzimuth": 111.30870010109864, + "temperature": 12, + "relativehumidity_2m": 80, + "windspeed_10m": 11.8 + }, + { + "datetime": "2024-10-16T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -36.112460277357016, + "sunAzimuth": 125.78490981561183, + "temperature": 11.8, + "relativehumidity_2m": 81, + "windspeed_10m": 11 + }, + { + "datetime": "2024-10-16T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -42.9021656490531, + "sunAzimuth": 142.90069940402603, + "temperature": 11.7, + "relativehumidity_2m": 82, + "windspeed_10m": 10.2 + }, + { + "datetime": "2024-10-17T00:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -47.23373820466217, + "sunAzimuth": 163.02375644913673, + "temperature": 11.7, + "relativehumidity_2m": 82, + "windspeed_10m": 9.4 + }, + { + "datetime": "2024-10-17T01:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -48.2359718752176, + "sunAzimuth": -174.9320340577077, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 8.6 + }, + { + "datetime": "2024-10-17T02:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -45.66431793404074, + "sunAzimuth": -153.4938195445769, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 8.2 + }, + { + "datetime": "2024-10-17T03:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -40.115139405653565, + "sunAzimuth": -134.69043107615582, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-17T04:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -32.54426550294801, + "sunAzimuth": -118.84703704658551, + "temperature": 11.8, + "relativehumidity_2m": 82, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-17T05:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -23.79099983796868, + "sunAzimuth": -105.2693069294498, + "temperature": 11.7, + "relativehumidity_2m": 82, + "windspeed_10m": 7.6 + }, + { + "datetime": "2024-10-17T06:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -14.469536195186127, + "sunAzimuth": -93.07325245162968, + "temperature": 11.6, + "relativehumidity_2m": 82, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-17T07:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -5.038393916921545, + "sunAzimuth": -81.47875856041325, + "temperature": 11.4, + "relativehumidity_2m": 83, + "windspeed_10m": 7.3 + }, + { + "datetime": "2024-10-17T08:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": 4.109572239802723, + "sunAzimuth": -69.8263270263417, + "temperature": 11.5, + "relativehumidity_2m": 83, + "windspeed_10m": 7.4 + }, + { + "datetime": "2024-10-17T09:00:00.000+02:00", + "dcPower": 31.67872965996608, + "power": 25.342983727972864, + "sunTilt": 12.574671747325786, + "sunAzimuth": -57.53951661964237, + "temperature": 11.9, + "relativehumidity_2m": 83, + "windspeed_10m": 8 + }, + { + "datetime": "2024-10-17T10:00:00.000+02:00", + "dcPower": 94.35489246212374, + "power": 75.483913969699, + "sunTilt": 19.89831645004539, + "sunAzimuth": -44.1268501705138, + "temperature": 12.5, + "relativehumidity_2m": 82, + "windspeed_10m": 9.7 + }, + { + "datetime": "2024-10-17T11:00:00.000+02:00", + "dcPower": 271.1188829478831, + "power": 216.8951063583065, + "sunTilt": 25.54455964459646, + "sunAzimuth": -29.277026273264024, + "temperature": 13.1, + "relativehumidity_2m": 82, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-17T12:00:00.000+02:00", + "dcPower": 309.5618220679901, + "power": 247.64945765439208, + "sunTilt": 28.952884649607554, + "sunAzimuth": -13.059427258390235, + "temperature": 13.5, + "relativehumidity_2m": 83, + "windspeed_10m": 10.7 + }, + { + "datetime": "2024-10-17T13:00:00.000+02:00", + "dcPower": 219.1359929657014, + "power": 175.30879437256112, + "sunTilt": 29.694087805098004, + "sunAzimuth": 3.9106711264578404, + "temperature": 13.8, + "relativehumidity_2m": 85, + "windspeed_10m": 10.8 + }, + { + "datetime": "2024-10-17T14:00:00.000+02:00", + "dcPower": 228.55502409292535, + "power": 182.8440192743403, + "sunTilt": 27.663008228484166, + "sunAzimuth": 20.63634185579284, + "temperature": 14.2, + "relativehumidity_2m": 86, + "windspeed_10m": 10.5 + }, + { + "datetime": "2024-10-17T15:00:00.000+02:00", + "dcPower": 218.107673955093, + "power": 174.48613916407442, + "sunTilt": 23.13530429931852, + "sunAzimuth": 36.24986394147597, + "temperature": 14.6, + "relativehumidity_2m": 87, + "windspeed_10m": 9.8 + }, + { + "datetime": "2024-10-17T16:00:00.000+02:00", + "dcPower": 187.6762781627061, + "power": 150.1410225301649, + "sunTilt": 16.626042266391202, + "sunAzimuth": 50.39758024284303, + "temperature": 14.9, + "relativehumidity_2m": 88, + "windspeed_10m": 9.2 + }, + { + "datetime": "2024-10-17T17:00:00.000+02:00", + "dcPower": 135.3327891382026, + "power": 108.26623131056209, + "sunTilt": 8.696388379725821, + "sunAzimuth": 63.21657784217465, + "temperature": 15.1, + "relativehumidity_2m": 89, + "windspeed_10m": 8.7 + }, + { + "datetime": "2024-10-17T18:00:00.000+02:00", + "dcPower": 66.58720027019501, + "power": 53.269760216156016, + "sunTilt": -0.15393334821361332, + "sunAzimuth": 75.12113476396313, + "temperature": 14.9, + "relativehumidity_2m": 90, + "windspeed_10m": 7.9 + }, + { + "datetime": "2024-10-17T19:00:00.000+02:00", + "dcPower": 11.87138687150887, + "power": 9.497109497207097, + "sunTilt": -9.500383797971471, + "sunAzimuth": 86.64674682587622, + "temperature": 14.6, + "relativehumidity_2m": 92, + "windspeed_10m": 6.7 + }, + { + "datetime": "2024-10-17T20:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -18.956464510241965, + "sunAzimuth": 98.40462190157557, + "temperature": 14.3, + "relativehumidity_2m": 93, + "windspeed_10m": 5.9 + }, + { + "datetime": "2024-10-17T21:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -28.11186795253563, + "sunAzimuth": 111.10746217430679, + "temperature": 14.2, + "relativehumidity_2m": 94, + "windspeed_10m": 5.4 + }, + { + "datetime": "2024-10-17T22:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -36.45054181856139, + "sunAzimuth": 125.60237057929713, + "temperature": 14.2, + "relativehumidity_2m": 94, + "windspeed_10m": 4.6 + }, + { + "datetime": "2024-10-17T23:00:00.000+02:00", + "dcPower": 0, + "power": 0, + "sunTilt": -43.2582671659911, + "sunAzimuth": 142.77034580724174, + "temperature": 14.2, + "relativehumidity_2m": 95, + "windspeed_10m": 4.4 + } + ] + ] +} From 05ed5ab8364b2048477dd92d334eae680ebbebc8 Mon Sep 17 00:00:00 2001 From: Dominique Lasserre Date: Mon, 30 Dec 2024 23:46:20 +0100 Subject: [PATCH 39/47] Update README.md (#303) - Development on feature/config-overhaul --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 8af5f4b..beca07a 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,9 @@ This project provides a comprehensive solution for simulating and optimizing an ## Getting Involved +> [!NOTE] +> Development is currently done in the feature-Branch `feature/config-overhaul`. If you want to provide PRs, please use that branch as base. +> See [CONTRIBUTING.md](CONTRIBUTING.md). ## Installation From ee75670713f8b03030eed4c3e840e0a13e2c493b Mon Sep 17 00:00:00 2001 From: Normann Date: Tue, 31 Dec 2024 15:58:10 +0100 Subject: [PATCH 40/47] temp. skip test_server (#311) * temp. skip test_server --- tests/test_server.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_server.py b/tests/test_server.py index 5ec4758..026b113 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -1,6 +1,7 @@ from http import HTTPStatus from pathlib import Path +import pytest import requests from akkudoktoreos.config import CONFIG_FILE_NAME, load_config @@ -17,6 +18,7 @@ def test_fixture_setup(server, tmp_path: Path) -> None: def test_server(server, tmp_path: Path): """Test the server.""" + pytest.skip() # temp skip test until 01.01.24 result = requests.get(f"{server}/gesamtlast_simple?year_energy=2000&") assert result.status_code == HTTPStatus.OK From 19c1f44f09209d1b963ed898261144483657a8c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Dec 2024 16:26:01 +0100 Subject: [PATCH 41/47] Bump mypy from 1.13.0 to 1.14.1 (#306) Bumps [mypy](https://github.com/python/mypy) from 1.13.0 to 1.14.1. - [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md) - [Commits](https://github.com/python/mypy/compare/v1.13.0...v1.14.1) --- updated-dependencies: - dependency-name: mypy dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 4a98ca2..b0c8ae7 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -8,6 +8,6 @@ pytest==8.3.4 pytest-cov==6.0.0 pytest-xprocess==1.0.2 pre-commit -mypy==1.13.0 +mypy==1.14.1 types-requests==2.32.0.20241016 pandas-stubs==2.2.3.241126 From 25b174952d2772c98fb0294f3a7d99101ba3645a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Dec 2024 16:27:31 +0100 Subject: [PATCH 42/47] Bump numpy from 2.2.0 to 2.2.1 (#305) Bumps [numpy](https://github.com/numpy/numpy) from 2.2.0 to 2.2.1. - [Release notes](https://github.com/numpy/numpy/releases) - [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst) - [Commits](https://github.com/numpy/numpy/compare/v2.2.0...v2.2.1) --- updated-dependencies: - dependency-name: numpy dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 8716274..d086559 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -numpy==2.2.0 +numpy==2.2.1 matplotlib==3.10.0 fastapi[standard]==0.115.6 uvicorn==0.34.0 From 9dda128cafd43cece53d64ae0afa644f041b4a9d Mon Sep 17 00:00:00 2001 From: Normann Date: Wed, 1 Jan 2025 12:28:19 +0100 Subject: [PATCH 43/47] remove temp. test skip (#313) --- tests/test_server.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_server.py b/tests/test_server.py index 026b113..5ec4758 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -1,7 +1,6 @@ from http import HTTPStatus from pathlib import Path -import pytest import requests from akkudoktoreos.config import CONFIG_FILE_NAME, load_config @@ -18,7 +17,6 @@ def test_fixture_setup(server, tmp_path: Path) -> None: def test_server(server, tmp_path: Path): """Test the server.""" - pytest.skip() # temp skip test until 01.01.24 result = requests.get(f"{server}/gesamtlast_simple?year_energy=2000&") assert result.status_code == HTTPStatus.OK From 36916f71b42f622b3e87760045b2f191ded4aa8d Mon Sep 17 00:00:00 2001 From: wenzul Date: Wed, 1 Jan 2025 12:33:39 +0100 Subject: [PATCH 44/47] Change required python version to 3.10 (#297) --- README.md | 11 ++++++++--- pyproject.toml | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index beca07a..1a8e33b 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md). ## Installation -The project requires Python 3.9 or newer. Currently there are no official packages or images published. +The project requires Python 3.10 or newer. Currently there are no official packages or images published. Following sections describe how to locally start the EOS server on `http://localhost:8503`. @@ -20,12 +20,14 @@ Following sections describe how to locally start the EOS server on `http://local Install dependencies in virtual environment: Linux: + ```bash python -m venv .venv .venv/bin/pip install -r requirements.txt ``` Windows: + ```bash python -m venv .venv .venv\Scripts\pip install -r requirements.txt @@ -34,13 +36,17 @@ python -m venv .venv Finally, start EOS fastapi server: Linux: + ```bash .venv/bin/fastapi run --port 8503 src/akkudoktoreos/server/fastapi_server.py ``` + Windows: + ``` .venv\Scripts\fastapi run --port 8503 src/akkudoktoreos/server/fastapi_server.py ``` + ### Docker ```bash @@ -92,7 +98,6 @@ Each class is designed to be easily customized and extended to integrate additio See the Swagger API documentation for detailed information: [EOS OpenAPI Spec](https://petstore3.swagger.io/?url=https://raw.githubusercontent.com/Akkudoktor-EOS/EOS/refs/heads/main/docs/akkudoktoreos/openapi.json) - ## Further resources - - [Installation guide (de)](https://meintechblog.de/2024/09/05/andreas-schmitz-joerg-installiert-mein-energieoptimierungssystem/) +- [Installation guide (de)](https://meintechblog.de/2024/09/05/andreas-schmitz-joerg-installiert-mein-energieoptimierungssystem/) diff --git a/pyproject.toml b/pyproject.toml index ae32262..9ec4d66 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ authors = [ description = "This project provides a comprehensive solution for simulating and optimizing an energy system based on renewable energy sources. With a focus on photovoltaic (PV) systems, battery storage (batteries), load management (consumer requirements), heat pumps, electric vehicles, and consideration of electricity price data, this system enables forecasting and optimization of energy flow and costs over a specified period." readme = "README.md" license = {file = "LICENSE"} -requires-python = ">=3.9" +requires-python = ">=3.10" classifiers = [ "Development Status :: 3 - Alpha", "Programming Language :: Python :: 3", From d695e08bd0549e410d63e8ed4f00990904fe3575 Mon Sep 17 00:00:00 2001 From: Normann Date: Wed, 1 Jan 2025 18:44:26 +0100 Subject: [PATCH 45/47] filepath fix for load_forecast main function (#322) --- src/akkudoktoreos/prediction/load_forecast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/akkudoktoreos/prediction/load_forecast.py b/src/akkudoktoreos/prediction/load_forecast.py index af29851..000c766 100644 --- a/src/akkudoktoreos/prediction/load_forecast.py +++ b/src/akkudoktoreos/prediction/load_forecast.py @@ -92,7 +92,7 @@ class LoadForecast: # Example usage of the class if __name__ == "__main__": - filepath = r"..\data\load_profiles.npz" # Adjust the path to the .npz file + filepath = Path(__file__).parent.parent / "data" / "load_profiles.npz" lf = LoadForecast(filepath=filepath, year_energy=2000) specific_date_prices = lf.get_daily_stats("2024-02-16") # Adjust date as needed specific_hour_stats = lf.get_hourly_stats("2024-02-16", 12) # Adjust date and hour as needed From 64e62022e28f9e61d3c5b7154479da9e65e217dc Mon Sep 17 00:00:00 2001 From: Dominique Lasserre Date: Sat, 4 Jan 2025 00:42:19 +0100 Subject: [PATCH 46/47] Update regular_grid_interpolator.pkl to scipy 1.15 Closes #335 (#336) --- .../data/regular_grid_interpolator.pkl | Bin 57706 -> 57718 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/akkudoktoreos/data/regular_grid_interpolator.pkl b/src/akkudoktoreos/data/regular_grid_interpolator.pkl index 005b2ddd97291ae11ca15bd797f13c106ba267cf..91a1601a9d9a003b9e03a5a8b181de5453894cd1 100644 GIT binary patch delta 42 ycmaELi22(gW|jt)so4`*syW2+N^=V;_2M_SJ$%5|!yaE;kdv90I>oOvNe=*gr4dm8 delta 30 mcmex%i22naW|jt)sqqt8s@X;JN^=V;^)|LYe860qqz3@TAPjo| From eabc2a795a92e36ce5a423f682efce7ab8d366f2 Mon Sep 17 00:00:00 2001 From: Dominique Lasserre Date: Sat, 4 Jan 2025 01:24:37 +0100 Subject: [PATCH 47/47] workflow: docker-build upload to DockerHub (#318) * workflow: docker-build upload to DockerHub - Upload on release, tag, push to main. - Build on pr to main (amd64 only). * docker: temporarily disable read-only container Closes #278 - Update documentation. - Temporarily set akkudoktor/eos:main in compose.yml (with releases/tags it should be replaced by latest again) --- .env | 2 +- .github/workflows/docker-build.yml | 159 ++++++++++++++++++++++------- README.md | 4 +- docker-compose.yaml | 2 +- 4 files changed, 125 insertions(+), 42 deletions(-) diff --git a/.env b/.env index 55fd2f0..5b21faf 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ -EOS_VERSION=latest +EOS_VERSION=main EOS_PORT=8503 PYTHON_VERSION=3.12.6 diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index fac6f43..ff588bc 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -1,27 +1,53 @@ name: docker-build on: - release: - types: [published] + # pipeline runs per trigger condition, so release trigger not required as tag is sufficient + #release: + # types: [published] + push: + branches: + - 'main' + - 'feature/config-overhaul' + tags: + - 'v*' + pull_request: + branches: + - 'main' + - 'feature/config-overhaul' env: - REGISTRY: ghcr.io + DOCKERHUB_REPO: akkudoktor/eos + GHCR_REPO: ghcr.io/akkudoktor-eos/eos + EOS_LICENSE: Apache-2.0 +# From https://docs.docker.com/build/ci/github-actions/multi-platform/ +# Changes: +# - adjusted rw permissions +# - manually set undetected license (label+annotation) +# - set description for index manifest +# - add attestation +# - conditionally don't push on pr +# - on pr just use amd64 platform jobs: - variables: + # Build platform matrix excludes. if-conditional with matrix on job level is not + # supported, see https://github.com/actions/runner/issues/1985 + platform-excludes: + runs-on: ubuntu-latest outputs: - repository: ${{ steps.var.outputs.repository}} - runs-on: "ubuntu-latest" + excludes: ${{ steps.excludes.outputs.matrix }} steps: - - name: Setting global variables - uses: actions/github-script@v6 - id: var - with: - script: | - core.setOutput('repository', '${{ github.repository }}'.toLowerCase()); + - id: excludes + run: | + if ${{ github.event_name == 'pull_request' }}; then + echo 'matrix=[ + {"platform": "linux/arm64"} + ]' | tr -d '[:space:]' >> $GITHUB_OUTPUT + else + echo 'matrix=[]' >> $GITHUB_OUTPUT + fi + build: - needs: - - variables + needs: platform-excludes runs-on: ubuntu-latest permissions: contents: read @@ -34,6 +60,7 @@ jobs: platform: - linux/amd64 - linux/arm64 + exclude: ${{ fromJSON(needs.platform-excludes.outputs.excludes) }} steps: - name: Prepare run: | @@ -44,7 +71,34 @@ jobs: id: meta uses: docker/metadata-action@v5 with: - images: "${{ env.REGISTRY }}/${{ needs.variables.outputs.repository }}" + images: | + ${{ env.DOCKERHUB_REPO }} + ${{ env.GHCR_REPO }} + labels: | + org.opencontainers.image.licenses=${{ env.EOS_LICENSE }} + annotations: | + org.opencontainers.image.licenses=${{ env.EOS_LICENSE }} + env: + DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index + + # Prepare to extract description so it can be manually set for index manifest (group of platform manifests) + - name: Prepare description + id: get_description + run: | + echo "EOS_REPO_DESCRIPTION=$(jq -cr '.labels."org.opencontainers.image.description"' <<< "$DOCKER_METADATA_OUTPUT_JSON")" >> $GITHUB_ENV + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - name: Set up QEMU uses: docker/setup-qemu-action@v3 @@ -52,27 +106,29 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Login to GitHub - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Build and push by digest id: build uses: docker/build-push-action@v6 with: platforms: ${{ matrix.platform }} labels: ${{ steps.meta.outputs.labels }} - outputs: type=image,name=${{ env.REGISTRY }}/${{ needs.variables.outputs.repository }},push-by-digest=true,name-canonical=true,push=true + annotations: ${{ steps.meta.outputs.annotations }} + outputs: type=image,"name=${{ env.DOCKERHUB_REPO }},${{ env.GHCR_REPO }}",push-by-digest=true,name-canonical=true,"push=${{ github.event_name != 'pull_request' }}","annotation-index.org.opencontainers.image.description=${{ env.EOS_REPO_DESCRIPTION }}" + #push: ${{ github.event_name != 'pull_request' }} - - name: Generate artifact attestation - uses: actions/attest-build-provenance@v1 + - name: Generate artifact attestation DockerHub + uses: actions/attest-build-provenance@v2 with: - subject-name: "${{ env.REGISTRY }}/${{ needs.variables.outputs.repository }}" + subject-name: docker.io/${{ env.DOCKERHUB_REPO }} subject-digest: ${{ steps.build.outputs.digest }} - push-to-registry: true + push-to-registry: ${{ github.event_name != 'pull_request' }} + + - name: Generate artifact attestation GitHub + uses: actions/attest-build-provenance@v2 + with: + subject-name: ${{ env.GHCR_REPO }} + subject-digest: ${{ steps.build.outputs.digest }} + push-to-registry: ${{ github.event_name != 'pull_request' }} - name: Export digest run: | @@ -90,9 +146,14 @@ jobs: merge: runs-on: ubuntu-latest + permissions: + contents: read + packages: write + id-token: write needs: - build - - variables + # skip for pull requests + if: ${{ github.event_name != 'pull_request' }} steps: - name: Download digests uses: actions/download-artifact@v4 @@ -101,6 +162,19 @@ jobs: pattern: digests-* merge-multiple: true + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -108,21 +182,30 @@ jobs: id: meta uses: docker/metadata-action@v5 with: - images: "${{ env.REGISTRY }}/${{ needs.variables.outputs.repository }}" - - - name: Login to GitHub - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} + images: | + ${{ env.DOCKERHUB_REPO }} + ${{ env.GHCR_REPO }} + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + labels: | + org.opencontainers.image.licenses=${{ env.EOS_LICENSE }} + annotations: | + org.opencontainers.image.licenses=${{ env.EOS_LICENSE }} + env: + DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index - name: Create manifest list and push working-directory: /tmp/digests run: | docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.REGISTRY }}/${{ needs.variables.outputs.repository }}@sha256:%s ' *) + $(printf '${{ env.DOCKERHUB_REPO }}@sha256:%s ' *) + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.GHCR_REPO }}@sha256:%s ' *) - name: Inspect image run: | - docker buildx imagetools inspect ${{ env.REGISTRY }}/${{ needs.variables.outputs.repository }}:${{ steps.meta.outputs.version }} + docker buildx imagetools inspect ${{ env.DOCKERHUB_REPO }}:${{ steps.meta.outputs.version }} + docker buildx imagetools inspect ${{ env.GHCR_REPO }}:${{ steps.meta.outputs.version }} diff --git a/README.md b/README.md index 1a8e33b..f98e0d0 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md). ## Installation -The project requires Python 3.10 or newer. Currently there are no official packages or images published. +The project requires Python 3.10 or newer. Official docker images can be found at [akkudoktor/eos](https://hub.docker.com/r/akkudoktor/eos). Following sections describe how to locally start the EOS server on `http://localhost:8503`. @@ -50,7 +50,7 @@ Windows: ### Docker ```bash -docker compose up --build +docker compose up ``` ## Configuration diff --git a/docker-compose.yaml b/docker-compose.yaml index bc340e0..0262573 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -5,7 +5,7 @@ networks: services: eos: image: "akkudoktor/eos:${EOS_VERSION}" - read_only: true + #read_only: true build: context: . dockerfile: "Dockerfile"