openenergyid 0.1.29__py3-none-any.whl → 0.1.30__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of openenergyid might be problematic. Click here for more details.
- openenergyid/__init__.py +1 -1
- openenergyid/abstractsim/__init__.py +5 -0
- openenergyid/abstractsim/abstract.py +102 -0
- openenergyid/baseload/__init__.py +1 -1
- openenergyid/capacity/__init__.py +1 -1
- openenergyid/capacity/main.py +1 -0
- openenergyid/capacity/models.py +2 -0
- openenergyid/const.py +11 -0
- openenergyid/dyntar/main.py +10 -9
- openenergyid/dyntar/models.py +3 -2
- openenergyid/elia/__init__.py +4 -0
- openenergyid/elia/api.py +91 -0
- openenergyid/elia/const.py +18 -0
- openenergyid/energysharing/data_formatting.py +9 -1
- openenergyid/energysharing/main.py +13 -2
- openenergyid/energysharing/models.py +3 -2
- openenergyid/models.py +10 -4
- openenergyid/mvlr/__init__.py +1 -1
- openenergyid/mvlr/main.py +1 -1
- openenergyid/mvlr/models.py +2 -3
- openenergyid/pvsim/__init__.py +8 -0
- openenergyid/pvsim/abstract.py +60 -0
- openenergyid/pvsim/elia/__init__.py +3 -0
- openenergyid/pvsim/elia/main.py +89 -0
- openenergyid/pvsim/main.py +49 -0
- openenergyid/pvsim/pvlib/__init__.py +11 -0
- openenergyid/pvsim/pvlib/main.py +115 -0
- openenergyid/pvsim/pvlib/models.py +235 -0
- openenergyid/pvsim/pvlib/quickscan.py +99 -0
- openenergyid/pvsim/pvlib/weather.py +91 -0
- openenergyid/sim/__init__.py +5 -0
- openenergyid/sim/main.py +67 -0
- openenergyid/simeval/__init__.py +6 -0
- openenergyid/simeval/main.py +148 -0
- openenergyid/simeval/models.py +162 -0
- {openenergyid-0.1.29.dist-info → openenergyid-0.1.30.dist-info}/METADATA +3 -1
- openenergyid-0.1.30.dist-info/RECORD +50 -0
- openenergyid-0.1.29.dist-info/RECORD +0 -30
- {openenergyid-0.1.29.dist-info → openenergyid-0.1.30.dist-info}/WHEEL +0 -0
- {openenergyid-0.1.29.dist-info → openenergyid-0.1.30.dist-info}/licenses/LICENSE +0 -0
- {openenergyid-0.1.29.dist-info → openenergyid-0.1.30.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""Module for evaluating energy simulation data."""
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
import pandas as pd
|
|
7
|
+
|
|
8
|
+
from .. import const
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def evaluate(
|
|
12
|
+
data: pd.DataFrame, return_frequencies: list[str] | None = None
|
|
13
|
+
) -> dict[str, pd.DataFrame | pd.Series]:
|
|
14
|
+
"""Evaluate the data and return resampled results.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
data: A pandas DataFrame containing time series data with columns:
|
|
18
|
+
- electricity_delivered
|
|
19
|
+
- electricity_exported
|
|
20
|
+
- electricity_produced
|
|
21
|
+
return_frequencies: List of pandas offset aliases for resampling frequencies.
|
|
22
|
+
Defaults to ['MS'] (Month Start) if None.
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
A dictionary with keys as frequencies and values as resampled DataFrames.
|
|
26
|
+
"""
|
|
27
|
+
evaluator = Evaluator(data=data, return_frequencies=return_frequencies)
|
|
28
|
+
return evaluator.evaluate()
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Evaluator:
|
|
32
|
+
"""Evaluator for basic energy system evaluation."""
|
|
33
|
+
|
|
34
|
+
def __init__(self, data: pd.DataFrame, return_frequencies: list[str] | None = None):
|
|
35
|
+
"""Initialize the evaluator with data and return frequencies."""
|
|
36
|
+
self.data = data.copy()
|
|
37
|
+
if return_frequencies is None:
|
|
38
|
+
self.return_frequencies = []
|
|
39
|
+
else:
|
|
40
|
+
self.return_frequencies = return_frequencies
|
|
41
|
+
|
|
42
|
+
def evaluate(self) -> dict[str, pd.DataFrame | pd.Series]:
|
|
43
|
+
"""Evaluate the data and return resampled results."""
|
|
44
|
+
if const.ELECTRICITY_DELIVERED not in self.data.columns:
|
|
45
|
+
self.data[const.ELECTRICITY_DELIVERED] = float("NaN")
|
|
46
|
+
if const.ELECTRICITY_EXPORTED not in self.data.columns:
|
|
47
|
+
self.data[const.ELECTRICITY_EXPORTED] = float("NaN")
|
|
48
|
+
if const.ELECTRICITY_PRODUCED not in self.data.columns:
|
|
49
|
+
self.data[const.ELECTRICITY_PRODUCED] = float("NaN")
|
|
50
|
+
if const.PRICE_ELECTRICITY_DELIVERED not in self.data.columns:
|
|
51
|
+
self.data[const.PRICE_ELECTRICITY_DELIVERED] = float("NaN")
|
|
52
|
+
if const.PRICE_ELECTRICITY_EXPORTED not in self.data.columns:
|
|
53
|
+
self.data[const.PRICE_ELECTRICITY_EXPORTED] = float("NaN")
|
|
54
|
+
|
|
55
|
+
# Add electricy_consumed
|
|
56
|
+
self.data[const.ELECTRICITY_CONSUMED] = (
|
|
57
|
+
self.data[const.ELECTRICITY_DELIVERED]
|
|
58
|
+
- self.data[const.ELECTRICITY_EXPORTED].fillna(0.0)
|
|
59
|
+
+ self.data[const.ELECTRICITY_PRODUCED].fillna(0.0)
|
|
60
|
+
).clip(lower=0)
|
|
61
|
+
|
|
62
|
+
# Add electricy_self_consumed
|
|
63
|
+
self.data[const.ELECTRICITY_SELF_CONSUMED] = (
|
|
64
|
+
self.data[const.ELECTRICITY_PRODUCED] - self.data[const.ELECTRICITY_EXPORTED]
|
|
65
|
+
).clip(lower=0)
|
|
66
|
+
|
|
67
|
+
# Add costs
|
|
68
|
+
self.data[const.COST_ELECTRICITY_DELIVERED] = (
|
|
69
|
+
self.data[const.ELECTRICITY_DELIVERED] * self.data[const.PRICE_ELECTRICITY_DELIVERED]
|
|
70
|
+
)
|
|
71
|
+
self.data[const.EARNINGS_ELECTRICITY_EXPORTED] = (
|
|
72
|
+
self.data[const.ELECTRICITY_EXPORTED] * self.data[const.PRICE_ELECTRICITY_EXPORTED]
|
|
73
|
+
)
|
|
74
|
+
self.data[const.COST_ELECTRICITY_NET] = (
|
|
75
|
+
self.data[const.COST_ELECTRICITY_DELIVERED]
|
|
76
|
+
- self.data[const.EARNINGS_ELECTRICITY_EXPORTED]
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
# Calculate sums
|
|
80
|
+
results: dict[str, pd.DataFrame | pd.Series] = {}
|
|
81
|
+
results["total"] = (
|
|
82
|
+
self.data[
|
|
83
|
+
[
|
|
84
|
+
const.ELECTRICITY_DELIVERED,
|
|
85
|
+
const.ELECTRICITY_EXPORTED,
|
|
86
|
+
const.ELECTRICITY_PRODUCED,
|
|
87
|
+
const.ELECTRICITY_CONSUMED,
|
|
88
|
+
const.ELECTRICITY_SELF_CONSUMED,
|
|
89
|
+
const.COST_ELECTRICITY_DELIVERED,
|
|
90
|
+
const.EARNINGS_ELECTRICITY_EXPORTED,
|
|
91
|
+
const.COST_ELECTRICITY_NET,
|
|
92
|
+
]
|
|
93
|
+
]
|
|
94
|
+
.dropna(axis=1, how="all")
|
|
95
|
+
.sum()
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
for freq in self.return_frequencies:
|
|
99
|
+
resampled = (
|
|
100
|
+
self.data[
|
|
101
|
+
[
|
|
102
|
+
const.ELECTRICITY_DELIVERED,
|
|
103
|
+
const.ELECTRICITY_EXPORTED,
|
|
104
|
+
const.ELECTRICITY_PRODUCED,
|
|
105
|
+
const.ELECTRICITY_CONSUMED,
|
|
106
|
+
const.ELECTRICITY_SELF_CONSUMED,
|
|
107
|
+
const.COST_ELECTRICITY_DELIVERED,
|
|
108
|
+
const.EARNINGS_ELECTRICITY_EXPORTED,
|
|
109
|
+
const.COST_ELECTRICITY_NET,
|
|
110
|
+
]
|
|
111
|
+
]
|
|
112
|
+
.dropna(axis=1, how="all")
|
|
113
|
+
.resample(freq)
|
|
114
|
+
.sum()
|
|
115
|
+
)
|
|
116
|
+
results[freq] = resampled
|
|
117
|
+
|
|
118
|
+
# Add ratios
|
|
119
|
+
for _, frame in results.items():
|
|
120
|
+
if const.ELECTRICITY_SELF_CONSUMED in frame:
|
|
121
|
+
frame[const.RATIO_SELF_CONSUMPTION] = np.divide(
|
|
122
|
+
frame[const.ELECTRICITY_SELF_CONSUMED], frame[const.ELECTRICITY_PRODUCED]
|
|
123
|
+
)
|
|
124
|
+
frame[const.RATIO_SELF_SUFFICIENCY] = np.divide(
|
|
125
|
+
frame[const.ELECTRICITY_SELF_CONSUMED],
|
|
126
|
+
frame[const.ELECTRICITY_CONSUMED],
|
|
127
|
+
)
|
|
128
|
+
return results
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def compare_results(
|
|
132
|
+
res_1: dict[str, pd.DataFrame | pd.Series], res_2: dict[str, pd.DataFrame | pd.Series]
|
|
133
|
+
) -> dict[str, dict[str, pd.Series | pd.DataFrame]]:
|
|
134
|
+
"""Compare two evaluation results and return the differences."""
|
|
135
|
+
results = {}
|
|
136
|
+
for key in res_1.keys():
|
|
137
|
+
if key in res_2:
|
|
138
|
+
df_1 = res_1[key]
|
|
139
|
+
df_2 = res_2[key]
|
|
140
|
+
if isinstance(df_1, pd.Series) and isinstance(df_2, pd.Series):
|
|
141
|
+
df_1 = df_1.to_frame().T
|
|
142
|
+
df_2 = df_2.to_frame().T
|
|
143
|
+
df_1, df_2 = typing.cast(pd.DataFrame, df_1), typing.cast(pd.DataFrame, df_2)
|
|
144
|
+
diff = df_2 - df_1
|
|
145
|
+
results[key] = {}
|
|
146
|
+
results[key]["diff"] = diff.dropna(how="all", axis=1).squeeze(axis=0)
|
|
147
|
+
results[key]["ratio_diff"] = (diff / df_1).dropna(how="all", axis=1).squeeze(axis=0)
|
|
148
|
+
return results
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"""Models for basic energy system evaluation."""
|
|
2
|
+
|
|
3
|
+
from typing import Annotated, Literal, Union
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, Field, RootModel, StringConstraints, confloat, conlist
|
|
6
|
+
|
|
7
|
+
from ..models import TimeDataFrame
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class EvaluationInput(TimeDataFrame):
|
|
11
|
+
"""Input frame for basic energy system evaluation."""
|
|
12
|
+
|
|
13
|
+
columns: list[
|
|
14
|
+
Literal[
|
|
15
|
+
"electricity_delivered",
|
|
16
|
+
"electricity_exported",
|
|
17
|
+
"electricity_produced",
|
|
18
|
+
"price_electricity_delivered",
|
|
19
|
+
"price_electricity_exported",
|
|
20
|
+
]
|
|
21
|
+
] = Field(min_length=1, max_length=5)
|
|
22
|
+
data: list[conlist(item_type=confloat(allow_inf_nan=True), min_length=1, max_length=5)] # type: ignore
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class EvaluationOutput(TimeDataFrame):
|
|
26
|
+
"""Output frame for basic energy system evaluation."""
|
|
27
|
+
|
|
28
|
+
columns: list[
|
|
29
|
+
Literal[
|
|
30
|
+
"electricity_delivered",
|
|
31
|
+
"electricity_exported",
|
|
32
|
+
"electricity_produced",
|
|
33
|
+
"electricity_consumed",
|
|
34
|
+
"electricity_self_consumed",
|
|
35
|
+
"cost_electricity_delivered",
|
|
36
|
+
"earnings_electricity_exported",
|
|
37
|
+
"cost_electricity_net",
|
|
38
|
+
"ratio_self_consumption",
|
|
39
|
+
"ratio_self_sufficiency",
|
|
40
|
+
]
|
|
41
|
+
] = Field(min_length=1, max_length=10)
|
|
42
|
+
data: list[conlist(item_type=confloat(allow_inf_nan=True), min_length=1, max_length=10)] # type: ignore
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# ---------- Reusable bits ----------
|
|
46
|
+
|
|
47
|
+
Frequency = Annotated[
|
|
48
|
+
str,
|
|
49
|
+
StringConstraints(pattern=r"^(\d+min|H|D|W(?:-[A-Z]{3})?|MS|M|Q|QS|A|AS)$"),
|
|
50
|
+
Field(
|
|
51
|
+
title="Frequency key",
|
|
52
|
+
description=(
|
|
53
|
+
"Pandas-style frequency string (freqstr). "
|
|
54
|
+
"Typical examples: '15min', 'H', 'D', 'MS', 'W-MON'."
|
|
55
|
+
),
|
|
56
|
+
examples=["15min", "H", "MS", "W-MON"],
|
|
57
|
+
),
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
Metric = Annotated[
|
|
61
|
+
str,
|
|
62
|
+
Field(
|
|
63
|
+
description="Metric identifier.",
|
|
64
|
+
examples=[
|
|
65
|
+
"electricity_delivered",
|
|
66
|
+
"electricity_exported",
|
|
67
|
+
"electricity_produced",
|
|
68
|
+
"electricity_consumed",
|
|
69
|
+
"electricity_self_consumed",
|
|
70
|
+
"cost_electricity_delivered",
|
|
71
|
+
"earnings_electricity_exported",
|
|
72
|
+
"cost_electricity_net",
|
|
73
|
+
"ratio_self_consumption",
|
|
74
|
+
"ratio_self_sufficiency",
|
|
75
|
+
],
|
|
76
|
+
),
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class MetricSummary(RootModel[dict[Metric, float]]):
|
|
81
|
+
"""Total/aggregate values per metric (e.g. { 'electricity_delivered': 123.4 })."""
|
|
82
|
+
|
|
83
|
+
root: dict[Metric, float]
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# ---------- Eval payloads ----------
|
|
87
|
+
# We model “either { 'total': MetricSummary } OR { '<freq>': EvaluationOutput, ... }”
|
|
88
|
+
# as two schemas and present them via oneOf.
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class EvalTotals(BaseModel):
|
|
92
|
+
"""Totals per metric (no time series)."""
|
|
93
|
+
|
|
94
|
+
total: MetricSummary = Field(
|
|
95
|
+
..., description="Aggregate totals per metric over the full evaluation window."
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class EvalByFrequency(RootModel[dict[Frequency, EvaluationOutput]]):
|
|
100
|
+
"""Per-frequency time series results."""
|
|
101
|
+
|
|
102
|
+
root: dict[Frequency, EvaluationOutput]
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
EvalPayload = Annotated[
|
|
106
|
+
Union[EvalTotals, EvalByFrequency],
|
|
107
|
+
Field(description="Either totals-only, or per-frequency time series results."),
|
|
108
|
+
]
|
|
109
|
+
|
|
110
|
+
# ---------- Comparison payloads ----------
|
|
111
|
+
# Shape:
|
|
112
|
+
# EITHER { "total": { "diff": MetricSummary } } or { "total": { "ratio_diff": MetricSummary } }
|
|
113
|
+
# OR { "<freq>": { "diff": EvaluationOutput } } or { "<freq>": { "ratio_diff": EvaluationOutput } }
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class DiffTotal(BaseModel):
|
|
117
|
+
"""Totals-level absolute differences."""
|
|
118
|
+
|
|
119
|
+
diff: MetricSummary = Field(..., description="Absolute differences of totals.")
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class RatioDiffTotal(BaseModel):
|
|
123
|
+
"""Totals-level relative (ratio) differences."""
|
|
124
|
+
|
|
125
|
+
ratio_diff: MetricSummary = Field(..., description="Relative (ratio) differences of totals.")
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class DiffTS(BaseModel):
|
|
129
|
+
"""Time series absolute differences at a given frequency."""
|
|
130
|
+
|
|
131
|
+
diff: EvaluationOutput = Field(
|
|
132
|
+
..., description="Absolute differences as a time series at this frequency."
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class RatioDiffTS(BaseModel):
|
|
137
|
+
"""Time series relative (ratio) differences at a given frequency."""
|
|
138
|
+
|
|
139
|
+
ratio_diff: EvaluationOutput = Field(
|
|
140
|
+
..., description="Relative (ratio) differences as a time series at this frequency."
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
# Enforce exclusivity if you decide to combine diff/ratio into one model; here we keep them separate for clean docs.
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class ComparisonTotals(BaseModel):
|
|
148
|
+
"""Totals comparison; pick exactly one of diff or ratio_diff by choosing the model."""
|
|
149
|
+
|
|
150
|
+
total: DiffTotal | RatioDiffTotal = Field(..., description="Totals-level comparison.")
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class ComparisonByFrequency(RootModel[dict[Frequency, Union[DiffTS, RatioDiffTS]]]):
|
|
154
|
+
"""Per-frequency comparison; for each freq, pick diff or ratio_diff."""
|
|
155
|
+
|
|
156
|
+
root: dict[Frequency, DiffTS | RatioDiffTS]
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
ComparisonPayload = Annotated[
|
|
160
|
+
Union[ComparisonTotals, ComparisonByFrequency],
|
|
161
|
+
Field(description="Comparison results at totals level or per-frequency."),
|
|
162
|
+
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openenergyid
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.30
|
|
4
4
|
Summary: Open Source Python library for energy analytics and simulations
|
|
5
5
|
Author-email: Jan Pecinovsky <jan@energieid.be>, Max Helskens <max@energieid.be>, Oscar Swyns <oscar@energieid.be>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -18,7 +18,9 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
18
18
|
Requires-Python: >=3.11
|
|
19
19
|
Description-Content-Type: text/markdown
|
|
20
20
|
License-File: LICENSE
|
|
21
|
+
Requires-Dist: aiohttp>=3.12.15
|
|
21
22
|
Requires-Dist: pandera[polars]>=0.22.1
|
|
23
|
+
Requires-Dist: pvlib>=0.13.0
|
|
22
24
|
Requires-Dist: pydantic>=2.8.2
|
|
23
25
|
Requires-Dist: statsmodels>=0.14.2
|
|
24
26
|
Dynamic: license-file
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
openenergyid/__init__.py,sha256=W7FsfPYrI4DcjTcIucigfC7QR_cSuAcx2ocomFDAYzc,193
|
|
2
|
+
openenergyid/const.py,sha256=2cRYP2rF8YtW4vP1nnsyn-JBgmTEfVO1tS6tqJvC6_M,1458
|
|
3
|
+
openenergyid/enums.py,sha256=jdw4CB1gkisx0re_SesrTEyh_T-UxYp6uieE7iYlHdA,357
|
|
4
|
+
openenergyid/models.py,sha256=G3xXbdNewcXSBr-vyvg4pE6zdaI44OrJIWQxgKjwvkg,6313
|
|
5
|
+
openenergyid/abstractsim/__init__.py,sha256=cl-Eh5y_ZOmacZ0X2YW4TeooqR-oD68Fju3UsH9Yziw,228
|
|
6
|
+
openenergyid/abstractsim/abstract.py,sha256=dhUNoaHiKH-ug2mcHUxDINbKMKh7VWMiAnEhPAUAFiE,3252
|
|
7
|
+
openenergyid/baseload/__init__.py,sha256=nEN4IX5m1_X11paXt11G-G9_iJ-ypwccc9NyQhkwtAQ,437
|
|
8
|
+
openenergyid/baseload/analysis.py,sha256=oFawfL4c8WrQxRb9WY74V4rVvslmyHhZ_uQ171C93cQ,7591
|
|
9
|
+
openenergyid/baseload/exceptions.py,sha256=uPPQlFmOikp3wuwdVxj3Mx-45TzPkLF86rKMFjT5qB4,250
|
|
10
|
+
openenergyid/baseload/models.py,sha256=W_WCcdLdkbySH7o5adLE7_txXLZsAVTjJkwzjepwN1Y,917
|
|
11
|
+
openenergyid/capacity/__init__.py,sha256=TVWtOBEA2h_Fy17TRYUBmxXUgd00-CJcbObjFkvRPwQ,221
|
|
12
|
+
openenergyid/capacity/main.py,sha256=vANuP4PVPWdfSnCZdEVvJD01RQHRzNr1sD1pkQeu29s,3675
|
|
13
|
+
openenergyid/capacity/models.py,sha256=aFarIPXzaaKqfEzYDVXG44uDaPTapqNsxKHFpysc9N8,834
|
|
14
|
+
openenergyid/dyntar/__init__.py,sha256=lUrk7ktS7yAqiafRHFoBE0RvFSI9mzDoO37diwLHuBg,495
|
|
15
|
+
openenergyid/dyntar/const.py,sha256=eJJV9VfpHlS9vWV47DWQkS3ICIXWhDmG4cU-ofbZJ3Q,1100
|
|
16
|
+
openenergyid/dyntar/main.py,sha256=6vdJ_jBdoDg5ec0vevMjdBS-p3DDCe3vlvie_Y4unIE,10639
|
|
17
|
+
openenergyid/dyntar/models.py,sha256=jqLY_sGG19eYQX2YG0btxdUNhMOYu6mkguBqDKxJCwI,3099
|
|
18
|
+
openenergyid/elia/__init__.py,sha256=shcLGBpzMm6r8teov7YwGD424f-um58jCiVM2yeHycQ,126
|
|
19
|
+
openenergyid/elia/api.py,sha256=Azs7D7Jr4zlHerD7Ueo4bs2P6ZwJ-0JfeNuvFEFfm3I,2772
|
|
20
|
+
openenergyid/elia/const.py,sha256=b0dQHVSHR4O9sztN7C07vijTGoAURERthP8pKn-k8gc,442
|
|
21
|
+
openenergyid/energysharing/__init__.py,sha256=A4JfrUYf-hBCzhUm0qL1GGlNMvpO8OwXJo80dJxFIvw,274
|
|
22
|
+
openenergyid/energysharing/const.py,sha256=X2zEPtTlsmZ66w6RmLS_h8NmdzObAEi5N6-0yrLN5V4,219
|
|
23
|
+
openenergyid/energysharing/data_formatting.py,sha256=47OAKDmsxgrChrU0jqCCMf1MTXK0qUU9HV2znevTg2o,2613
|
|
24
|
+
openenergyid/energysharing/main.py,sha256=nLXwhA6omGBIjNJzcOlqTmYWF3uuBqqsAO9dsUKf4xo,4492
|
|
25
|
+
openenergyid/energysharing/models.py,sha256=1GPigtXffO1EsZhFkHG0OYwGXK71I9xLC1fD5rHxKwQ,2527
|
|
26
|
+
openenergyid/mvlr/__init__.py,sha256=QNLdUqzE3lg4hkMc5Z47ft7DFydQnw-BF1LaLpLLcaY,471
|
|
27
|
+
openenergyid/mvlr/helpers.py,sha256=Uzbfrj3IpH26wA206KOl0hNucKE-n9guJNC_EROBVKA,983
|
|
28
|
+
openenergyid/mvlr/main.py,sha256=X7H1lzKx3JYOQkHR0R3HLqHvCGa8PuI2CafvYquhEZI,1491
|
|
29
|
+
openenergyid/mvlr/models.py,sha256=3Y_y3A5FmJxDEYT4XGpXiuUTMS8p0umPMeXNFRufGAY,8580
|
|
30
|
+
openenergyid/mvlr/mvlr.py,sha256=zcVWsKDfcS2jdfa-45QPu3YCnhL4p14FHuWpQLLwIL4,18626
|
|
31
|
+
openenergyid/pvsim/__init__.py,sha256=gVNEFsEGEMz9SqhrUCH91GWEgYGCWH6hwbztO6I-OfM,204
|
|
32
|
+
openenergyid/pvsim/abstract.py,sha256=IjYndlmvi9VTnUQ0vCDOLc5wB9d1jWnbq-e5zq0Br88,1688
|
|
33
|
+
openenergyid/pvsim/main.py,sha256=1Pcdkgg3NgSPtESqhqaJdlw8hoBTiwV8XjNtIzWq2go,1796
|
|
34
|
+
openenergyid/pvsim/elia/__init__.py,sha256=XVynbFXNWjDhNDuyJJoe6CYKq5dk46IW21sFqzfrPTE,113
|
|
35
|
+
openenergyid/pvsim/elia/main.py,sha256=hqA1Kbsk3yUgR_Oe_iGzsSnaqSvpjm971G6zljeteac,2900
|
|
36
|
+
openenergyid/pvsim/pvlib/__init__.py,sha256=07PCnTLDi9yPUCXiI2Fa25KXtw2KdS65ICkgZZnjzj4,244
|
|
37
|
+
openenergyid/pvsim/pvlib/main.py,sha256=ZpjYyK60vr45KWld5gZVIS3xi_9Ze_Ggka_2zzIhgAc,3145
|
|
38
|
+
openenergyid/pvsim/pvlib/models.py,sha256=a3xomqRu7WwKQLTTZ57EsCPGfHQsgFL-ZdwOSG_tjXE,7421
|
|
39
|
+
openenergyid/pvsim/pvlib/quickscan.py,sha256=7DoUiUzPd4vZKQxL_Uo6bCz_THJ-G1ul9Ni-eS5N6RM,3874
|
|
40
|
+
openenergyid/pvsim/pvlib/weather.py,sha256=D2xbkTYg3mtt7GDoz0uu_ML2U6ElsQHjbvWs28q-5tM,3022
|
|
41
|
+
openenergyid/sim/__init__.py,sha256=gKslrJwVB80Tm1s27OJyNKiouq0CcAt-vvPXhsu2sec,198
|
|
42
|
+
openenergyid/sim/main.py,sha256=93owbBfC2XXXnmN8Vq7EqcwV-5sI_oYgbonyHs9NPZE,2261
|
|
43
|
+
openenergyid/simeval/__init__.py,sha256=hk-q7enbBpxi3g2D9LMYmw7R1ikdte8mYIvPLVg0aBs,252
|
|
44
|
+
openenergyid/simeval/main.py,sha256=5pucS9mGKKeQmM5P-cyYdw4FQtyBXfil6MU4ppWTpGQ,5895
|
|
45
|
+
openenergyid/simeval/models.py,sha256=xUUr2NEXEUGzo6Jq2X-aDEWyVjINouPZhpHxxmYucNo,4964
|
|
46
|
+
openenergyid-0.1.30.dist-info/licenses/LICENSE,sha256=NgRdcNHwyXVCXZ8sJwoTp0DCowThJ9LWWl4xhbV1IUY,1074
|
|
47
|
+
openenergyid-0.1.30.dist-info/METADATA,sha256=1Kb0PpAmOMKVXrlkpf89L_snPDjEBRA0fid4yVklYu4,1216
|
|
48
|
+
openenergyid-0.1.30.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
49
|
+
openenergyid-0.1.30.dist-info/top_level.txt,sha256=vf3DmJCXgD_lJjSPFktonUJJT6vEg6KIPCKMPfCWCFI,13
|
|
50
|
+
openenergyid-0.1.30.dist-info/RECORD,,
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
openenergyid/__init__.py,sha256=EweBkQt142zR18upgUaoaVkWDGweGyAFquXajtTYX8c,193
|
|
2
|
-
openenergyid/const.py,sha256=D-xUnUyVuLmphClkePgxpFP6z0RDhw_6m7rX0BHBgrw,823
|
|
3
|
-
openenergyid/enums.py,sha256=jdw4CB1gkisx0re_SesrTEyh_T-UxYp6uieE7iYlHdA,357
|
|
4
|
-
openenergyid/models.py,sha256=hH7_ymOQStcO9XeLdrk2rWQMlZHmgvdmDUSL56wNymg,6074
|
|
5
|
-
openenergyid/baseload/__init__.py,sha256=LXgnCnoSB1fyknMvkAv8nbtYczqW8Od_N2v_bp-LYVw,437
|
|
6
|
-
openenergyid/baseload/analysis.py,sha256=oFawfL4c8WrQxRb9WY74V4rVvslmyHhZ_uQ171C93cQ,7591
|
|
7
|
-
openenergyid/baseload/exceptions.py,sha256=uPPQlFmOikp3wuwdVxj3Mx-45TzPkLF86rKMFjT5qB4,250
|
|
8
|
-
openenergyid/baseload/models.py,sha256=W_WCcdLdkbySH7o5adLE7_txXLZsAVTjJkwzjepwN1Y,917
|
|
9
|
-
openenergyid/capacity/__init__.py,sha256=1En96HlPV8kd1hOJO9RjRbXNInp5ZSkmjsjp0jfZlcQ,221
|
|
10
|
-
openenergyid/capacity/main.py,sha256=G6_EtXs1k_W-fxS33pFrCNKajuH81skdI32zp5RX9bI,3674
|
|
11
|
-
openenergyid/capacity/models.py,sha256=qi0IFyF_QOVleSzN8g0U2Fzqcc9ZDfNKt8oteFLY6Q0,832
|
|
12
|
-
openenergyid/dyntar/__init__.py,sha256=lUrk7ktS7yAqiafRHFoBE0RvFSI9mzDoO37diwLHuBg,495
|
|
13
|
-
openenergyid/dyntar/const.py,sha256=eJJV9VfpHlS9vWV47DWQkS3ICIXWhDmG4cU-ofbZJ3Q,1100
|
|
14
|
-
openenergyid/dyntar/main.py,sha256=i8EkayRicnMhG66cyrxGwUumFx3UGe7KDSImfFqmK04,10638
|
|
15
|
-
openenergyid/dyntar/models.py,sha256=A3ngK1X6mFDL5-9FpVdTSu5VmDy0s7OeqNyevUiGXsk,3098
|
|
16
|
-
openenergyid/energysharing/__init__.py,sha256=A4JfrUYf-hBCzhUm0qL1GGlNMvpO8OwXJo80dJxFIvw,274
|
|
17
|
-
openenergyid/energysharing/const.py,sha256=X2zEPtTlsmZ66w6RmLS_h8NmdzObAEi5N6-0yrLN5V4,219
|
|
18
|
-
openenergyid/energysharing/data_formatting.py,sha256=Kwuhyn6ao_8Brdm9frlA6VzYOqimNYZsRbYwNXnE7yc,2583
|
|
19
|
-
openenergyid/energysharing/main.py,sha256=QKrtDyAlmKj0qtlqlUMjTJujQeKBK9U1_W80-RZWt-U,4449
|
|
20
|
-
openenergyid/energysharing/models.py,sha256=-FedTqWqoi7AYrbI4S_pX0bMScrbZxncQ21CXFz2cXM,2526
|
|
21
|
-
openenergyid/mvlr/__init__.py,sha256=Glrc218oqa8tq_Y2G9LXaSoN4Yba-vsjXUi9r9iPzaY,471
|
|
22
|
-
openenergyid/mvlr/helpers.py,sha256=Uzbfrj3IpH26wA206KOl0hNucKE-n9guJNC_EROBVKA,983
|
|
23
|
-
openenergyid/mvlr/main.py,sha256=Daj9UjcX70WETRrKu3QY-1LfMRkKP8Wvu4Ted-Smwzs,1491
|
|
24
|
-
openenergyid/mvlr/models.py,sha256=XvkViOLlYqi0ffgF3AD4Jvk3yL05gsoKdKgBAsGJ7L4,8581
|
|
25
|
-
openenergyid/mvlr/mvlr.py,sha256=zcVWsKDfcS2jdfa-45QPu3YCnhL4p14FHuWpQLLwIL4,18626
|
|
26
|
-
openenergyid-0.1.29.dist-info/licenses/LICENSE,sha256=NgRdcNHwyXVCXZ8sJwoTp0DCowThJ9LWWl4xhbV1IUY,1074
|
|
27
|
-
openenergyid-0.1.29.dist-info/METADATA,sha256=tayyCY0d2D2cilvGl_Z-MiKMju3cZv6FGbBbzQHWuKc,1155
|
|
28
|
-
openenergyid-0.1.29.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
29
|
-
openenergyid-0.1.29.dist-info/top_level.txt,sha256=vf3DmJCXgD_lJjSPFktonUJJT6vEg6KIPCKMPfCWCFI,13
|
|
30
|
-
openenergyid-0.1.29.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|