if you look at your errorlogs then you see you have errors.
listen_state needs a callback that takes several args. like this:
def what_we_want_to_do (self, entity, attribute, old, new, kwargs):
and run_hourly takes less args, like this:
def what_we_want_to_do (self, kwargs):
you cant use 1 type of callback for both, then it will give errors that to much or to few args were given.
also a callback doesnt contain () when it is called, so not:
self.run_hourly(self.AutoGenGroup(), runtime)
but
self.run_hourly(self.AutoGenGroup, runtime)
if you want to learn how to program things, the first thing you need to learn is to check your logs, when you make changes. if you do something wrong it will always show up in your logs and you can learn from what it says there.
if you dont know how to check your logs or where they are then i am glad to help.
edit: 1 other remark:
run_hourly takes a time object and not a datetime object.
from the docs:
# Run every hour, on the hour
import datetime
...
runtime = datetime.time(0, 0, 0)
self.run_hourly(self.run_hourly_c, runtime)