Config update

This commit is contained in:
2025-12-07 12:22:33 +01:00
parent 9718d9428a
commit 52d11bfff0
9 changed files with 318 additions and 222 deletions

2
.gitignore vendored
View File

@@ -14,5 +14,7 @@ node_modules
/custom_components/hacs /custom_components/hacs
/custom_components/scheduler /custom_components/scheduler
/custom_components/pyscript /custom_components/pyscript
/custom_components/homematicip_local
/themes /themes
/node-red
/.storage/hacs/*.hacs /.storage/hacs/*.hacs

View File

@@ -56,6 +56,7 @@ kids_room:
- light.kinderzimmer_fluter - light.kinderzimmer_fluter
- cover.kinderzimmer_rollo - cover.kinderzimmer_rollo
- light.music_mouse_regal_licht - light.music_mouse_regal_licht
- light.kinderzimmer_deckenlampe
bathroom: bathroom:
name: Bad name: Bad

View File

@@ -43,7 +43,7 @@ def create_power_plug(device_info: List[DeviceInfo],
postfix_counter_reset=" BSZ Neustart"): postfix_counter_reset=" BSZ Neustart"):
result = {'switch': [], result = {'switch': [],
'sensor': []} 'sensor': []}
template_sensors = {'sensor': []} template_sensors = {'template': {'sensor': []}}
for entry in device_info: for entry in device_info:
try: try:
# Switching # Switching
@@ -82,13 +82,11 @@ def create_power_plug(device_info: List[DeviceInfo],
'type': 'DPT-9', 'type': 'DPT-9',
}) })
name = name_to_id(entry.display_name + " Verbrauch mA", 'sensor') name = name_to_id(entry.display_name + " Verbrauch mA", 'sensor')
template_sensors['sensor'].append({ template_sensors['template']['sensor'].append({
'platform': 'template', 'unique_id': name_to_id(entry.display_name + " Verbrauch", None),
'sensors': { 'name': entry.display_name + " Verbrauch",
name_to_id(entry.display_name + " Verbrauch", None): 'unit_of_measurement': 'W',
{'friendly_name': entry.display_name + " Verbrauch", 'state': f"{{{{ (states('{name}') | float / 1000 * 230) | round(1) }}}}"
'unit_of_measurement': 'W',
'value_template': f"{{{{ (states('{name}') | float / 1000 * 230) | round(1) }}}}"}}
}) })
consumption_sum = csv_contents.get(entry.csv_name + postfix_consumption_sum, None) consumption_sum = csv_contents.get(entry.csv_name + postfix_consumption_sum, None)
if consumption_sum: if consumption_sum:

View File

@@ -226,27 +226,27 @@ octoprint:
number_of_tools: 1 number_of_tools: 1
bed: true bed: true
telegram_bot: #telegram_bot:
- platform: webhooks # - platform: webhooks
parse_mode: html # parse_mode: html
url: https://ha.bauer.tech # url: https://ha.bauer.tech
api_key: !secret telegram_token # api_key: !secret telegram_token
allowed_chat_ids: # allowed_chat_ids:
- !secret telegram_chatid_martin # - !secret telegram_chatid_martin
trusted_networks: # trusted_networks:
- 127.0.0.1/32 # - 127.0.0.1/32
- 192.168.178.80 # - 192.168.178.80
- 149.154.167.197/32 # - 149.154.167.197/32
- 149.154.167.198/31 # - 149.154.167.198/31
- 149.154.167.200/29 # - 149.154.167.200/29
- 149.154.167.208/28 # - 149.154.167.208/28
- 149.154.167.224/29 # - 149.154.167.224/29
- 149.154.167.232/31 # - 149.154.167.232/31
notify: #notify:
- name: telegram_martin # - name: telegram_martin
platform: telegram # platform: telegram
chat_id: !secret telegram_chatid_martin # chat_id: !secret telegram_chatid_martin
# Custom stuff # Custom stuff
@@ -258,6 +258,7 @@ counter:
initial: 0 initial: 0
step: 1 step: 1
#switch: #switch:
# - platform: httpsispmctl # - platform: httpsispmctl
# name: esszimmer_oben_radio_steckdose # name: esszimmer_oben_radio_steckdose
@@ -297,52 +298,52 @@ logger:
# Weather prediction # Weather prediction
# - platform: yr # - platform: yr
tts: #tts:
- platform: watson_tts # - platform: watson_tts
watson_apikey: !secret watson_api_key # watson_apikey: !secret watson_api_key
watson_url: https://gateway-lon.watsonplatform.net/text-to-speech/api # watson_url: https://gateway-lon.watsonplatform.net/text-to-speech/api
voice: de-DE_BirgitVoice # voice: de-DE_BirgitVoice
output_format: audio/flac # output_format: audio/flac
output_audio_rate: 44100 # output_audio_rate: 44100
alexa: #alexa:
smart_home: # smart_home:
locale: de-DE # locale: de-DE
#endpoint: https://api.eu.amazonalexa.com/v3/events # #endpoint: https://api.eu.amazonalexa.com/v3/events
#client_id: amzn1.application-oa2-client.a4de8a70130c4f9383b277044f07a3af # #client_id: amzn1.application-oa2-client.a4de8a70130c4f9383b277044f07a3af
#client_secret: !secret alexa_client_secret # #client_secret: !secret alexa_client_secret
filter: # filter:
include_entities: # include_entities:
# Light Groups # # Light Groups
#- light.kuche_esszimmer_lichter # #- light.kuche_esszimmer_lichter
#- light.arbeitszimmer_lichter # #- light.arbeitszimmer_lichter
# Arbeitszimmer # # Arbeitszimmer
- light.arbeitszimmer_deckenlampe # - light.arbeitszimmer_deckenlampe
- light.arbeitszimmer_fluter # - light.arbeitszimmer_fluter
- light.arbeitszimmer_stehlampe_unten # - light.arbeitszimmer_stehlampe_unten
- light.arbeitszimmer_stehlampe_oben # - light.arbeitszimmer_stehlampe_oben
- cover.arbeitszimmer_rollo # - cover.arbeitszimmer_rollo
- scene.arbeitszimmer_orange # - scene.arbeitszimmer_orange
- scene.arbeitszimmer_blau_grun # - scene.arbeitszimmer_blau_grun
- scene.arbeitszimmer_hell # - scene.arbeitszimmer_hell
# Gang # # Gang
- light.gang_bogen # - light.gang_bogen
- light.gang_licht # - light.gang_licht
- light.gang_einganglicht # - light.gang_einganglicht
# Wohnbereich # # Wohnbereich
- cover.wohnzimmer_fenster_rollo # - cover.wohnzimmer_fenster_rollo
- cover.wohnzimmer_terrassentur_rollo # - cover.wohnzimmer_terrassentur_rollo
- cover.kuche_fenster_rollo # - cover.kuche_fenster_rollo
- cover.esszimmer_fenster_rollo # - cover.esszimmer_fenster_rollo
entity_config: # entity_config:
cover.arbeitszimmer_rollo: # cover.arbeitszimmer_rollo:
display_categories: EXTERIOR_BLIND # display_categories: EXTERIOR_BLIND
cover.wohnzimmer_fenster_rollo: # cover.wohnzimmer_fenster_rollo:
display_categories: EXTERIOR_BLIND # display_categories: EXTERIOR_BLIND
cover.wohnzimmer_terrassentur_rollo: # cover.wohnzimmer_terrassentur_rollo:
display_categories: EXTERIOR_BLIND # display_categories: EXTERIOR_BLIND
cover.esszimmer_fenster_rollo: # cover.esszimmer_fenster_rollo:
display_categories: EXTERIOR_BLIND # display_categories: EXTERIOR_BLIND
homekit: homekit:
name: !secret homekit_name name: !secret homekit_name
@@ -396,6 +397,10 @@ homekit:
- light.gartenhaus_deckenlicht_mitte - light.gartenhaus_deckenlicht_mitte
- light.gartenhaus_deckenlicht_vorne - light.gartenhaus_deckenlicht_vorne
- light.gartenhaus_wandlicht - light.gartenhaus_wandlicht
- switch.pool_pumpe_switch
- switch.pool_pumpe_speed1
- switch.pool_pumpe_speed2
- switch.pool_pumpe_speed3
# -- Schlafzimmer # -- Schlafzimmer
- light.schlafzimmer_deckenlampe - light.schlafzimmer_deckenlampe
- light.schlafzimmer_fluter - light.schlafzimmer_fluter
@@ -424,82 +429,84 @@ homekit:
- light.kinderzimmer_deckenlampe - light.kinderzimmer_deckenlampe
- cover.kinderzimmer_rollo - cover.kinderzimmer_rollo
- light.music_mouse_regal_licht - light.music_mouse_regal_licht
- light.kinderzimmer_fluter
google_assistant: #google_assistant:
project_id: homeassistant-d3afc # project_id: homeassistant-d3afc
service_account: !include google_assistant_service_account.json # service_account: !include google_assistant_service_account.json
report_state: true # report_state: true
expose_by_default: false # expose_by_default: false
entity_config: # entity_config:
# Arbeitszimmer # # Arbeitszimmer
light.arbeitszimmer_deckenlampe: # light.arbeitszimmer_deckenlampe:
room: Arbeitszimmer # room: Arbeitszimmer
light.arbeitszimmer_fluter: # light.arbeitszimmer_fluter:
room: Arbeitszimmer # room: Arbeitszimmer
light.arbeitszimmer_stehlampe_unten: # light.arbeitszimmer_stehlampe_unten:
room: Arbeitszimmer # room: Arbeitszimmer
light.arbeitszimmer_stehlampe_oben: # light.arbeitszimmer_stehlampe_oben:
room: Arbeitszimmer # room: Arbeitszimmer
cover.arbeitszimmer_rollo: # cover.arbeitszimmer_rollo:
room: Arbeitszimmer # room: Arbeitszimmer
scene.arbeitszimmer_orange: # scene.arbeitszimmer_orange:
room: Arbeitszimmer # room: Arbeitszimmer
scene.arbeitszimmer_blau_grun: # scene.arbeitszimmer_blau_grun:
room: Arbeitszimmer # room: Arbeitszimmer
scene.arbeitszimmer_hell: # scene.arbeitszimmer_hell:
room: Arbeitszimmer # room: Arbeitszimmer
# Gang # # Gang
light.gang_bogen: # light.gang_bogen:
room: Gang # room: Gang
light.gang_licht: # light.gang_licht:
room: Gang # room: Gang
light.gang_einganglicht: # light.gang_einganglicht:
room: Gang # room: Gang
# Wohnbereich # # Wohnbereich
cover.wohnzimmer_fenster_rollo: # cover.wohnzimmer_fenster_rollo:
room: Wohnbereich # room: Wohnbereich
cover.wohnzimmer_terrassentur_rollo: # cover.wohnzimmer_terrassentur_rollo:
room: Wohnbereich # room: Wohnbereich
cover.kuche_fenster_rollo: # cover.kuche_fenster_rollo:
room: Wohnbereich # room: Wohnbereich
cover.esszimmer_fenster_rollo: # cover.esszimmer_fenster_rollo:
room: Wohnbereich # room: Wohnbereich
knx: !include knx_conf.yaml knx: !include knx_conf.yaml
homematic: #homematic:
interfaces: # interfaces:
rf: # rf:
host: de838cd8-raspberrymatic # host: 127.0.0.1
port: 2001 # port: 2001
resolvenames: json # resolvenames: json
username: homeassistant # username: homeassistant
password: !secret homematic_pw # password: !secret homematic_pw
wired: # wired:
host: de838cd8-raspberrymatic # host: 127.0.0.1
port: 2000 # port: 2000
resolvenames: json # resolvenames: json
username: homeassistant # username: homeassistant
password: !secret homematic_pw # password: !secret homematic_pw
hmip: # hmip:
host: de838cd8-raspberrymatic # host: 127.0.0.1
port: 2010 # port: 2010
resolvenames: json # resolvenames: json
username: homeassistant # username: homeassistant
password: !secret homematic_pw # password: !secret homematic_pw
groups: # groups:
host: de838cd8-raspberrymatic # host: 127.0.0.1
port: 9292 # port: 9292
resolvenames: json # resolvenames: json
username: homeassistant # username: homeassistant
password: !secret homematic_pw # password: !secret homematic_pw
path: /groups # path: /groups
hosts: # hosts:
raspberrymatic: # raspberrymatic:
host: de838cd8-raspberrymatic # host: 127.0.0.1
username: homeassistant # port: 2001
password: !secret homematic_pw # username: homeassistant
# password: !secret homematic_pw
#zwave: #zwave:
# usb_path: /dev/serial/by-id/usb-0658_0200-if00 # usb_path: /dev/serial/by-id/usb-0658_0200-if00
@@ -542,7 +549,7 @@ sysdweb:
- irserver - irserver
- squeezelite - squeezelite
- shairport-sync - shairport-sync
- dht22_sensing #- dht22_sensing
- logitechmediaserver - logitechmediaserver
lirc_network: lirc_network:
@@ -573,21 +580,92 @@ media_player:
- platform: squeezebox_telnet - platform: squeezebox_telnet
host: musikserverWohnzimmerOben.fritz.box host: musikserverWohnzimmerOben.fritz.box
template:
- sensor:
- default_entity_id: motion_combined
friendly_name: Bewegung
state: >
{%- set pirs = {'Gang Mitte': states.binary_sensor.gang_bewegungsmelder_mitte,
'Eingang': states.binary_sensor.gang_bewegungsmelder_ost,
'Gang Hinten': states.binary_sensor.gang_bewegungsmelder_schlafzimmer,
'Gang Wohnzimmer': states.binary_sensor.gang_bewegungsmelder_wohnzimmer} %}
{% for pir_name, pir in pirs.items() %}
{% if as_timestamp(pir.last_changed) == as_timestamp(pirs.values() | map(attribute='last_changed') | max) %}
{{ pir_name }}
{% endif %}
{% endfor %}
- default_entity_id: oxilife_ph_filtered
friendly_name: Oxilify pH Filtered
unit_of_measurement: "{{ states.sensor.oxilife_ph.attributes.unit_of_measurement }}"
state: >
{% if 200 <= states('sensor.gartenhaus_steckdose2_verbrauch') | float %}
{{ states('sensor.oxilife_ph') }}
{% else %}
unknown
{% endif %}
- default_entity_id: oxilife_redox_level_filtered
friendly_name: Oxilify Redox Filtered
unit_of_measurement: "{{ states.sensor.oxilife_redox_level.attributes.unit_of_measurement }}"
state: >
{% if 200 <= states('sensor.gartenhaus_steckdose2_verbrauch') | float %}
{{ states('sensor.oxilife_redox_level') }}
{% else %}
unknown
{% endif %}
- default_entity_id: pool_temperatur_filtered
friendly_name: Oxilify Temperature Filtered
unit_of_measurement: "{{ states.sensor.pool_temperatur.attributes.unit_of_measurement }}"
state: >
{% if 200 <= states('sensor.gartenhaus_steckdose2_verbrauch') | float %}
{{ states('sensor.pool_temperatur') }}
{% else %}
unknown
{% endif %}
- switch:
- unique_id: pool_pumpe_switch
state: "{{ 1 if 100 <= states('sensor.gartenhaus_steckdose2_verbrauch') | float else 0 }}"
turn_on:
service: script.pool_pumpe_schalten
data:
value: 1
turn_off:
service: script.pool_pumpe_schalten
data:
value: 0
- unique_id: pool_pumpe_speed1
state: "{{ 200 <= states('sensor.gartenhaus_steckdose2_verbrauch') | float < 650 }}"
turn_on:
service: script.pool_pumpe_schalten
data:
value: 1
turn_off:
service: script.pool_pumpe_schalten
data:
value: 0
- unique_id: pool_pumpe_speed2
state: "{{ 650 <= states('sensor.gartenhaus_steckdose2_verbrauch') | float < 1100 }}"
turn_on:
service: script.pool_pumpe_schalten
data:
value: 2
turn_off:
service: script.pool_pumpe_schalten
data:
value: 0
- unique_id: pool_pumpe_speed3
state: "{{ 1100 <= states('sensor.gartenhaus_steckdose2_verbrauch') | float }}"
turn_on:
service: script.pool_pumpe_schalten
data:
value: 3
turn_off:
service: script.pool_pumpe_schalten
data:
value: 0
sensor: sensor:
- platform: template
sensors:
motion_combined:
friendly_name: Bewegung
value_template: >
{%- set pirs = {'Gang Mitte': states.binary_sensor.gang_bewegungsmelder_mitte,
'Eingang': states.binary_sensor.gang_bewegungsmelder_ost,
'Gang Hinten': states.binary_sensor.gang_bewegungsmelder_schlafzimmer,
'Gang Wohnzimmer': states.binary_sensor.gang_bewegungsmelder_wohnzimmer} %}
{% for pir_name, pir in pirs.items() %}
{% if as_timestamp(pir.last_changed) == as_timestamp(pirs.values() | map(attribute='last_changed') | max) %}
{{ pir_name }}
{% endif %}
{% endfor %}
- platform: time_date - platform: time_date
display_options: display_options:
- 'time' - 'time'

View File

@@ -1,40 +1,6 @@
from datetime import datetime, timedelta from datetime import datetime
from ir_helpers import * from ir_helpers import *
TIMEOUT_REPEAT_PRESS = 5 # time to switch states when pressed shortly in sequence, in seconds
# --------------------------------- Helper functions ----------------------------------------------------
light_scene_helper_dict = {}
def scene_helper(scene_function):
"""Function to manage the repeated press of the same action
When pressed shortly in sequence, states are cycled
Otherwise light is toggled"""
unique_name_for_globals = id(scene_function)
is_on_func, scenes = scene_function()
last_called, call_idx = light_scene_helper_dict.get(unique_name_for_globals, (datetime.now(), -1))
now = datetime.now()
time_since_last_call = now - last_called
recently_called = (time_since_last_call < timedelta(seconds=TIMEOUT_REPEAT_PRESS))
light_already_on = is_on_func()
log.warning(f"{light_already_on=}")
if recently_called:
call_idx = (call_idx + 1)
else:
call_idx = -1
if light_already_on and call_idx == -1:
scenes[-1]()
call_idx = -1
elif not light_already_on:
scenes[0]()
call_idx = 0
else:
idx = call_idx % len(scenes)
scenes[idx]()
light_scene_helper_dict[unique_name_for_globals] = (now, call_idx)
# --------------------------------- "Scenes" for actions ---------------------------------------------------- # --------------------------------- "Scenes" for actions ----------------------------------------------------

View File

@@ -5,32 +5,36 @@ async def regal_licht_f(**kwargs):
await hass.services.async_call('light', 'turn_on', {'entity_id': "light.music_mouse_regal_licht", 'effect': 'static', **kwargs}) await hass.services.async_call('light', 'turn_on', {'entity_id': "light.music_mouse_regal_licht", 'effect': 'static', **kwargs})
return f return f
@event_trigger("ir_command_received", "host == 'musicmouse.fritz.box' and repeat_counter == 0 and remote == 'ir_led3'") @event_trigger("ir_command_received", "host == 'musicmouse.fritz.box' and repeat_counter == 0 and remote == 'small_led_remote'")
def ir_remote_kinderzimmer(button_name=None, **kwargs): def ir_remote_kinderzimmer(button_name=None, **kwargs):
def dim_offset_f(offset):
async def f():
await hass.services.async_call('dimmer', 'dim', {'entity_id': 'group.kids_room', 'offset': offset})
return f
mapping = { mapping = {
'key_on': scene_f('kinderzimmer_hell'), 'on': scene_f('kinderzimmer_hell'),
'key_off': light_f("turn_off", entity_id="group.kids_room"), 'off': light_f("turn_off", entity_id="group.kids_room"),
'key_brightnessup': cover_f('open_cover', 'cover.kinderzimmer_rollo'), 'brightness_up': cover_f('open_cover', 'cover.kinderzimmer_rollo'),
'key_brightnessdown': cover_f('close_cover', 'cover.kinderzimmer_rollo'), 'brightness_down': cover_f('close_cover', 'cover.kinderzimmer_rollo'),
'key_white': scene_f('kinderzimmer_hell'), 'white': scene_f('kinderzimmer_hell'),
'key_red': scene_f('kinderzimmer_wickeln_nachts'), 'red': scene_f('kinderzimmer_wickeln_nachts'),
'key_pound': regal_licht_f(rgbw_color=[255, 30, 60, 0]), 'hash_pink': regal_licht_f(rgbw_color=[255, 30, 60, 0]),
'key_1': regal_licht_f(rgbw_color=[255, 30, 60, 0]), '1_orange': regal_licht_f(rgbw_color=[255, 30, 60, 0]),
'key_2': regal_licht_f(rgbw_color=[28, 255, 35, 0]), '2_green': regal_licht_f(rgbw_color=[28, 255, 35, 0]),
'key_3': regal_licht_f(rgbw_color=[0, 0, 255, 0]), '3_light_blue': regal_licht_f(rgbw_color=[0, 0, 255, 0]),
'key_4': regal_licht_f(rgbw_color=[255, 156, 17, 0]), '4_orange': regal_licht_f(rgbw_color=[255, 156, 17, 0]),
'key_5': regal_licht_f(rgbw_color=[12, 166, 255, 0]), '5_blue': regal_licht_f(rgbw_color=[12, 166, 255, 0]),
'key_6': regal_licht_f(rgbw_color=[185, 10, 255, 0]), '6_purple': regal_licht_f(rgbw_color=[185, 10, 255, 0]),
'key_7': regal_licht_f(rgbw_color=[255, 156, 17, 0], brightness=50, effect="side_0.2_inc8"), '7_yellow': regal_licht_f(rgbw_color=[255, 156, 17, 0], brightness=50, effect="side_0.2_inc8"),
'key_8': regal_licht_f(rgbw_color=[0, 0, 255, 0], brightness=50, effect="side_0.2_inc8"), '8_light_blue': regal_licht_f(rgbw_color=[0, 0, 255, 0], brightness=50, effect="side_0.2_inc8"),
'key_9': regal_licht_f(rgbw_color=[255, 30, 60, 0], brightness=50, effect="side_0.2_inc8"), '9_pink': regal_licht_f(rgbw_color=[255, 30, 60, 0], brightness=50, effect="side_0.2_inc8"),
'star_yellow': scene_f('kinderzimmer_regal_dunkel'),
'fade': dim_offset_f(+30),
'smooth': dim_offset_f(-30),
} }
if button_name in mapping: if button_name in mapping:
mapping[button_name]() mapping[button_name]()
elif button_name == 'key_smooth':
dimmer.dim(entity_id="light.music_mouse_regal_licht", offset=-30)
elif button_name == 'key_fade':
dimmer.dim(entity_id="light.music_mouse_regal_licht", offset=+30)
@event_trigger("ir_command_received", "host == 'musicmouse.fritz.box' and repeat_counter == 0 and remote == 'Hauppauge'") @event_trigger("ir_command_received", "host == 'musicmouse.fritz.box' and repeat_counter == 0 and remote == 'Hauppauge'")
def ir_remote_hauppauge_kinderzimmer(button_name=None, **kwargs): def ir_remote_hauppauge_kinderzimmer(button_name=None, **kwargs):
@@ -39,6 +43,16 @@ def ir_remote_hauppauge_kinderzimmer(button_name=None, **kwargs):
**default_ir_light_control('group.kids_room'), **default_ir_light_control('group.kids_room'),
**default_ir_cover_control('group.kids_room'), **default_ir_cover_control('group.kids_room'),
**default_ir_music_control(**p), **default_ir_music_control(**p),
'key_red': scene_f('kinderzimmer_regal_dunkel'),
'key_green': scene_f('kinderzimmer_orange'),
'key_yellow': scene_f('kinderzimmer_hell'),
'key_blue': scene_f('kinderzimmer_normal'),
'btn_1': playlist_f('Good Morning', **p),
'btn_2': playlist_f('Good Night Long', **p),
'btn_3': playlist_f('Good Night', **p),
'key_video': playlist_f('Good Night', **p),
} }
if button_name in mapping: if button_name in mapping:
mapping[button_name]() mapping[button_name]()

View File

@@ -4,11 +4,11 @@
# unten: kurz: off, but 1 min bedlight # unten: kurz: off, but 1 min bedlight
# lang: rollos zu: nur tagsueber wenn komplett offen # lang: rollos zu: nur tagsueber wenn komplett offen
@event_trigger("homematic.keypress", "name == 'schlafzimmer_deckenlampe'") @event_trigger("homematic.keypress", "name == 'schlafzimmer_deckenlampe'")
def schlafzimmer_licht(channel=None, param=None, **kwargs): def schlafzimmer_licht(subtype=None, type=None, **kwargs):
up = (channel == 2) up = (subtype == 2)
down = (channel == 1) down = (subtype == 1)
long = (param == "PRESS_LONG") long = (type == "press_long")
short = not long short= (type == "press_short")
log.info(f"Schlafzimmer knopf up {up}, long {long}") log.info(f"Schlafzimmer knopf up {up}, long {long}")
if up and short: if up and short:

View File

@@ -1,3 +1,4 @@
from datetime import datetime, timedelta
# ---------------------------------- Music --------------------------------------------- # ---------------------------------- Music ---------------------------------------------
URLS = { URLS = {
@@ -129,3 +130,39 @@ class CyclicCounter:
def prev(self): def prev(self):
self.idx = (self.idx - 1) % len(self.values) self.idx = (self.idx - 1) % len(self.values)
self.func(self.values[self.idx]) self.func(self.values[self.idx])
TIMEOUT_REPEAT_PRESS = 5 # time to switch states when pressed shortly in sequence, in seconds
# --------------------------------- Helper functions ----------------------------------------------------
light_scene_helper_dict = {}
def scene_helper(scene_function):
"""Function to manage the repeated press of the same action
When pressed shortly in sequence, states are cycled
Otherwise light is toggled"""
unique_name_for_globals = id(scene_function)
is_on_func, scenes = scene_function()
last_called, call_idx = light_scene_helper_dict.get(unique_name_for_globals, (datetime.now(), -1))
now = datetime.now()
time_since_last_call = now - last_called
recently_called = (time_since_last_call < timedelta(seconds=TIMEOUT_REPEAT_PRESS))
light_already_on = is_on_func()
log.warning(f"{light_already_on=}")
if recently_called:
call_idx = (call_idx + 1)
else:
call_idx = -1
if light_already_on and call_idx == -1:
scenes[-1]()
call_idx = -1
elif not light_already_on:
scenes[0]()
call_idx = 0
else:
idx = call_idx % len(scenes)
scenes[idx]()
light_scene_helper_dict[unique_name_for_globals] = (now, call_idx)