Всем привет! Сейчас я покажу, как я снимаю данные с датчика 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
После циклы работают как надо.
pi@raspberrypi:~ $ - 172.33.33.10 (Raspbian Stretch)
, где настройки образа выполнены опираясь на заметку: Чистим систему Raspbian Stretch на свое усмотрениеDHT11
датчик температуры и влажности который подключен к миникомпьютеру Как подключить датчикDHT11
кRaspberry
.- Роутер
Mikrotik
который связывает стенд.
Шаг №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
, вижу найденное совпадение, хоть и пишется что оно установлено (но я его не ставил), а потому напротив данного приложения нажимаю «Обновить
», тем самым запуститься процесс установки самой последней версии.
Отлично. Переходим к первоначальной настройки связи 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 — В виде Списка
–
Отлично модуль настроен. Удаляю из 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
Шаг №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
успешно появляются:
Шаг №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
Данные идут:
Опять время наступает, ранее запущенный скрипт завершается, новый запускается
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.