Всем привет! Сейчас я покажу, как я снимаю данные с датчика 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.




