piGarden: integrazione con Home Assistant

Alcuni mesi fa avevo accennato alla possibilità di poter controllare piGarden direttamente da Home Assistant, il noto controller di domotica open source. In questo articolo spiegherò come poterlo fare in modo da arrivare ad aver un pannello di gestione simile a quello mostrato nell’immagine riportata qui sopra.

Come prima cosa abbiamo bisogno che sul nostro raspberry sia installato e funzionante un broker mqtt. Uno dei più noti è sicuramente Mosquitto del quale troverete molte guide in rete per l’installazione e configurazione.

Il broker mqtt server da collante tra piGarden e Home Assistant grazie al quale comunicheranno tramite il protocollo mqtt.

Una volta che abbiamo il nostro broker mqtt funzionante dobbiamo configurare il nostro piGarden in modo che ad ogni cambio di stato questo venga pubblicato tramite un apposito topic mqtt. In questo modo Home Assistant riuscirà a reperire lo stato dei vari sensori da piGarden tenendo così aggiornata la propria interfaccia. Per fare questo potete rifarvi alle istruzioni riportate nell’articolo  “piGarden 0.5.9: pubblicare stato ed eventi vesto un broker mqtt“.

Altro passo importante è quello di installare mqttconnector il quale si preoccuperà di inviare a piGarden via socket server tutti i messaggi ricevuti da Home Assistant via mqtt. Per instalalre mqttconnector potete rifarvi all’articolo: “mqttconnector, utilizza le api piGarden e piGuardian tramite mqtt

Naturalmente si presuppone che su piGarden sia attivato il socket server, che se state utilizzando piGardenWeb, questo è già funzionante. Altrimenti potete rifarvi all’articolo “piGarden 0.2 – Easter egg“.

Ok, adesso abbiamo broker mqtt funzionante, piGarden configurato in modo che propaghi il proprio stato via mqtt e mqttconnector che istraderà al socket server i comandi ricevuti da Home Assitant via mqtt. Tutti i pezzo sono al loro posto, passiamo quindi alla configurazione di Home Assistant.

Come prima cosa dobbiamo andare modificare il file di configurazione di Home Assistant che generalmente si trova in https://www.lejubila.net/2017/04/pigarden-0-2-easter-egg/configuration.yaml, ma in base al tipo di installazione che avete fatto ptrebbe trovarsi anche in un’altra posizione.

Innanzitutto dovrete abilitare il supporto per il protocollo mqtt. Nelle ultime versioni di Home Assitant, se non sbaglio, questo operazione può essere fatto anche direttamente da interfaccia web. Io comunque ho l’ho attivato dal file di configurazione configuration.yaml andando ad inserire le seguenti linee di codice:

mqtt:
  discovery: true
  broker: indirizzo_ip_di_mosquitto
  port: 1883
  client_id: home-assistant
  keepalive: 60
  username: nome_utente_mosquitto
  password: password_utente_mosquitto
  protocol: 3.1
  birth_message:
    topic: "hass/status"
    payload: "online"
    qos: 1
    retain: true
  will_message:
    topic: "hass/status"
    payload: "offline"
    qos: 1
    retain: true

Andiamo ora ad istruire Home Assistant in modo che possa recuperare le informazioni meteo da Openweathermap per poi poterle mostrare nella seguente forma:

Per fare questo dobbiamo inserire sempre in configuration.yaml il seguente codice (l’api key la potete recuperare dopo esservi iscritti al servizio):

  - platform: openweathermap
    api_key: la_tua_api_key_di_openweathermap
    name: openweather

Definiamo ora i sensori che ci permetteranno di mostrare le informazioni sull’ultima azione compiuta da piGarden sullo stato del sensore fisico e online di rilevamento pioggia.

Inseriamo quindi le seguenti istruzioni in configuration.yaml:

sensor:
  #
  # Sensore informativo piGarden
  #
  - platform: mqtt
    name: pigarden_info_icon
    state_topic: "pigarden/result"
    value_template: >
      {% if value_json['info'] > "" %}
        mdi:information 
      {% elif value_json['success'] > "" %}
        mdi:message-text
      {% elif value_json['warning'] > "" %}
        mdi:message-alert
      {% else %}
        {{ states.sensor.pigarden_info_icon.state }}
      {% endif %}

  - platform: mqtt
    name: pigarden_info_message
    state_topic: "pigarden/result"
    value_template: >
      {% if value_json['info'] > "" or value_json['success'] > "" or value_json['warning'] > "" %}
        {% if value_json['info'] > "" %}
          {{ value_json['info'] }} ({{ value_json['timestamp'] | timestamp_local }})
        {% endif %}
        {% if value_json['success'] > "" %}
          {{ value_json['success'] }} ({{ value_json['timestamp'] | timestamp_local }})
        {% endif %}
        {% if value_json['warning'] > "" %}
          {{ value_json['warning'] }} ({{ value_json['timestamp'] | timestamp_local }})
        {% endif %}
      {% else %}
          {{ states.sensor.pigarden_info_message.state }}
      {% endif %}

  - platform: mqtt
    name: pigarden_last_rain_sensor
    state_topic: "pigarden/result"
    value_template: >
      {% if value_json['last_rain_sensor'] > "" %}
        {{ value_json['last_rain_sensor'] | int | timestamp_local }}
      {% else %}
        sconosciuto
      {% endif %}

  - platform: mqtt
    name: pigarden_last_rain_online
    state_topic: "pigarden/result"
    value_template: >
      {% if value_json['last_rain_online'] > "" %}
        {{ value_json['last_rain_online'] | int | timestamp_local }}
      {% else %}
        sconosciuto
      {% endif %}

  - platform: template
    sensors:
      pigarden_info:
        value_template: "{{ states.sensor.pigarden_info_message.state }}"
        icon_template: "{{ states.sensor.pigarden_info_icon.state }}"

Dobbiamo ora definire per ogni zona gestita su piGarden, gli switch, gli input boolean e i binary sensor che ci permetteranno di avviare/interrompere l’irrigazione e di forzare l’irrigazione in caso di pioggia.

Nell’esempio sottostante andrò a gestire tre zone che avranno i seguenti nomi:

  • Giardino_Posteriore_DX
  • Giardino_Posteriore_SX
  • Giardino_Posteriore_CN

Inseriamo quindi sempre in configuration.yaml quanto segue:

switch:
  #
  # Switch per gestire le elettrovalvole di piGarden
  #

  - platform: template
    switches:
      pigarden_zone_giardino_posteriore_dx:
        value_template: "{{ is_state('binary_sensor.pigarden_state_giardino_posteriore_dx', 'on') }}"
        turn_on:
          service: mqtt.publish
          data:
            topic: "pigarden/command"
            #payload: "open Giardino_Posteriore_DX"
            payload_template: > 
              {% if is_state( 'input_boolean.pigarden_force_giardino_posteriore_dx', 'off' ) %}
                open Giardino_Posteriore_DX
              {% else %}
                open Giardino_Posteriore_DX force
              {% endif %}
        turn_off:
          service: mqtt.publish
          data:
            topic: "pigarden/command"
            payload: "close Giardino_Posteriore_DX"
        entity_picture_template: >
          {% if not is_state( 'binary_sensor.pigarden_state_giardino_posteriore_dx', 'on' ) %}
            /local/icons/sprinkler-pause-3.gif
          {% else %}
            /local/icons/sprinkler-play-3.gif
          {% endif %}

  - platform: template
    switches:
      pigarden_zone_giardino_posteriore_sx:
        value_template: "{{ is_state('binary_sensor.pigarden_state_giardino_posteriore_sx', 'on') }}"
        turn_on:
          service: mqtt.publish
          data:
            topic: "pigarden/command"
            payload_template: > 
              {% if is_state( 'input_boolean.pigarden_force_giardino_posteriore_sx', 'off' ) %}
                open Giardino_Posteriore_SX
              {% else %}
                open Giardino_Posteriore_SX force
              {% endif %}
        turn_off:
          service: mqtt.publish
          data:
            topic: "pigarden/command"
            payload: "close Giardino_Posteriore_SX"
        entity_picture_template: >
          {% if not is_state( 'binary_sensor.pigarden_state_giardino_posteriore_sx', 'on' ) %}
            /local/icons/sprinkler-pause-3.gif
          {% else %}
            /local/icons/sprinkler-play-3.gif
          {% endif %}

  - platform: template
    switches:
      pigarden_zone_giardino_posteriore_cn:
        value_template: "{{ is_state('binary_sensor.pigarden_state_giardino_posteriore_cn', 'on') }}"
        turn_on:
          service: mqtt.publish
          data:
            topic: "pigarden/command"
            payload_template: >
              {% if is_state( 'input_boolean.pigarden_force_giardino_posteriore_cn', 'off' ) %}
                open Giardino_Posteriore_CN
              {% else %}
                open Giardino_Posteriore_CN force
              {% endif %}
        turn_off:
          service: mqtt.publish
          data:
            topic: "pigarden/command"
            payload: "close Giardino_Posteriore_CN"
        entity_picture_template: >
          {% if not is_state( 'binary_sensor.pigarden_state_giardino_posteriore_cn', 'on' ) %}
            /local/icons/sprinkler-pause-3.gif
          {% else %}
            /local/icons/sprinkler-play-3.gif
          {% endif %}

binary_sensor:
  #
  # binary sensor per switch template pigarden
  #
  - platform: mqtt
    name: pigarden_state_giardino_posteriore_dx
    state_topic: "pigarden/result"
    payload_on: true
    payload_off: false
    qos: 0
    value_template: "{{ value_json['zones']['Giardino_Posteriore_DX']['state'] == 1 or value_json['zones']['Giardino_Posteriore_DX']['state'] == 2 }}"
  - platform: mqtt
    name: pigarden_state_giardino_posteriore_sx
    state_topic: "pigarden/result"
    payload_on: true
    payload_off: false
    qos: 0
    value_template: "{{ value_json['zones']['Giardino_Posteriore_SX']['state'] == 1 or value_json['zones']['Giardino_Posteriore_SX']['state'] == 2 }}"
  - platform: mqtt
    name: pigarden_state_giardino_posteriore_cn
    state_topic: "pigarden/result"
    payload_on: true
    payload_off: false
    qos: 0
    value_template: "{{ value_json['zones']['Giardino_Posteriore_CN']['state'] == 1 or value_json['zones']['Giardino_Posteriore_CN']['state'] == 2 }}"

input_boolean:
  pigarden_force_giardino_posteriore_dx:
    name: Forza irrigazione in caso di pioggia
    initial: off
    icon: mdi:weather-rainy
  pigarden_force_giardino_posteriore_sx:
    name: Forza irrigazione in caso di pioggia
    initial: off
    icon: mdi:weather-rainy
  pigarden_force_giardino_posteriore_cn:
    name: Forza irrigazione in caso di pioggia
    initial: off
    icon: mdi:weather-rainy

Sugli switch che permettono l’avvio/interruzione dell’irrigazione delle varie zone ho inserito due icone custom. Queste due icone vanno posizionate nella directory www/icons da creare nella cartella dove è presente il file di configurazione configuration.yaml ( /home/homeassistant/.homeassistant/www/icons ).

Le due i cone da caricare sono le seguenti:

Ok, abbiamo finito di modificare il file di configurazione configuration.yaml. Adesso dobbiamo riavviare il servizio relativo ad Home Assistant, lo potete fare tranquillamente da interfaccia web andando su Impostazioni / Generale / Gestione del server / Riavviare. Prima di fare ciò però vi consiglio di verificare che nel file di configurazione appena modificato non vi siano errori. Lo potete fare da Impostazioni / Generale / Convalida della configurazione / Controlla la configurazione.

Bene ora che abbiamo Home Assistant riavviato con la nostra nuova configurazione passiamo a personalizzare l’interfaccia di Home Assistant.

Aggiungiamo una nuova “vista” dove inserire tutti gli elementi di piGarden. Lo facciamo andando in modalità di configurazione dell’interfaccia, cliccando sull’icona che rappresenta il menu, presente nell’angolo in alto a destra di Home Assistant e successivamente cliccando sulla voce “Configura l’interfaccia utente“:

Aggiungiamo la vista cliccando sul l’icona a forma di + e definiamola come segue:

Creata la nuova vista relativa a piGarden, andiamo ad aggiungere un Vertical Stack Card dove inseriremo le informazioni di stato di piGarden, dei sensori della pioggia e le condizioni meteo:



type: vertical-stack
cards:
  - entities:
      - entity: sensor.pigarden_info
    show_header_toggle: false
    title: Controllo piGarden
    type: entities
  - entities:
      - sensor.pigarden_last_rain_sensor
      - sensor.pigarden_last_rain_online
    show_header_toggle: false
    title: Ultima pioggia rilevata
    type: entities
  - entity: weather.openweather
    name: Meteo
    type: weather-forecast

Come ultimo passo aggiungiamo un altro Vertical Stack Card dove inseriremo i controlli per le varie zone:


type: vertical-stack
cards:
  - entities:
      - switch.pigarden_zone_giardino_posteriore_dx
      - input_boolean.pigarden_force_giardino_posteriore_dx
    show_header_toggle: false
    title: Giardino Posteriore DX
    type: entities
  - entities:
      - switch.pigarden_zone_giardino_posteriore_sx
      - input_boolean.pigarden_force_giardino_posteriore_sx
    show_header_toggle: false
    title: Giardino Posteriore SX
    type: entities
  - entities:
      - switch.pigarden_zone_giardino_posteriore_cn
      - input_boolean.pigarden_force_giardino_posteriore_cn
    show_header_toggle: false
    title: Giardino Posteriore CN
    type: entities

Bene, a questo punto se abbiamo fatto tutto Home Assistant dovrebbe mostrarci un pannello simile a quello qui sotto da dove potremo gestire piGarden.

6 pensieri su “piGarden: integrazione con Home Assistant

  1. Ciao, ottimo lavoro! funziona tutto alla perfezione!
    solo una cosa: dovresti correggere la scritta qtt con mqtt nella configurazione del file .yaml
    c’è un errore anche nella scritta binay_sensor: manca la “r”
    grazie
    Claudio

  2. Oltre ad avere corretto gli errori indicati sopra, ho aggiunto anche una parte di definizione sensori mancante:


    - platform: template
    sensors:
    pigarden_info:
    value_template: "{{ states.sensor.pigarden_info_message.state }}"
    icon_template: "{{ states.sensor.pigarden_info_icon.state }}"

  3. Ciao,progetto stupendo.
    Potresti inserire nella configurazione dell’home assistant anche il pulsante per la chiusura di tutte le elettrovalvole e per il riavvio spegnimento della centralina?
    Grazie mille

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.