Home Assistant: Condividere risorse hardware dell’host tramite MQTT

Autore: Vito
1,8K 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

22 commenti

davide Brescianini 13 Agosto 2022 - 14:01

ciao , con il comando cmd_hwmon_show vedo le informazioni dei sensori (tem,peratura cpu e memoria) ma nn riesco a farle pubblicare via mqtt. ho installato proxmox. ma oltre a copiare i due file nella cartella sbin e modificati con i miei parametri mqtt devo fare altro?
grazie

Rispondi
Vito 16 Agosto 2022 - 10:47

Devi verificare che i dati di connessione al broker MQTT siano corretti.

Rispondi
SavioThecnic 3 Febbraio 2023 - 14:43

Ho proxmox 7.3.4 noto che i comandi gli devo lanciare senza sudo rispetto alla guida

se lancio /sbin/cmd_hwmon send ho questa risposta cosa mi manda

Non mi è chiaro come editare la config che comando devo lanciare ?

root@srv-proxmox1:~# /sbin/cmd_hwmon send
cat: /sys/class/hwmon/hwmon1/temp2_input: No such file or directory
cat: /sys/class/hwmon/hwmon1/temp3_input: No such file or directory
cat: /sys/class/hwmon/hwmon1/temp4_input: No such file or directory
cat: /sys/class/hwmon/hwmon1/temp5_input: No such file or directory
cat: /sys/class/hwmon/hwmon1/temp6_input: No such file or directory
cat: /sys/class/hwmon/hwmon1/temp7_input: No such file or directory
Send hwmon values now.
Publish MQTT message “46000” to topic “system/hwmon/resource1/value” now.
Error: Unknown option ‘MQTT’.

Use ‘mosquitto_pub –help’ to see usage.
Publish MQTT message “CPU_Total_Temperature” to topic “system/hwmon/resource1/description” now.
Error: Unknown option ‘MQTT’.

Rispondi
Leo 31 Marzo 2022 - 09:58

Ciao Vito e grazie per il tuo articolo, ho configurato il tutto ma i dati non arrivano ai sensori o meglio danno: non disponibile.
Se da shell però lancio il comando /sbin/cmd_hwmon send i dati compaiono per un minuto e poi di nuovo Non disponibile.
Credo che non funzioni la contab ma l’ho configuarata come hai indicato.. Hai qualche suggerimento?

Rispondi
Vito 31 Marzo 2022 - 10:37

Ciao, se inviandolo manualmente funziona è sicuramente quello. Ti consiglio di guardare la sua documentazione relativa alla tua distribuzione, ma tendenzialmente la configurazione è standard di conseguenza dovrebbe funzionare per tutti. Hai provato a riavviare? a verificare se il servizio è attivo?

Rispondi
Leo 31 Marzo 2022 - 11:04

Grazie Vito uso Debian 11 ho controllato i log della cron e sembrano funzionare…
Mar 31 11:00:01 proxmox CRON[1642]: (root) CMD (sudo /sbin/cmd_hwmon send)
Mar 31 11:01:01 proxmox CRON[1811]: (root) CMD (sudo /sbin/cmd_hwmon send)
Mar 31 11:02:01 proxmox CRON[2006]: (root) CMD (sudo /sbin/cmd_hwmon send)
Mar 31 11:03:01 proxmox CRON[2152]: (root) CMD (sudo /sbin/cmd_hwmon send)

Rispondi
Leo 31 Marzo 2022 - 18:26

Ho tolto il comando sudo dalla cron e ha iniziato a funzionare. La cosa strana e che funziona sia la temperatura che la RAM mentre il disco fa come prima NON DISPONIBILE a meno che non lanci il comando da shell…

Rispondi
Roberto 2 Dicembre 2021 - 14:52

Due domande, se volessi recuperare le informazioni di utilizzo cpu, ram e spazio sul disco delle singole istanze è possibile? e seconda domanda, ma sono l’unico a cui cambia il percorso hwmon ogni tanto trovo le informazioni su hwmon1 e ogni tanto su hwmon2 o hwmon3

Rispondi
Vito 3 Dicembre 2021 - 10:46

Ciao, sì puó capitare soprattutto durante gli aggiornamenti. Io mi sono creato un’associazione automatica del percorso se trova il file corretto.

Discorso istanze non ho capito.

Rispondi
Roberto 3 Dicembre 2021 - 11:33

A me capita quando riavvia Proxmox, per il discorso delle istanze, volevo capire se invece di installare un client mqtt su ogni macchina virtuale per ricavare le informazioni di utilizzo della stessa si poteva agire direttamente dalle informazioni recuperabili da proxmox (inviare le informazioni che si vedono sulla schermata “Sommario” della VM), spero di essermi spiegato.

Rispondi
Vito 3 Dicembre 2021 - 13:33

sì può capitare va fatto qualcosa per impostare il percorso sul momento, esempio:

#!/bin/sh

# Parameters
hwmon_path=”/sys/class/hwmon”
hwmon_folder=””
mqtt_topic=”hwmon/venv”

# File Presence Check
check_folder_1=”hwmon3″
check_folder_2=”hwmon4″
check_file_1=”*_label”

if ls $hwmon_path/$check_folder_1/$check_file_1 1> /dev/null 2>&1; then
hwmon_folder=”$check_folder_1″
elif ls $hwmon_path/$check_folder_2/$check_file_1 1> /dev/null 2>&1; then
hwmon_folder=”$check_folder_2″
else
hwmon_folder=”$check_folder_1″
fi

detto questo lo script è predisposto per leggere qualsiasi valore e pubblicarlo, se c’è modo di fargli leggere quei valori, sicuramente possono essere pubblicati direttamente dal server proxmox impostando l’estrazione corretta come negli esempi forniti.

Rispondi
Francesco 2 Settembre 2021 - 19:03

Domanda da ignorante: come accedo alle cartelle di Proxmox per caricare gli script? Per ora le mie conoscenze si fermano ad aver creato una VM con Hassos (per il resto, HA è pronto e configurato in quanto già uso il broker MTQQ).

Grazie mille!

Rispondi
Vito 15 Settembre 2021 - 11:12

Via SSH (SFTP) con client come WinSCP (Windows), Transmit (MacOS) o Cyberduck ecc… per la commandline o terminale integrato o PuTTY (Windows).

Rispondi
mamos76 22 Giugno 2021 - 19:51

ho eseguito la guida alla lettera e infatti riesco a vedere i valori tramite il comando cmd_hwmon show. Soltanto che sembra che non vengano pubblicati su mqtt. Ho riguardato 100 volte le impostazioni del cmd_mqtt e sono corrette. Il broker mqtt funziona correttamente perchè ho altri dispositivi collegati e funzionano correttamente.

il crontab l’ho aggiornato come da guida. non so cos’altro guardare

Rispondi
mamos76 22 Giugno 2021 - 20:00

come non detto risolto

Rispondi
nicola 12 Agosto 2021 - 21:26

cosa sbagliavi? sono bloccato nello stesso modo

Rispondi
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.