# Loads default set of integrations. Do not remove.
default_config:

# includes
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

# Load frontend themes from the themes folder
frontend:
  themes: !include_dir_merge_named themes

# https://www.home-assistant.io/docs/configuration/basic/
homeassistant:  
  name: "warpzone"
  latitude: 51.944514
  longitude: 7.638933
  elevation: 70
  unit_system: metric
  currency: EUR 
  country: DE
  time_zone: Europe/Berlin
  internal_url: https://{{ domain }}
  auth_providers:
    - type: trusted_networks
      trusted_networks:
        - 10.0.0.0/22
        - 192.168.0.0/24
      allow_bypass_login: true
    - type: homeassistant

# https://www.home-assistant.io/integrations/http/
http:
  server_port: 8123
  ip_ban_enabled: False
  login_attempts_threshold: 10
  use_x_forwarded_for: true
  trusted_proxies: 
    - 172.0.0.0/8

# https://www.home-assistant.io/integrations/api/
api:

# https://www.home-assistant.io/integrations/logger
# log_level= critical, fatal, error, warning, warn, info, debug, notset
logger:
  default: info

# https://www.home-assistant.io/integrations/influxdb/
influxdb:
  api_version: 2 
  host: influxdb
  port: 8086 
  ssl: false
  organization: homeassistant
  bucket: homeassistant
  token: {{ influxdb_token }}
  default_measurement: units


# eQ3 Max 
maxcube:
  gateways:
    - host: {{ eq3max.cube_host }}
      port: 62910
      scan_interval: 60

# zonenstatus wird vom hauptschalter gesteuert, switch02 ping ist nicht mehr notwendig
# https://www.home-assistant.io/integrations/ping/
#binary_sensor:
#  - platform: ping
#    host: TL-SG3452X
#    name: "Switch02"
#    count: 3
#    scan_interval: 20 

# https://www.home-assistant.io/integrations/tts/
tts:
  - platform: picotts
    language: "de-DE"

# https://www.home-assistant.io/integrations/rest_command/
rest_command: 
  set_zone_status_open: 
    url: "https://api.warpzone.ms/setstatus?newstatus=OPEN&update_key={{ warpai_status_update_key }}"
    method: GET 
  set_zone_status_closed: 
    url: "https://api.warpzone.ms/setstatus?newstatus=CLOSED&update_key={{ warpai_status_update_key }}"
    method: GET 
  set_lounge_matrix_off:
    url: "http://led-matrix.warpzone.lan/play/off.png"
    method: GET
  set_lounge_matrix_on:
    url: "http://led-matrix.warpzone.lan/skip"
    method: GET
  open_door:
    url: "http://shippo.warpzone.lan:7000/open_door?username=warpzone&password={{ portal_password }}"
    method: GET

# https://www.home-assistant.io/integrations/telegram/
telegram_bot:
  - platform: polling
    api_key: "{{ telegram_statusbot_token }}"
    allowed_chat_ids:
      - -1001893089134
      - -1001341516106

notify:
  - platform: telegram
    name: zonenstatus
    chat_id: -1001893089134
  - platform: telegram
    name: stromverbrauch
    chat_id: -1001341516106

## Automatisierungen ################################################################

# helper to store zonenstatus 
input_select:
  zonenstatus:
    options:
      - open
      - closed
    icon: mdi:door-open

# current time for zonenstatus telegram
sensor:
  - platform: time_date
    display_options:
      - 'time'
      - 'date'
      - 'date_time'

automation ansible:

  # Autodiscovery für Licht Hackcenter
  - alias: ANSIBLE_autodiscovery_light_hackcenter
    description: "MQTT Autodiscovery für Licht Hackcenter"
    mode: single
    triggers:
      - trigger: homeassistant
        event: start
    action:
      - service: mqtt.publish
        data:
          topic: "homeassistant/light/licht_hackcenter_01/config"
          retain: true
          qos: 0
          payload: >
            {
              "name": "Licht Hackcenter",
              "unique_id": "licht_hackcenter_01",
              "object_id": "licht_hackcenter",
              "state_topic": "stat/tasmota_B1233C/POWER",
              "command_topic": "cmnd/tasmota_B1233C/Power1",
              "brightness_state_topic": "light/dali_out",
              "brightness_command_topic": "light/dali_in",
              "qos": 0,
              "payload_on": "ON",
              "payload_off": "OFF",
              "optimistic": false,
              "device": {
                "identifiers": ["licht_hackcenter_01"],
                "name": "Licht Hackcenter",
                "suggest_area": "hackcenter",
                "manufacturer": "warpzone",
                "model": "DALI"
              }
            }

  # Abluft dauerhaft an
  - alias: ANSIBLE_Abluft_dauer_an
    description: Verhindert Ausschalten der Abluft und setzt festen Wert bei schließen der Zone
    mode: restart
    triggers:
      - type: turned_off
        device_id: 96844a416179e61fff99195b6a16522e
        entity_id: 466bdccea823dfee632a8feac65399a2
        domain: fan
        for:
          hours: 0
          minutes: 0
          seconds: 1
        trigger: device
      - entity_id:
        - input_select.zonenstatus
        from: open
        to: closed
        for:
          hours: 0
          minutes: 0
          seconds: 1
        trigger: state
    conditions: []
    actions:
      - if:
        - condition: state
          entity_id: sensor.season
          state: summer
        then:
          - action: fan.turn_on
            metadata: {}
            data:
              percentage: 15
            target:
              device_id: 96844a416179e61fff99195b6a16522e
        else:
          - action: fan.turn_on
            metadata: {}
            data:
              percentage: 20
            target:
              device_id: 96844a416179e61fff99195b6a16522e

  - alias: ANSIBLE_Zonenshutdown
    mode: single
    triggers:
      - trigger: state
        entity_id:
          - input_select.zonenstatus
        from: open
        to: closed
    conditions: []
    actions:
      - parallel:
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_backcenter_aus
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_dreckcenter_aus
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_gehcenter_aus
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_hackcenter_aus
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_kackcenter_aus
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_loetcenter_aus 
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_rackcenter_aus
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_saal1_aus
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_schnackcenter_aus
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ansible_hackcenter_licht_nach_shutdown

  - alias: ANSIBLE_Zonenboot
    mode: single
    triggers:
      - trigger: state
        entity_id:
          - input_select.zonenstatus
        from: closed
        to: open
    conditions: []
    actions:
      - parallel:
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_backcenter_an
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_dreckcenter_an
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_gehcenter_an
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_hackcenter_an
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_kackcenter_an
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_loetcenter_an 
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_rackcenter_an
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_saal1_an
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: true
            target:
              entity_id: automation.ANSIBLE_ZONE_schnackcenter_an

  # set zonenstatus
  - alias: ANSIBLE_zonenstatus_set
    description: Speichert Zonenstatus in einem Helper
    mode: restart
    trigger:
      - platform: state
        entity_id:
          - binary_sensor.esphome_status_hauptschalter
        from: "off"
        to: "on"
      - platform: state
        entity_id:
          - binary_sensor.esphome_status_hauptschalter
        from: "on"
        to: "off"
    condition: []
    action:
      - choose:
          - conditions:
              - condition: state
                entity_id: binary_sensor.esphome_status_hauptschalter
                state: "on"
            sequence:
              - service: input_select.select_option
                data:
                  option: open
                target:
                  entity_id: input_select.zonenstatus
          - conditions:
              - condition: state
                entity_id: binary_sensor.esphome_status_hauptschalter
                state: "off"
            sequence:
              - service: input_select.select_option
                data:
                  option: closed
                target:
                  entity_id: input_select.zonenstatus

  # send zonenstatus to MQTT, REST
  - alias: ANSIBLE_zonenstatus_send_MQTT_REST
    description: Sendet den Zonenstatus per MQTT und REST für Shutdown und SpaceAPI
    trigger:
    - platform: time_pattern
      seconds: /10
    condition: []
    action:
    - choose:
      - conditions:
        - condition: state
          entity_id: input_select.zonenstatus
          state: 'open'
        sequence:
        - service: mqtt.publish
          data:
            topic: warpzone/door/status
            payload: OPEN
        - service: rest_command.set_zone_status_open
          data: {}
      - conditions:
        - condition: state
          entity_id: input_select.zonenstatus
          state: 'closed'
        sequence:
        - service: mqtt.publish
          data:
            topic: warpzone/door/status
            payload: CLOSED
        - service: rest_command.set_zone_status_closed
          data: {}
    mode: restart

  # send zonenstatus once on change to MQTT
  - alias: ANSIBLE_zonenstatus_send_once_MQTT
    description: Sendet den Zonenstatus EINMALIG (on change) per MQTT
    trigger:
      - platform: state
        entity_id:
          - input_select.zonenstatus
    condition: []
    action:
      - choose:
          - conditions:
              - condition: state
                entity_id: input_select.zonenstatus
                state: open
            sequence:
              - service: mqtt.publish
                data:
                  topic: warpzone/door/status_once
                  payload: OPEN
          - conditions:
              - condition: state
                entity_id: input_select.zonenstatus
                state: closed
            sequence:
              - service: mqtt.publish
                data:
                  topic: warpzone/door/status_once
                  payload: CLOSED
    mode: restart

  # send zonenstatus to telegram
  - alias: ANSIBLE_zonenstatus_send_telegram
    description: Sendet den Zonenstatus per Telegram-Bot
    trigger:
      - platform: state
        entity_id:
          - input_select.zonenstatus
    condition: []
    action:
      - choose:
          - conditions:
              - condition: state
                entity_id: input_select.zonenstatus
                state: open
            sequence:
              - service: telegram_bot.send_message
                data:
                  target: -1001893089134
                  timeout: 30
                  message: Die warpzone ist seit {{ '{{' }} states('sensor.time') {{ '}}' }} geöffnet!
          - conditions:
              - condition: state
                entity_id: input_select.zonenstatus
                state: closed
            sequence:
              - service: telegram_bot.send_message
                data:
                  target: -1001893089134
                  timeout: 30
                  message: Die warpzone ist seit {{ '{{' }} states('sensor.time') {{ '}}' }} geschlossen!
    mode: restart
  
  # Stromverbrauch auf Telegram senden
  - alias: ANSIBLE_stromverbrauch_send_telegram
    description: Sendet alle 10 Minuten den Stromverbrauch per Telegram
    trigger:
      - platform: time_pattern
        minutes: /10
    condition: []
    action:
      - if:
        - condition: state
          entity_id: automation.ansible_zonenstatus_send_telegram
          attribute: current
          state: "1"
        then:
          - wait_for_trigger:
            - platform: state
              entity_id:
                - automation.ansible_zonenstatus_send_telegram
              attribute: current
              to: "0"
      - service: telegram_bot.send_message
        data:
          target: -1001341516106
          timeout: 30
          message: >
            Zähler Power: {{ '{{' }} states('sensor.esphome_power_total_power') {{ '}}' }} W 

            Solar Power: {{ '{{' }} states('sensor.hms_1600_4t_power')|float(0) {{ '}}' }} W 

            Temperatur Hackcenter: {{ '{{' }} states('sensor.temp') {{ '}}' }} °C
    mode: restart

  # Feinstaubsensor steuert Luftfilter
  - alias: ANSIBLE_Feinstaubsensor_Luftfilter
    description: Feinstaubsensor steuer Luftfilter
    trigger:
      - platform: time_pattern
        seconds: /10
    condition: []
    action:
      - choose:
          - conditions:
              - condition: numeric_state
                entity_id: sensor.feinstaub_2_5
                below: 36
            sequence:
              - service: fan.set_percentage
                data:
                  percentage: 33
                target:
                  device_id: 8b6ff876340558ef11d13441afecec8d
          - conditions:
              - condition: numeric_state
                entity_id: sensor.feinstaub_2_5
                above: 35
                below: 86
            sequence:
              - service: fan.set_percentage
                data:
                  percentage: 66
                target:
                  device_id: 8b6ff876340558ef11d13441afecec8d
          - conditions:
              - condition: numeric_state
                entity_id: sensor.feinstaub_2_5
                above: 85
            sequence:
              - service: fan.set_percentage
                data:
                  percentage: 100
                target:
                  device_id: 8b6ff876340558ef11d13441afecec8d
    mode: restart

  # Feinstaubsensor steuert Ampel
  - alias: ANSIBLE_Feinstaubsensor_Ampel
    description: Feinstaubsensor status auf Ampel anzeigen
    trigger:
      - platform: time_pattern
        seconds: /10
    condition: []
    action:
      - choose:
          - conditions:
              - condition: numeric_state
                entity_id: sensor.feinstaub_2_5
                below: 36
            sequence:
              - device_id: e26403f906b93f7c6b4f5339a21f9b26
                domain: select
                entity_id: select.ampel_preset
                type: select_option
                option: Green static
          - conditions:
              - condition: numeric_state
                entity_id: sensor.feinstaub_2_5
                above: 35
                below: 86
            sequence:
              - device_id: e26403f906b93f7c6b4f5339a21f9b26
                domain: select
                entity_id: select.ampel_preset
                type: select_option
                option: Orange static
          - conditions:
              - condition: numeric_state
                entity_id: sensor.feinstaub_2_5
                above: 85
            sequence:
              - device_id: e26403f906b93f7c6b4f5339a21f9b26
                domain: select
                entity_id: select.ampel_preset
                type: select_option
                option: Red static
    mode: restart

  # Türöffner Knopf  
  - alias: ANSIBLE_Button_Türöffner
    description: ""
    mode: single
    triggers:
      - domain: mqtt
        device_id: 388988a29515369fb821e4e0ff8d9e27
        type: action
        subtype: single
        trigger: device
    conditions: []
    actions:
      - action: rest_command.open_door
        metadata: {}
        data: {}


  - alias: ANSIBLE_ZONE_backcenter_aus
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_off
        metadata: {}
        data: {}
        target:
          area_id: backcenter
      - action: switch.turn_off
        metadata: {}
        data: {}
        target:
          area_id: backcenter
    mode: single

  - alias: ANSIBLE_ZONE_dreckenter_aus
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_off
        metadata: {}
        data: {}
        target:
          area_id: dreckcenter
      - action: switch.turn_off
        metadata: {}
        data: {}
        target:
          area_id: dreckcenter
    mode: single

  - alias: ANSIBLE_ZONE_gehcenter_aus
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_off
        metadata: {}
        data: {}
        target:
          area_id: gehcenter
      - action: switch.turn_off
        metadata: {}
        data: {}
        target:
          area_id: gehcenter
    mode: single

  - alias: ANSIBLE_ZONE_hackcenter_aus
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_off
        metadata: {}
        data: {}
        target:
          area_id: hackcenter
      - action: switch.turn_off
        metadata: {}
        data: {}
        target:
          area_id: hackcenter
    mode: single

  - alias: ANSIBLE_ZONE_kackcenter_aus
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_off
        metadata: {}
        data: {}
        target:
          area_id: kackcenter
      - action: switch.turn_off
        metadata: {}
        data: {}
        target:
          area_id: kackcenter
    mode: single

  - alias: ANSIBLE_ZONE_loetcenter_aus
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_off
        metadata: {}
        data: {}
        target:
          area_id: loetcenter
      - action: switch.turn_off
        metadata: {}
        data: {}
        target:
          area_id: loetcenter
    mode: single

  - alias: ANSIBLE_ZONE_rackcenter_aus
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_off
        metadata: {}
        data: {}
        target:
          area_id: rackcenter
      - action: switch.turn_off
        metadata: {}
        data: {}
        target:
          area_id: rackcenter
    mode: single

  - alias: ANSIBLE_ZONE_saal1_aus
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_off
        metadata: {}
        data: {}
        target:
          area_id: saal_1
      - action: switch.turn_off
        metadata: {}
        data: {}
        target:
          area_id: saal_1
    mode: single

  - alias: ANSIBLE_ZONE_schnackcenter_aus
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_off
        metadata: {}
        data: {}
        target:
          area_id: schnackcenter
      - action: switch.turn_off
        metadata: {}
        data: {}
        target:
          area_id: schnackcenter
    mode: single

  - alias: ANSIBLE_ZONE_NoAutoOn_aus
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_off
        metadata: {}
        data: {}
        target:
          area_id: NoAutoOn
      - action: switch.turn_off
        metadata: {}
        data: {}
        target:
          area_id: NoAutoOn
    mode: single

  - alias: ANSIBLE_ZONE_backcenter_an
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_on
        metadata: {}
        data: {}
        target:
          area_id: backcenter
      - action: switch.turn_on
        metadata: {}
        data: {}
        target:
          area_id: backcenter
    mode: single

  - alias: ANSIBLE_ZONE_dreckenter_an
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_on
        metadata: {}
        data: {}
        target:
          area_id: dreckcenter
      - action: switch.turn_on
        metadata: {}
        data: {}
        target:
          area_id: dreckcenter
    mode: single

  - alias: ANSIBLE_ZONE_gehcenter_an
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_on
        metadata: {}
        data: {}
        target:
          area_id: gehcenter
      - action: switch.turn_on
        metadata: {}
        data: {}
        target:
          area_id: gehcenter
    mode: single

  - alias: ANSIBLE_ZONE_hackcenter_an
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_on
        metadata: {}
        data: {}
        target:
          area_id: hackcenter
      - action: switch.turn_on
        metadata: {}
        data: {}
        target:
          area_id: hackcenter
    mode: single

  - alias: ANSIBLE_ZONE_kackcenter_an
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_on
        metadata: {}
        data: {}
        target:
          area_id: kackcenter
      - action: switch.turn_on
        metadata: {}
        data: {}
        target:
          area_id: kackcenter
    mode: single

  - alias: ANSIBLE_ZONE_loetcenter_an
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_on
        metadata: {}
        data: {}
        target:
          area_id: loetcenter
      - action: switch.turn_on
        metadata: {}
        data: {}
        target:
          area_id: loetcenter
    mode: single

  - alias: ANSIBLE_ZONE_rackcenter_an
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_on
        metadata: {}
        data: {}
        target:
          area_id: rackcenter
      - action: switch.turn_on
        metadata: {}
        data: {}
        target:
          area_id: rackcenter
    mode: single

  - alias: ANSIBLE_ZONE_saal1_an
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_on
        metadata: {}
        data: {}
        target:
          area_id: saal_1
      - action: switch.turn_on
        metadata: {}
        data: {}
        target:
          area_id: saal_1
    mode: single

  - alias: ANSIBLE_ZONE_schnackcenter_an
    description: ""
    triggers: []
    conditions: []
    actions:
      - action: light.turn_on
        metadata: {}
        data: {}
        target:
          area_id: schnackcenter
      - action: switch.turn_on
        metadata: {}
        data: {}
        target:
          area_id: schnackcenter
    mode: single