From 71b44d6a091bf6e2ddd7509646889fc4a8633236 Mon Sep 17 00:00:00 2001 From: Christian Kauer Date: Mon, 15 Jan 2024 21:26:53 +0100 Subject: [PATCH] linode server steuern, zirkulationspumpe steuern --- .HA_VERSION | 2 +- .../door_sensor_keller_changed_to_closed.yaml | 40 ++-- .../door_sensor_keller_changed_to_open.yaml | 42 ++-- automations/smoke_sensor.yaml | 74 +++---- automations/test_poolpumpe.yaml | 41 ++++ automations/zirkulationspumpe.yaml | 34 ++++ .../legovaer/group-sonos-on-motion.yaml | 150 ++++++++++++++ configuration.yaml | 3 +- .../hacs_frontend_experimental/__init__.py | 8 +- .../source/bir_no.py | 164 ++++++++-------- .../source/cederbaum_de.py | 184 +++++++++--------- entities/notifiers/iphones.yaml | 8 +- entities/sensors/linode_server1.yaml | 10 + integrations/http.yaml | 10 +- integrations/mqtt.yaml.bak | 42 ++-- integrations/rest_command.yaml | 5 + integrations/templates.yaml | 22 +-- rest_commands/linode_commands.yaml | 23 +++ scripts/smoke_sensor_script.yaml | 76 ++++---- secrets.yaml | 6 +- templates.yaml | 20 +- 21 files changed, 613 insertions(+), 351 deletions(-) create mode 100644 automations/test_poolpumpe.yaml create mode 100644 automations/zirkulationspumpe.yaml create mode 100644 blueprints/automation/legovaer/group-sonos-on-motion.yaml create mode 100644 entities/sensors/linode_server1.yaml create mode 100644 integrations/rest_command.yaml create mode 100644 rest_commands/linode_commands.yaml diff --git a/.HA_VERSION b/.HA_VERSION index cee5dee..d7349c1 100644 --- a/.HA_VERSION +++ b/.HA_VERSION @@ -1 +1 @@ -2023.12.3 \ No newline at end of file +2024.1.3 \ No newline at end of file diff --git a/automations/ground_corridor/door_sensor_keller_changed_to_closed.yaml b/automations/ground_corridor/door_sensor_keller_changed_to_closed.yaml index 5f9aa43..a022e90 100644 --- a/automations/ground_corridor/door_sensor_keller_changed_to_closed.yaml +++ b/automations/ground_corridor/door_sensor_keller_changed_to_closed.yaml @@ -1,21 +1,21 @@ -# https://www.home-assistant.io/docs/automation/trigger/#event-trigger -description: Änderung Türsensor Kellertür zu geschlossen -alias: Änderung Türsensor Kellertür zu geschlossen -id: 95dd0b0b-0deb-470c-a2d7-e6b6dac08891 -trigger: - - platform: state - entity_id: binary_sensor.door_sensor_kellertur_window_door_is_open - to: "off" -action: - - service: notify.dev_telegram - data: - message: > - {% if is_state('binary_sensor.door_sensor_kellertur_window_door_is_open', 'on') %} - Kellertür wurde geöffnet - {% else %} - Kellertür wurde geschlossen - {% endif %} - - - service: switch.turn_off - target: +# https://www.home-assistant.io/docs/automation/trigger/#event-trigger +description: Änderung Türsensor Kellertür zu geschlossen +alias: Änderung Türsensor Kellertür zu geschlossen +id: 95dd0b0b-0deb-470c-a2d7-e6b6dac08891 +trigger: + - platform: state + entity_id: binary_sensor.door_sensor_kellertur_window_door_is_open + to: "off" +action: + - service: notify.dev_telegram + data: + message: > + {% if is_state('binary_sensor.door_sensor_kellertur_window_door_is_open', 'on') %} + Kellertür wurde geöffnet + {% else %} + Kellertür wurde geschlossen + {% endif %} + + - service: switch.turn_off + target: entity_id: switch.double_switch_node12_4 \ No newline at end of file diff --git a/automations/ground_corridor/door_sensor_keller_changed_to_open.yaml b/automations/ground_corridor/door_sensor_keller_changed_to_open.yaml index a22ab6c..b3f6ce6 100644 --- a/automations/ground_corridor/door_sensor_keller_changed_to_open.yaml +++ b/automations/ground_corridor/door_sensor_keller_changed_to_open.yaml @@ -1,21 +1,21 @@ -# https://www.home-assistant.io/docs/automation/trigger/#event-trigger -description: Änderung Türsensor Kellertür zu offen -alias: Änderung Türsensor Kellertür zu offen -id: a22bec55-1ad8-438b-97c8-73ee60cf07d0 -trigger: - - platform: state - entity_id: binary_sensor.door_sensor_kellertur_window_door_is_open - to: "on" -action: - - service: notify.dev_telegram - data: - message: > - {% if is_state('binary_sensor.door_sensor_kellertur_window_door_is_open', 'on') %} - Kellertür wurde geöffnet - {% else %} - Kellertür wurde geschlossen - {% endif %} - - - service: switch.turn_on - target: - entity_id: switch.double_switch_node12_4 +# https://www.home-assistant.io/docs/automation/trigger/#event-trigger +description: Änderung Türsensor Kellertür zu offen +alias: Änderung Türsensor Kellertür zu offen +id: a22bec55-1ad8-438b-97c8-73ee60cf07d0 +trigger: + - platform: state + entity_id: binary_sensor.door_sensor_kellertur_window_door_is_open + to: "on" +action: + - service: notify.dev_telegram + data: + message: > + {% if is_state('binary_sensor.door_sensor_kellertur_window_door_is_open', 'on') %} + Kellertür wurde geöffnet + {% else %} + Kellertür wurde geschlossen + {% endif %} + + - service: switch.turn_on + target: + entity_id: switch.double_switch_node12_4 diff --git a/automations/smoke_sensor.yaml b/automations/smoke_sensor.yaml index 1b4f8d4..ed7dc94 100644 --- a/automations/smoke_sensor.yaml +++ b/automations/smoke_sensor.yaml @@ -1,37 +1,37 @@ -description: Rauchmelder-Alarm -alias: Rauchmelder-Alarm -id: 8ce59ed4-f7dd-47a5-a1ab-ada15310fc2d - -trigger: - - platform: state - entity_id: - - binary_sensor.rauchmelder_buro_christian_smoke_detected - - binary_sensor.rauchmelder_buro_christian_smoke_alarm_test - - binary_sensor.feueralarm_dummy - - binary_sensor.rauchmelder_heizungskeller_smoke_detected - - binary_sensor.rauchmelder_heizungskeller_smoke_alarm_test - to: - - "on" - -action: - - variables: - param_entity: "{{trigger.to_state.entity_id}}" - param_test_alert: "{{states('binary_sensor.group_smoke_sensors_test_alert')}}" - - service: system_log.write - data: - level: info - message: "Automation Feuer erkannt!! | Entity: {{param_entity}} | Test-Alert: {{param_test_alert}} Starte Skript für Feueralarm..." - # - service: notify.dev_telegram - # data: - # message: > - # rauchmelder_buro_christian_smoke_detected changed - # {{ trigger.entity_id }} - # from {{ trigger.from_state.state }} to {{ trigger.to_state.state }} - # starting "smoke_sensor_script"... - - service: script.smoke_sensor_script - data: - param_state: "{{trigger.to_state.state}}" - param_entity_id: "{{param_entity}}" - param_test_alert: "{{param_test_alert}}" - -mode: single +description: Rauchmelder-Alarm +alias: Rauchmelder-Alarm +id: 8ce59ed4-f7dd-47a5-a1ab-ada15310fc2d + +trigger: + - platform: state + entity_id: + - binary_sensor.rauchmelder_buro_christian_smoke_detected + - binary_sensor.rauchmelder_buro_christian_smoke_alarm_test + - binary_sensor.feueralarm_dummy + - binary_sensor.rauchmelder_heizungskeller_smoke_detected + - binary_sensor.rauchmelder_heizungskeller_smoke_alarm_test + to: + - "on" + +action: + - variables: + param_entity: "{{trigger.to_state.entity_id}}" + param_test_alert: "{{states('binary_sensor.group_smoke_sensors_test_alert')}}" + - service: system_log.write + data: + level: info + message: "Automation Feuer erkannt!! | Entity: {{param_entity}} | Test-Alert: {{param_test_alert}} Starte Skript für Feueralarm..." + # - service: notify.dev_telegram + # data: + # message: > + # rauchmelder_buro_christian_smoke_detected changed + # {{ trigger.entity_id }} + # from {{ trigger.from_state.state }} to {{ trigger.to_state.state }} + # starting "smoke_sensor_script"... + - service: script.smoke_sensor_script + data: + param_state: "{{trigger.to_state.state}}" + param_entity_id: "{{param_entity}}" + param_test_alert: "{{param_test_alert}}" + +mode: single diff --git a/automations/test_poolpumpe.yaml b/automations/test_poolpumpe.yaml new file mode 100644 index 0000000..629b493 --- /dev/null +++ b/automations/test_poolpumpe.yaml @@ -0,0 +1,41 @@ +mode: single +id: 28152be7-98e7-4041-b3f1-d775c381f5b4 +desciption: Zeitsteuerung Poolpumpe +alias: Event Poolpumpe schalten +trigger: + - platform: time + at: "21:15:00" + id: weekday + - platform: time + at: "22:30:00" + id: weekend +condition: [] +action: + - choose: + - conditions: + - condition: trigger + id: weekday + - condition: time + weekday: + - mon + - tue + - wed + - thu + sequence: + # - service: switch.turn_on + # data: {} + # target: + # entity_id: switch.your_switch + - conditions: + - condition: trigger + id: weekend + - condition: time + weekday: + - fri + - sat + - sun + sequence: + # - service: switch.turn_on + # data: {} + # target: + # entity_id: switch.your_switch diff --git a/automations/zirkulationspumpe.yaml b/automations/zirkulationspumpe.yaml new file mode 100644 index 0000000..84fcd22 --- /dev/null +++ b/automations/zirkulationspumpe.yaml @@ -0,0 +1,34 @@ +mode: single +id: 61dfcad1-b4e2-4b03-afe5-37e08a11466c +desciption: Zeitsteuerung Zirkulationspumpe +alias: Event Zirkulationspumpe schalten +trigger: + - platform: time + at: "11:00:00" + id: stop + - platform: time + at: "15:00:00" + id: start + - platform: time + at: "22:00:00" + id: stop + - platform: time + at: "05:00:00" + id: start +condition: [] +action: + - choose: + - conditions: + - condition: trigger + id: start + sequence: + - service: notify.dev_telegram + data: + message: Zirkulation wird gestartet + - conditions: + - condition: trigger + id: stop + sequence: + - service: notify.dev_telegram + data: + message: Zirkulation wird gestoppe diff --git a/blueprints/automation/legovaer/group-sonos-on-motion.yaml b/blueprints/automation/legovaer/group-sonos-on-motion.yaml new file mode 100644 index 0000000..2834e61 --- /dev/null +++ b/blueprints/automation/legovaer/group-sonos-on-motion.yaml @@ -0,0 +1,150 @@ +blueprint: + name: Group Sonos on Motion + description: "# Group Sonos on Motion\n**Version: 1.0**\nGroup a Sonos device to + a main device when presence (e.g. motion) is detected and the main device is playing + music. Can be extended with custom conditions, for example, only group the Sonos + when you're not asleep.\nLet us know what you think of this blueprint and for + community support including updates: [Click Here](https://community.home-assistant.io/t/sonos-grouping-and-ungrouping-using-motion-detection/575452)\n**The + Automation Process:**\n - In this example we will use a motion sensor as the trigger + but you can use one or multiple [Binary Sensors](https://www.home-assistant.io/integrations/binary_sensor/) + as the trigger/s.\n - Triggers on a motion sensor and adds the Sonos speaker (target) + in the room to a group (source).\n - When no motion is detected, a time delay + is activated and removes the Sonos player from the group Automatically.\n - The + Sonos speaker will remain GROUPED if the motion sensor detects motion before the + time delay removes the Sonos speaker from the group. It will then reset the time + delay after last motion is detected.\n - You have the option to add \"Custom conditions\". + This allows you to extend this blueprint with more advanced YAML syntax.\n - You + have the option to set the \"Allow TV\" option. When selected, the target Sonos + Speaker will join the group even if the group is playing audio from the TV.\n + - You have the option to adjust the \"Time Delay\". This will increase or decrease + the amount of time it will take before the target Sonos Speaker will leave the + group again.\n" + domain: automation + input: + motion_trigger: + name: Trigger Sensor - Binary Sensors * + description: The Sensor/s that will make a Sonos speaker join a group. The trigger + can be any [Binary Sensors](https://www.home-assistant.io/integrations/binary_sensor/) + you like. + selector: + entity: + domain: + - binary_sensor + multiple: true + sonos_source: + name: Sonos source + description: The sonos player which this player will join. Probably located + in a different room. + selector: + entity: + integration: sonos + domain: + - media_player + multiple: false + sonos_target: + name: Sonos target + description: The Sonos player that will be joining the existing group. Probably + the player which is located in the room where the motion has been triggered. + selector: + entity: + integration: sonos + domain: + - media_player + multiple: false + time_delay: + name: Time Delay + description: The delay time to leave the sonos player in the group after the + last trigger is detected. + default: 5 + selector: + number: + min: 0.0 + max: 30.0 + step: 0.5 + unit_of_measurement: minutes + mode: slider + custom_conditions: + name: Custom conditions + default: [] + description: A list of custom condititions that also have to be met before grouping + the sonos. Only available via YAML mode. + allow_tv: + name: Allow TV grouping + description: Whether to also group the Sonos when the source is playing TV audio. + default: false + selector: + boolean: {} + source_url: https://gist.github.com/legovaer/b0211044a36411d8089220687ffda1d8 +mode: restart +max_exceeded: silent +variables: + motion_trigger: !input motion_trigger + sonos_source: !input sonos_source + sonos_target: !input sonos_target + allow_tv: !input allow_tv + time_delay: !input time_delay +trigger: +- platform: state + entity_id: !input motion_trigger + from: 'off' + to: 'on' + id: t1 +- platform: state + entity_id: !input motion_trigger + from: 'on' + to: 'off' + id: t2 +- platform: state + entity_id: !input sonos_source + to: playing + id: t3 +- platform: homeassistant + event: start + id: t4 +- platform: event + event_type: automation_reloaded + id: t5 +condition: +- condition: and + conditions: + - condition: state + entity_id: !input sonos_source + state: playing + - condition: or + conditions: + - condition: state + entity_id: !input sonos_target + state: paused + - condition: state + entity_id: !input sonos_target + state: idle + - '{{ sonos_target in state_attr(sonos_source, "group_members") }}' + - '{{ allow_tv or state_attr(sonos_source, "source") != "TV" }}' + - condition: and + conditions: !input custom_conditions +action: +- choose: + - alias: Motion has been detected - group speakers + conditions: + - condition: trigger + id: t1 + sequence: + - alias: Add the speaker to the group + service: media_player.join + data: + group_members: + - !input sonos_target + target: + entity_id: !input sonos_source + - alias: Motion has no longer been detected - unjoin after delay + conditions: + - condition: trigger + id: t2 + sequence: + - alias: Wait the number of minutes set in the time delay + delay: + minutes: !input time_delay + - alias: Unjoin the speaker from the group + service: media_player.unjoin + target: + entity_id: !input sonos_target diff --git a/configuration.yaml b/configuration.yaml index 4cbb381..9f7eda4 100644 --- a/configuration.yaml +++ b/configuration.yaml @@ -11,7 +11,6 @@ default_config: tts: - platform: google_translate - ios: # https://www.justiot.de/smart-home/anleitung-push-nachrichten-mit-home-assistant-unter-ios/ logger: # https://www.home-assistant.io/integrations/logger/ @@ -20,4 +19,4 @@ logger: # https://www.home-assistant.io/integrations/logger/ waste_collection_schedule: debug homeassistant.components.script: debug homeassistant.components.automation: debug - pyfritzhome.fritzhome: warning \ No newline at end of file + pyfritzhome.fritzhome: warning diff --git a/custom_components/hacs/hacs_frontend_experimental/__init__.py b/custom_components/hacs/hacs_frontend_experimental/__init__.py index cbf286a..8a0c19f 100644 --- a/custom_components/hacs/hacs_frontend_experimental/__init__.py +++ b/custom_components/hacs/hacs_frontend_experimental/__init__.py @@ -1,5 +1,5 @@ -"""HACS Frontend""" -from .version import VERSION - -def locate_dir(): +"""HACS Frontend""" +from .version import VERSION + +def locate_dir(): return __path__[0] \ No newline at end of file diff --git a/custom_components/waste_collection_schedule/waste_collection_schedule/source/bir_no.py b/custom_components/waste_collection_schedule/waste_collection_schedule/source/bir_no.py index d8876b6..3de5651 100644 --- a/custom_components/waste_collection_schedule/waste_collection_schedule/source/bir_no.py +++ b/custom_components/waste_collection_schedule/waste_collection_schedule/source/bir_no.py @@ -1,82 +1,82 @@ -import datetime - -import requests -from lxml import etree -from waste_collection_schedule import Collection # type: ignore[attr-defined] - -TITLE = "BIR (Bergensområdets Interkommunale Renovasjonsselskap)" -DESCRIPTION = "Askøy, Bergen, Bjørnafjorden, Eidfjord, Kvam, Osterøy, Samnanger, Ulvik, Vaksdal, Øygarden og Voss Kommune (Norway)." -URL = "https://bir.no" - -TEST_CASES = { - "Villa Paradiso": { - "street_name": "Nordåsgrenda", - "house_number": 7, - "house_letter": "", - }, - "Mardalsrenen 12 B": { - "street_name": "Mardalsrenen", - "house_number": "11", - }, - "Alf Bondes Veg 13 B": { - "street_name": "Alf Bondes Veg", - "house_number": "13", - "house_letter": "B", - }, -} - -API_URL = "https://bir.no/api/search/AddressSearch" -ICON_MAP = {"restavfall": "mdi:trash-can", "papir": "mdi:newspaper-variant-multiple"} - - -def map_icon(text): - for key, value in ICON_MAP.items(): - if key in text: - return value - return "mdi:trash-can" - - -class Source: - def __init__(self, street_name, house_number, house_letter=""): - self._street_name = street_name - self._house_number = house_number - self._house_letter = house_letter - - def fetch(self): - headers = {"user-agent": "Home-Assitant-waste-col-sched/0.1"} - - args = { - "q": f"{self._street_name} {self._house_number}{self._house_letter} ", # The space at the end is serving as a termination character for the query - "s": False, - } - - r = requests.get(API_URL, params=args, headers=headers) - r = requests.get( - f"{URL}/adressesoek/toemmekalender", - params={"rId": {r.json()[0]["Id"]}}, - headers=headers, - ) - doc = etree.HTML(r.content) - month_containers = doc.cssselect( - ".main-content .address-page-box .month-container" - ) - - return [ - Collection( - date=datetime.datetime.strptime( - f"{date.text.replace('des','dec').replace('mai','may').replace('okt','oct')} {container.cssselect('.month-title')[0].text.strip().split(' ')[1]}", - "%d. %b %Y", - ).date(), - t=doc.cssselect( - f'.trash-categories > .trash-row > img[src="{category_row.cssselect(".icon > img")[0].get("src")}"] + .trash-text' - )[0].text, - icon=map_icon( - doc.cssselect( - f'.trash-categories > .trash-row > img[src="{category_row.cssselect(".icon > img")[0].get("src")}"] + .trash-text' - )[0].text.lower() - ), - ) - for container in month_containers - for category_row in container.cssselect(".category-row") - for date in category_row.cssselect(".date-item > .date-item-date") - ] +import datetime + +import requests +from lxml import etree +from waste_collection_schedule import Collection # type: ignore[attr-defined] + +TITLE = "BIR (Bergensområdets Interkommunale Renovasjonsselskap)" +DESCRIPTION = "Askøy, Bergen, Bjørnafjorden, Eidfjord, Kvam, Osterøy, Samnanger, Ulvik, Vaksdal, Øygarden og Voss Kommune (Norway)." +URL = "https://bir.no" + +TEST_CASES = { + "Villa Paradiso": { + "street_name": "Nordåsgrenda", + "house_number": 7, + "house_letter": "", + }, + "Mardalsrenen 12 B": { + "street_name": "Mardalsrenen", + "house_number": "11", + }, + "Alf Bondes Veg 13 B": { + "street_name": "Alf Bondes Veg", + "house_number": "13", + "house_letter": "B", + }, +} + +API_URL = "https://bir.no/api/search/AddressSearch" +ICON_MAP = {"restavfall": "mdi:trash-can", "papir": "mdi:newspaper-variant-multiple"} + + +def map_icon(text): + for key, value in ICON_MAP.items(): + if key in text: + return value + return "mdi:trash-can" + + +class Source: + def __init__(self, street_name, house_number, house_letter=""): + self._street_name = street_name + self._house_number = house_number + self._house_letter = house_letter + + def fetch(self): + headers = {"user-agent": "Home-Assitant-waste-col-sched/0.1"} + + args = { + "q": f"{self._street_name} {self._house_number}{self._house_letter} ", # The space at the end is serving as a termination character for the query + "s": False, + } + + r = requests.get(API_URL, params=args, headers=headers) + r = requests.get( + f"{URL}/adressesoek/toemmekalender", + params={"rId": {r.json()[0]["Id"]}}, + headers=headers, + ) + doc = etree.HTML(r.content) + month_containers = doc.cssselect( + ".main-content .address-page-box .month-container" + ) + + return [ + Collection( + date=datetime.datetime.strptime( + f"{date.text.replace('des','dec').replace('mai','may').replace('okt','oct')} {container.cssselect('.month-title')[0].text.strip().split(' ')[1]}", + "%d. %b %Y", + ).date(), + t=doc.cssselect( + f'.trash-categories > .trash-row > img[src="{category_row.cssselect(".icon > img")[0].get("src")}"] + .trash-text' + )[0].text, + icon=map_icon( + doc.cssselect( + f'.trash-categories > .trash-row > img[src="{category_row.cssselect(".icon > img")[0].get("src")}"] + .trash-text' + )[0].text.lower() + ), + ) + for container in month_containers + for category_row in container.cssselect(".category-row") + for date in category_row.cssselect(".date-item > .date-item-date") + ] diff --git a/custom_components/waste_collection_schedule/waste_collection_schedule/source/cederbaum_de.py b/custom_components/waste_collection_schedule/waste_collection_schedule/source/cederbaum_de.py index 7722c22..2539b67 100644 --- a/custom_components/waste_collection_schedule/waste_collection_schedule/source/cederbaum_de.py +++ b/custom_components/waste_collection_schedule/waste_collection_schedule/source/cederbaum_de.py @@ -1,92 +1,92 @@ -import datetime -import json -import re - -import requests -from bs4 import BeautifulSoup -from waste_collection_schedule import Collection # type: ignore[attr-defined] - -TITLE = "Cederbaum Braunschweig" -DESCRIPTION = "Cederbaum Braunschweig Paperimüll" -URL = "https://www.cederbaum.de" -TEST_CASES = { - "Hans-Sommer-Str": {"street": "Hans-Sommer-Str."}, - "Adolfstr 31-42": {"street": "Adolfstr. 31-42"}, - "Am Schwarzen Berge": {"street": "am Schwarzen Berge "}, -} - -API_URL = "https://www.cederbaum.de/blaue-tonne/abfuhrkalender" -ICON_MAP = { - "PAPER": "mdi:newspaper", -} - - -class Source: - def __init__(self, street): - self._street = street - - self.page_source = None - self.street_id = None - self.collection_data = None - - def fetch_page_source(self): - resp = requests.get(API_URL) - soup = BeautifulSoup(resp.text, "html.parser") - self.page_source = soup - - def get_street_id(self): - if not self.page_source: - raise ValueError("No page source found") - - select = self.page_source.find("select") - - if not select: - raise ValueError("No tag found") + + options = select.find_all("option") + for option in options: + value = option.get("value") + text = option.get_text() + if text.lower().strip() == self._street.lower().strip(): + self.street_id = value + break + + def get_collection_data(self): + if not self.page_source: + raise ValueError("No page source found") + + script_tags = self.page_source.find_all("script") + script_with_text = [tag for tag in script_tags if tag.string] + pattern = re.compile(r"var rate = (\{.*?\});") + + for script_tag in script_with_text: + match = pattern.search(script_tag.string) + if match: + var_content = match.group(1) + self.collection_data = json.loads(var_content) + break + + def fetch(self): + self.fetch_page_source() + self.get_street_id() + self.get_collection_data() + + if not self.collection_data: + raise ValueError("No collection data found") + + entries = [] + waste_dates = self.collection_data[self.street_id]["Termine"] + for waste_date in waste_dates: + date = datetime.datetime.strptime( + waste_dates[waste_date]["Termin"], "%d.%m.%Y" + ) + + entries.append( + Collection( + date=date.date(), + t="Paper", + icon=ICON_MAP.get("PAPER"), + ) + ) + + return entries diff --git a/entities/notifiers/iphones.yaml b/entities/notifiers/iphones.yaml index 48fe146..0d90d78 100644 --- a/entities/notifiers/iphones.yaml +++ b/entities/notifiers/iphones.yaml @@ -1,5 +1,5 @@ -# https://companion.home-assistant.io/docs/notifications/notifications-basic/ -name: iPhones -platform: group -services: +# https://companion.home-assistant.io/docs/notifications/notifications-basic/ +name: iPhones +platform: group +services: - service: mobile_app_christians_iphone_14 \ No newline at end of file diff --git a/entities/sensors/linode_server1.yaml b/entities/sensors/linode_server1.yaml new file mode 100644 index 0000000..66e5ea9 --- /dev/null +++ b/entities/sensors/linode_server1.yaml @@ -0,0 +1,10 @@ +# https://www.linode.com/docs/api/linode-instances/#linode-view +- platform: rest + method: GET + name: linode_server1_status + resource: https://api.linode.com/v4/linode/instances/53770635/ + headers: + User-Agent: Home Assistant + Content-Type: application/json + Authorization: !secret rest_headers_secret_linode + value_template: "{{ value_json.status }}" diff --git a/integrations/http.yaml b/integrations/http.yaml index 60b48e2..2bfe611 100644 --- a/integrations/http.yaml +++ b/integrations/http.yaml @@ -1,14 +1,14 @@ # https://www.home-assistant.io/integrations/http/ -# +# http: - ssl_certificate: /ssl/cert.pem - ssl_key: /ssl/privkey.pem + # ssl_certificate: /ssl/cert.pem + # ssl_key: /ssl/privkey.pem use_x_forwarded_for: true trusted_proxies: - - 192.168.178.35 + - 192.168.178.2 - 192.168.178.70 - 192.168.178.0/24 - 127.0.0.1 - ::1 ip_ban_enabled: false - login_attempts_threshold: 100 \ No newline at end of file + login_attempts_threshold: 5 diff --git a/integrations/mqtt.yaml.bak b/integrations/mqtt.yaml.bak index 0abea05..a1728df 100644 --- a/integrations/mqtt.yaml.bak +++ b/integrations/mqtt.yaml.bak @@ -1,22 +1,22 @@ -# https://www.home-assistant.io/docs/mqtt/broker -# 2022-12-23: rausgenommen, da nicht mehr kompatibel -# mqtt: - # broker: 192.168.178.44 - # username: !secret mqtt_user - # password: !secret mqtt_pw - -mqtt: - switch: - - unique_id: sonoff1_switch - command_topic: "cmnd/sonoff-1/POWER" - name: "Tannenbaum" - payload_on: "ON" - payload_off: "OFF" - payload_available: "Online" - payload_not_available: "Offline" - retain: true - qos: 0 - state_topic: "tele/sonoff-1/STATE" - availability_topic: "tele/sonoff-1/LWT" - state_on: "ON" +# https://www.home-assistant.io/docs/mqtt/broker +# 2022-12-23: rausgenommen, da nicht mehr kompatibel +# mqtt: + # broker: 192.168.178.44 + # username: !secret mqtt_user + # password: !secret mqtt_pw + +mqtt: + switch: + - unique_id: sonoff1_switch + command_topic: "cmnd/sonoff-1/POWER" + name: "Tannenbaum" + payload_on: "ON" + payload_off: "OFF" + payload_available: "Online" + payload_not_available: "Offline" + retain: true + qos: 0 + state_topic: "tele/sonoff-1/STATE" + availability_topic: "tele/sonoff-1/LWT" + state_on: "ON" state_off: "OFF" \ No newline at end of file diff --git a/integrations/rest_command.yaml b/integrations/rest_command.yaml new file mode 100644 index 0000000..58efae7 --- /dev/null +++ b/integrations/rest_command.yaml @@ -0,0 +1,5 @@ +# https://www.home-assistant.io/integrations/rest_command/ + +#rest_command: !include ../rest_command.yaml +# rest_command split: !include_dir_named ../rest_commands +rest_command: !include_dir_merge_named ../rest_commands/ diff --git a/integrations/templates.yaml b/integrations/templates.yaml index 2991ec5..4dbf0d7 100644 --- a/integrations/templates.yaml +++ b/integrations/templates.yaml @@ -1,11 +1,11 @@ ---- -# The script integration allows users to specify a sequence of actions to be -# executed by Home Assistant when turned on. -# -# This loads up my custom tempates. -# -# https://www.home-assistant.io/integrations/template/ -# - -template: !include ../templates.yaml -template split: !include_dir_named ../templates +--- +# The script integration allows users to specify a sequence of actions to be +# executed by Home Assistant when turned on. +# +# This loads up my custom tempates. +# +# https://www.home-assistant.io/integrations/template/ +# + +template: !include ../templates.yaml +template split: !include_dir_named ../templates diff --git a/rest_commands/linode_commands.yaml b/rest_commands/linode_commands.yaml new file mode 100644 index 0000000..c1a4515 --- /dev/null +++ b/rest_commands/linode_commands.yaml @@ -0,0 +1,23 @@ +# https://www.linode.com/docs/api/linode-instances/#linode-shut-down +trigger_linode_server1_shutdown: + url: "https://api.linode.com/v4/linode/instances/53770635/shutdown" + method: POST + payload: "{}" + content_type: "application/json" + verify_ssl: true + headers: + authorization: !secret rest_headers_secret_linode + accept: "application/json, text/html" + user-agent: "Home Assistant" + +# https://www.linode.com/docs/api/linode-instances/#linode-boot +trigger_linode_server1_boot: + url: "https://api.linode.com/v4/linode/instances/53770635/boot" + method: POST + payload: "{}" + content_type: "application/json" + verify_ssl: true + headers: + authorization: !secret rest_headers_secret_linode + accept: "application/json, text/html" + user-agent: "Home Assistant" diff --git a/scripts/smoke_sensor_script.yaml b/scripts/smoke_sensor_script.yaml index 2749b5a..e90286a 100644 --- a/scripts/smoke_sensor_script.yaml +++ b/scripts/smoke_sensor_script.yaml @@ -1,38 +1,38 @@ -description: "Racumelder Ereignisse bearbeiten" -fields: # https://www.home-assistant.io/integrations/script/#passing-variables-to-scripts - param_entity_id: # https://www.home-assistant.io/integrations/script/#fields - description: "entity_id des meldenden Gerätes" - example: "binary_sensor.rauchmelder_buro_christian_smoke_detected" - required: "true" - param_test_alert: - description: "probealarm ja/nein" - required: "true" - param_state: - description: "Status des Ereignisses" - example: "on" - required: "true" - default: "off" -sequence: - - service: system_log.write - data: - level: info - message: "Skript Feueralarm für Entity '{{param_entity_id}}' gestartet. (State: {{param_state}}) | Probealarm: {{param_test_alert}} Starte Aktionen..." - - # send critical notifications https://companion.home-assistant.io/docs/notifications/critical-notifications - - service: notify.iPHONES - data: - title: "FEUERALARM" - message: "Feueralarm für '{{param_entity_id}}'" - data: - push: - sound: - name: "default" - critical: 1 - volume: 1.0 - - - service: notify.dev_telegram - data: - message: > - Feueralarm für Entity '{{param_entity_id}}'!!! (State: {{param_state}}) | Probealarm: {{param_test_alert}} - - +description: "Racumelder Ereignisse bearbeiten" +fields: # https://www.home-assistant.io/integrations/script/#passing-variables-to-scripts + param_entity_id: # https://www.home-assistant.io/integrations/script/#fields + description: "entity_id des meldenden Gerätes" + example: "binary_sensor.rauchmelder_buro_christian_smoke_detected" + required: "true" + param_test_alert: + description: "probealarm ja/nein" + required: "true" + param_state: + description: "Status des Ereignisses" + example: "on" + required: "true" + default: "off" +sequence: + - service: system_log.write + data: + level: info + message: "Skript Feueralarm für Entity '{{param_entity_id}}' gestartet. (State: {{param_state}}) | Probealarm: {{param_test_alert}} Starte Aktionen..." + + # send critical notifications https://companion.home-assistant.io/docs/notifications/critical-notifications + - service: notify.iPHONES + data: + title: "FEUERALARM" + message: "Feueralarm für '{{param_entity_id}}'" + data: + push: + sound: + name: "default" + critical: 1 + volume: 1.0 + + - service: notify.dev_telegram + data: + message: > + Feueralarm für Entity '{{param_entity_id}}'!!! (State: {{param_state}}) | Probealarm: {{param_test_alert}} + + diff --git a/secrets.yaml b/secrets.yaml index f29053a..c06d9c9 100644 --- a/secrets.yaml +++ b/secrets.yaml @@ -1,13 +1,13 @@ - # Use this file to store secrets like usernames and passwords. # Learn more at https://www.home-assistant.io/docs/configuration/secrets/ some_password: welcome - telegram_api_key: 448772521:AAHIIrXBVEUF7_1zYRCmGo5YHipRJyBlp7o telegram_dev: -391668323 telegram_chk: 14652347 telegram_homegroup: -192460863 mqtt_user: mqtt_user -mqtt_pw: IH88EZW4mIm9LI8oJWIK \ No newline at end of file +mqtt_pw: IH88EZW4mIm9LI8oJWIK + +rest_headers_secret_linode: Bearer db59c00118966bdfaf97aa5661d934d822a5fc94656e1d5be4a8a12bf6f34780 diff --git a/templates.yaml b/templates.yaml index d619c73..e3b100a 100644 --- a/templates.yaml +++ b/templates.yaml @@ -1,11 +1,11 @@ -- sensor: - -- binary_sensor: - # simuliert einen nicht Hardware-Rouchmelder, der einfach über dem Dummy-Schalter aktiviert werden kann - - name: Feueralarm_Dummy - state: > - {% if states("input_boolean.switch_fire_alert_dummy")|lower == "on" %} - On - {% else %} - Off +- sensor: + +- binary_sensor: + # simuliert einen nicht Hardware-Rouchmelder, der einfach über dem Dummy-Schalter aktiviert werden kann + - name: Feueralarm_Dummy + state: > + {% if states("input_boolean.switch_fire_alert_dummy")|lower == "on" %} + On + {% else %} + Off {% endif %} \ No newline at end of file