From d613c1db5c342b6750085026c2de78e9ca74c5f5 Mon Sep 17 00:00:00 2001 From: Dirk Alders Date: Sat, 20 Apr 2024 16:56:13 +0200 Subject: [PATCH] Global Summer and Winter Mode --- function/__init__.py | 12 +++++++++++- function/rooms.py | 15 +++++++++++++++ function/videv.py | 14 ++++++++++++++ topics.py | 2 ++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/function/__init__.py b/function/__init__.py index f0d9f09..343e636 100644 --- a/function/__init__.py +++ b/function/__init__.py @@ -9,7 +9,7 @@ from function.ground_floor_west import ground_floor_west from function.first_floor_west import first_floor_west from function.first_floor_east import first_floor_east from function.rooms import room_collection -from function.videv import all_off +from function.videv import all_off, videv_pure_switch import logging try: @@ -42,6 +42,8 @@ class all_functions(room_collection): self.init_cross_room_interactions() # Off Buttons self.init_off_functionality() + # Summer / Winter mode + self.init_sumer_winter_mode() def init_cross_room_interactions(self): # shelly dirk input 1 @@ -69,6 +71,14 @@ class all_functions(room_collection): # 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.all_off) + def init_sumer_winter_mode(self): + # ALL summer/winter mode + self.videv_summer_mode = videv_pure_switch(self.mqtt_client, config.TOPIC_ALL_SUMMER_WINTER_MODE) + + self.videv_summer_mode.add_callback(self.videv_summer_mode.KEY_STATE, None, self.gfw.summer_mode) + self.videv_summer_mode.add_callback(self.videv_summer_mode.KEY_STATE, None, self.ffw.summer_mode) + self.videv_summer_mode.add_callback(self.videv_summer_mode.KEY_STATE, None, self.ffe.summer_mode) + 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: diff --git a/function/rooms.py b/function/rooms.py index f3d2469..42f4694 100644 --- a/function/rooms.py +++ b/function/rooms.py @@ -27,6 +27,12 @@ class room(object): except AttributeError: pass # not a module or has no method all_off + def summer_mode(self, enable): + for name, obj in inspect.getmembers(self): + if obj.__class__.__name__ == 'heating_function': + if obj.__module__ == 'function.modules': + obj.set(obj.KEY_SUMMER_MODE, enable) + class room_collection(object): ALLOWED_CLASSES = ("room", "room_collection") @@ -45,6 +51,15 @@ class room_collection(object): if sub.__class__.__bases__[0].__name__ in self.ALLOWED_CLASSES: sub.all_off() + def summer_mode(self, device=None, key=None, data=None): + logger.info("Changing to %s \"%s\"", "summer mode" if data else "winter_mode", type(self).__name__) + for sub_name in dir(self): + # attribute name is not private + if not sub_name.startswith("__"): + sub = getattr(self, sub_name) + if sub.__class__.__bases__[0].__name__ in self.ALLOWED_CLASSES: + sub.summer_mode(data) + def all_devices(self, object_to_analyse=None, depth=0): target = object_to_analyse or self # diff --git a/function/videv.py b/function/videv.py index a2c6050..ec847e6 100644 --- a/function/videv.py +++ b/function/videv.py @@ -20,6 +20,20 @@ except ImportError: ROOT_LOGGER_NAME = 'root' +class videv_pure_switch(videv_base): + KEY_STATE = 'state' + + def __init__(self, mqtt_client, topic): + super().__init__(mqtt_client, topic) + self[self.KEY_STATE] = False + # + self.mqtt_client.add_callback(self.topic + '/state/set', self.state) + + def state(self, mqtt_client, tbd, message): + self.set(self.KEY_STATE, message.payload == b'true') + self.__tx__(self.KEY_STATE, message.payload == b'true') + + class videv_switching(videv_base): KEY_STATE = 'state' diff --git a/topics.py b/topics.py index b752935..cfd296c 100644 --- a/topics.py +++ b/topics.py @@ -3,6 +3,8 @@ # TOPIC_WARNINGS = "videv/warnings" TOPIC_ALL_OFF_VIDEV = "videv/off" +TOPIC_ALL_SUMMER_WINTER_MODE = "videv/summer_mode" + # ground floor west # floor TOPIC_GFW_FLOOR_MAIN_LIGHT_VIDEV = "videv/gfw/floor/main_light"