Changed automations to pyscript

This commit is contained in:
Martin Bauer
2021-10-05 11:22:27 +00:00
parent a0e498edeb
commit ab2ab9f9d7
27 changed files with 496 additions and 2592 deletions

9
pyscript/config.yaml Normal file
View File

@@ -0,0 +1,9 @@
apps:
ir_remote_kitchenpi
ir_remote_oben
ir_remote_schlafzimmer
herd
knx_buttons
licht_schlafzimmer
licht_gang_bogen
licht_wc

14
pyscript/herd.py Normal file
View File

@@ -0,0 +1,14 @@
@state_trigger("switch.esszimmer_szene_4")
def esszimmer_gangtuer_herd(value=None):
entity_id = [f"switch.herd_phase_{i}" for i in range(1, 4)]
if value == "on":
switch.turn_on(entity_id=entity_id)
elif value == "off":
switch.turn_off(entity_id=entity_id)
@state_trigger("float(sensor.herd_phase_1_verbrauch) + float(sensor.herd_phase_2_verbrauch) + float(sensor.herd_phase_3_verbrauch) < 100", state_hold=30 * 60)
def herd_auto_aus():
switch.esszimmer_szene_4.turn_off()

View File

@@ -0,0 +1,33 @@
from ir_helpers import *
@event_trigger("ir_command_received", "host == 'kitchenpi.fritz.box' and repeat_counter == 0")
def ir_remote_kitchenpi(button_name=None, **kwargs):
player = {'player': 'media_player.kitchenpi'}
mapping = {
**default_ir_light_control('group.living_area'),
**default_ir_cover_control('group.living_area'),
**default_ir_music_control(**player),
'btn_1': playlist_f('Fast Jazz', shuffle=True, **player),
'btn_2': playlist_f('Favorite Brass', shuffle=True, **player),
'btn_3': playlist_f("Pop", shuffle=True, **player),
'btn_4': playlist_f('Bar Classics', **player),
'btn_5': playlist_f('Sentimental Moods', **player),
'btn_6': playlist_f(URLS['spotify_merkliste'], **player),
'btn_7': radio_f('BR24', **player),
'btn_8': radio_f('BR-Klassik', **player),
'btn_9': playlist_f(URLS['klassik_radio'], **player),
'btn_0': radio_f('Bayern 3', **player),
'key_numeric_pound': radio_f('Bayern 2', **player),
'key_numeric_star': radio_f('Antenne Bayern', **player),
'key_red': scene_f('wohnbereich_orange'),
'key_green': scene_f('wohnbereich_grun'),
'key_yellow': scene_f('wohnbereich_hell'),
'key_blue': scene_f('wohnbereich_blau_grun'),
}
if button_name in mapping:
mapping[button_name]()

View File

@@ -0,0 +1,77 @@
from ir_helpers import *
light_counter = CyclicCounter(
lambda v: light.lampe_ersterstock.turn_on(**v),
[
{'color_temp': 492},
{'xy_color': [0.5794, 0.3752]},
{'xy_color': [0.5535, 0.4104]},
{'xy_color': [0.4662, 0.3252]},
{'xy_color': [0.3423, 0.2252]},
{'xy_color': [0.346, 0.394]},
{'xy_color': [0.4119, 0.3671]},
{'xy_color': [0.408, 0.517]},
{'color_temp': 202},
],
)
def music_mapping(player):
player = {'player': player}
return {
'btn_1': radio_f('Bayern 1', **player),
'btn_2': radio_f('Bayern 2', **player),
'btn_3': radio_f('BR Heimat', **player),
'btn_4': radio_f('Bayern+', **player),
'btn_5': radio_f('BR24', **player),
'btn_6': radio_f('BR-Klassik', **player),
'btn_7': playlist_f('Gesammelte Weihnachtslieder', **player),
'btn_8': playlist_f('Harmonic Brass Christmas', **player),
'btn_9': playlist_f('German Brass Christmas', **player),
'key_numeric_star': playlist_f('Weihnachten mit den Wiener Sängerknaben', **player),
'btn_0': playlist_f('Weihnachten mit den Wiener Sängerknaben', **player),
'key_numeric_pound': playlist_f('SammlungGeorg', **player),
}
def light_mapping():
return {
'key_red': light_counter.next,
'key_green': light_counter.prev,
'key_blue': light.lampe_ersterstock.turn_off,
'key_yellow': light.lampe_ersterstock.turn_off,
'key_channelup': lambda: dimmer.dim(entity_id='light.lampe_ersterstock', offset=+30),
'key_channeldown': lambda: dimmer.dim(entity_id='light.lampe_ersterstock', offset=-30),
}
# -------------------------------------------------------------------------------------------------
@event_trigger("ir_command_received", "host == 'esszimmerradio.fritz.box' and repeat_counter == 0")
def ir_remote_esszimmer_oben(button_name=None, **kwargs):
mapping = {
**music_mapping('media_player.esszimmer'),
**light_mapping(),
}
buttons_to_switch_on = ['key_play', 'key_power'] + [f'btn_{i}' for i in range(10)]
buttons_to_switch_off = ['key_goto', 'key_pause']
if button_name in buttons_to_switch_on:
switch.esszimmer_oben_radio_steckdose1.turn_on()
elif button_name in buttons_to_switch_off:
switch.esszimmer_oben_radio_steckdose1.turn_off()
elif button_name == 'key_record':
sysdweb.restart(service_name="squeezelite", hostname="esszimmerradio.fritz.box")
if button_name in mapping:
mapping[button_name]()
@event_trigger("ir_command_received", "host == 'musikserverWohnzimmerOben.fritz.box' and repeat_counter==0")
def ir_remote_wohnzimmer_oben(button_name=None, **kwargs):
mapping = {
**music_mapping('media_player.wohnzimmer'),
**light_mapping(),
}
if button_name in mapping:
mapping[button_name]()

View File

@@ -0,0 +1,66 @@
from ir_helpers import *
@pyscript_compile
def timed_sleep_f(content, light_off_mins, music_off_mins, shuffle):
variables = {
'media_content_id': content,
'light_off_secs': light_off_mins * 60,
'music_off_secs': music_off_mins * 60,
'shuffle': shuffle,
}
async def f():
await hass.services.async_call('script', 'timed_sleep', variables)
return f
@event_trigger("ir_command_received", "host == 'bedroompi.fritz.box' and repeat_counter == 0")
def ir_remote_schlafzimmer(button_name=None, **kwargs):
p = {'player': 'media_player.bedroompi'}
mapping = {
**default_ir_light_control('group.bedroom'),
**default_ir_cover_control('group.bedroom'),
**default_ir_music_control(**p),
'btn_1': playlist_f('Good Morning', **p),
'btn_2': playlist_f('Good Night Long', **p),
'btn_3': playlist_f('Good Night', **p),
'btn_4': playlist_f('Bar Classics', **p),
'btn_5': playlist_f('Sentimental Moods', **p),
'btn_6': playlist_f(URLS['spotify_merkliste'], **p),
'btn_7': radio_f('BR24', **p),
'btn_8': radio_f('BR-Klassik', **p),
'btn_9': playlist_f(URLS['klassik_radio'], **p),
'btn_0': radio_f('Bayern 3', **p),
'key_numeric_pound': radio_f('Bayern 2', **p),
'key_numeric_star': radio_f('Antenne Bayern', **player),
'key_red': scene_f('schlafzimmer_stillen'),
'key_green': scene_f('schlafzimmer_orange'),
'key_yellow': scene_f('schlafzimmer_ganz_hell'),
'key_blue': scene_f('nachtswennallelieberschlafen'),
'key_tv': timed_sleep_f(URLS['spotify_rain'], light_off_mins=15, music_off_mins=45, shuffle=True),
'key_video': timed_sleep_f('Good Night', light_off_mins=15, music_off_mins=45, shuffle=False),
'key_music': timed_sleep_f(URLS['spotify_rain'], light_off_mins=5, music_off_mins=20, shuffle=True),
'key_picture': timed_sleep_f('Good Night', light_off_mins=5, music_off_mins=20, shuffle=False)
}
if button_name in mapping:
mapping[button_name]()
elif button_name == "key_numeric_star": # Foen
repeat_one_crossfade(**p)
media_player.play_media(media_content_id='Foen', media_content_type='music', entity_id=p['player'])
media_player.volume_set(volume_level=60, entity_id=p['player'])
elif button_name == 'key_power': # Music & Lights off
media_player.media_pause(entity_id=p['player'])
light.turn_off(entity_id='group.bedroom')
elif button_name == 'key_ok': # Grosser Rollo zu, kleiner halb zu
cover.schlafzimmer_rollo_gross.close_cover()
cover_half.set_half(entity_id="cover.schlafzimmer_rollo_klein")
elif button_name == 'key_mute': # Alles aus ohne draussen & schlafzimmer
light.turn_off(entity_id='group.all_downstairs_but_bedroom_and_outside')
elif button_name == 'key_channel': # alles aus ausser schlafzimmer
light.turn_off(entity_id='group.all_downstairs_but_bedroom')

119
pyscript/knx_buttons.py Normal file
View File

@@ -0,0 +1,119 @@
@pyscript_compile
def in_room(room):
return f"entity_id.startswith('switch.{room}_szene_')"
@event_trigger("short_click", in_room("eingang"))
@event_trigger("long_click", in_room("eingang"))
def eingang(entity_id=None, event_type=None):
long_click = (event_type == "long_click")
key = {'switch.eingang_szene_2': 'bulb_orange',
'switch.eingang_szene_3': 'bulb_black',
'switch.eingang_szene_4': 'key',
'switch.eingang_szene_5': 'dog'}[entity_id]
if key == "bulb_orange":
light.gang_licht.turn_on()
light.gang_einganglicht.turn_on()
if long_click:
scene.wohnbereich_hell.turn_on()
elif key == "bulb_black":
if long_click:
light.turn_off(entity_id="group.all_downstairs")
else:
light.turn_off(entity_id="group.all_downstairs_but_outside")
@event_trigger("short_click", in_room("esszimmer"))
@event_trigger("long_click", in_room("esszimmer"))
def esszimmer_gangtuer(entity_id=None, event_type=None):
key = {'switch.esszimmer_szene_0': 'arrow_down',
'switch.esszimmer_szene_1': 'arrow_up',
'switch.esszimmer_szene_2': 'bulb_orange',
'switch.esszimmer_szene_3': 'bulb_yellow',
'switch.esszimmer_szene_4': 'cooking_pot', # Herd an/aus in separater Datei
'switch.esszimmer_szene_5': 'bulb_black'}[entity_id]
long_click = (event_type == "long_click")
if long_click:
covers = ['cover.kuche_fenster_rollo', 'cover.esszimmer_fenster_rollo']
else:
covers = ['group.living_area']
if key == "arrow_down":
cover_half.set_half(entity_id=covers)
elif key == "arrow_up":
cover.open_cover(entity_id=covers)
elif key == "bulb_orange":
if long_click:
scene.kuche_essbereich_orange.turn_on()
else:
scene.wohnbereich_orange.turn_on()
elif key == "bulb_yellow":
if long_click:
scene.kuche_essbereich_hell.turn_on()
else:
scene.wohnbereich_hell.turn_on()
elif key == "bulb_black":
if long_click:
light.essbereich_lichter.turn_off()
else:
light.turn_off(entity_id="group.living_area")
@event_trigger("short_click", in_room("wohnzimmer"))
@event_trigger("long_click", in_room("wohnzimmer"))
def wohnzimmer_gangtur(entity_id=None, event_type=None):
long_click = (event_type == "long_click")
key = {'switch.wohnzimmer_szene_0': 'arrow_down',
'switch.wohnzimmer_szene_1': 'arrow_up',
'switch.wohnzimmer_szene_2': 'bulb_orange',
'switch.wohnzimmer_szene_3': 'bulb_yellow',
'switch.wohnzimmer_szene_4': 'bulb_blue',
'switch.wohnzimmer_szene_5': 'bulb_black'}[entity_id]
if long_click:
covers = ['cover.wohnzimmer_fenster_rollo', 'cover.wohnzimmer_terrassentur_rollo']
else:
covers = ['group.living_area']
if key == "arrow_down":
cover_half.set_half(entity_id=covers)
elif key == "arrow_up":
cover.open_cover(entity_id=covers)
elif key == "bulb_orange":
if long_click:
scene.wohnzimmer_orange.turn_on()
else:
scene.wohnbereich_orange.turn_on()
elif key == "bulb_yellow":
if long_click:
scene.wohnzimmer_hell.turn_on()
else:
scene.wohnbereich_hell.turn_on()
elif key == "bulb_blue":
if long_click:
scene.wohnzimmer_dunkel.turn_on()
else:
scene.wohnbereich_blau_grun.turn_on()
elif key == "bulb_black":
if long_click:
light.wohnzimmer_lichter.turn_off()
else:
light.turn_off(entity_id="group.living_area")
@event_trigger("short_click", in_room("wohnzimmer_terrassentur"))
@event_trigger("long_click", in_room("wohnzimmer_terrassentur"))
def wohnzimmer_terassentuer(entity_id=None, event_type=None):
long_click = (event_type == "long_click")
key = {'switch.wohnzimmer_terrassentur_szene_2': 'teddy',
'switch.wohnzimmer_terrassentur_szene_3': 'flowers'}[entity_id]
if key == "teddy":
if long_click:
scene.wohnbereich_kuscheln.turn_on()
elif key == "flowers":
if long_click:
light.turn_off(entity_id="light.garten_lichter")
else:
scene.garten_savanna.turn_on()

View File

View File

@@ -0,0 +1,11 @@
@event_trigger("homematic.keypress", "name == 'schlafzimmer_deckenlampe'")
def schlafzimmer_licht(channel=None, param=None):
up = (channel == 1)
long = (param == "PRESS_LONG")
# TODO
# oben: kurz: orange szene
# lang: helle szene
# unten: kurz: off, but 1 min bedlight
# lang: rollos zu

4
pyscript/licht_wc.py Normal file
View File

@@ -0,0 +1,4 @@
@state_trigger("switch.wc_licht_taster == 'on'")
def wc_licht():
switch.wc_licht.toggle()

View File

@@ -0,0 +1,126 @@
# ---------------------------------- Music ---------------------------------------------
URLS = {
'klassik_radio': "http://opml.radiotime.com/Tune.ashx?id=s25028&formats=aac,ogg,mp3",
'spotify_rain': "spotify:playlist:37i9dQZF1DXbcPC6Vvqudd",
'spotify_merkliste': "spotify:playlist:43wCckw3P4WKdy06Rd7eYO",
}
async def media_player_s(service_name, entity_id, **kwargs):
await hass.services.async_call('media_player', service_name, {'entity_id': entity_id, **kwargs})
async def media_player_f(service_name, entity_id, **kwargs):
async def f():
hass.services.async_call('media_player', service_name, {'entity_id': entity_id, **kwargs})
return f
async def default_music_settings(player, shuffle=False):
await media_player_s('shuffle_set', player, shuffle=shuffle)
await media_player_s('squeezebox_call_method', player, command="playlist repeat 0")
await media_player_s('squeezebox_call_method', player, command="playerpref transitionType 0")
async def repeat_one_crossfade(player):
await media_player_s('repeat_set', player, repeat='one')
await media_player_s('squeezebox_call_method', player, command='playerpref transitionType 1')
def playlist_f(name, player, shuffle=False):
async def f():
await default_music_settings(player, shuffle=shuffle)
await media_player_s('play_media', player, media_content_id=name, media_content_type='music')
return f
def radio_f(name, player):
async def f():
await media_player_s('play_media', player, media_content_id=name, media_content_type='channel')
return f
def scene_f(name):
async def f():
await hass.services.async_call('scene', 'turn_on', {'entity_id': 'scene.' + name})
return f
def cover_f(name, entity_id, **kwargs):
async def f():
await hass.services.async_call('cover', name, {'entity_id': entity_id, **kwargs})
return f
def cover_half_f(entity_id):
async def f():
await hass.services.async_call('cover_half', 'set_half', {'entity_id': entity_id})
return f
def light_f(name, entity_id, **kwargs):
async def f():
await hass.services.async_call('light', name, {'entity_id': entity_id, **kwargs})
return f
def default_ir_music_control(player):
return {
'key_play': media_player_f("media_play_pause", player),
'key_pause': media_player_f("turn_off", player),
'key_forward': media_player_f('media_next_track', player),
'key_fastforward': media_player_f('media_next_track', player),
'key_previous': media_player_f('media_previous_track', player),
'key_rewind': media_player_f('media_previous_track', player),
'key_volumeup': media_player_f('volume_up', player),
'key_volumedown': media_player_f('volume_down', player),
'key_menu': media_player_f('shuffle_set', player, shuffle=True),
'key_exit': media_player_f('shuffle_set', player, shuffle=False),
}
# ---------------------------------- Covers --------------------------------------------
def default_ir_cover_control(device_group):
return {
'key_up': cover_f('open_cover', device_group),
'key_down': cover_f('close_cover', device_group),
'key_left': cover_half_f(device_group),
'key_right': cover_half_f(device_group),
}
# ---------------------------------- Lights ---------------------------------------------
def default_ir_light_control(device_group):
def dim_offset_f(offset):
async def f():
await hass.services.async_call('dimmer', 'dim', {'entity_id': device_group, 'offset': offset})
return f
return {
'key_channelup': dim_offset_f(+30),
'key_channeldown': dim_offset_f(-30),
'key_menu': dim_offset_f(130),
'key_stop': dim_offset_f(-130),
'key_goto': light_f('turn_off', device_group)
}
class CyclicCounter:
def __init__(self, func, values):
self.idx = 0
self.values = values
self.func = func
def next(self):
self.idx = (self.idx + 1) % len(self.values)
self.func(self.values[self.idx])
def prev(self):
self.idx = (self.idx - 1) % len(self.values)
self.func(self.values[self.idx])