diff --git a/apps/apps.yaml b/apps/apps.yaml index a75d050..07169de 100644 --- a/apps/apps.yaml +++ b/apps/apps.yaml @@ -9,6 +9,7 @@ ManCaveLights: init_brightness: 200 max_brightness: 254 step_size: 25 + color: antique_white button1: light.stick_lamp button2: light.wet_bar button3: light.monkey_lamp diff --git a/apps/tap_dial.py b/apps/tap_dial.py index f950247..99bcfbb 100644 --- a/apps/tap_dial.py +++ b/apps/tap_dial.py @@ -24,6 +24,15 @@ class TapDial(Hass): def max_brightness(self) -> int: return int(self.args.get('max_brightness', 254)) + # The active_entity_is_on property fails if no button has been pushed and the dial is rotated with the error: + # File "/conf/apps/tap_dial.py", line 59, in handle_state_change + # if new.startswith('dial_rotate') and self.active_entity_is_on: + # ^^^^^^^^^^^^^^^^^^^^^^^^ + # File "/conf/apps/tap_dial.py", line 29, in active_entity_is_on + # return self.active_entity.get_state() == 'on' + # ^^^^^^^^^^^^^^^^^^ + # AttributeError: 'TapDial' object has no attribute 'active_entity'. Did you mean: 'remove_entity'? + @property def active_entity_is_on(self) -> bool: return self.active_entity.get_state() == 'on' @@ -67,61 +76,64 @@ class TapDial(Hass): case 'fast': rate = 3 * self.step_size val = self.active_entity.attributes['brightness'] - self.log(f'070 Brightness value = {val} Change rate = {rate}') - if dir == 'right': - if val < self.max_brightness: - if (val + rate) > self.max_brightness: - val = self.max_brightness - else: - val += rate - self.active_entity.turn_on(brightness=val) - self.log(f'078 Brightness value = {val}') + if val != 'null': + self.log(f'071 Brightness value = {val} Change rate = {rate}') + if dir == 'right': + if val < self.max_brightness: + if (val + rate) > self.max_brightness: + val = self.max_brightness + else: + val += rate + self.active_entity.turn_on(brightness=val) + self.log(f'079 Brightness value = {val}') + else: + if val > 0: + if (val - rate) < 0: + val = 0 + else: + val -= rate + self.active_entity.turn_on(brightness=val) + self.log(f'087 Brightness value = {val}') else: - if val > 0: - if (val - rate) < 0: - val = 0 - else: - val -= rate - self.active_entity.turn_on(brightness=val) - self.log(f'086 Brightness value = {val}') + self.log(f'089 WARNING: Brightness value = {val}') # Button actions elif new.endswith('release'): _, n, typ, _ = new.split('_', 4) # type will be either press or hold - self.log(f'092 Button {n} {typ}') + self.log(f'104 Button {n} {typ}') if eid := self.args.get(f'button{n}'): self.active_entity = self.get_entity(eid) - self.log(f'096 Set active entity to: {self.active_entity.name}') - self.log(json.dumps(self.active_entity.get_state('all'), indent=4)) + self.log(f'108 Set active entity to: {self.active_entity.name}') + # self.log(json.dumps(self.active_entity.get_state('all'), indent=4)) domain, entity = eid.split('.') - self.log(f'099 Curent domain: {domain}, entity: {entity}') + self.log(f'112 Curent domain: {domain}, entity: {entity}') match domain: case 'light': # Set the light to maximum brightness if the button is held. if typ == 'hold': self.active_entity.turn_on(brightness=self.max_brightness) - self.log(f'105 Set {self.active_entity.friendly_name} to maximum brightness {self.max_brightness}') + self.log(f'118 Set {self.active_entity.friendly_name} to maximum brightness {self.max_brightness}') else: if self.active_entity_is_on: self.active_entity.turn_off() - self.log(f'109 Turn off {self.active_entity.friendly_name}') + self.log(f'122 Turn off {self.active_entity.friendly_name}') else: self.active_entity.turn_on(brightness=self.init_brightness) - self.log(f'112 Turn on {self.active_entity.friendly_name} with brightness {self.init_brightness}') + self.log(f'125 Turn on {self.active_entity.friendly_name} with brightness {self.init_brightness}') case 'switch': self.active_entity.toggle() - self.log(f'115 Toggle on/off power to {self.active_entity.friendly_name}') + self.log(f'128 Toggle on/off power to {self.active_entity.friendly_name}') elif switch := self.args.get(f'button{n}'): self.active_entity = self.get_entity(switch) - self.log(f'119 Set active entity to: {self.active_entity.friendly_name}') + self.log(f'132 Set active entity to: {self.active_entity.friendly_name}') onoff = self.active_entity.get_state() - self.log(f'114 {self.active_entity.friendly_name} is currently {onoff}') + self.log(f'134 {self.active_entity.friendly_name} is currently {onoff}') self.active_entity.toggle() - self.log(f'116 Toggle on/off power to {self.active_entity.friendly_name}') + self.log(f'136 Toggle on/off power to {self.active_entity.friendly_name}') # This function was written by chatgpt! def hex_to_rgb(self, hex_color: str) -> list: @@ -131,7 +143,7 @@ class TapDial(Hass): # Check if the string has a valid length if len(hex_color) != 6: - raise ValueError(f"126 Invalid hex color: {hex_color}. Must be 6 characters long.") + raise ValueError(f"146 Invalid hex color: {hex_color}. Must be 6 characters long.") try: # Split the hex color into its RGB components and convert to integers @@ -140,5 +152,5 @@ class TapDial(Hass): b = int(hex_color[4:6], 16) return [r, g, b] except ValueError: - raise ValueError(f"135 Invalid hex color: {hex_color}. Must contain only valid hex digits.") + raise ValueError(f"155 Invalid hex color: {hex_color}. Must contain only valid hex digits.") diff --git a/docker-compose.yml b/docker-compose.yml index 2e8af35..8feefd4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,17 +5,9 @@ services: volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - - config:/conf + - ./:/conf ports: - 5050:5050 restart: unless-stopped tty: true - -volumes: - config: - driver: local - driver_opts: - o: bind - type: none - device: ./ diff --git a/inactive/living_room.yaml b/inactive/living_room.yaml new file mode 100644 index 0000000..d9598fd --- /dev/null +++ b/inactive/living_room.yaml @@ -0,0 +1,68 @@ +living_room: + module: room_control + class: RoomController + # rich: DEBUG + off_duration: 00:10:00 + manual_mode: input_boolean.living_room_manual_mode + states: + - time: sunrise + off_duration: 00:15:00 + scene: + light.living_room_lamps: + state: on + color_temp: 200 + brightness: 255 + light.white05: + state: on + color_temp: 200 + brightness: 190 + light.living_room_floodlights: + state: off + - time: '18:00:00' + off_duration: 01:00:00 + scene: + light.living_room_lamps: + state: on + color_temp: 300 + brightness: 190 + light.living_room_floodlights: + state: off + - time: '23:00:00' + off_duration: 00:00:30 + scene: + light.living_room_lamps: + state: on + color_temp: 400 + brightness: 125 + light.white05: + state: off + light.living_room_floodlights: + state: off + # sleep: input_boolean.sleeping + # sleep_state: + # scene: + # light.colorflood05: + # state: 'on' + # color_name: 'red' + # brightness: 10 + +# front_door: +# module: door +# class: Door +# app: living_room +# door: binary_sensor.front_contact + +living_room_button: + module: button + class: Button + app: living_room + manual_mode: input_boolean.living_room_manual_mode + button: button01 + ref_entity: light.color04 + +living_room_motion: + module: motion + class: Motion + app: living_room + sensor: binary_sensor.living_room_motion + ref_entity: light.color04 diff --git a/inactive/mancave.yaml b/inactive/mancave.yaml new file mode 100644 index 0000000..6e47c08 --- /dev/null +++ b/inactive/mancave.yaml @@ -0,0 +1,84 @@ +mancave: + module: room_control + class: RoomController + # rich: DEBUG + off_duration: 00:00:10 + manual_mode: input_boolean.mancave_manual_mode + states: + - time: sunrise + scene: + light.color01: + state: on + color_temp: 200 + brightness: 255 + light.colorflood05: + state: off + light.color03: + state: off + light.white08: + color_temp: 300 + brightness: 175 + light.wled_soundreactive: + state: off + preset: 'Stream' + - time: '18:00:00' + scene: + light.color01: + state: on + rgb_color: [255, 193, 193] + brightness: 255 + light.colorflood05: + state: on + rgb_color: [255, 193, 193] + brightness: 170 + light.color03: + state: off + light.white08: + state: on + color_temp: 400 + brightness: 70 + light.wled_soundreactive: + state: on + preset: 'WashingMachine' + - time: '23:00:00' + scene: + light.color01: + state: on + color_temp: 400 + brightness: 125 + light.colorflood05: + state: off + light.color03: + state: off + light.white08: + state: off + light.wled_soundreactive: + state: off + # sleep: input_boolean.sleeping + # sleep_state: + # scene: + # light.colorflood05: + # state: 'on' + # color_name: 'red' + # brightness: 10 + +# front_door: +# module: door +# class: Door +# app: living_room +# door: binary_sensor.front_contact + +mancave_button: + module: button + class: Button + app: mancave + manual_mode: input_boolean.mancave_manual_mode + button: button07 + ref_entity: light.color01 + +mancave_motion: + module: motion + class: Motion + app: mancave + sensor: binary_sensor.motionsensors01_occupancy + ref_entity: light.color01