# =====================================================================
# DomotikPro - Pacchetto "Energia casa" per Home Assistant
# Versione 1.0 - verificato con Home Assistant 2026.10
# Guida completa, passo per passo:
# https://domotikpro.it/guida/quanto-consumano-elettrodomestici-misure-reali-shelly-home-assistant
#
# Cosa fa:
#  - avviso vocale sugli Echo quando la casa supera una soglia in watt,
#    ripetuto ogni 10 secondi finché il carico non scende (al massimo
#    20 volte), con silenzio notturno facoltativo dalle 23 alle 7
#  - notifica sul telefono (app Home Assistant), facoltativa
#  - consumi di oggi, del mese e dell'anno, con il costo in euro
#    calcolato sul prezzo al kWh del tuo fornitore
#  - consumo di fondo della casa, misurato ogni notte tra le 2 e le 5
#  - protezione facoltativa: spegne un carico se superi una seconda soglia
#
# Tutto quello che devi cambiare è nelle 5 voci "SOSTITUISCI".
# Le trovi nelle sezioni 1 e 2 qui sotto. Non serve toccare altro.
# =====================================================================


# ---------------------------------------------------------------------
# 1. I TUOI SENSORI (2 voci da sostituire, subito qui sotto)
#    Scrivi l'ID entità del tuo misuratore generale (es. Shelly EM).
#    - sensore_potenza: il sensore in W
#      (es. sensor.shelly_em_channel_1_power)
#    - sensore_energia: il sensore in kWh
#      (es. sensor.shelly_em_channel_1_energy)
# ---------------------------------------------------------------------
template:
  - variables:
      sensore_potenza: sensor.SOSTITUISCI_potenza
      sensore_energia: sensor.SOSTITUISCI_energia
    sensor:
      - name: "DomotikPro potenza casa"
        unique_id: domotikpro_potenza_casa
        unit_of_measurement: "W"
        device_class: power
        state_class: measurement
        state: "{{ states(sensore_potenza) }}"
        availability: "{{ has_value(sensore_potenza) }}"

      - name: "DomotikPro energia casa"
        unique_id: domotikpro_energia_casa
        unit_of_measurement: "kWh"
        device_class: energy
        state_class: total_increasing
        state: "{{ states(sensore_energia) }}"
        availability: "{{ has_value(sensore_energia) }}"

      # Costi calcolati con il prezzo che imposti dalla plancia
      - name: "DomotikPro costo oggi"
        unique_id: domotikpro_costo_oggi
        unit_of_measurement: "EUR"
        device_class: monetary
        state: >-
          {{ (states('sensor.domotikpro_energia_oggi') | float(0)
              * states('input_number.domotikpro_prezzo_energia') | float(0)) | round(2) }}
        availability: "{{ has_value('sensor.domotikpro_energia_oggi') }}"
        attributes:
          fornitore: "{{ states('input_text.domotikpro_fornitore') }}"
          prezzo_kwh: "{{ states('input_number.domotikpro_prezzo_energia') }}"

      - name: "DomotikPro costo mese"
        unique_id: domotikpro_costo_mese
        unit_of_measurement: "EUR"
        device_class: monetary
        state: >-
          {{ (states('sensor.domotikpro_energia_mese') | float(0)
              * states('input_number.domotikpro_prezzo_energia') | float(0)) | round(2) }}
        availability: "{{ has_value('sensor.domotikpro_energia_mese') }}"
        attributes:
          fornitore: "{{ states('input_text.domotikpro_fornitore') }}"
          prezzo_kwh: "{{ states('input_number.domotikpro_prezzo_energia') }}"

  # Consumo di fondo: alle 5 del mattino salva la potenza media delle
  # 3 ore precedenti (2-5), quando in casa è quasi tutto spento.
  - triggers:
      - trigger: time
        at: "05:00:00"
    sensor:
      - name: "DomotikPro consumo di fondo"
        unique_id: domotikpro_consumo_di_fondo
        unit_of_measurement: "W"
        device_class: power
        state: "{{ states('sensor.domotikpro_potenza_media_3_ore') | float(0) | round(0) }}"


# ---------------------------------------------------------------------
# 2. I TUOI ECHO, IL TUO TELEFONO E IL CARICO DA SPEGNERE (3 voci)
#    - Echo: l'ID entità di ogni Echo che deve parlare (media_player.xxx).
#      Per aggiungerne un altro, copia la riga che inizia con il trattino.
#    - Telefono: l'azione di notifica della tua app Home Assistant
#      (notify.mobile_app_xxx). Se non usi l'app, lascia com'è e tieni
#      spento l'interruttore "Notifica sul telefono".
#    - Carico: l'interruttore che la protezione può spegnere, ad esempio
#      il relè Shelly del forno (switch.xxx). Se non usi la protezione,
#      lascia com'è e tieni spento l'interruttore "Protezione distacco".
#      MAI lavatrice, lavastoviglie, frigorifero o congelatore.
# ---------------------------------------------------------------------
script:
  domotikpro_avviso_consumi:
    alias: "DomotikPro avviso consumi"
    description: "Annuncio sugli Echo e notifica sul telefono"
    mode: queued
    fields:
      messaggio:
        description: "Testo dell'avviso"
        example: "Attenzione, consumi elevati"
    sequence:
      - if:
          - condition: state
            entity_id: input_boolean.domotikpro_avviso_vocale
            state: "on"
          # Con "Silenzio notturno" acceso gli Echo tacciono dalle 23 alle 7
          - condition: or
            conditions:
              - condition: state
                entity_id: input_boolean.domotikpro_silenzio_notturno
                state: "off"
              - condition: time
                after: "07:00:00"
                before: "23:00:00"
        then:
          - action: notify.alexa_media
            continue_on_error: true
            data:
              target:
                - media_player.SOSTITUISCI_echo
              data:
                type: announce
              message: "{{ messaggio }}"
      - if:
          - condition: state
            entity_id: input_boolean.domotikpro_avviso_telefono
            state: "on"
        then:
          - action: notify.mobile_app_SOSTITUISCI_telefono
            continue_on_error: true
            data:
              title: "Consumi elevati"
              message: "{{ messaggio }}"

  domotikpro_spegni_carico:
    alias: "DomotikPro spegni carico"
    description: "Carico che la protezione distacco può spegnere"
    mode: single
    sequence:
      - action: switch.turn_off
        target:
          entity_id: switch.SOSTITUISCI_carico


# ---------------------------------------------------------------------
# DA QUI IN POI NON SERVE CAMBIARE NULLA
# ---------------------------------------------------------------------

# Valori e interruttori che regoli dalla plancia
input_number:
  domotikpro_soglia_avviso:
    name: "Soglia avviso"
    min: 1500
    max: 12000
    step: 50
    mode: box
    unit_of_measurement: "W"
    icon: mdi:flash-alert

  domotikpro_soglia_distacco:
    name: "Soglia protezione distacco"
    min: 3000
    max: 15000
    step: 50
    mode: box
    unit_of_measurement: "W"
    icon: mdi:power-plug-off

  domotikpro_prezzo_energia:
    name: "Prezzo energia al kWh"
    min: 0
    max: 1
    step: 0.001
    mode: box
    unit_of_measurement: "EUR/kWh"
    icon: mdi:currency-eur

# Il nome del tuo fornitore di energia (Enel, Sorgenia, ...), dalla plancia
input_text:
  domotikpro_fornitore:
    name: "Fornitore energia"
    max: 60
    icon: mdi:domain

input_boolean:
  domotikpro_avviso_vocale:
    name: "Avviso vocale"
    icon: mdi:account-voice
  domotikpro_avviso_telefono:
    name: "Notifica sul telefono"
    icon: mdi:cellphone-message
  domotikpro_protezione_distacco:
    name: "Protezione distacco"
    icon: mdi:shield-alert
  domotikpro_silenzio_notturno:
    name: "Silenzio notturno"
    icon: mdi:sleep

# Contatori di consumo che ripartono da zero ogni giorno, mese e anno
utility_meter:
  domotikpro_energia_oggi:
    name: "DomotikPro energia oggi"
    unique_id: domotikpro_energia_oggi
    source: sensor.domotikpro_energia_casa
    cycle: daily
  domotikpro_energia_mese:
    name: "DomotikPro energia mese"
    unique_id: domotikpro_energia_mese
    source: sensor.domotikpro_energia_casa
    cycle: monthly
  domotikpro_energia_anno:
    name: "DomotikPro energia anno"
    unique_id: domotikpro_energia_anno
    source: sensor.domotikpro_energia_casa
    cycle: yearly

# Potenza media (pesata sul tempo) delle ultime 3 ore
sensor:
  - platform: statistics
    name: "DomotikPro potenza media 3 ore"
    unique_id: domotikpro_potenza_media_3_ore
    entity_id: sensor.domotikpro_potenza_casa
    state_characteristic: average_step
    max_age:
      hours: 3
    sampling_size: 100000
    precision: 0

automation:
  # Avviso: la casa resta sopra la soglia per 10 secondi
  - id: domotikpro_avviso_soglia
    alias: "DomotikPro avviso soglia potenza"
    description: "Avvisa finché la potenza resta sopra la soglia (max 20 volte)"
    mode: single
    triggers:
      - trigger: numeric_state
        entity_id: sensor.domotikpro_potenza_casa
        above: input_number.domotikpro_soglia_avviso
        for:
          seconds: 10
    conditions:
      - condition: or
        conditions:
          - condition: state
            entity_id: input_boolean.domotikpro_avviso_vocale
            state: "on"
          - condition: state
            entity_id: input_boolean.domotikpro_avviso_telefono
            state: "on"
    actions:
      - repeat:
          while:
            - condition: numeric_state
              entity_id: sensor.domotikpro_potenza_casa
              above: input_number.domotikpro_soglia_avviso
            - condition: template
              value_template: "{{ repeat.index <= 20 }}"
          sequence:
            - action: script.domotikpro_avviso_consumi
              data:
                messaggio: >-
                  Attenzione, consumi elevati: stai usando
                  {{ states('sensor.domotikpro_potenza_casa') | int(0) }} watt.
            - delay:
                seconds: 10

  # Protezione: sopra la seconda soglia per 30 secondi spegne un carico
  - id: domotikpro_protezione_distacco
    alias: "DomotikPro protezione distacco"
    description: "Spegne il carico scelto se la casa resta sopra la soglia di distacco"
    mode: single
    triggers:
      - trigger: numeric_state
        entity_id: sensor.domotikpro_potenza_casa
        above: input_number.domotikpro_soglia_distacco
        for:
          seconds: 30
    conditions:
      - condition: state
        entity_id: input_boolean.domotikpro_protezione_distacco
        state: "on"
    actions:
      - action: script.domotikpro_spegni_carico
      - action: script.domotikpro_avviso_consumi
        data:
          messaggio: >-
            Protezione distacco: ho spento un carico, la casa stava usando
            {{ states('sensor.domotikpro_potenza_casa') | int(0) }} watt.
