Tenho 2 ficheiros que correm pelo cron.
cron
0 * * * * /home/<user>/mqtt_config.sh #corre a todas as horas
* * * * * /home/<user>/mqtt_status.sh #corre de 15 em 15 segundos
* * * * * sleep 15 && /home/<user>/mqtt_status.sh
* * * * * sleep 30 && /home/<user>/mqtt_status.sh
* * * * * sleep 45 && /home/<user>/mqtt_status.sh
mqtt_config.sh
serve para criar os sensores no HA pelo MQTT
#!/bin/bash
HOST=<IP-do-MQTTBroker> #Exemplo 192.168.1.1
PORT=<Porta-MQTTBroker> #Exemplo 1883
USER=<user MQTTBroker>
PASS=<password MQTTBroker
SENSOR='<nome base do sensor>' #Exemplo 'hassio_server_01', o sensor do disco será 'sensor.hassio_server_01_disk'
SERVER='<friendly name dos sensores>' # Exemplo 'Hassio Server 01', o sensor do disco será 'Hassio Server 01 Disk'
#LOAD
mosquitto_pub -h $HOST -p $PORT -t 'homeassistant/sensor/'$SENSOR'/Load/config' -m "{\"name\":\"$SERVER Load 1M\", \"icon\":\"mdi:cpu-64-bit\", \"unit_of_measurement\": \"%\", \"state_topic\":\"home/servers/$SENSOR/state\", \"value_template\": \"{{ value_json.load }}\"}" -u $USER -P $PASS
#MEM
mosquitto_pub -h $HOST -p $PORT -t 'homeassistant/sensor/'$SENSOR'/Mem/config' -m "{\"name\":\"$SERVER Memory\", \"icon\":\"mdi:memory\", \"unit_of_measurement\": \"%\", \"state_topic\":\"home/servers/$SENSOR/state\", \"value_template\": \"{{ value_json.mem }}\" }" -u $USER -P $PASS
#DISK
mosquitto_pub -h $HOST -p $PORT -t 'homeassistant/sensor/'$SENSOR'/Disk/config' -m "{\"name\":\"$SERVER Disk\", \"icon\":\"mdi:harddisk\", \"unit_of_measurement\": \"%\", \"state_topic\":\"home/servers/$SENSOR/state\", \"value_template\": \"{{ value_json.disk }}\" }" -u $USER -P $PASS
#LAST_BOOT
mosquitto_pub -h $HOST -p $PORT -t 'homeassistant/sensor/'$SENSOR'/LastBoot/config' -m "{\"name\":\"$SERVER Last Boot\", \"device_class\":\"timestamp\", \"icon\":\"mdi:clock\", \"state_topic\":\"home/servers/$SENSOR/state\", \"value_template\":\"{{ value_json.last_boot }}\" }" -u $USER -P $PASS
#UPDATES AVAILABLE
mosquitto_pub -h $HOST -p $PORT -t 'homeassistant/sensor/'$SENSOR'/AvailableUpdates/config' -m "{\"name\":\"$SERVER Available Updates\", \"icon\":\"mdi:package-variant\", \"state_topic\":\"home/servers/$SENSOR/state\", \"value_template\":\"{{ value_json.updates_available }}\" }" -u $USER -P $PASS
exit
mqtt_status.sh
serve para atualizar os valores dos sensores no HA
#!/bin/bash
HOST=<IP-do-MQTTBroker> #Exemplo 192.168.1.1
PORT=<Porta-MQTTBroker> #Exemplo 1883
USER=<user MQTTBroker>
PASS=<password MQTTBroker
SENSOR='<nome base do sensor>' #Deve ser o mesmo que definido no 'mqtt_config.sh'
LOAD=$(uptime | awk '{print $(NF-2)}' | head -c -2)
LOAD_PERC=$(awk "BEGIN {printf \"%.1f\n\", $LOAD*100/2}")
MEMTOTAL=$(free | grep Mem | awk {'print $2'})
MEMUSED=$(free | grep Mem | awk {'print $3'})
MEM=$(awk "BEGIN {printf \"%.1f\n\", $MEMUSED*100/$MEMTOTAL}")
DISK=$(df -h | grep /dev/sda2 | awk {'print $5'} | tr -d %)
UPTIME=$(uptime -s)
LAST_BOOT=$(date -d"$UPTIME" +%FT%T+00:00)
NUMBER_UPDATES=$(apt-get -s upgrade | grep -Po "^[[:digit:]]+ (?=upgraded)")
PAYLOAD="{\"load\":$LOAD_PERC, \"mem\":$MEM, \"disk\":$DISK, \"updates_available\":$NUMBER_UPDATES, \"last_boot\":\"$LAST_BOOT\"}"
echo $PAYLOAD
#STATE
mosquitto_pub -h $HOST -p $PORT -t 'home/servers/'$SENSOR'/state' -m "$PAYLOAD" -u $USER -P $PASS
exit
Os scripts devem ter permissão de execução.
chmod 755 mqtt_config.sh
chmod 755 mqtt_status.sh
Volto a referir que este scripts foram totalmente criados por mim e a experiencia em ShellScript não é muita.
Tenho vários pontos a melhorar, mas o tempo não tem sido muito para isto. Nomeadamente quando se reinicia o HA temos de esperar até uma hora certa (ex: 14h00, 15h00, etc) para que os sensores sejam criados novamente no HA.
Para os scripts correrem, têm de instalar o mosquitto-client nas máquinas onde querem correr os scripts
sudo apt-get install mosquitto-clients
Espero que seja útil