Всем привет! Сейчас я покажу, как я снимаю данные с датчика DHT11 через протокол MQTT и передаю их в сервис MajorDoMo.

Моя схема:

Есть центральный сервис MajorDoMo он развернут на Ubuntu 18.04 Server amd64 виртуального контейнера под ESXi 6.0.0 развернутого внутри домашнего сервера HP MicroServer Gen8.

Есть миникомпьютер на базе Raspberry Pi 3 Model B к которому подключен датчик температуры и влажности, он находится в другой комнате.

Как я себе вижу задачу: На оси Raspbian Stretch миникомпьютера Raspberry Pi 3 Model B крутится скрипт который который снимает показания и передает их в Majordomo.

Стенд:

  • ekzorchik@srv-bionic:~$ — 172.33.33.14 (MajorDoMo) на Ubuntu 18.04 Server, задействована заметка Как установить MajorDoMo на Ubuntu 18.04 Server. После обязательно следует перезагрузить систему чтобы после все циклы запустились, раньше этого было достаточно и задание в crontab отрабатывало, теперь его нужно изменить:
ekzorchik@srv-bionic:~$ sudo crontab -e

@reboot /usr/bin/php /var/www/cycle.php

*/5 * * * * /usr/bin/php /var/www/cycle.php

После циклы работают как надо.

Шаг №1: Проверяю, что подключившись с основной системы к Raspberry Pi 3 Model B могу снять показания с датчика температуры:

ekzorchik@navy:~$ ssh -l pi 172.33.33.10

pi@raspberrypi:~ $ uname -a

Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux

pi@raspberrypi:~ $ git clone https://github.com/adafruit/Adafruit_Python_DHT.git

pi@raspberrypi:~ $ cd Adafruit_Python_DHT/

pi@raspberrypi:~/Adafruit_Python_DHT $ sudo python setup.py install

pi@raspberrypi:~/Adafruit_Python_DHT $ examples/AdafruitDHT.py 11 4

Temp=21.0* Humidity=17.0%

  • Где 21 градус — это температура у меня в комнате
  • Где 17% – это влажность у меня в комнате.

Шаг №2: Если нужно с MajorDoMo получать показания датчика DHT11 без использования MQTT то на системе Ubuntu 18.04 Server проделываем:

ekzorchik@navy:~$ ssh -l ekzorchik 172.33.33.14

ekzorchik@srv-bionic:~$ uname -a

Linux srv-bionic 4.15.0-43-generic #46-Ubuntu SMP Thu Dec 6 14:45:28 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

ekzorchik@srv-bionic:~$ sudo apt-get install sshpass -y

ekzorchik@srv-bionic:~$ sshpass -p 712mbddr@ ssh -o StrictHostKeyChecking=no pi@172.33.33.10 'Adafruit_Python_DHT/examples/AdafruitDHT.py 11 4'

Warning: Permanently added '172.33.33.10' (ECDSA) to the list of known hosts.

Temp=20.0* Humidity=18.0%

Дальше уже на основании моих разобранных заметок полученные значения обрабатываем и переносим в MajorDoMo.

Шаг №3: Теперь вернемся к тому, что я хочу с Raspberry Pi 3 Model B передавать показания через протокол MQTT, для этого нужно проделать все по ранее опубликованной заметке (tips_ubuntu_18_04_mosquitto_v1.odt) где я разобрал как установить MQTT на Ubuntu 18.04 Server amd64.

Шаг №4: Устанавливаю в Webинтерфейс MajorDoMo поддержку протокола MQTT и настраиваю:

http://IP&DNS — Панель управления — Система — Маркет дополнений — в поиске набираю «MQTT» и нажимаю клавишу Enter, вижу найденное совпадение, хоть и пишется что оно установлено (но я его не ставил), а потому напротив данного приложения нажимаю «Обновить», тем самым запуститься процесс установки самой последней версии.

Устанавливаю модуль MQTT для работы в MajorDoMo

Отлично. Переходим к первоначальной настройки связи Ubuntu и Raspberry:

http://IP&DNS — Устройства — MQTT — (MQTT) Настроить

  • MajorDoMo Client: 172.33.33.14
  • Hostname: (*) localhost
  • Port: (*) 1883
  • Subscription path: (*) #
  • authorization required: отмечаю галочкой
  • Username: mqtt-spy (это на доступ к подписке)
  • Password: Aa1234567 (это на доступ к подписке)

и нажимаю кнопку “Обновить"

После открываю консоль командной строки и отправляю в Majordomo устройству MQTT тестовое сообщение:

ekzorchik@srv-bionic:~$ ip r | awk '{print $9}' | head -n1

172.33.33.14 (Это адрес системы MajorDoMo)

ekzorchik@srv-bionic:~$ mosquitto_pub -d -t temp -m "Test Message" -h 172.33.33.14 -p 1883 -u mqtt-spy -P Aa1234567

Client mosq/zg4IvN7OKleEckwe4m sending CONNECT

Client mosq/zg4IvN7OKleEckwe4m received CONNACK (0)

Client mosq/zg4IvN7OKleEckwe4m sending PUBLISH (d0, q0, r0, m1, 'temp', ... (12 bytes))

Client mosq/zg4IvN7OKleEckwe4m sending DISCONNECT
  • «-d» → Режим отладки
  • «-t» → mqtt topic to publish to
  • «-m» → message payload to send
  • «-h» → mqtt host to connect to. Defaults to localhost.
  • «-p» → network port to connect to. Defaults to 1883 for plain MQTT and 8883 for MQTT over TLS.
  • «-u» → provide a username
  • «-P» → provide a password

Проверяю, что в интерфейсе MajorDoMo:

http://IP&DNS — Устройства — MQTT — В виде Списка

Тестовое сообщение отправленное через MQTT в MajorDoMo

Отлично модуль настроен. Удаляю из Web-интерфейса данную тестовую запись.

Шаг №5: Чтобы с Raspberry Pi 3 Model B установленной операционной системы Raspbian Stretch через протокол MQTT можно было отправлять показания от датчика DHT11:

pi@raspberrypi:~ $ git clone https://github.com/eclipse/paho.mqtt.python

Cloning into 'paho.mqtt.python'…

pi@raspberrypi:~ $ cd paho.mqtt.python/

pi@raspberrypi:~/paho.mqtt.python $ sudo python setup.py install

pi@raspberrypi:~/paho.mqtt.python $ cd ~

pi@raspberrypi:~ $ sudo apt-get install ipython -y

pi@raspberrypi:~ $ ipython

Python 2.7.13 (default, Sep 26 2018, 18:42:22)

In [1]: import paho.mqtt.client as mqtt

In [2]: import time

In [3]: import sys

In [4]: import Adafruit_DHT

In [5]: username = "mqtt-spy"

In [6]: password = "Aa1234567"

In [7]: clientid = "client"

In [8]: mqtcc = mqtt.Client(client_id=clientid)

In [9]: mqtcc.username_pw_set(username,password=password)

In [10]: mqtcc.connect("172.33.33.25",port=1883,keepalive=60)

In [11]: mqtcc.loop_start()

In [12]: temp11 = Adafruit_DHT.read_retry(11,4)

In [13]: temp11 = "temp,c=" + str(temp11)

In [14]: print(temp11)

temp,c=(14.0, 24.0)

In [15]: topic="test"

формат(имя топика и отправить значение переменной)

In [16]: mqtcc.publish(topic,payload=temp11)

In [17]: quit

pi@raspberrypi:~ $

Получилось отправить: температуру с датчика DHT11

Проверка работы через python с протоколом MQTT

Шаг №6: Теперь можно написать скрипт который через протокол MQTT будет передавать данные в MajorDoMo:

#!/usr/bin/python
import paho.mqtt.client as mqtt
import time
import sys
import Adafruit_DHT

time.sleep(30) #Sleep to allow wireless to connect before starting MQTT

username = "mqtt-spy"
password = "Aa1234567"
clientid = "client"

mqtcc = mqtt.Client(client_id=clientid)
mqtcc.username_pw_set(username, password=password)
mqtcc.connect("172.33.33.14", port=1883, keepalive=60)
mqtcc.loop_start()

#topic = "dht11"
topic_dht11_temp = "temp"
topic_dht11_humidity = "humidity"

while True:
    try:
        temp11 = Adafruit_DHT.read_retry(11, 4)
        humidity11, temp11 = Adafruit_DHT.read_retry(11, 4)
        if temp11 is not None:
            temp11 = "temp,c=" + str(temp11)
            mqtcc.publish(topic_dht11_temp, payload=temp11, retain=True)
        if humidity11 is not None:
            humidity11 = "rel_hum,p=" + str(humidity11)
            mqtcc.publish(topic_dht11_humidity, payload=humidity11, retain=True)
        time.sleep(5)
    except (EOFError, SystemExit, KeyboardInterrupt):
        mqtcc.disconnect()
        sys.exit()

Честно скрипт полностью не мой собственный, а найденный и оптимизированные под свои нужны, он работает.

pi@raspberrypi:~ $ chmod +x dht11

pi@raspberrypi:~ $ ./dht11

и вот спустя обозначенный 30 секунд данные в MajorDoMo успешно появляются:

Результат работы python скрипта на Raspberry по отправке данных датчика в MajorDoMo

 

Шаг №7: Теперь нужно каким-либо образом настроить чтобы скрипт на Raspberry Pi 3 Model B включался сам и передавал показания:

Можно не подключаться, а запускать на Raspberry pi 3 Model B по Cron(у) скрипт:

pi@raspberrypi:~ $ nano script

#!/bin/bash

killall dht11

/home/pi/dht11

pi@raspberrypi:~ $ chmod +x script

pi@raspberrypi:~ $ crontab -e

*/2 * * * * /home/pi/script

Время наступает и запускается скрипт:

pi@raspberrypi:~ $ ps aux | grep temp | head -1

pi 1281 1.1 1.0 13996 10012 ? S 23:26 0:00 /usr/bin/python /home/pi/dht11

Данные идут:

Скритп запускается данные передаются в MajorDoMo

Опять время наступает, ранее запущенный скрипт завершается, новый запускается

pi@raspberrypi:~ $ ps aux | grep temp | head -1

pi 1336 2.6 1.3 26748 13844 ? Sl 23:28 0:01 /usr/bin/python /home/pi/dht11

Работает. И показания присылаются в MajorDoMo.

Потребление системных ресурсов Raspberry мало и не нагружается систему.

Итого! Все шагами выше я для себя задокументировал настройку как через MQTT можно снимать показания датчика DHT11 и передавать их на центральный узел где развернут сервис MQTT. Плюс если нет желания использовать MQTT использовать связку строки через sshpass и подключаться. Я считаю что правильнее когда сервер не Raspberry Pi 3 Model B, а полноценная система Ubuntu 18.04 Server. Каждый узел делаю только ту задачу которую умеет делать хорошо. На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.

От ekzorchik

Всем хорошего дня, меня зовут Александр. Я под ником - ekzorchik, являюсь автором всех написанных, разобранных заметок. Большинство вещей с которыми мне приходиться разбираться, как на работе, так и дома выложены на моем блоге в виде пошаговых инструкции. По сути блог - это шпаргалка онлайн. Каждая новая работа где мне случалось работать вносила новые знания и нюансы работы и соответственно я расписываю как сделать/решить ту или иную задачу. Это очень помогает. Когда сам разбираешь задачу, стараешься ее приподнести в виде структурированной заметки чтобы было все наглядно и просто, то процесс усвоения идет в гору. Также прошу на https://win.ekzorchik.ru https://lin.ekzorchik.ru https://net.ekzorchik.ru https://voip.ekzorchik.ru https;//home.ekzorchik.ru