Публикуем температуру, использование процессора, памяти и диска в MQTT для Home Assistant

Все точно работает на Raspbian Stretch, актуальной на момент данной публикации.

Так же все работает и на последней версии Raspbian Jessie

Есть очень удобная утилита awk, способная вытягивать только нужную нам информацию из выдаваемых данных. Именно ее будем использовать в скриптах.

Итак, у меня есть Hassio на отдельной малине, там же установлен брокер mosquitto.

Допустим, адрес hassio с брокером mosquitto 192.168.1.101

Так же у меня есть еще одна raspberry, с установленной xeoma, и я хочу получать информацию о ее состоянии в Home Assistant.

Я буду получать информацию о температуре процессора, загруженности процессора, использования оперативной памяти и жесткого диска (в данном случае корня флешки — / ), а так же процент использования usb диска и аптайм системы

Для начала установим необходимые пакеты python3:

sudo apt-get install python3-pip
sudo apt-get install python3-setuptools
sudo pip3 install paho-mqtt

Теперь установим mosquitto:

wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-stretch.list
cd $home
sudo apt-get update
sudo apt-get install mosquitto
sudo apt-get install mosquitto-clients
rm mosquitto-repo.gpg.key

Теперь нужно создать скрипты.

Создадим папку mqtt в домашней директории raspberry:

sudo mkdir mqtt

и зайдем в нее:

cd mqtt

 

Пояснения по скриптам:

hostname=»192.168.1.101» это адрес брокера

«/rpi/temp» это топик

check_output([«vcgencmd«,»measure_temp«]) это команда для отображения

 

Первый скрипт температуры:

sudo nano temp.py

Содержимое:

#!/usr/bin/env python3
import paho.mqtt.publish as publish
from subprocess import check_output
from re import findall

def get_temp():
    temp = check_output(["vcgencmd","measure_temp"]).decode("UTF-8")
    return(findall("\d+\.\d+",temp)[0])

def publish_message(topic, message):
    print("Publishing to MQTT topic: " + topic)
    print("Message: " + message)

    publish.single(topic, message, hostname="192.168.1.101")

temp = get_temp()
publish_message("/rpi/temp", temp)

 

Скрипт загрузки процессора:

sudo nano cpu.py

 

#!/usr/bin/env python3
import paho.mqtt.publish as publish
from subprocess import check_output
from re import findall

def get_data():
    data = check_output(["sudo","bash","/home/pi/mqtt/cpu.sh"]).decode("UTF-8")
    return(findall("\d+",data)[0])

def publish_message(topic, message):
    print("Publishing to MQTT topic: " + topic)
    print("Message: " + message)

    publish.single(topic, message, hostname="192.168.1.101")

data = get_data()
publish_message("/rpi/cpu", data)

и для него же bash скрипт с командой:

sudo nano cpu.sh

Содержимое:

#!/bin/bash
(grep 'cpu ' /proc/stat;sleep 0.1;grep 'cpu ' /proc/stat)|awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'

 

Скрипт загрузки оперативной памяти:

sudo nano ram.py

Содержимое:

#!/usr/bin/env python3
import paho.mqtt.publish as publish
from subprocess import check_output
from re import findall

def get_data():
    data = check_output(["sudo","bash","/home/pi/mqtt/ram.sh"]).decode("UTF-8")
    return(findall("\d+",data)[0])

def publish_message(topic, message):
    print("Publishing to MQTT topic: " + topic)
    print("Message: " + message)

    publish.single(topic, message, hostname="192.168.1.101")

data = get_data()
publish_message("/rpi/ram", data)

bash скрипт с командой:

sudo nano ram.sh

Содержимое:

#!/bin/bash
awk '/MemTotal/{t=$2}/MemAvailable/{a=$2}END{print 100-100*a/t}' /proc/meminfo

Скрипт занятого места hdd:

sudo nano hdd.py

Содержимое:

#!/usr/bin/env python3
import paho.mqtt.publish as publish
from subprocess import check_output
from re import findall

def get_data():
    data = check_output(["sudo","bash","/home/pi/mqtt/hdd.sh"]).decode("UTF-8")
    return(findall("\d+",data)[0])

def publish_message(topic, message):
    print("Publishing to MQTT topic: " + topic)
    print("Message: " + message)

    publish.single(topic, message, hostname="192.168.1.101")

data = get_data()
publish_message("/rpi/hdd", data)

bash скрипт с командой:

sudo nano hdd.sh

Содержимое:

#!/bin/bash
df | awk '/ \/$/{print $5}'

 

Скрипт занятого места usbhdd1:

sudo nano usbhdd1.py

Содержимое:

#!/usr/bin/env python3
import paho.mqtt.publish as publish
from subprocess import check_output
from re import findall

def get_data():
    data = check_output(["sudo","bash","/home/pi/mqtt/usbhdd1.sh"]).decode("UTF-8")
    return(findall("\d+",data)[0])

def publish_message(topic, message):
    print("Publishing to MQTT topic: " + topic)
    print("Message: " + message)

    publish.single(topic, message, hostname="192.168.1.101")

data = get_data()
publish_message("/rpi/usbhdd1", data)

bash скрипт:

#!/bin/bash
df | awk '/hdd/ {print($5)}'

в скрипте стоит /hdd/ — это ориентир для поиска утилитой awk, у меня usb диск смонтирован в mnt/hdd, поэтому по hdd  выполняется поиск и выводит колонку №5 в вывод


 

Скрипт аптайма:

sudo nano uptime.py

Содержимое:

#!/usr/bin/env python3
import paho.mqtt.publish as publish
from subprocess import check_output
from re import findall

def get_data():
    data = check_output(["sudo","bash","/home/pi/mqtt/uptime.sh"]).decode("UTF-8")
    return(data)

def publish_message(topic, message):
    print("Publishing to MQTT topic: " + topic)
    print("Message: " + message)

    publish.single(topic, message, hostname="192.168.1.101")

data = get_data()
publish_message("/rpi/uptime", data)

bash:

#!/bin/bash
#echo $(uptime) | sed 's/^.\+up\ \+\([^,]*\).*/\1/g'
awk '{print $1/60}' /proc/uptime

 

 

Даем права на выполнение всех этих скриптов:

sudo chmod +x temp.py cpu.py cpu.sh ram.py ram.sh hdd.py hdd.sh uptime.py uptime.sh usbhdd1.py usbhdd1.sh

И теперь нужно проверить их выполнение, выполнив по очереди каждый:

sudo python3 temp.py

и так далее

Должно выйти сообщение:

 

Теперь настроим автоматическое выполнение всех этих скриптов через cron

sudo crontab -e

и добавляем в самом конце:

# mqtt publish:

* * * * *  /home/pi/mqtt/cpu.py; /home/pi/mqtt/hdd.py; /home/pi/mqtt/temp.py; /home/pi/mqtt/ram.py; /home/pi/mqtt/usbhdd1.py

* * * * *  sleep 30; /home/pi/mqtt/cpu.py; /home/pi/mqtt/hdd.py; /home/pi/mqtt/temp.py; /home/pi/mqtt/ram.py; /home/pi/mqtt/usbhdd1.py

* * * * *  /home/pi/mqtt/uptime.py

 

Теперь каждые 30 секунд будут выполняться все скрипты по очереди, аптайм раз в минуту

 

Чтобы добавить в Home Assistant, в sensors.yaml:

 

####################################################
#               Статус системы Xeoma               #
####################################################

# Аптайм rasberry Xeoma в минутах
- platform: mqtt
  name: "xeoma_rpi_uptime"
  state_topic: "/rpi/uptime"

# Аптайм rasberry Xeoma кастом
- platform: template
  sensors:
    kodi_rpi_bedroom_uptime_custom:
      icon_template: mdi:clock
      value_template: >
        {% set uptime = states.sensor.xeoma_rpi_uptime.state | int %}
        {% set minutes = (( uptime % 60) / 1) | int %}
        {% set hours = ((uptime % 1440) / 60) | int %}
        {% set days = (uptime / 1440) | int %}

          {% if uptime < 1 %} Меньше минуты {% else %} {% if days > 0 %}
              {{ days }} д.
            {% endif %}
            {% if hours > 0 %}
              {% if days > 0 %}
                {{ ' ' }}
              {% endif %}
              {{ hours }} ч.
            {% endif %}
            {% if minutes > 0 %}
              {% if days > 0 or hours > 0 %}
                {{ ' ' }}
              {% endif %}
                {{ minutes }} мин.
            {% endif %}
          {% endif %}

# Температура rasberry Xeoma
- platform: mqtt
  name: "xeoma_rpi_temp"
  state_topic: "/rpi/temp"
  unit_of_measurement: "°C"
  device_class: temperature
  
# hdd системы rasberry Xeoma
- platform: mqtt
  name: "xeoma_rpi_hdd"
  state_topic: "/rpi/hdd"
  unit_of_measurement: "%"

# usbhdd1 Xeoma
- platform: mqtt
  name: "xeoma_rpi_usbhdd1"
  state_topic: "/rpi/usbhdd1"
  unit_of_measurement: "%"

# cpu rasberry Xeoma
- platform: mqtt
  name: "xeoma_rpi_cpu"
  state_topic: "/rpi/cpu"
  unit_of_measurement: "%"
  
# ram rasberry Xeoma
- platform: mqtt
  name: "xeoma_rpi_ram"
  state_topic: "/rpi/ram"
  unit_of_measurement: "%"

Настраиваем имена, иконки и группы, и в итоге получается вот так:

 

UPD 30.05.19

Обновил  bash скрипт аптайма и сенсоры аптайма в Home Assistant, теперь аптайм выглядит так:

29
Оставить комментарий

avatar
1 Цепочка комментария
28 Ответы по цепочке
1 Последователи
 
Популярнейший комментарий
Цепочка актуального комментария
2 Авторы комментариев
Sem2000kvvkvv Авторы недавних комментариев

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

  Подписаться  
новее старее большинство голосов
Уведомление о
Sem2000
Гость
Sem2000

Спасибо за замечательную статью!
100 лет искал что-либо подобное.
К сожалению не совсем понял куда вы инсталлировали пакеты питоновские.
На малинке с хассио или на хеома ?