Skip to content

Commit

Permalink
V2024.10.03
Browse files Browse the repository at this point in the history
- Modify sensor naming to support multiple instances more transparently
  • Loading branch information
petergridge authored Oct 8, 2024
1 parent 624f321 commit 61615ef
Showing 1 changed file with 70 additions and 97 deletions.
167 changes: 70 additions & 97 deletions custom_components/openweathermaphistory/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,36 +95,7 @@ async def async_step_user(
options = user_input.get(CONF_CREATE_SENSORS)

# now process the create sensor options to build the required sensors
for i in range(6):
if 'forecast_rain' in options:
resources.append(create_formula(f"forecast{i}rain", 'precipitation','measurement'))
if 'forecast_snow' in options:
resources.append(create_formula(f"forecast{i}snow", 'precipitation','measurement'))
if 'forecast_max' in options:
resources.append(create_formula(f"forecast{i}max", 'temperature','measurement'))
if 'forecast_min' in options:
resources.append(create_formula(f"forecast{i}min", 'temperature','measurement'))
if 'forecast_humidity' in options:
resources.append(create_formula(f"forecast{i}humidity", 'humidity','measurement'))
if 'forecast_pop' in options:
resources.append(create_formula(f"forecast{i}pop",'none','none'))

for i in range(int(max(user_input[CONF_MAX_DAYS], user_input[CONF_INTIAL_DAYS]))):
if 'hist_rain' in options:
resources.append(create_formula(f"day{i}rain",'precipitation','measurement'))
if 'hist_snow' in options:
resources.append(create_formula(f"day{i}snow",'precipitation','measurement'))
if 'hist_max' in options:
resources.append(create_formula(f"day{i}max",'temperature','measurement'))
if 'hist_min' in options:
resources.append(create_formula(f"day{i}min",'temperature','measurement'))

if 'current_obs' in options:
resources.append(create_formula("current_rain",'precipitation','measurement'))
resources.append(create_formula("current_snow", 'precipitation','measurement'))
resources.append(create_formula("current_humidity", 'humidity','measurement'))
resources.append(create_formula("current_temp", 'temperature','measurement'))
resources.append(create_formula("current_pressure", 'pressure','measurement'))
resources=process_options(options,resources,int(max(user_input[CONF_MAX_DAYS], user_input[CONF_INTIAL_DAYS])))

self._data[CONF_RESOURCES]=resources

Expand Down Expand Up @@ -439,7 +410,6 @@ async def async_step_finalise(self, user_input=None):
"""Create the program config."""
newdata = {}
newdata.update(self._data)

#the top level of the dictionary needs to change
#for HA update to trigger, bug?
if newdata.get('xx') == 'x':
Expand Down Expand Up @@ -477,70 +447,13 @@ async def async_step_update(self, user_input=None):
newdata[CONF_MAX_DAYS] = int(user_input.get(CONF_MAX_DAYS))
newdata[CONF_INTIAL_DAYS] = int(user_input.get(CONF_INTIAL_DAYS))
newdata[CONF_MAX_CALLS] = int(user_input.get(CONF_MAX_CALLS))

# Input is valid, set data.
resources =[]
resources=self._data[CONF_RESOURCES]
options = user_input.get(CONF_CREATE_SENSORS)

# now process the create sensor options to build the required sensors
for i in range(6):
if 'forecast_rain' in options:
resources=add_to_list(resources,create_formula(f"forecast{i}rain", 'precipitation','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"forecast{i}rain", 'precipitation','measurement'))
if 'forecast_snow' in options:
resources=add_to_list(create_formula(f"forecast{i}snow", 'precipitation','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"forecast{i}snow", 'precipitation','measurement'))
if 'forecast_max' in options:
resources=add_to_list(create_formula(f"forecast{i}max", 'temperature','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"forecast{i}max", 'precipitation','measurement'))
if 'forecast_min' in options:
resources=add_to_list(create_formula(f"forecast{i}min", 'temperature','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"forecast{i}min", 'precipitation','measurement'))
if 'forecast_humidity' in options:
resources=add_to_list(create_formula(f"forecast{i}humidity", 'humidity','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"forecast{i}humidity", 'precipitation','measurement'))
if 'forecast_pop' in options:
resources=add_to_list(resources,create_formula(f"forecast{i}pop",'none','none'))
else:
resources=remove_from_list(resources,create_formula(f"forecast{i}pop", 'precipitation','measurement'))

for i in range(int(max(user_input[CONF_MAX_DAYS], user_input[CONF_INTIAL_DAYS]))):
if 'hist_rain' in options:
resources=add_to_list(resources,create_formula(f"day{i}rain",'precipitation','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"day{i}rain", 'precipitation','measurement'))
if 'hist_snow' in options:
resources=add_to_list(resources,create_formula(f"day{i}snow",'precipitation','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"day{i}snow", 'precipitation','measurement'))
if 'hist_max' in options:
add_to_list(resources,create_formula(f"day{i}max",'temperature','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"day{i}max", 'precipitation','measurement'))
if 'hist_min' in options:
resources=add_to_list(resources,create_formula(f"day{i}min",'temperature','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"day{i}min", 'precipitation','measurement'))

if 'current_obs' in options:
resources=add_to_list(resources,create_formula("current_rain",'precipitation','measurement'))
resources=add_to_list(resources,create_formula("current_snow", 'precipitation','measurement'))
resources=add_to_list(resources,create_formula("current_humidity", 'humidity','measurement'))
resources=add_to_list(resources,create_formula("current_temp", 'temperature','measurement'))
resources=add_to_list(resources,create_formula("current_pressure", 'pressure','measurement'))
else:
resources=remove_from_list(resources,create_formula("current_rain",'precipitation','measurement'))
resources=remove_from_list(resources,create_formula("current_snow", 'precipitation','measurement'))
resources=remove_from_list(resources,create_formula("current_humidity", 'humidity','measurement'))
resources=remove_from_list(resources,create_formula("current_temp", 'temperature','measurement'))
resources=remove_from_list(resources,create_formula("current_pressure", 'pressure','measurement'))

# now process the create sensor options to build the required sensors
resources=process_options(options,resources,int(max(user_input[CONF_MAX_DAYS], user_input[CONF_INTIAL_DAYS])))
#update the configuation
newdata[CONF_RESOURCES]=resources
newdata[CONF_CREATE_SENSORS]=options
self._data.update(newdata)
Expand Down Expand Up @@ -585,7 +498,6 @@ async def async_step_delete(self, user_input=None):
self._data = newdata
return await self.async_step_init()
# build the list
#selection = 0
for selection,sensor in enumerate(self._data.get(CONF_RESOURCES)):
sensors.append(str(selection) + '.' + sensor.get(CONF_NAME))
list_schema = vol.Schema({vol.Optional(CONF_NAME): vol.In(sensors)})
Expand All @@ -609,7 +521,6 @@ async def async_step_list_modify(self, user_input=None):
return await self.async_step_modify()
#build the list for display
for selection,sensor in enumerate(self._data.get(CONF_RESOURCES)):

items.append(str(selection) + '.' + sensor.get(CONF_NAME))
list_schema = vol.Schema({vol.Optional(CONF_NAME): vol.In(items)})

Expand All @@ -626,7 +537,6 @@ async def async_step_modify(self, user_input=None):
newdata.update(self._data)
this_sensor = newdata.get(CONF_RESOURCES)[self.selected]


if user_input is not None:
evalform = evaluate_custom_formula(user_input.get(CONF_FORMULA),self._data.get(CONF_MAX_DAYS,0))
match evalform:
Expand Down Expand Up @@ -669,7 +579,7 @@ async def async_step_modify(self, user_input=None):
options=["none","humidity","precipitation","precipitation_intensity","temperature","pressure"]
)
),
}
}
)

return self.async_show_form(
Expand Down Expand Up @@ -744,10 +654,10 @@ async def async_step_add(self, user_input=None):

#---- Helpers ----

def create_formula(sensor,sensorclass,stateclass):
def create_formula(sensor,sensorclass,stateclass,instance="Home"):
"""Create formula dictionary."""
formula = {}
formula[CONF_NAME] = sensor
formula[CONF_NAME] = "OWMH_"+instance+"_"+sensor
formula[CONF_FORMULA] = "{{ " + sensor + " }}"
formula[CONF_ATTRIBUTES] = ''
formula[CONF_SENSORCLASS] = sensorclass
Expand All @@ -773,6 +683,69 @@ def remove_from_list(list, item):
break
return list


def process_options(options,resource_list,days):
"""Process the selected aut create options."""
resources = resource_list
for i in range(6):
if 'forecast_rain' in options:
resources=add_to_list(resources,create_formula(f"forecast{i}rain", 'precipitation','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"forecast{i}rain", 'precipitation','measurement'))
if 'forecast_snow' in options:
resources=add_to_list(create_formula(f"forecast{i}snow", 'precipitation','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"forecast{i}snow", 'precipitation','measurement'))
if 'forecast_max' in options:
resources=add_to_list(create_formula(f"forecast{i}max", 'temperature','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"forecast{i}max", 'precipitation','measurement'))
if 'forecast_min' in options:
resources=add_to_list(create_formula(f"forecast{i}min", 'temperature','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"forecast{i}min", 'precipitation','measurement'))
if 'forecast_humidity' in options:
resources=add_to_list(create_formula(f"forecast{i}humidity", 'humidity','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"forecast{i}humidity", 'precipitation','measurement'))
if 'forecast_pop' in options:
resources=add_to_list(resources,create_formula(f"forecast{i}pop",'none','none'))
else:
resources=remove_from_list(resources,create_formula(f"forecast{i}pop", 'precipitation','measurement'))

for i in range(days):
if 'hist_rain' in options:
resources=add_to_list(resources,create_formula(f"day{i}rain",'precipitation','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"day{i}rain", 'precipitation','measurement'))
if 'hist_snow' in options:
resources=add_to_list(resources,create_formula(f"day{i}snow",'precipitation','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"day{i}snow", 'precipitation','measurement'))
if 'hist_max' in options:
add_to_list(resources,create_formula(f"day{i}max",'temperature','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"day{i}max", 'precipitation','measurement'))
if 'hist_min' in options:
resources=add_to_list(resources,create_formula(f"day{i}min",'temperature','measurement'))
else:
resources=remove_from_list(resources,create_formula(f"day{i}min", 'precipitation','measurement'))

if 'current_obs' in options:
resources=add_to_list(resources,create_formula("current_rain",'precipitation','measurement'))
resources=add_to_list(resources,create_formula("current_snow", 'precipitation','measurement'))
resources=add_to_list(resources,create_formula("current_humidity", 'humidity','measurement'))
resources=add_to_list(resources,create_formula("current_temp", 'temperature','measurement'))
resources=add_to_list(resources,create_formula("current_pressure", 'pressure','measurement'))
else:
resources=remove_from_list(resources,create_formula("current_rain",'precipitation','measurement'))
resources=remove_from_list(resources,create_formula("current_snow", 'precipitation','measurement'))
resources=remove_from_list(resources,create_formula("current_humidity", 'humidity','measurement'))
resources=remove_from_list(resources,create_formula("current_temp", 'temperature','measurement'))
resources=remove_from_list(resources,create_formula("current_pressure", 'pressure','measurement'))

return resources

def evaluate_custom_formula(formula, max_days):
"""Evaluate the formula/template."""
wvars = {}
Expand Down

0 comments on commit 61615ef

Please sign in to comment.