emhass 0.8.6__py3-none-any.whl → 0.9.0__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.
- emhass/command_line.py +701 -270
- emhass/forecast.py +56 -23
- emhass/machine_learning_forecaster.py +4 -4
- emhass/machine_learning_regressor.py +290 -0
- emhass/optimization.py +4 -3
- emhass/retrieve_hass.py +235 -103
- emhass/static/advanced.html +3 -0
- emhass/static/script.js +2 -0
- emhass/utils.py +605 -305
- emhass/web_server.py +48 -26
- {emhass-0.8.6.dist-info → emhass-0.9.0.dist-info}/METADATA +19 -5
- emhass-0.9.0.dist-info/RECORD +26 -0
- emhass-0.8.6.dist-info/RECORD +0 -25
- {emhass-0.8.6.dist-info → emhass-0.9.0.dist-info}/LICENSE +0 -0
- {emhass-0.8.6.dist-info → emhass-0.9.0.dist-info}/WHEEL +0 -0
- {emhass-0.8.6.dist-info → emhass-0.9.0.dist-info}/entry_points.txt +0 -0
- {emhass-0.8.6.dist-info → emhass-0.9.0.dist-info}/top_level.txt +0 -0
emhass/web_server.py
CHANGED
@@ -13,6 +13,7 @@ from distutils.util import strtobool
|
|
13
13
|
from emhass.command_line import set_input_data_dict
|
14
14
|
from emhass.command_line import perfect_forecast_optim, dayahead_forecast_optim, naive_mpc_optim
|
15
15
|
from emhass.command_line import forecast_model_fit, forecast_model_predict, forecast_model_tune
|
16
|
+
from emhass.command_line import regressor_model_fit, regressor_model_predict
|
16
17
|
from emhass.command_line import publish_data
|
17
18
|
from emhass.utils import get_injection_dict, get_injection_dict_forecast_model_fit, \
|
18
19
|
get_injection_dict_forecast_model_tune, build_params
|
@@ -25,8 +26,8 @@ def checkFileLog(refString=None):
|
|
25
26
|
if (refString is not None):
|
26
27
|
logArray = grabLog(refString) #grab reduced log array
|
27
28
|
else:
|
28
|
-
if ((data_path / 'actionLogs.txt')).exists():
|
29
|
-
with open(str(data_path / 'actionLogs.txt'), "r") as fp:
|
29
|
+
if ((emhass_conf['data_path'] / 'actionLogs.txt')).exists():
|
30
|
+
with open(str(emhass_conf['data_path'] / 'actionLogs.txt'), "r") as fp:
|
30
31
|
logArray = fp.readlines()
|
31
32
|
for logString in logArray:
|
32
33
|
if (logString.split(' ', 1)[0] == "ERROR"):
|
@@ -37,8 +38,8 @@ def checkFileLog(refString=None):
|
|
37
38
|
def grabLog(refString):
|
38
39
|
isFound = []
|
39
40
|
output = []
|
40
|
-
if ((data_path / 'actionLogs.txt')).exists():
|
41
|
-
with open(str(data_path / 'actionLogs.txt'), "r") as fp:
|
41
|
+
if ((emhass_conf['data_path'] / 'actionLogs.txt')).exists():
|
42
|
+
with open(str(emhass_conf['data_path'] / 'actionLogs.txt'), "r") as fp:
|
42
43
|
logArray = fp.readlines()
|
43
44
|
for x in range(len(logArray)-1): #find all matches and log key in isFound
|
44
45
|
if (re.search(refString,logArray[x])):
|
@@ -50,8 +51,8 @@ def grabLog(refString):
|
|
50
51
|
|
51
52
|
#clear the log file
|
52
53
|
def clearFileLog():
|
53
|
-
if ((data_path / 'actionLogs.txt')).exists():
|
54
|
-
with open(str(data_path / 'actionLogs.txt'), "w") as fp:
|
54
|
+
if ((emhass_conf['data_path'] / 'actionLogs.txt')).exists():
|
55
|
+
with open(str(emhass_conf['data_path'] / 'actionLogs.txt'), "w") as fp:
|
55
56
|
fp.truncate()
|
56
57
|
|
57
58
|
#initial index page render
|
@@ -63,8 +64,8 @@ def index():
|
|
63
64
|
env = Environment(loader=file_loader)
|
64
65
|
template = env.get_template('index.html')
|
65
66
|
# Load cache dict
|
66
|
-
if (data_path / 'injection_dict.pkl').exists():
|
67
|
-
with open(str(data_path / 'injection_dict.pkl'), "rb") as fid:
|
67
|
+
if (emhass_conf['data_path'] / 'injection_dict.pkl').exists():
|
68
|
+
with open(str(emhass_conf['data_path'] / 'injection_dict.pkl'), "rb") as fid:
|
68
69
|
injection_dict = pickle.load(fid)
|
69
70
|
else:
|
70
71
|
app.logger.warning("The data container dictionary is empty... Please launch an optimization task")
|
@@ -85,8 +86,8 @@ def template_action(action_name):
|
|
85
86
|
file_loader = PackageLoader('emhass', 'templates')
|
86
87
|
env = Environment(loader=file_loader)
|
87
88
|
template = env.get_template('template.html')
|
88
|
-
if (data_path / 'injection_dict.pkl').exists():
|
89
|
-
with open(str(data_path / 'injection_dict.pkl'), "rb") as fid:
|
89
|
+
if (emhass_conf['data_path'] / 'injection_dict.pkl').exists():
|
90
|
+
with open(str(emhass_conf['data_path'] / 'injection_dict.pkl'), "rb") as fid:
|
90
91
|
injection_dict = pickle.load(fid)
|
91
92
|
else:
|
92
93
|
app.logger.warning("The data container dictionary is empty... Please launch an optimization task")
|
@@ -96,8 +97,8 @@ def template_action(action_name):
|
|
96
97
|
#post actions
|
97
98
|
@app.route('/action/<action_name>', methods=['POST'])
|
98
99
|
def action_call(action_name):
|
99
|
-
with open(str(data_path / 'params.pkl'), "rb") as fid:
|
100
|
-
config_path, params = pickle.load(fid)
|
100
|
+
with open(str(emhass_conf['data_path'] / 'params.pkl'), "rb") as fid:
|
101
|
+
emhass_conf['config_path'], params = pickle.load(fid)
|
101
102
|
runtimeparams = request.get_json(force=True)
|
102
103
|
params = json.dumps(params)
|
103
104
|
if runtimeparams is not None and runtimeparams != '{}':
|
@@ -105,7 +106,7 @@ def action_call(action_name):
|
|
105
106
|
runtimeparams = json.dumps(runtimeparams)
|
106
107
|
ActionStr = " >> Setting input data dict"
|
107
108
|
app.logger.info(ActionStr)
|
108
|
-
input_data_dict = set_input_data_dict(
|
109
|
+
input_data_dict = set_input_data_dict(emhass_conf, costfun,
|
109
110
|
params, runtimeparams, action_name, app.logger)
|
110
111
|
if not input_data_dict:
|
111
112
|
return make_response(grabLog(ActionStr), 400)
|
@@ -122,7 +123,7 @@ def action_call(action_name):
|
|
122
123
|
app.logger.info(ActionStr)
|
123
124
|
opt_res = perfect_forecast_optim(input_data_dict, app.logger)
|
124
125
|
injection_dict = get_injection_dict(opt_res)
|
125
|
-
with open(str(data_path / 'injection_dict.pkl'), "wb") as fid:
|
126
|
+
with open(str(emhass_conf['data_path'] / 'injection_dict.pkl'), "wb") as fid:
|
126
127
|
pickle.dump(injection_dict, fid)
|
127
128
|
msg = f'EMHASS >> Action perfect-optim executed... \n'
|
128
129
|
if not checkFileLog(ActionStr):
|
@@ -133,7 +134,7 @@ def action_call(action_name):
|
|
133
134
|
app.logger.info(ActionStr)
|
134
135
|
opt_res = dayahead_forecast_optim(input_data_dict, app.logger)
|
135
136
|
injection_dict = get_injection_dict(opt_res)
|
136
|
-
with open(str(data_path / 'injection_dict.pkl'), "wb") as fid:
|
137
|
+
with open(str(emhass_conf['data_path'] / 'injection_dict.pkl'), "wb") as fid:
|
137
138
|
pickle.dump(injection_dict, fid)
|
138
139
|
msg = f'EMHASS >> Action dayahead-optim executed... \n'
|
139
140
|
if not checkFileLog(ActionStr):
|
@@ -144,7 +145,7 @@ def action_call(action_name):
|
|
144
145
|
app.logger.info(ActionStr)
|
145
146
|
opt_res = naive_mpc_optim(input_data_dict, app.logger)
|
146
147
|
injection_dict = get_injection_dict(opt_res)
|
147
|
-
with open(str(data_path / 'injection_dict.pkl'), "wb") as fid:
|
148
|
+
with open(str(emhass_conf['data_path'] / 'injection_dict.pkl'), "wb") as fid:
|
148
149
|
pickle.dump(injection_dict, fid)
|
149
150
|
msg = f'EMHASS >> Action naive-mpc-optim executed... \n'
|
150
151
|
if not checkFileLog(ActionStr):
|
@@ -156,7 +157,7 @@ def action_call(action_name):
|
|
156
157
|
df_fit_pred, _, mlf = forecast_model_fit(input_data_dict, app.logger)
|
157
158
|
injection_dict = get_injection_dict_forecast_model_fit(
|
158
159
|
df_fit_pred, mlf)
|
159
|
-
with open(str(data_path / 'injection_dict.pkl'), "wb") as fid:
|
160
|
+
with open(str(emhass_conf['data_path'] / 'injection_dict.pkl'), "wb") as fid:
|
160
161
|
pickle.dump(injection_dict, fid)
|
161
162
|
msg = f'EMHASS >> Action forecast-model-fit executed... \n'
|
162
163
|
if not checkFileLog(ActionStr):
|
@@ -173,7 +174,7 @@ def action_call(action_name):
|
|
173
174
|
injection_dict['title'] = '<h2>Custom machine learning forecast model predict</h2>'
|
174
175
|
injection_dict['subsubtitle0'] = '<h4>Performed a prediction using a pre-trained model</h4>'
|
175
176
|
injection_dict['table1'] = table1
|
176
|
-
with open(str(data_path / 'injection_dict.pkl'), "wb") as fid:
|
177
|
+
with open(str(emhass_conf['data_path'] / 'injection_dict.pkl'), "wb") as fid:
|
177
178
|
pickle.dump(injection_dict, fid)
|
178
179
|
msg = f'EMHASS >> Action forecast-model-predict executed... \n'
|
179
180
|
if not checkFileLog(ActionStr):
|
@@ -187,12 +188,28 @@ def action_call(action_name):
|
|
187
188
|
return make_response(grabLog(ActionStr), 400)
|
188
189
|
injection_dict = get_injection_dict_forecast_model_tune(
|
189
190
|
df_pred_optim, mlf)
|
190
|
-
with open(str(data_path / 'injection_dict.pkl'), "wb") as fid:
|
191
|
+
with open(str(emhass_conf['data_path'] / 'injection_dict.pkl'), "wb") as fid:
|
191
192
|
pickle.dump(injection_dict, fid)
|
192
193
|
msg = f'EMHASS >> Action forecast-model-tune executed... \n'
|
193
194
|
if not checkFileLog(ActionStr):
|
194
195
|
return make_response(msg, 201)
|
195
196
|
return make_response(grabLog(ActionStr), 400)
|
197
|
+
elif action_name == 'regressor-model-fit':
|
198
|
+
ActionStr = " >> Performing a machine learning regressor fit..."
|
199
|
+
app.logger.info(ActionStr)
|
200
|
+
regressor_model_fit(input_data_dict, app.logger)
|
201
|
+
msg = f'EMHASS >> Action regressor-model-fit executed... \n'
|
202
|
+
if not checkFileLog(ActionStr):
|
203
|
+
return make_response(msg, 201)
|
204
|
+
return make_response(grabLog(ActionStr), 400)
|
205
|
+
elif action_name == 'regressor-model-predict':
|
206
|
+
ActionStr = " >> Performing a machine learning regressor predict..."
|
207
|
+
app.logger.info(ActionStr)
|
208
|
+
regressor_model_predict(input_data_dict, app.logger)
|
209
|
+
msg = f'EMHASS >> Action regressor-model-predict executed... \n'
|
210
|
+
if not checkFileLog(ActionStr):
|
211
|
+
return make_response(msg, 201)
|
212
|
+
return make_response(grabLog(ActionStr), 400)
|
196
213
|
else:
|
197
214
|
app.logger.error("ERROR: passed action is not valid")
|
198
215
|
msg = f'EMHASS >> ERROR: Passed action is not valid... \n'
|
@@ -253,8 +270,13 @@ if __name__ == "__main__":
|
|
253
270
|
if options.get('data_path', None) != None and options.get('data_path', None) != "default":
|
254
271
|
DATA_PATH = options.get('data_path', None);
|
255
272
|
|
273
|
+
#save paths to dictionary
|
256
274
|
config_path = Path(CONFIG_PATH)
|
257
275
|
data_path = Path(DATA_PATH)
|
276
|
+
emhass_conf = {}
|
277
|
+
emhass_conf['config_path'] = config_path
|
278
|
+
emhass_conf['data_path'] = data_path
|
279
|
+
emhass_conf['root_path'] = Path(config_path).parent #assume root is parent of config_path
|
258
280
|
|
259
281
|
# Read the example default config file
|
260
282
|
if config_path.exists():
|
@@ -274,8 +296,8 @@ if __name__ == "__main__":
|
|
274
296
|
web_ui_url = '0.0.0.0'
|
275
297
|
|
276
298
|
# Initialize this global dict
|
277
|
-
if (data_path / 'injection_dict.pkl').exists():
|
278
|
-
with open(str(data_path / 'injection_dict.pkl'), "rb") as fid:
|
299
|
+
if (emhass_conf['data_path'] / 'injection_dict.pkl').exists():
|
300
|
+
with open(str(emhass_conf['data_path'] / 'injection_dict.pkl'), "rb") as fid:
|
279
301
|
injection_dict = pickle.load(fid)
|
280
302
|
else:
|
281
303
|
injection_dict = None
|
@@ -384,11 +406,11 @@ if __name__ == "__main__":
|
|
384
406
|
params = build_params(params, params_secrets, options, 1, app.logger)
|
385
407
|
else:
|
386
408
|
params = build_params(params, params_secrets, options, args.addon, app.logger)
|
387
|
-
if os.path.exists(str(data_path)):
|
388
|
-
with open(str(data_path / 'params.pkl'), "wb") as fid:
|
409
|
+
if os.path.exists(str(emhass_conf['data_path'])):
|
410
|
+
with open(str(emhass_conf['data_path'] / 'params.pkl'), "wb") as fid:
|
389
411
|
pickle.dump((config_path, params), fid)
|
390
412
|
else:
|
391
|
-
raise Exception("missing: " + str(data_path))
|
413
|
+
raise Exception("missing: " + str(emhass_conf['data_path']))
|
392
414
|
|
393
415
|
# Define logger
|
394
416
|
#stream logger
|
@@ -396,7 +418,7 @@ if __name__ == "__main__":
|
|
396
418
|
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
397
419
|
ch.setFormatter(formatter)
|
398
420
|
#Action File logger
|
399
|
-
fileLogger = logging.FileHandler(str(data_path / 'actionLogs.txt'))
|
421
|
+
fileLogger = logging.FileHandler(str(emhass_conf['data_path'] / 'actionLogs.txt'))
|
400
422
|
formatter = logging.Formatter('%(levelname)s - %(name)s - %(message)s')
|
401
423
|
fileLogger.setFormatter(formatter) # add format to Handler
|
402
424
|
if logging_level == "DEBUG":
|
@@ -428,7 +450,7 @@ if __name__ == "__main__":
|
|
428
450
|
port = int(os.environ.get('PORT', 5000))
|
429
451
|
app.logger.info("Launching the emhass webserver at: http://"+web_ui_url+":"+str(port))
|
430
452
|
app.logger.info("Home Assistant data fetch will be performed using url: "+hass_url)
|
431
|
-
app.logger.info("The data path is: "+str(data_path))
|
453
|
+
app.logger.info("The data path is: "+str(emhass_conf['data_path']))
|
432
454
|
try:
|
433
455
|
app.logger.info("Using core emhass version: "+version('emhass'))
|
434
456
|
except PackageNotFoundError:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: emhass
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.9.0
|
4
4
|
Summary: An Energy Management System for Home Assistant
|
5
5
|
Home-page: https://github.com/davidusb-geek/emhass
|
6
6
|
Author: David HERNANDEZ
|
@@ -24,11 +24,11 @@ Requires-Dist: protobuf >=3.0.0
|
|
24
24
|
Requires-Dist: pytz >=2021.1
|
25
25
|
Requires-Dist: requests >=2.25.1
|
26
26
|
Requires-Dist: beautifulsoup4 >=4.9.3
|
27
|
-
Requires-Dist: h5py ==3.
|
27
|
+
Requires-Dist: h5py ==3.11.0
|
28
28
|
Requires-Dist: pulp >=2.4
|
29
29
|
Requires-Dist: pyyaml >=5.4.1
|
30
30
|
Requires-Dist: tables <=3.9.1
|
31
|
-
Requires-Dist: skforecast ==0.
|
31
|
+
Requires-Dist: skforecast ==0.12.0
|
32
32
|
Requires-Dist: flask >=2.0.3
|
33
33
|
Requires-Dist: waitress >=2.1.1
|
34
34
|
Requires-Dist: plotly >=5.6.0
|
@@ -63,6 +63,20 @@ Requires-Dist: plotly >=5.6.0
|
|
63
63
|
<img alt="Read the Docs" src="https://img.shields.io/readthedocs/emhass">
|
64
64
|
</a>
|
65
65
|
</p>
|
66
|
+
<div align="center">
|
67
|
+
<a href="https://emhass.readthedocs.io/en/latest/">
|
68
|
+
<img src="https://raw.githubusercontent.com/davidusb-geek/emhass/master/docs/images/Documentation_button.svg" alt="Documentation">
|
69
|
+
</a>
|
70
|
+
<a href="https://community.home-assistant.io/t/emhass-an-energy-management-for-home-assistant/338126">
|
71
|
+
<img src="https://raw.githubusercontent.com/davidusb-geek/emhass/master/docs/images/Community_button.svg" alt="Community">
|
72
|
+
</a>
|
73
|
+
<a href="https://github.com/davidusb-geek/emhass/issues">
|
74
|
+
<img src="https://raw.githubusercontent.com/davidusb-geek/emhass/master/docs/images/Issues_button.svg" alt="Issues">
|
75
|
+
</a>
|
76
|
+
<a href="https://github.com/davidusb-geek/emhass-add-on">
|
77
|
+
<img src="https://raw.githubusercontent.com/davidusb-geek/emhass/master/docs/images/EMHASS_Add_on_button.svg" alt="EMHASS Add-on">
|
78
|
+
</a>
|
79
|
+
</div>
|
66
80
|
<br>
|
67
81
|
<p align="center">
|
68
82
|
If you like this work please consider buying a coffee ;-)
|
@@ -107,7 +121,7 @@ You must follow these steps to make EMHASS work properly:
|
|
107
121
|
|
108
122
|
1) Define all the parameters in the configuration file according to your installation. See the description for each parameter in the **configuration** section.
|
109
123
|
|
110
|
-
2) You most notably will need to define the main data entering EMHASS. This will be the `
|
124
|
+
2) You most notably will need to define the main data entering EMHASS. This will be the `sensor.power_photovoltaics` for the name of the your hass variable containing the PV produced power and the variable `sensor.power_load_no_var_loads` for the load power of your household excluding the power of the deferrable loads that you want to optimize.
|
111
125
|
|
112
126
|
3) Launch the actual optimization and check the results. This can be done manually using the buttons in the web ui or with a `curl` command like this: `curl -i -H 'Content-Type:application/json' -X POST -d '{}' http://localhost:5000/action/dayahead-optim`.
|
113
127
|
|
@@ -370,7 +384,7 @@ In EMHASS we have basically 4 forecasts to deal with:
|
|
370
384
|
|
371
385
|
- PV production selling price forecast: at what price are you selling your excess PV production on the next 24h. This is given in EUR/kWh.
|
372
386
|
|
373
|
-
The sensor containing the load data should be specified in parameter `var_load` in the configuration file. As we want to optimize the household energies, when need to forecast the load power conumption. The default method for this is a naive approach using 1-day persistence. The load data variable should not contain the data from the deferrable loads themselves. For example, lets say that you set your deferrable load to be the washing machine. The variable that you should enter in EMHASS will be: `var_load: 'sensor.power_load_no_var_loads'` and `
|
387
|
+
The sensor containing the load data should be specified in parameter `var_load` in the configuration file. As we want to optimize the household energies, when need to forecast the load power conumption. The default method for this is a naive approach using 1-day persistence. The load data variable should not contain the data from the deferrable loads themselves. For example, lets say that you set your deferrable load to be the washing machine. The variable that you should enter in EMHASS will be: `var_load: 'sensor.power_load_no_var_loads'` and `sensor.power_load_no_var_loads = sensor.power_load - sensor.power_washing_machine`. This is supposing that the overall load of your house is contained in variable: `sensor.power_load`. The sensor `sensor.power_load_no_var_loads` can be easily created with a new template sensor in Home Assistant.
|
374
388
|
|
375
389
|
If you are implementing a MPC controller, then you should also need to provide some data at the optimization runtime using the key `runtimeparams`.
|
376
390
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
emhass/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
+
emhass/command_line.py,sha256=O47CH1_OvV64tg38ijSlDVZLIGYbXgFbLw43baIlmQU,47953
|
3
|
+
emhass/forecast.py,sha256=JyMiiy4ukm4fzWgPaveKNX5jmlO6GLd6w0tnugbtZ0Y,47259
|
4
|
+
emhass/machine_learning_forecaster.py,sha256=az8cYRCckmR-WEdXyigbe8udtbj82yfahPmow4gue4s,15655
|
5
|
+
emhass/machine_learning_regressor.py,sha256=fn4fpo4UDAstGsPehCFSPUQzphUwoYiV0WzFGHW6rXc,10641
|
6
|
+
emhass/optimization.py,sha256=ijiSBKdU0fS6TBpeoBo-CoPz6lBMU4nnsi6aiZi1J0I,37252
|
7
|
+
emhass/retrieve_hass.py,sha256=nOEqs1MtL5DcGr3e0ht_ulozYpX2zvKDgX2PWSylyaE,21025
|
8
|
+
emhass/utils.py,sha256=iWRoMdS20MF9FO8v2D0mjokIzpmwD_ZmhZZA-QDPy0Q,47801
|
9
|
+
emhass/web_server.py,sha256=UfPUBA-ct1Su8cQFyufnW0Bb4BBlpGHF3yXN47sXkig,23055
|
10
|
+
emhass/data/cec_inverters.pbz2,sha256=tK8FvAUDW0uYez8EPttdCJwHhpPofclYV6GhhNZL0Pk,168272
|
11
|
+
emhass/data/cec_modules.pbz2,sha256=8vEaysgYffXg3KUl8XSF36Mdywzi3LpEtUN_qenjO9s,1655747
|
12
|
+
emhass/static/advanced.html,sha256=15tYNw9ck_ds1zxQk0XXj7wmS9px_0x0GDx57cFx3vA,1970
|
13
|
+
emhass/static/basic.html,sha256=hJ4EgCXVNHL5nMQWkIHWjsTm_bJb0N_ZN4zFUjhxEzU,608
|
14
|
+
emhass/static/script.js,sha256=8lrgGTYY5Ec0v_-n6n738MX8TuBff6sebASlSWRiroY,17332
|
15
|
+
emhass/static/style.css,sha256=xSihd06G-AeMKtFGPCJAnTaGVQXKuPM7kvVvDuQDuxU,15557
|
16
|
+
emhass/static/img/emhass_icon.png,sha256=Kyx6hXQ1huJLHAq2CaBfjYXR25H9j99PSWHI0lShkaQ,19030
|
17
|
+
emhass/static/img/emhass_logo_short.svg,sha256=yzMcqtBRCV8rH84-MwnigZh45_f9Eoqwho9P8nCodJA,66736
|
18
|
+
emhass/static/img/feather-sprite.svg,sha256=VHjMJQg88wXa9CaeYrKGhNtyK0xdd47zCqwSIa-hxo8,60319
|
19
|
+
emhass/templates/index.html,sha256=_BsvUJ981uSQkx5H9tq_3es__x4WdPiOy7FjNoNYU9w,2744
|
20
|
+
emhass/templates/template.html,sha256=TkGgMecQEbFUZA4ymPwMUzNjKHsENvCgroUWbPt7G4Y,158
|
21
|
+
emhass-0.9.0.dist-info/LICENSE,sha256=1X3-S1yvOCBDBeox1aK3dq00m7dA8NDtcPrpKPISzbE,1077
|
22
|
+
emhass-0.9.0.dist-info/METADATA,sha256=FM4U57ejR0jI_EfZBv_OGUsRRdQ5hKoQFnFNA9Bshgk,35618
|
23
|
+
emhass-0.9.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
24
|
+
emhass-0.9.0.dist-info/entry_points.txt,sha256=6Bp1NFOGNv_fSTxYl1ke3K3h3aqAcBxI-bgq5yq-i1M,52
|
25
|
+
emhass-0.9.0.dist-info/top_level.txt,sha256=L7fIX4awfmxQbAePtSdVg2e6x_HhghfReHfsKSpKr9I,7
|
26
|
+
emhass-0.9.0.dist-info/RECORD,,
|
emhass-0.8.6.dist-info/RECORD
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
emhass/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
emhass/command_line.py,sha256=TrNJnP1V94NoGanR7-Ik1ZVWlE6fsbDjWUIuH0l-0bs,37580
|
3
|
-
emhass/forecast.py,sha256=38WF2XkopDOwvSZJU3_m01BXyiENVypEVOeXcHP-5Fo,45704
|
4
|
-
emhass/machine_learning_forecaster.py,sha256=8Rm0-pltsjIYqLv01zCeO_Ij_n2HKC62dv_kCno7UsU,15640
|
5
|
-
emhass/optimization.py,sha256=WcUJSDSBK7wgx0jaX25mhco7ZfqG1g066Ebh6ACyruQ,37197
|
6
|
-
emhass/retrieve_hass.py,sha256=COf8LD6B0arFI-P71PXyLT7snB7_Wg5c3bMhRdVMdI4,18406
|
7
|
-
emhass/utils.py,sha256=zj1rzpzsRpifgDcmeqRZUcM6WL6GGCcUAdStmGoXlJE,42394
|
8
|
-
emhass/web_server.py,sha256=FFdIZio-QGFH3t-p-Le2Q1o6_cqjfBSdoEXdExJ21nY,21541
|
9
|
-
emhass/data/cec_inverters.pbz2,sha256=tK8FvAUDW0uYez8EPttdCJwHhpPofclYV6GhhNZL0Pk,168272
|
10
|
-
emhass/data/cec_modules.pbz2,sha256=8vEaysgYffXg3KUl8XSF36Mdywzi3LpEtUN_qenjO9s,1655747
|
11
|
-
emhass/static/advanced.html,sha256=AsT3lMD0AjvAqzAYvUPmslyOYk2C3LA-VfoSB2PwnYA,1747
|
12
|
-
emhass/static/basic.html,sha256=hJ4EgCXVNHL5nMQWkIHWjsTm_bJb0N_ZN4zFUjhxEzU,608
|
13
|
-
emhass/static/script.js,sha256=bj3Pksm97sM4lUTpp3IkStx8fMwee39GnDWhrWjvV_A,17250
|
14
|
-
emhass/static/style.css,sha256=xSihd06G-AeMKtFGPCJAnTaGVQXKuPM7kvVvDuQDuxU,15557
|
15
|
-
emhass/static/img/emhass_icon.png,sha256=Kyx6hXQ1huJLHAq2CaBfjYXR25H9j99PSWHI0lShkaQ,19030
|
16
|
-
emhass/static/img/emhass_logo_short.svg,sha256=yzMcqtBRCV8rH84-MwnigZh45_f9Eoqwho9P8nCodJA,66736
|
17
|
-
emhass/static/img/feather-sprite.svg,sha256=VHjMJQg88wXa9CaeYrKGhNtyK0xdd47zCqwSIa-hxo8,60319
|
18
|
-
emhass/templates/index.html,sha256=_BsvUJ981uSQkx5H9tq_3es__x4WdPiOy7FjNoNYU9w,2744
|
19
|
-
emhass/templates/template.html,sha256=TkGgMecQEbFUZA4ymPwMUzNjKHsENvCgroUWbPt7G4Y,158
|
20
|
-
emhass-0.8.6.dist-info/LICENSE,sha256=1X3-S1yvOCBDBeox1aK3dq00m7dA8NDtcPrpKPISzbE,1077
|
21
|
-
emhass-0.8.6.dist-info/METADATA,sha256=KR8yrRLmiYFe6ljkjXrQO-De3j-26I1d3WO3pZXMSvs,34758
|
22
|
-
emhass-0.8.6.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
23
|
-
emhass-0.8.6.dist-info/entry_points.txt,sha256=6Bp1NFOGNv_fSTxYl1ke3K3h3aqAcBxI-bgq5yq-i1M,52
|
24
|
-
emhass-0.8.6.dist-info/top_level.txt,sha256=L7fIX4awfmxQbAePtSdVg2e6x_HhghfReHfsKSpKr9I,7
|
25
|
-
emhass-0.8.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|