Home Assistant: Condividere risorse hardware dell’host tramite MQTT

Autore: Vito
481 visite
MQTT Hardware Monitor - Featured Image

Sempre più spesso l’installazione di Home Assistant avviene tramite l’utilizzo di macchine virtuali, ad esempio utilizzando Proxmox, che rende impossibile accedere ad alcune utili informazioni fornite dall’host principale come la temperatura del processore o lo spazio residuo sul disco.

Sfruttando e rielaborando alcuni concetti acquisti nel precedente articolo andremo a vedere come utilizzare il protocollo MQTT per condividere queste informazioni verso la nostra installazione di Home Assistant avendo un server Proxmox su base Debian installato su un Intel NUC.

Preparazione

Come prima operazione installiamo i pacchetti necessari:

# sudo apt-get update
# sudo apt-get install mosquitto-clients

Scaricare questo pacchetto contenente gli script “cmd_mqtt” e “cmd_hwmon” e posizionarli all’interno del percorso “/sbin/“, poi applicare i permessi necessari:

# chmod 755 /sbin/cmd_mqtt
# chmod 755 /sbin/cmd_hwmon

Configurazione

Partiamo configurando il file “cmd_mqtt” che sì occuperà di pubblicare i contenuti verso il nostro Broker MQTT.

Sì tratta di una versione rivista del medesimo file ampiamente spiegato all’interno del precedente articolo:

# Parameters
device="<THIS CLIENT ID>"                // ID del dispositivo, ad esempio "VENV"
host="<YOUR MQTT BROKER IP>"             // Indirizzo IP del Broker MQTT
port="1883"                              // Porta del Broker MQTT
username="<YOUR MQTT BROKER USERNAME>"   // Username del Broker MQTT
password="<YOUR MQTT BROKER PASSWORD>"   // Password del Broker MQTT
...

Configuriamo quindi i parametri principali del file “cmd_hwmon” che sì occuperà di recuperare i valori delle risorse hardware interessate ed a pubblicarle:

# Parameters
hwmon_path="/sys/class/hwmon"                     // Percorso base delle risorse hardware
hwmon_folder="hwmon1"                             // Cartella specifica risorse hardware
mqtt_topic="system/hwmon"                         // Topic MQTT di pubblicazione

Per comprendere i valori sopra indicati e come procedere è doveroso fermarsi un attimo ed analizzare il contenuto del nostro server.

Come visibile nell’immagine sottostante, all’interno del nostro percorso base saranno presenti diverse cartelle come “hwmon1” che al suo interno conterrà diversi file.

Tramite il comando “cat”, analizzando l’oggetto “xxxxx_label” di ogni file, è possibile comprendere il significato del valore che rappresenta l’oggetto “xxxxx_input” come nell’esempio sottostante dove il file “temp1_input” rappresenterà la temperatura complessiva del nostro processore identificato come “Package id 0” ed il file “temp2_input” quella relativa al singolo core del processore “Core 0”.

Identificati i valori che ci interessano compilare la parte sottostante.

Lo script è predisposto per esporre fino a 15 contenuti differenti contemporaneamente non obbligatoriamente relativi alle risorse hardware sopra elencate. Un esempio è la pubblicazione della % di spazio utilizzato dal disco “local-lvm” di Proxmox dove generalmente sono archiviate tutte le macchine virtuali oppure la % di utilizzo della memoria RAM.

Per disabilitare una risorsa semplicemente indicare come valore e descrizione “-“.

########      Resources Settings:      ########
...
# Resource 1
mqtt_payload_value_1="$(cat $hwmon_path/$hwmon_folder/temp1_input)"         // Payload contenente la temperatura CPU
mqtt_payload_description_1="CPU_Temperature_Total"                          // Descrizione identificativa temperatura CPU
...
# Resource 8
mqtt_payload_value_8="$(pvesm status | grep local-lvm | awk '$7 ~ /\%$/ {print $7 }' | awk '{gsub(/\ |\%/,"")}1')"
mqtt_payload_description_8="Disk_LocalLVM_Used_Space_Percent"
# Resource 9
mqtt_payload_value_9="$(free -m | awk '/Mem:/ {print $3/$2*100}')"
mqtt_payload_description_9="Memory_Total_Used_Percent"
...
# Resource 10
mqtt_payload_value_10="-"                                                   // "-" identifica una risorsa disabilitata
mqtt_payload_description_10="-"                                             // "-" identifica una risorsa disabilitata
...

Tramite il comando “cmd_hwmon show” è possibile mostrare un’anteprima dei valori che verranno pubblicati:

Impostare quindi la periodicità di pubblicazione eseguendo:

# crontab -e

Ed aggiungendo in fondo:

# Mail Alerts
MAILTO=""

# Hardware Monitor
* * * * * sudo /sbin/cmd_hwmon send

Di conseguenza ogni minuto verrà aggiornato il relativo topic con i valori configurati, verificabile tramite un tool di analisi come MQTT Explorer:

Attenzione: La chiave “MAILTO” è necessaria per inibire il continuo inoltro di email nel caso queste fossero state configurate.

Integrazione in Home Assistant

Successivamente alla configurazione di un Broker MQTT all’interno della propria installazione di Home Assistant, ad esempio Mosquitto disponibile come componente aggiuntivo per chi utilizza Home Assistant Supervised, aggiungiamo un sensore per analizzare ogni risorsa pubblicata che ci interessa.

Prendiamo come esempio la temperatura principale del processore condivisa tramite il topic “resource1”, l’utilizzo del disco local-lvm tramite il topic “resource8” e l’utilizzo della memoria RAM tramite il topic “resource9”:

sensor:
  # Hardware Monitor
  # Temperatura Processore [Risorsa 1]
  - platform: mqtt
    name: 'Temperatura Processore'
    icon: mdi:thermometer
    qos: 0
    state_topic: 'system/hwmon/resource1/value'
    value_template: '{{ (value | float / 1000) | round(2) }}'
    force_update: true
    expire_after: 120
    unit_of_measurement: '°C'
  # Utilizzo Disco local-lvm [Risorsa 8]
  - platform: mqtt
    name: 'Utilizzo Disco [local-lvm]'
    icon: mdi:harddisk
    qos: 0
    state_topic: 'system/hwmon/resource8/value'
    value_template: '{{ (value | float) | round(2) }}'
    force_update: true
    expire_after: 120
    unit_of_measurement: '%'
  # Utilizzo Memoria RAM [Risorsa 9]
  - platform: mqtt
    name: 'Utilizzo Memoria RAM'
    icon: mdi:memory
    qos: 0
    state_topic: 'system/hwmon/resource9/value'
    value_template: '{{ (value | float) | round(2) }}'
    force_update: true
    expire_after: 120
    unit_of_measurement: '%'

Come indicato nella documentazione ufficiale relativa ai sensori MQTT, impostando il valore “expire_after” è possibile indicare dopo quanti secondi il sensore risulterà non disponibile se nessun valore viene pubblicato. Avendo una pubblicazione periodica di 1 minuto è consigliato impostare un minimo di 2 minuti.

Prendendo come esempio la prima risorsa, possiamo quindi creare una card “Indicatore” per analizzare lo stato della temperatura in base alla sua criticità:

type: gauge
name: Temperatura Processore
entity: sensor.temperatura_processore
min: 0
max: 150
severity:
  green: 50
  yellow: 60
  red: 100
Se ti è stato utile, perché non...
Mi offri un caffè?

Post correlati

6 commenti

Renzo Severino 22 Marzo 2021 - 21:52

sensor:
# Hardware Monitor
# Temperatura Processore [Risorsa 1]
– platform: mqtt
name: ‘Temperatura Processore’
icon: mdi:thermometer
qos: 0
state_topic: ‘system/hwmon/resource1/value’
value_template: ‘{{ (value | float / 1000) | round(2) }}’
force_update: true
expire_after: 120
unit_of_measurement: ‘°C’

questo per la temperatura, invece per Disk_local ?
Grazie

Rispondi
Vito 22 Marzo 2021 - 22:45

Ho aggiornato l’articolo, lo troverai pronto li!

Rispondi
Renzo Severino 22 Marzo 2021 - 17:31

buongiorno come faccio a ricavare l’ID, grazie
device=”” // ID del dispositivo, ad esempio “VENV”

Rispondi
Vito 22 Marzo 2021 - 17:34

Ciao, è l’identificativo con cui il dispositivo sì identifica verso il Broker MQTT. Lo definisci tu a piacimento, io solitamente metto l’hostname del dispositivo.

Rispondi
Renzo Severino 22 Marzo 2021 - 17:38

risolto, ma nel caso di più dischi?

Rispondi
Vito 22 Marzo 2021 - 17:50

Devi aggiungere una risorsa sfruttando una di quelle vuote indicando il valore di estrazione % del disco usando ad esempio quello fornito per local-lvm indicando il disco supplementare, o creando tu stesso un’estrazione a piacimento facendo dei test da console con grep/awk

Rispondi

Lascia un commento

* Utilizzando questo modulo accetti la memorizzazione e la gestione dei tuoi dati da questo sito web.