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
22 commenti
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
Devi verificare che i dati di connessione al broker MQTT siano corretti.
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’.
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?
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?
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)
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…
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
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.
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.
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.
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!
Via SSH (SFTP) con client come WinSCP (Windows), Transmit (MacOS) o Cyberduck ecc… per la commandline o terminale integrato o PuTTY (Windows).
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
come non detto risolto
cosa sbagliavi? sono bloccato nello stesso modo
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
Ho aggiornato l’articolo, lo troverai pronto li!
buongiorno come faccio a ricavare l’ID, grazie
device=”” // ID del dispositivo, ad esempio “VENV”
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.
risolto, ma nel caso di più dischi?
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