Hi Guys,
I just started using Appdaemon and its amazing, I have some minor Python expereince so please be kind with me:
I have the following code working:
import appdaemon.plugins.hass.hassapi as hass
class current_scene(hass.Hass):
def initialize(self):
self.handles = {}
self.wakeup = self.get_state("input_datetime.aufwachen")
self.sleep = self.get_state("input_datetime.schlafen")
self.handle = self.listen_state(self.wakeup_changed,"input_datetime.aufwachen")
self.handles["wakeup_changed"] =self.handle
self.handle = self.listen_state(self.sleep_changed,"input_datetime.schlafen")
self.handles["sleep_changed"] =self.handle
self.handle = self.run_daily(self.wakeuptime, self.wakeup)
self.handles["wakeuptime"] =self.handle
self.handle = self.run_daily(self.sleeptime, self.sleep)
self.handles["sleeptime"] =self.handle
self.log("Handles have been created: {}".format(self.handles), level = "INFO")
self.log("Wakeup time is: {}, Sleep time is: {}".format(self.wakeup, self.sleep), level = "INFO")
def wakeuptime(self, kwargs):
if self.get_state("input_boolean.manual_scene_mode") == "off":
self.change_scene("Aufwachen")
else:
pass
def sleeptime(self, kwargs):
if self.get_state("input_boolean.manual_scene_mode") == "off":
self.change_scene("Schlafen")
else:
pass
def wakeup_changed(self, entity, attribute, old, new, kwargs):
self.cancel_timer(self.handles["wakeuptime"])
self.wakeup = self.get_state("input_datetime.aufwachen")
self.handle = self.run_daily(self.wakeuptime, self.wakeup)
self.handles["wakeuptime"] =self.handle
self.log("Handles have been updated: {}".format(self.handles), level = "INFO")
self.log("New wakeup time is: {}".format(self.wakeup), level = "INFO")
def sleep_changed(self, entity, attribute, old, new, kwargs):
self.cancel_timer(self.handles["sleeptime"])
self.sleep = self.get_state("input_datetime.schlafen")
self.handle = self.run_daily(self.sleeptime, self.sleep)
self.handles["sleeptime"] =self.handle
self.log("Handles have been updated: {}".format(self.handles), level = "INFO")
self.log("New sleep time is: {}".format(self.sleep), level = "INFO")
So far so good. I know wanted to clean up the code a bit and replace some redundant parts by creating a function. This would handle the recreation of the run_daily callbacks when somebody picks a new sleep or wakeup time in the ui.
So i changed sleep_changed function and created a time_changed function as follows:
def sleep_changed(self, entity, attribute, old, new, kwargs):
self.time_changed(handle_key ="sleeptime", newtime="input_datetime.schlafen", callbfunc ="self.sleeptime")
def time_changed(self, handle_key, newtime, callbfunc):
self.cancel_timer(self.handles[handle_key])
newtime = self.get_state(newtime)
self.handle = self.run_daily(callbfunc, newtime)
self.handles[handle_key] =self.handle
self.log("Handles have been updated: {}".format(self.handles), level = "INFO")
self.log("New {} is: {}".format(handle_key, time), level = "INFO")
I cant get that to work i get the following error:
2020-11-19 16:26:05.809542 WARNING Szenen: ------------------------------------------------------------
2020-11-19 16:26:05.808783 WARNING Szenen: Traceback (most recent call last):
File "/usr/lib/python3.8/site-packages/appdaemon/threading.py", line 900, in worker
funcref(
File "/config/appdaemon/apps/scene.py", line 64, in sleep_changed
self.time_changed(handle_key ="sleeptime", newtime="input_datetime.schlafen", callbfunc ="self.sleeptime")
File "/config/appdaemon/apps/scene.py", line 91, in time_changed
self.handle = self.run_daily(callbfunc, newtime)
File "/usr/lib/python3.8/site-packages/appdaemon/utils.py", line 195, in inner_sync_wrapper
f = run_coroutine_threadsafe(self, coro(self, *args, **kwargs))
File "/usr/lib/python3.8/site-packages/appdaemon/utils.py", line 299, in run_coroutine_threadsafe
result = future.result(self.AD.internal_function_timeout)
File "/usr/lib/python3.8/concurrent/futures/_base.py", line 439, in result
return self.__get_result()
File "/usr/lib/python3.8/concurrent/futures/_base.py", line 388, in __get_result
raise self._exception
File "/usr/lib/python3.8/site-packages/appdaemon/adapi.py", line 2388, in run_daily
handle = await self.run_every(callback, event, 24 * 60 * 60, **kwargs)
File "/usr/lib/python3.8/site-packages/appdaemon/adapi.py", line 2563, in run_every
handle = await self.AD.sched.insert_schedule(
File "/usr/lib/python3.8/site-packages/appdaemon/scheduler.py", line 328, in insert_schedule
function_name = callback.__name__
AttributeError: 'str' object has no attribute '__name__'
2020-11-19 16:26:05.807512 WARNING Szenen: ------------------------------------------------------------
2020-11-19 16:26:05.806750 WARNING Szenen: Worker Ags: {'id': 'ca8d858959b8475f92de0b89a6256dfb', 'name': 'Szenen', 'objectid': 'b5c239f8a07c4463ad2fc74572e199a2', 'type': 'state', 'function': >, 'attribute': 'state', 'entity': 'input_datetime.schlafen', 'new_state': '23:00:00', 'old_state': '22:00:00', 'pin_app': True, 'pin_thread': 2, 'kwargs': {'__thread_id': 'thread-2'}}
```
Any help is really appreciated