Skip to content

Commit 7ceee6f

Browse files
committed
rename service->action for compatibility with HA >=2024.8
1 parent 061d882 commit 7ceee6f

File tree

3 files changed

+53
-51
lines changed

3 files changed

+53
-51
lines changed

custom_components/scheduler/actions.py

Lines changed: 49 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
STATE_UNAVAILABLE,
1616
CONF_CONDITIONS,
1717
CONF_ATTRIBUTE,
18-
CONF_STATE
18+
CONF_STATE,
19+
CONF_ACTION
1920
)
2021
from homeassistant.components.climate import (
2122
SERVICE_SET_TEMPERATURE,
@@ -49,14 +50,14 @@ def parse_service_call(data: dict):
4950
"""turn action data into a service call"""
5051

5152
service_call = {
52-
CONF_SERVICE: data[CONF_SERVICE],
53+
CONF_ACTION: data[CONF_ACTION] if CONF_ACTION in data else data[CONF_SERVICE], # map service->action for backwards compaibility
5354
CONF_SERVICE_DATA: data[ATTR_SERVICE_DATA],
5455
}
5556
if ATTR_ENTITY_ID in data and data[ATTR_ENTITY_ID]:
5657
service_call[ATTR_ENTITY_ID] = data[ATTR_ENTITY_ID]
5758

5859
if (
59-
service_call[CONF_SERVICE]
60+
service_call[CONF_ACTION]
6061
== "{}.{}".format(CLIMATE_DOMAIN, SERVICE_SET_TEMPERATURE)
6162
and ATTR_HVAC_MODE in service_call[CONF_SERVICE_DATA]
6263
and ATTR_ENTITY_ID in service_call
@@ -66,7 +67,7 @@ def parse_service_call(data: dict):
6667
# set temperature setpoint again for integrations which lose setpoint after switching hvac_mode
6768
_service_call = [
6869
{
69-
CONF_SERVICE: "{}.{}".format(CLIMATE_DOMAIN, SERVICE_SET_HVAC_MODE),
70+
CONF_ACTION: "{}.{}".format(CLIMATE_DOMAIN, SERVICE_SET_HVAC_MODE),
7071
ATTR_ENTITY_ID: service_call[ATTR_ENTITY_ID],
7172
CONF_SERVICE_DATA: {
7273
ATTR_HVAC_MODE: service_call[CONF_SERVICE_DATA][ATTR_HVAC_MODE]
@@ -80,15 +81,15 @@ def parse_service_call(data: dict):
8081
):
8182
_service_call.extend([
8283
{
83-
CONF_SERVICE: ACTION_WAIT_STATE_CHANGE,
84+
CONF_ACTION: ACTION_WAIT_STATE_CHANGE,
8485
ATTR_ENTITY_ID: service_call[ATTR_ENTITY_ID],
8586
CONF_SERVICE_DATA: {
8687
CONF_DELAY: 50,
8788
CONF_STATE: service_call[CONF_SERVICE_DATA][ATTR_HVAC_MODE]
8889
},
8990
},
9091
{
91-
CONF_SERVICE: "{}.{}".format(CLIMATE_DOMAIN, SERVICE_SET_TEMPERATURE),
92+
CONF_ACTION: "{}.{}".format(CLIMATE_DOMAIN, SERVICE_SET_TEMPERATURE),
9293
ATTR_ENTITY_ID: service_call[ATTR_ENTITY_ID],
9394
CONF_SERVICE_DATA: {
9495
x: service_call[CONF_SERVICE_DATA][x]
@@ -123,12 +124,12 @@ def entity_is_available(hass: HomeAssistant, entity, is_target_entity=False):
123124
return False
124125

125126

126-
def service_is_available(hass: HomeAssistant, service: str):
127-
"""evaluate whether a HA service is ready for targeting"""
128-
if service in [ACTION_WAIT, ACTION_WAIT_STATE_CHANGE]:
127+
def action_is_available(hass: HomeAssistant, action: str):
128+
"""evaluate whether a HA action is ready for targeting"""
129+
if action in [ACTION_WAIT, ACTION_WAIT_STATE_CHANGE]:
129130
return True
130-
domain = service.split(".").pop(0)
131-
domain_service = service.split(".").pop(1)
131+
domain = action.split(".").pop(0)
132+
domain_service = action.split(".").pop(1)
132133
return hass.services.has_service(domain, domain_service)
133134

134135

@@ -193,8 +194,8 @@ def action_has_effect(action: dict, hass: HomeAssistant):
193194
if ATTR_ENTITY_ID not in action:
194195
return True
195196

196-
domain = action[CONF_SERVICE].split(".").pop(0)
197-
service = action[CONF_SERVICE].split(".").pop(1)
197+
domain = action[CONF_ACTION].split(".").pop(0)
198+
service = action[CONF_ACTION].split(".").pop(1)
198199
state = hass.states.get(action[ATTR_ENTITY_ID])
199200
current_state = state.state if state else None
200201

@@ -276,7 +277,7 @@ async def async_cleanup_queues(self, id: str = None):
276277
self._queues.pop(key)
277278

278279
if not len(self._queues.keys()):
279-
_LOGGER.debug("[{}]: Finished execution of actions".format(self.id))
280+
_LOGGER.debug("[{}]: Finished execution of tasks".format(self.id))
280281

281282
async def async_empty_queue(self, **kwargs):
282283
"""remove all objects from queue"""
@@ -435,18 +436,18 @@ def is_finished(self):
435436
return len(self._queue) == 0
436437

437438
def is_available(self):
438-
"""check if all services and entities involved in the task are available"""
439+
"""check if all actions and entities involved in the task are available"""
439440

440-
# check services
441-
required_services = [action[CONF_SERVICE] for action in self._queue]
442-
failed_service = next(
443-
(x for x in required_services if not service_is_available(self.hass, x)),
441+
# check actions
442+
required_actions = [action[CONF_ACTION] for action in self._queue]
443+
failed_action = next(
444+
(x for x in required_actions if not action_is_available(self.hass, x)),
444445
None,
445446
)
446-
if failed_service:
447+
if failed_action:
447448
_LOGGER.debug(
448-
"[{}]: Service {} is unavailable, scheduled action cannot be executed".format(
449-
self.id, failed_service
449+
"[{}]: Action {} is unavailable, scheduled task cannot be executed".format(
450+
self.id, failed_action
450451
)
451452
)
452453
return False
@@ -510,26 +511,26 @@ async def async_process_queue(self, task_idx=0):
510511
while len(self._queue):
511512
self._queue.pop()
512513

513-
skip_action = False
514+
skip_task = False
514515

515516
while task_idx < len(self._queue):
516-
action = self._queue[task_idx]
517+
task = self._queue[task_idx]
517518

518-
if action[CONF_SERVICE] in [ACTION_WAIT, ACTION_WAIT_STATE_CHANGE]:
519+
if task[CONF_ACTION] in [ACTION_WAIT, ACTION_WAIT_STATE_CHANGE]:
519520
if skip_action:
520521
task_idx = task_idx + 1
521522
continue
522-
elif action[CONF_SERVICE] == ACTION_WAIT_STATE_CHANGE:
523-
state = self.hass.states.get(action[ATTR_ENTITY_ID])
524-
if CONF_ATTRIBUTE in action[CONF_SERVICE_DATA]:
525-
state = state.attributes.get(action[CONF_SERVICE_DATA][CONF_ATTRIBUTE])
523+
elif task[CONF_ACTION] == ACTION_WAIT_STATE_CHANGE:
524+
state = self.hass.states.get(task[ATTR_ENTITY_ID])
525+
if CONF_ATTRIBUTE in task[CONF_SERVICE_DATA]:
526+
state = state.attributes.get(task[CONF_SERVICE_DATA][CONF_ATTRIBUTE])
526527
else:
527528
state = state.state
528-
if state == action[CONF_SERVICE_DATA][CONF_STATE]:
529+
if state == task[CONF_SERVICE_DATA][CONF_STATE]:
529530
_LOGGER.debug(
530-
"[{}]: Entity {} is already set to {}, proceed with next action".format(
531+
"[{}]: Entity {} is already set to {}, proceed with next task".format(
531532
self.id,
532-
action[ATTR_ENTITY_ID],
533+
task[ATTR_ENTITY_ID],
533534
state,
534535
)
535536
)
@@ -547,12 +548,12 @@ async def async_timer_finished(_now):
547548

548549
self._timer = async_call_later(
549550
self.hass,
550-
action[CONF_SERVICE_DATA][CONF_DELAY],
551+
task[CONF_SERVICE_DATA][CONF_DELAY],
551552
async_timer_finished,
552553
)
553554
_LOGGER.debug(
554-
"[{}]: Postponing next action for {} seconds".format(
555-
self.id, action[CONF_SERVICE_DATA][CONF_DELAY]
555+
"[{}]: Postponing next task for {} seconds".format(
556+
self.id, task[CONF_SERVICE_DATA][CONF_DELAY]
556557
)
557558
)
558559

@@ -562,9 +563,9 @@ async def async_entity_changed(event):
562563
old_state = event.data["old_state"]
563564
new_state = event.data["new_state"]
564565

565-
if CONF_ATTRIBUTE in action[CONF_SERVICE_DATA]:
566-
old_state = old_state.attributes.get(action[CONF_SERVICE_DATA][CONF_ATTRIBUTE])
567-
new_state = new_state.attributes.get(action[CONF_SERVICE_DATA][CONF_ATTRIBUTE])
566+
if CONF_ATTRIBUTE in task[CONF_SERVICE_DATA]:
567+
old_state = old_state.attributes.get(task[CONF_SERVICE_DATA][CONF_ATTRIBUTE])
568+
new_state = new_state.attributes.get(task[CONF_SERVICE_DATA][CONF_ATTRIBUTE])
568569
else:
569570
old_state = old_state.state
570571
new_state = new_state.state
@@ -578,8 +579,8 @@ async def async_entity_changed(event):
578579
new_state
579580
)
580581
)
581-
if new_state == action[CONF_SERVICE_DATA][CONF_STATE]:
582-
_LOGGER.debug("[{}]: Stop postponing next action".format(self.id))
582+
if new_state == task[CONF_SERVICE_DATA][CONF_STATE]:
583+
_LOGGER.debug("[{}]: Stop postponing next task".format(self.id))
583584
if self._timer:
584585
self._timer()
585586
self._timer = None
@@ -588,30 +589,30 @@ async def async_entity_changed(event):
588589
self.queue_busy = False
589590
await self.async_process_queue(task_idx + 1)
590591

591-
if action[CONF_SERVICE] == ACTION_WAIT_STATE_CHANGE:
592+
if task[CONF_ACTION] == ACTION_WAIT_STATE_CHANGE:
592593
self._state_update_listener = async_track_state_change_event(
593-
self.hass, action[ATTR_ENTITY_ID], async_entity_changed
594+
self.hass, task[ATTR_ENTITY_ID], async_entity_changed
594595
)
595596
return
596597

597-
if ATTR_ENTITY_ID in action:
598+
if ATTR_ENTITY_ID in task:
598599
_LOGGER.debug(
599-
"[{}]: Executing service {} on entity {}".format(
600-
self.id, action[CONF_SERVICE], action[ATTR_ENTITY_ID]
600+
"[{}]: Executing action {} on entity {}".format(
601+
self.id, task[CONF_ACTION], task[ATTR_ENTITY_ID]
601602
)
602603
)
603604
else:
604605
_LOGGER.debug(
605-
"[{}]: Executing service {}".format(self.id, action[CONF_SERVICE])
606+
"[{}]: Executing action {}".format(self.id, task[CONF_ACTION])
606607
)
607608

608-
skip_action = not action_has_effect(action, self.hass)
609+
skip_action = not action_has_effect(task, self.hass)
609610
if skip_action:
610611
_LOGGER.debug("[{}]: Action has no effect, skipping".format(self.id))
611612
else:
612613
await async_call_from_config(
613614
self.hass,
614-
action,
615+
task,
615616
)
616617
task_idx = task_idx + 1
617618

custom_components/scheduler/const.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
ATTR_NAME,
1616
)
1717

18-
VERSION = "3.3.5"
18+
VERSION = "3.3.6"
1919

2020
DOMAIN = "scheduler"
2121

hacs.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
22
"name": "Scheduler component",
3-
"render_readme": true
4-
}
3+
"render_readme": true,
4+
"homeassistant": "2024.8.0"
5+
}

0 commit comments

Comments
 (0)