diff --git a/devices/__init__.py b/devices/__init__.py index b46ebe0..b4ea53b 100644 --- a/devices/__init__.py +++ b/devices/__init__.py @@ -26,15 +26,13 @@ devices (DEVICES) """ -# TODO: Usage of mqtt_base for all devices -# -# TODO: brennenstuhl_heatingvalve: always send "{"preset": "manual", "system_mode": "heat"}" with any information # TODO: usage of base.mqtt as parent for class base __DEPENDENCIES__ = [] import json import logging +import task try: from config import APP_NAME as ROOT_LOGGER_NAME @@ -265,6 +263,26 @@ class shelly(base): def __init__(self, mqtt_client, topic): super().__init__(mqtt_client, topic) + # + self.output_key_delayed = None + self.delayed_flash_task = task.delayed(0.3, self.flash_task) + self.delayed_off_task = task.delayed(0.3, self.off_task) + # + self.all_off_requested = False + + def flash_task(self, *args): + if self.flash_active: + self.pack(self.output_key_delayed, not self.get(self.output_key_delayed)) + self.output_key_delayed = None + if self.all_off_requested: + self.delayed_off_task.run() + + def off_task(self, *args): + self.all_off() + + @property + def flash_active(self): + return self.output_key_delayed is not None # # WARNING CALL @@ -344,6 +362,23 @@ class shelly(base): self.logger.info("Toggeling output 1") self.set_output_1('toggle') + def flash_0_mcb(self, device, key, data): + self.output_key_delayed = self.KEY_OUTPUT_0 + self.toggle_output_0_mcb(device, key, data) + self.delayed_flash_task.run() + + def flash_1_mcb(self, device, key, data): + self.output_key_delayed = self.KEY_OUTPUT_1 + self.toggle_output_1_mcb(device, key, data) + self.delayed_flash_task.run() + + def all_off(self): + if self.flash_active: + self.all_off_requested = True + else: + self.set_output_0(False) + self.set_output_1(False) + class silvercrest_powerplug(base): KEY_LINKQUALITY = "linkquality" @@ -386,6 +421,9 @@ class silvercrest_powerplug(base): self.logger.info("Toggeling output 0") self.set_output_0('toggle') + def all_off(self): + self.set_output_0(False) + class silvercrest_motion_sensor(base): KEY_BATTERY = "battery" @@ -523,6 +561,9 @@ class my_powerplug(base): self.logger.info("Toggeling all outputs") self.set_output_0('toggle') + def all_off(self): + self.set_output_all(False) + class tradfri_light(base): KEY_LINKQUALITY = "linkquality" @@ -623,6 +664,9 @@ class tradfri_light(base): self.logger.log(logging.INFO if data != self.color_temp else logging.DEBUG, "Changing color temperature to %s", str(data)) self.set_color_temp(data) + def all_off(self): + self.set_output_0(False) + class tradfri_button(base): ACTION_TOGGLE = "toggle" diff --git a/function/__init__.py b/function/__init__.py index c994791..8814348 100644 --- a/function/__init__.py +++ b/function/__init__.py @@ -24,6 +24,9 @@ class all_functions(object): self.mqtt_client = mqtt_client # self.__devices__ = None + # + # Rooms + # # stairway self.stw_stairway = stairway(self.mqtt_client) # ground floor west @@ -49,7 +52,16 @@ class all_functions(object): # Off Buttons self.init_off_functionality() + def init_cross_room_interactions(self): + # shelly dirk input 1 + self.last_gfw_dirk_input_1 = None + self.gfw_dirk.main_light_shelly.add_callback(devices.shelly.KEY_INPUT_1, None, self.gfw_dirk_input_1) + # tradfri button ffe_sleep right click + self.ffe_sleep.button_tradfri.add_callback(devices.tradfri_button.KEY_ACTION, + devices.tradfri_button.ACTION_RIGHT, self.ffe_floor.main_light_shelly.toggle_output_0_mcb) + def init_off_functionality(self): + ##### TEMPORARY ################################################################################################################### # Off Buttons self.gui_button_all_off = devices.nodered_gui_button(self.mqtt_client, "gui/all/common/off/button") self.gui_button_gfw_off = devices.nodered_gui_button(self.mqtt_client, "gui/gfw/common/off/button") @@ -60,15 +72,25 @@ class all_functions(object): self.gui_button_gfw_off.add_callback(devices.nodered_gui_button.KEY_STATE, True, self.gfw_off) self.gui_button_ffw_off.add_callback(devices.nodered_gui_button.KEY_STATE, True, self.ffw_off) self.gui_button_ffe_off.add_callback(devices.nodered_gui_button.KEY_STATE, True, self.ffe_off) - # Long push ffe_floor - self.ffe_floor.main_light_shelly.add_callback(devices.shelly.KEY_LONGPUSH_0, True, self.ffe_floor.all_off_feedback) - self.ffe_floor.main_light_shelly.add_callback(devices.shelly.KEY_LONGPUSH_0, True, self.ffe_off) - # Long push stairway - self.stw_stairway.main_light_shelly.add_callback(devices.shelly.KEY_LONGPUSH_0, True, self.stw_stairway.all_off_feedback) + ##### TEMPORARY ################################################################################################################### + + # ALL OFF - Long push stairway + self.stw_stairway.main_light_shelly.add_callback(devices.shelly.KEY_LONGPUSH_0, True, self.stw_stairway.main_light_shelly.flash_0_mcb) self.stw_stairway.main_light_shelly.add_callback(devices.shelly.KEY_LONGPUSH_0, True, self.all_off) - # Long push input device + + # FFE ALL OFF - Long push ffe_floor + self.ffe_floor.main_light_shelly.add_callback(devices.shelly.KEY_LONGPUSH_0, True, self.ffe_floor.main_light_shelly.flash_0_mcb) + self.ffe_floor.main_light_shelly.add_callback(devices.shelly.KEY_LONGPUSH_0, True, self.ffe_off) + + # FFE ALL OFF - Long push input device self.ffe_sleep.button_tradfri.add_callback(devices.tradfri_button.KEY_ACTION, devices.tradfri_button.ACTION_RIGHT_LONG, self.ffe_off) + def gfw_dirk_input_1(self, device, key, data): + if self.last_gfw_dirk_input_1 is not None: + if self.last_gfw_dirk_input_1 != data: + self.gfw_floor.main_light_shelly.toggle_output_0_mcb(device, key, data) + self.last_gfw_dirk_input_1 = data + def getmembers(self, prefix): rv = [] for name, obj in inspect.getmembers(self): @@ -96,25 +118,17 @@ class all_functions(object): for ffe in self.getmembers('ffe'): ffe.all_off() + def stw_off(self, device=None, key=None, data=None): + logger.info("Switching \"stairway\" off.") + for stw in self.getmembers('stw'): + stw.all_off() + def all_off(self, device=None, key=None, data=None): self.common_off(device, key, data) self.gfw_off(device, key, data) self.ffw_off(device, key, data) self.ffe_off(device, key, data) - - def init_cross_room_interactions(self): - # shelly dirk input 1 - self.last_gfw_dirk_input_1 = None - self.gfw_dirk.main_light_shelly.add_callback(devices.shelly.KEY_INPUT_1, None, self.gfw_dirk_input_1) - # tradfri button ffe_sleep right click - self.ffe_sleep.button_tradfri.add_callback(devices.tradfri_button.KEY_ACTION, - devices.tradfri_button.ACTION_RIGHT, self.ffe_floor.main_light_shelly.toggle_output_0_mcb) - - def gfw_dirk_input_1(self, device, key, data): - if self.last_gfw_dirk_input_1 is not None: - if self.last_gfw_dirk_input_1 != data: - self.gfw_floor.main_light_shelly.toggle_output_0_mcb(device, key, data) - self.last_gfw_dirk_input_1 = data + self.stw_off(device, key, data) def devicelist(self): if self.__devices__ is None: diff --git a/function/first_floor_east.py b/function/first_floor_east.py index 444380f..f724dad 100644 --- a/function/first_floor_east.py +++ b/function/first_floor_east.py @@ -55,6 +55,7 @@ class first_floor_east_kitchen(room): # Functionality initialisation # self.circulation_pump = timer_on_activation(self.circulation_pump_shelly, devices.shelly.KEY_OUTPUT_0, 10*60) + self.circulation_pump_shelly.add_callback(devices.shelly.KEY_OUTPUT_0, True, self.main_light_shelly.flash_0_mcb, True) ##### TEMPORARY ################################################################################################################### self.gui_main_light = devices.nodered_gui_light(mqtt_client, config.TOPIC_FFE_KITCHEN_MAIN_LIGHT_GUI) diff --git a/function/rooms.py b/function/rooms.py index 9309afe..b265900 100644 --- a/function/rooms.py +++ b/function/rooms.py @@ -20,44 +20,10 @@ logger = logging.getLogger(ROOT_LOGGER_NAME).getChild(__name__) class room(object): def __init__(self, mqtt_client): self.mqtt_client = mqtt_client - # - self.block_all_off = False - self.last_flash_data = None - try: - self.delayed_task = task.delayed(.25, self.main_light_shelly.toggle_output_0_mcb, None, None, None) - except AttributeError: - logger.exception("Device self.main_light does not exist!") - self.delayed_task = task.delayed(.25, self.__delayed_task_dummy__, None, None, None) - - def __delayed_task_dummy__(self, device, key, data): - logger.exception("Device self.main_light does not exist!") def all_off(self, device=None, key=None, data=None): - if not self.block_all_off: - logger.info("Switching all off \"%s\"", type(self).__name__) - try: - self.main_light_shelly.set_output_0(False) - self.main_light_shelly.set_output_1(False) - except AttributeError: - logger.exception("Device self.main_light does not exist!") - self.block_all_off = False - - def all_off_feedback(self, device=None, key=None, data=None): - logger.info("Flashing \"%s\" main light", type(self).__name__) - if self.main_light_shelly.output_0 is False: - try: - self.main_light_shelly.set_output_0(True) - except AttributeError: - logger.exception("Device self.main_light does not exist!") - self.block_all_off = True - self.delayed_task.run() - - def flash_main_light(self, device, key, data): - if self.last_flash_data != data and data is True: - logger.info("Flashing \"%s\" main light", type(self).__name__) - try: - self.main_light_shelly.toggle_output_0_mcb(device, key, data) - except AttributeError: - logger.exception("Device self.main_light does not exist!") - self.delayed_task.run() - self.last_flash_data = data + logger.info("Switching all off \"%s\"", type(self).__name__) + try: + self.main_light_shelly.all_off() + except AttributeError: + logger.exception("Device self.main_light does not exist!")