emhass 0.11.1__py3-none-any.whl → 0.11.2__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.
@@ -19,8 +19,7 @@
19
19
  "sensor_power_photovoltaics": "sensor.power_photovoltaics",
20
20
  "sensor_power_load_no_var_loads": "sensor.power_load_no_var_loads",
21
21
  "sensor_replace_zero": [
22
- "sensor.power_photovoltaics",
23
- "sensor.power_load_no_var_loads"
22
+ "sensor.power_photovoltaics"
24
23
  ],
25
24
  "sensor_linear_interp": [
26
25
  "sensor.power_photovoltaics",
emhass/retrieve_hass.py CHANGED
@@ -72,6 +72,19 @@ class RetrieveHass:
72
72
  self.logger = logger
73
73
  self.get_data_from_file = get_data_from_file
74
74
 
75
+ def get_ha_config(self):
76
+ """
77
+ Extract some configuration data from HA.
78
+
79
+ """
80
+ headers = {
81
+ "Authorization": "Bearer " + self.long_lived_token,
82
+ "content-type": "application/json"
83
+ }
84
+ url = self.hass_url+"api/config"
85
+ response_config = get(url, headers=headers)
86
+ self.ha_config = response_config.json()
87
+
75
88
  def get_data(self, days_list: pd.date_range, var_list: list,
76
89
  minimal_response: Optional[bool] = False, significant_changes_only: Optional[bool] = False,
77
90
  test_url: Optional[str] = "empty") -> None:
@@ -98,15 +111,17 @@ class RetrieveHass:
98
111
  are experimental
99
112
  """
100
113
  self.logger.info("Retrieve hass get data method initiated...")
114
+ headers = {
115
+ "Authorization": "Bearer " + self.long_lived_token,
116
+ "content-type": "application/json"
117
+ }
118
+ # Looping on each day from days list
101
119
  self.df_final = pd.DataFrame()
102
120
  x = 0 # iterate based on days
103
- # Looping on each day from days list
104
121
  for day in days_list:
105
122
  for i, var in enumerate(var_list):
106
123
  if test_url == "empty":
107
- if (
108
- self.hass_url == "http://supervisor/core/api"
109
- ): # If we are using the supervisor API
124
+ if (self.hass_url == "http://supervisor/core/api"): # If we are using the supervisor API
110
125
  url = (
111
126
  self.hass_url
112
127
  + "/history/period/"
@@ -124,16 +139,10 @@ class RetrieveHass:
124
139
  )
125
140
  if minimal_response: # A support for minimal response
126
141
  url = url + "?minimal_response"
127
- if (
128
- significant_changes_only
129
- ): # And for signicant changes only (check the HASS restful API for more info)
142
+ if (significant_changes_only): # And for signicant changes only (check the HASS restful API for more info)
130
143
  url = url + "?significant_changes_only"
131
144
  else:
132
145
  url = test_url
133
- headers = {
134
- "Authorization": "Bearer " + self.long_lived_token,
135
- "content-type": "application/json",
136
- }
137
146
  try:
138
147
  response = get(url, headers=headers)
139
148
  except Exception:
@@ -407,7 +407,7 @@ function buildParamElement(
407
407
  else {
408
408
  return `
409
409
  ${type_specific_html}
410
- <input class="param_input" type="${type}" value=${value} placeholder=${parameter_definition_object["default_value"]}>
410
+ <input class="param_input" type="${type}" placeholder=${parameter_definition_object["default_value"]} value=${value} >
411
411
  ${type_specific_html_end}
412
412
  `;
413
413
  }
@@ -418,9 +418,9 @@ function buildParamElement(
418
418
  if (typeof Object.values(value)[0] === "object") {
419
419
  for (param of Object.values(value)) {
420
420
  for (items of Object.values(param)) {
421
- inputs += `<input class="param_input" type="${type}" value=${
421
+ inputs += `<input class="param_input" type="${type}" placeholder=${Object.values(items)[0]} value=${
422
422
  Object.values(items)[0]
423
- } placeholder=${Object.values(items)[0]}>`;
423
+ }>`;
424
424
  }
425
425
  inputs += `</br>`;
426
426
  }
@@ -432,7 +432,7 @@ function buildParamElement(
432
432
  for (param of value) {
433
433
  inputs += `
434
434
  ${type_specific_html}
435
- <input class="param_input" type="${type}" value=${param} placeholder=${parameter_definition_object["default_value"]}>
435
+ <input class="param_input" type="${type}" placeholder=${parameter_definition_object["default_value"]} value=${param}>
436
436
  ${type_specific_html_end}
437
437
  `;
438
438
  }
emhass/utils.py CHANGED
@@ -288,7 +288,7 @@ def treat_runtimeparams(runtimeparams: str, params: str, retrieve_hass_conf: dic
288
288
  else:
289
289
  prediction_horizon = runtimeparams["prediction_horizon"]
290
290
  params["passed_data"]["prediction_horizon"] = prediction_horizon
291
- if "soc_init" not in runtimeparams.keys():
291
+ if 'soc_init' not in runtimeparams.keys():
292
292
  soc_init = plant_conf['battery_target_state_of_charge']
293
293
  else:
294
294
  soc_init = runtimeparams["soc_init"]
@@ -298,23 +298,24 @@ def treat_runtimeparams(runtimeparams: str, params: str, retrieve_hass_conf: dic
298
298
  else:
299
299
  soc_final = runtimeparams["soc_final"]
300
300
  params["passed_data"]["soc_final"] = soc_final
301
- if 'operating_hours_of_each_deferrable_load' not in runtimeparams.keys():
302
- def_total_hours = optim_conf['operating_hours_of_each_deferrable_load']
301
+ if 'operating_hours_of_each_deferrable_load' not in runtimeparams.keys() and 'def_total_hours' not in runtimeparams.keys():
302
+ def_total_hours = optim_conf.get('operating_hours_of_each_deferrable_load')
303
303
  else:
304
- def_total_hours = runtimeparams['operating_hours_of_each_deferrable_load']
304
+ def_total_hours = runtimeparams.get(
305
+ 'operating_hours_of_each_deferrable_load', runtimeparams.get('def_total_hours'))
305
306
  params["passed_data"]['operating_hours_of_each_deferrable_load'] = def_total_hours
306
- if 'start_timesteps_of_each_deferrable_load' in runtimeparams.keys():
307
- def_start_timestep = runtimeparams['start_timesteps_of_each_deferrable_load']
308
- else:
307
+ if 'start_timesteps_of_each_deferrable_load' not in runtimeparams.keys() and 'def_start_timestep' in runtimeparams.keys():
308
+ def_start_timestep = optim_conf.get('start_timesteps_of_each_deferrable_load')
309
+ else:
309
310
  def_start_timestep = runtimeparams.get(
310
- 'def_start_timestep', optim_conf['start_timesteps_of_each_deferrable_load'])
311
+ 'start_timesteps_of_each_deferrable_load', runtimeparams.get('def_start_timestep'))
311
312
  params["passed_data"]['start_timesteps_of_each_deferrable_load'] = def_start_timestep
312
- if 'end_timesteps_of_each_deferrable_load' in runtimeparams.keys():
313
- def_end_timestep = runtimeparams['end_timesteps_of_each_deferrable_load']
313
+ if 'end_timesteps_of_each_deferrable_load' not in runtimeparams.keys() and 'def_end_timestep' not in runtimeparams.keys():
314
+ def_end_timestep = optim_conf.get('end_timesteps_of_each_deferrable_load')
314
315
  else:
315
316
  def_end_timestep = runtimeparams.get(
316
- 'def_end_timestep', optim_conf['end_timesteps_of_each_deferrable_load'])
317
- params["passed_data"]["end_timesteps_of_each_deferrable_load"] = def_end_timestep
317
+ 'end_timesteps_of_each_deferrable_load', runtimeparams.get('def_end_timestep'))
318
+ params["passed_data"]['end_timesteps_of_each_deferrable_load'] = def_end_timestep
318
319
  forecast_dates = copy.deepcopy(forecast_dates)[0:prediction_horizon]
319
320
  # Load the default config
320
321
  if "def_load_config" in optim_conf:
@@ -364,11 +365,16 @@ def treat_runtimeparams(runtimeparams: str, params: str, retrieve_hass_conf: dic
364
365
  params['passed_data'][forecast_key] = None
365
366
 
366
367
  # Treat passed data for forecast model fit/predict/tune at runtime
367
- if 'historic_days_to_retrieve' in runtimeparams.keys():
368
- days_to_retrieve = runtimeparams['historic_days_to_retrieve']
368
+ if 'historic_days_to_retrieve' not in runtimeparams.keys() and 'days_to_retrieve' not in runtimeparams.keys():
369
+ historic_days_to_retrieve = retrieve_hass_conf.get('historic_days_to_retrieve')
369
370
  else:
370
- days_to_retrieve = runtimeparams.get('days_to_retrieve', 9)
371
- params["passed_data"]['historic_days_to_retrieve'] = days_to_retrieve
371
+ historic_days_to_retrieve = runtimeparams.get(
372
+ 'historic_days_to_retrieve', runtimeparams.get('days_to_retrieve'))
373
+ if historic_days_to_retrieve < 9:
374
+ logger.warning("warning `days_to_retrieve` is set to a value less than 9, this could cause an error with the fit")
375
+ logger.warning("setting`passed_data:days_to_retrieve` to 9 for fit/predict/tune")
376
+ historic_days_to_retrieve = 9
377
+ params["passed_data"]['historic_days_to_retrieve'] = historic_days_to_retrieve
372
378
  if "model_type" not in runtimeparams.keys():
373
379
  model_type = "load_forecast"
374
380
  else:
@@ -479,50 +485,35 @@ def treat_runtimeparams(runtimeparams: str, params: str, retrieve_hass_conf: dic
479
485
  params["passed_data"]["publish_prefix"] = publish_prefix
480
486
 
481
487
  # Treat optimization (optim_conf) configuration parameters passed at runtime
482
- if 'number_of_deferrable_loads' in runtimeparams.keys():
483
- optim_conf['number_of_deferrable_loads'] = runtimeparams['number_of_deferrable_loads']
484
- if 'num_def_loads' in runtimeparams.keys():
485
- optim_conf['number_of_deferrable_loads'] = runtimeparams['num_def_loads']
486
- if 'nominal_power_of_deferrable_loads' in runtimeparams.keys():
487
- optim_conf['nominal_power_of_deferrable_loads'] = runtimeparams['nominal_power_of_deferrable_loads']
488
- if 'P_deferrable_nom' in runtimeparams.keys():
489
- optim_conf['nominal_power_of_deferrable_loads'] = runtimeparams['P_deferrable_nom']
490
- if 'operating_hours_of_each_deferrable_load' in runtimeparams.keys():
491
- optim_conf['operating_hours_of_each_deferrable_load'] = runtimeparams['operating_hours_of_each_deferrable_load']
492
- if 'def_total_hours' in runtimeparams.keys():
493
- optim_conf['operating_hours_of_each_deferrable_load'] = runtimeparams['def_total_hours']
494
- if 'start_timesteps_of_each_deferrable_load' in runtimeparams.keys():
495
- optim_conf['start_timesteps_of_each_deferrable_load'] = runtimeparams['start_timesteps_of_each_deferrable_load']
496
- if 'end_timesteps_of_each_deferrable_load' in runtimeparams.keys():
497
- optim_conf['end_timesteps_of_each_deferrable_load'] = runtimeparams['end_timesteps_of_each_deferrable_load']
488
+ if 'number_of_deferrable_loads' in runtimeparams.keys() or 'num_def_loads' in runtimeparams.keys():
489
+ optim_conf['number_of_deferrable_loads'] = runtimeparams.get(
490
+ 'number_of_deferrable_loads', runtimeparams.get('num_def_loads'))
491
+ if 'nominal_power_of_deferrable_loads' in runtimeparams.keys() or 'P_deferrable_nom' in runtimeparams.keys():
492
+ optim_conf['nominal_power_of_deferrable_loads'] = runtimeparams.get(
493
+ 'nominal_power_of_deferrable_loads', runtimeparams.get('P_deferrable_nom'))
494
+ if 'operating_hours_of_each_deferrable_load' in runtimeparams.keys() or 'def_total_hours' in runtimeparams.keys():
495
+ optim_conf['operating_hours_of_each_deferrable_load'] = runtimeparams.get(
496
+ 'operating_hours_of_each_deferrable_load', runtimeparams.get('def_total_hours'))
497
+ if 'start_timesteps_of_each_deferrable_load' in runtimeparams.keys() or 'def_start_timestep' in runtimeparams.keys():
498
+ optim_conf['start_timesteps_of_each_deferrable_load'] = runtimeparams.get(
499
+ 'start_timesteps_of_each_deferrable_load', runtimeparams.get('def_start_timestep'))
500
+ if 'end_timesteps_of_each_deferrable_load' in runtimeparams.keys() or 'def_end_timestep' in runtimeparams.keys():
501
+ optim_conf['end_timesteps_of_each_deferrable_load'] = runtimeparams.get(
502
+ 'end_timesteps_of_each_deferrable_load', runtimeparams.get('def_end_timestep'))
498
503
  if "def_current_state" in runtimeparams.keys():
499
504
  optim_conf["def_current_state"] = [
500
505
  bool(s) for s in runtimeparams["def_current_state"]]
501
- if 'treat_deferrable_load_as_semi_cont' in runtimeparams.keys():
502
- optim_conf['treat_deferrable_load_as_semi_cont'] = [
503
- ast.literal_eval(str(k).capitalize())
504
- for k in runtimeparams['treat_deferrable_load_as_semi_cont']
505
- ]
506
- if 'treat_def_as_semi_cont' in runtimeparams.keys():
506
+ if 'treat_deferrable_load_as_semi_cont' in runtimeparams.keys() or 'treat_def_as_semi_cont' in runtimeparams.keys():
507
507
  optim_conf['treat_deferrable_load_as_semi_cont'] = [
508
- ast.literal_eval(str(k).capitalize())
509
- for k in runtimeparams['treat_def_as_semi_cont']
510
- ]
511
- if 'set_deferrable_load_single_constant' in runtimeparams.keys():
508
+ ast.literal_eval(str(k).capitalize()) for k in runtimeparams.get('treat_deferrable_load_as_semi_cont',runtimeparams.get('treat_def_as_semi_cont'))
509
+ ]
510
+ if 'set_deferrable_load_single_constant' in runtimeparams.keys() or 'set_def_constant' in runtimeparams.keys():
512
511
  optim_conf['set_deferrable_load_single_constant'] = [
513
- ast.literal_eval(str(k).capitalize()) for k in runtimeparams['set_deferrable_load_single_constant']
512
+ ast.literal_eval(str(k).capitalize()) for k in runtimeparams.get('set_deferrable_load_single_constant',runtimeparams.get('set_def_constant'))
514
513
  ]
515
- if 'set_def_constant' in runtimeparams.keys():
516
- optim_conf['set_deferrable_load_single_constant'] = [
517
- ast.literal_eval(str(k).capitalize()) for k in runtimeparams['set_def_constant']
518
- ]
519
- if 'set_deferrable_startup_penalty' in runtimeparams.keys():
520
- optim_conf['set_deferrable_startup_penalty'] = [
521
- ast.literal_eval(str(k).capitalize()) for k in runtimeparams['set_deferrable_startup_penalty']
522
- ]
523
- if 'def_start_penalty' in runtimeparams.keys():
514
+ if 'set_deferrable_startup_penalty' in runtimeparams.keys() or 'def_start_penalty' in runtimeparams.keys():
524
515
  optim_conf['set_deferrable_startup_penalty'] = [
525
- ast.literal_eval(str(k).capitalize()) for k in runtimeparams['def_start_penalty']
516
+ ast.literal_eval(str(k).capitalize()) for k in runtimeparams.get('set_deferrable_startup_penalty',runtimeparams.get('def_start_penalty'))
526
517
  ]
527
518
  if 'def_load_config' in runtimeparams:
528
519
  optim_conf["def_load_config"] = runtimeparams['def_load_config']
@@ -534,9 +525,9 @@ def treat_runtimeparams(runtimeparams: str, params: str, retrieve_hass_conf: dic
534
525
  optim_conf['weight_battery_charge'] = runtimeparams['weight_battery_charge']
535
526
 
536
527
  # Treat retrieve data from Home Assistant (retrieve_hass_conf) configuration parameters passed at runtime
537
- if 'optimization_time_step' in runtimeparams.keys():
538
- retrieve_hass_conf['optimization_time_step'] = pd.to_timedelta(
539
- runtimeparams['optimization_time_step'], "minutes")
528
+ if 'optimization_time_step' in runtimeparams.keys() or 'freq' in runtimeparams.keys():
529
+ retrieve_hass_conf['optimization_time_step'] = pd.to_timedelta(runtimeparams.get(
530
+ 'optimization_time_step', runtimeparams.get('freq')), "minutes")
540
531
  if 'continual_publish' in runtimeparams.keys():
541
532
  retrieve_hass_conf['continual_publish'] = bool(
542
533
  runtimeparams['continual_publish'])
@@ -653,9 +644,7 @@ def get_yaml_parse(params: str, logger: logging.Logger) -> Tuple[dict, dict, dic
653
644
  return False, False, False
654
645
 
655
646
  optim_conf = input_conf.get("optim_conf", {})
656
-
657
647
  retrieve_hass_conf = input_conf.get("retrieve_hass_conf", {})
658
-
659
648
  plant_conf = input_conf.get("plant_conf", {})
660
649
 
661
650
  # Format time parameters
@@ -668,6 +657,70 @@ def get_yaml_parse(params: str, logger: logging.Logger) -> Tuple[dict, dict, dic
668
657
 
669
658
  return retrieve_hass_conf, optim_conf, plant_conf
670
659
 
660
+ def get_legacy_yaml_parse(emhass_conf: dict, use_secrets: Optional[bool] = True,
661
+ params: Optional[str] = None) -> Tuple[dict, dict, dict]:
662
+ """
663
+ Perform parsing of the config.yaml file.
664
+
665
+ :param emhass_conf: Dictionary containing the needed emhass paths
666
+ :type emhass_conf: dict
667
+ :param use_secrets: Indicate if we should use a secrets file or not.
668
+ Set to False for unit tests.
669
+ :type use_secrets: bool, optional
670
+ :param params: Configuration parameters passed from data/options.json
671
+ :type params: str
672
+ :return: A tuple with the dictionaries containing the parsed data
673
+ :rtype: tuple(dict)
674
+
675
+ """
676
+ if params is None:
677
+ with open(emhass_conf["config_path"], 'r') as file:
678
+ input_conf = yaml.load(file, Loader=yaml.FullLoader)
679
+ else:
680
+ input_conf = json.loads(params)
681
+ if use_secrets:
682
+ if params is None:
683
+ with open(emhass_conf["config_path"].parent / 'secrets_emhass.yaml', 'r') as file: # Assume secrets and config file paths are the same
684
+ input_secrets = yaml.load(file, Loader=yaml.FullLoader)
685
+ else:
686
+ input_secrets = input_conf.pop("params_secrets", None)
687
+
688
+ if type(input_conf["retrieve_hass_conf"]) == list: # if using old config version
689
+ retrieve_hass_conf = dict(
690
+ {key: d[key] for d in input_conf["retrieve_hass_conf"] for key in d}
691
+ )
692
+ else:
693
+ retrieve_hass_conf = input_conf.get("retrieve_hass_conf", {})
694
+
695
+ if use_secrets:
696
+ retrieve_hass_conf.update(input_secrets)
697
+ else:
698
+ retrieve_hass_conf["hass_url"] = "http://supervisor/core/api"
699
+ retrieve_hass_conf["long_lived_token"] = "${SUPERVISOR_TOKEN}"
700
+ retrieve_hass_conf["time_zone"] = "Europe/Paris"
701
+ retrieve_hass_conf["lat"] = 45.83
702
+ retrieve_hass_conf["lon"] = 6.86
703
+ retrieve_hass_conf["alt"] = 4807.8
704
+ retrieve_hass_conf["freq"] = pd.to_timedelta(retrieve_hass_conf["freq"], "minutes")
705
+ retrieve_hass_conf["time_zone"] = pytz.timezone(retrieve_hass_conf["time_zone"])
706
+
707
+ if type(input_conf["optim_conf"]) == list:
708
+ optim_conf = dict({key: d[key] for d in input_conf["optim_conf"] for key in d})
709
+ else:
710
+ optim_conf = input_conf.get("optim_conf", {})
711
+
712
+ optim_conf["list_hp_periods"] = dict(
713
+ (key, d[key]) for d in optim_conf["list_hp_periods"] for key in d
714
+ )
715
+ optim_conf["delta_forecast"] = pd.Timedelta(days=optim_conf["delta_forecast"])
716
+
717
+ if type(input_conf["plant_conf"]) == list:
718
+ plant_conf = dict({key: d[key] for d in input_conf["plant_conf"] for key in d})
719
+ else:
720
+ plant_conf = input_conf.get("plant_conf", {})
721
+
722
+ return retrieve_hass_conf, optim_conf, plant_conf
723
+
671
724
 
672
725
  def get_injection_dict(df: pd.DataFrame, plot_size: Optional[int] = 1366) -> dict:
673
726
  """
@@ -867,7 +920,7 @@ def build_config(emhass_conf: dict, logger: logging.Logger, defaults_path: str,
867
920
 
868
921
 
869
922
  def build_legacy_config_params(emhass_conf: dict, legacy_config: dict,
870
- logger: logging.Logger) -> dict:
923
+ logger: logging.Logger) -> dict:
871
924
  """
872
925
  Build a config dictionary with legacy config_emhass.yaml file.
873
926
  Uses the associations file to convert parameter naming conventions (to config.json/config_defaults.json).
@@ -918,8 +971,7 @@ def build_legacy_config_params(emhass_conf: dict, legacy_config: dict,
918
971
  return config
919
972
  # params['associations_dict'] = associations_dict
920
973
 
921
- def param_to_config(param: dict,
922
- logger: logging.Logger) -> dict:
974
+ def param_to_config(param: dict, logger: logging.Logger) -> dict:
923
975
  """
924
976
  A function that extracts the parameters from param back to the config.json format.
925
977
  Extracts parameters from config catagories.
@@ -949,7 +1001,7 @@ def param_to_config(param: dict,
949
1001
  return return_config
950
1002
 
951
1003
  def build_secrets(emhass_conf: dict, logger: logging.Logger, argument: Optional[dict] = {}, options_path: Optional[str] = None,
952
- secrets_path: Optional[str] = None, no_response: Optional[bool] = False) -> Tuple[dict, dict]:
1004
+ secrets_path: Optional[str] = None, no_response: Optional[bool] = False) -> Tuple[dict, dict]:
953
1005
  """
954
1006
  Retrieve and build parameters from secrets locations (ENV, ARG, Secrets file (secrets_emhass.yaml/options.json) and/or Home Assistant (via API))
955
1007
  priority order (lwo to high) = Defaults (written in function), ENV, Options json file, Home Assistant API, Secrets yaml file, Arguments
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: emhass
3
- Version: 0.11.1
3
+ Version: 0.11.2
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
@@ -47,9 +47,6 @@ Requires-Dist: plotly>=5.6.0
47
47
  </a>
48
48
  <a style="text-decoration:none" href="https://github.com/davidusb-geek/emhass/actions">
49
49
  <img alt="EMHASS GitHub Workflow Status" src="https://github.com/davidusb-geek/emhass/actions/workflows/publish_docker.yaml/badge.svg?event=release">
50
- </a>
51
- <a style="text-decoration:none" href="https://github.com/davidusb-geek/emhass-add-on/actions">
52
- <img alt="EMHASS-Add-on GitHub Workflow Status" src="https://github.com/davidusb-geek/emhass-add-on/actions/workflows/publish_docker.yaml/badge.svg?event=release">
53
50
  </a>
54
51
  <a hstyle="text-decoration:none" ref="https://codecov.io/github/davidusb-geek/emhass" >
55
52
  <img src="https://codecov.io/github/davidusb-geek/emhass/branch/master/graph/badge.svg?token=BW7KSCHN90"/>
@@ -4,17 +4,17 @@ emhass/forecast.py,sha256=EZuQnhVmXcHOxteaw1o44BVMVS956Y2UaTRELNT7RaI,53644
4
4
  emhass/machine_learning_forecaster.py,sha256=UP9YR3NSt-b_5i2b8wMAfXRWeMnJjSkBXnXvHepzHpM,16109
5
5
  emhass/machine_learning_regressor.py,sha256=QMAokLgEjvQ8Xy5gYZBQGQTzh2zgg6d6iydoPmy0QeI,10546
6
6
  emhass/optimization.py,sha256=IagqVYN2k8KFtQ0ZUZWab6egmDvpkYSQG8qyBmoWvyM,50877
7
- emhass/retrieve_hass.py,sha256=jLh8nSpsdeZJCaI7qKxAcZYpH8OKouMHz1OiezqLuqc,23430
8
- emhass/utils.py,sha256=_wCO_88Ycn0Gd5EcGHMBcyI9NQ-saWunGzvZVqufn-o,65336
7
+ emhass/retrieve_hass.py,sha256=TzvowZLRNnNVKTv5peAbfmM05k_4JqMfZ-SymU3g7iw,23711
8
+ emhass/utils.py,sha256=jtTnVa4X9w4Qgey2-XbWPUC_lg4LIFoedmh3yreeAes,68507
9
9
  emhass/web_server.py,sha256=QALTX0We82qToxiCnX2SocgkjlUsHLubqJ5WrCWO3P0,27229
10
10
  emhass/data/associations.csv,sha256=GFE_4ptHT6qno0lJt_rEeOXBqkLd759GNqXEVp4x2Po,3654
11
11
  emhass/data/cec_inverters.pbz2,sha256=tK8FvAUDW0uYez8EPttdCJwHhpPofclYV6GhhNZL0Pk,168272
12
12
  emhass/data/cec_modules.pbz2,sha256=8vEaysgYffXg3KUl8XSF36Mdywzi3LpEtUN_qenjO9s,1655747
13
- emhass/data/config_defaults.json,sha256=GKw2p3jObwMY1wAR_D_x8T8eNzQgu3awNQnIBuBwhJE,2791
13
+ emhass/data/config_defaults.json,sha256=0jyYfF1ob3QMbjP8h2rd0jlbfe2uYm68NYW0GKM5qfk,2754
14
14
  emhass/static/advanced.html,sha256=gAhsd14elDwh1Ts4lf9wn_ZkczzzObq5qOimi_la3Ic,2067
15
15
  emhass/static/basic.html,sha256=ro2WwWgJyoUhqx_nJFzKCEG8FA8863vSHLmrjGYcEgs,677
16
16
  emhass/static/configuration_list.html,sha256=4ZAL-4YXdofnx17np-v39Yt3qW2TWbSzNBkj86bpvIg,1578
17
- emhass/static/configuration_script.js,sha256=PQYZHWMb0dohrw3hI7HeIXNEae6PamIvvs84IePLThw,31097
17
+ emhass/static/configuration_script.js,sha256=N95GzyQdLzzOuSNw4L78BdArdqLPYJKhU3baGEsOhZE,31098
18
18
  emhass/static/script.js,sha256=q3qTqc_pTLTK-0NPKurxFXcJ2vZLz4TctPfUgz09ygo,16291
19
19
  emhass/static/style.css,sha256=a_8YlGubn1zoF5RTLJ_Qkrb8tAjUY9p7oAKxhCvJY2s,19288
20
20
  emhass/static/data/param_definitions.json,sha256=Nq4dnSmug0mWU8JooqVayKa67NQ2b6k30Z-ac2BJcys,19158
@@ -24,9 +24,9 @@ emhass/static/img/feather-sprite.svg,sha256=VHjMJQg88wXa9CaeYrKGhNtyK0xdd47zCqwS
24
24
  emhass/templates/configuration.html,sha256=yS9p730GHf99ZYK0NiZjkuaxPjH1ZFo8R6xL5c1ZZ9s,2885
25
25
  emhass/templates/index.html,sha256=Ehn-hUdraIwX_5Usb5Liz1ip24NfztmCxsi0J4Tf3-A,3076
26
26
  emhass/templates/template.html,sha256=TkGgMecQEbFUZA4ymPwMUzNjKHsENvCgroUWbPt7G4Y,158
27
- emhass-0.11.1.dist-info/LICENSE,sha256=1X3-S1yvOCBDBeox1aK3dq00m7dA8NDtcPrpKPISzbE,1077
28
- emhass-0.11.1.dist-info/METADATA,sha256=x9mxnfO20GSc2HsZn375WlEKWMOreP9cNvOWpOQz3WI,48843
29
- emhass-0.11.1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
30
- emhass-0.11.1.dist-info/entry_points.txt,sha256=6Bp1NFOGNv_fSTxYl1ke3K3h3aqAcBxI-bgq5yq-i1M,52
31
- emhass-0.11.1.dist-info/top_level.txt,sha256=L7fIX4awfmxQbAePtSdVg2e6x_HhghfReHfsKSpKr9I,7
32
- emhass-0.11.1.dist-info/RECORD,,
27
+ emhass-0.11.2.dist-info/LICENSE,sha256=1X3-S1yvOCBDBeox1aK3dq00m7dA8NDtcPrpKPISzbE,1077
28
+ emhass-0.11.2.dist-info/METADATA,sha256=fBUrr3jdNsmfINxtemxhL1ISYeDTCESHThh6xKpFd9I,48570
29
+ emhass-0.11.2.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
30
+ emhass-0.11.2.dist-info/entry_points.txt,sha256=6Bp1NFOGNv_fSTxYl1ke3K3h3aqAcBxI-bgq5yq-i1M,52
31
+ emhass-0.11.2.dist-info/top_level.txt,sha256=L7fIX4awfmxQbAePtSdVg2e6x_HhghfReHfsKSpKr9I,7
32
+ emhass-0.11.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.2.0)
2
+ Generator: setuptools (75.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5