Подключаем к домотикзу датчик Xiaomi Mijia Temperature and Humidity Sensor

Внешний вид прибора:

Неплохой обзор датчика: тыц1
Купить можно на али-экспресс: тыц2
Источник вдохновения: тыц3тыц4

Подключим его к домотикзу:



1. Получаем мак-адрес устройства (нужен адрес напротив которого имя MJ_HT_V1) выполнив команду:

sudo hcitool lescan


pi@raspberrypi:~ $ sudo hcitool lescan
LE Scan ...
4D:68:A4:D0:45:A7 (unknown)
4D:68:A4:D0:45:A7 MJ_HT_V1

На этом этапе есть вероятность получить ошибку "Could not open device: No such device"
Причина: блютуз отключен
Решение: включить на Raspberry блютуз.

2. Создаем Виртуальное (Dummy) устройство с любым названием и типом "Temp+Hum"
3. Запоминаем его IDX !!!
4. С github-а скачиваем domoticz_mijia.py и папку mijia
5. Редактируем файл domoticz_mijia.py:
в начале файла в строке domoticzserver = "127.0.0.1:8000" - прописываем адрес и порт вашего домотикза,
если нужно, на следующей строке указываем логин и пароль к домотикзу,
в самом конце файла оставляем только одну команду (если у вас только один датчик) update("4C:65:A8:D0:4C:98","752") , и сюда заносим свой мак-адрес полученный ранее и IDX dummy датчика.
6. Копируем файл domoticz_mijia.py и папку mijia на Raspberry (например, в папку /home/pi/mijia-sensor-domoticz)
7. Устанавливаем на файлы разрешение на запуск
8. Проверяем, запустив файл:

/usr/bin/python3 /home/pi/mijia-sensor-domoticz/domoticz_mijia.py


pi@raspberrypi:~ $ /usr/bin/python3 /home/pi/mijia-sensor-domoticz/domoticz_mijia.py

1: updating
connect: Device or resource busy (16)
Mi Sensor: 4D:68:A4:D0:45:A7
Firmware: 00.00.66
Name: MJ_HT_V1
Temperature: 27.5°C
Humidity: 55.6%
Battery: 84%
http://192.168.0.130:8080/json.htm?type=command&param=udevice&idx=42&nvalue=0&svalue=27.5;55.6;1&battery=84

Если получили ошибку "No module named 'mijia'", проверьте наличие и содержимое папки mijia рядом с файлом domoticz_mijia.py

9. Сенсор сам нам ничего слать не будет, у него нужно периодически запрашивать показания (запуская команду из шага 8). Запускать можно из самого домотикза (позже может сделаю и опишу этот метод), или поручить это всё крону. 
Запускаем редактор конфигурации крона:

crontab -e

и в конце файла дописываем строку (запуск раз в минуту):

* * * * * /usr/bin/python3 /home/pi/mijia-sensor-domoticz/domoticz_mijia.py >/dev/null 2>&1

---------------------------

P.S.: Из инструкции следует один вывод: датчик отдает показания любому кто запросит (нет никаких паролей или скрытых токенов как у умных ламп).

----------------------------------------------------------------------
UPD 2020-01-22
Достался нахаляву на алиэкспресс квадратный датчик "Mi Temperature and Humidity Monitor 2"  (за 6$ со скидкой в 6$)

Внешний вид:


----------------------------------------------------------------------
Кратко опишу один из способов подключения его к домотикзу.

В выводе команды sudo hcitool lescan
он обозван как LYWSD03MMC

Код для работы с этим чудом вражеской техники можно взять здесь: https://github.com/JsBergbau/MiTemperature2 

Качаем всё, распаковываем и копируем на малину (я скопировал в папку /home/pi/mijia-sensor-domoticz)
Для работы скриптов возможно потребуется доустановить компоненты:
pip3 install bluepy

Редактируем файл LYWSD03MMC.py (и не забываем дать права на его выполнение):
в начале файла после всех import-ов (приблизительно 18 строка) добавил код отправки результатов в домотикз:

# DigitALLeZ 2021-01-21 --------------------------------------------
import urllib.request
import base64

domoticzserver   = "127.0.0.1:8080"
domoticzusername = ""
domoticzpassword = ""
idx_temp = 31

base64string = base64.encodebytes(('%s:%s' % (domoticzusername, domoticzpassword)).encode()).decode().replace('\n', '')

def domoticzrequest (url):
  print(url)
  request = urllib.request.Request(url)
  request.add_header("Authorization", "Basic %s" % base64string)
  response = urllib.request.urlopen(request)
  return response.read()
# DigitALLeZ -------------------------------------------------------

Здесь idx_temp - это idx нужного датчика.
Далее, в конце блока  def handleNotification(self, cHandle, data).... (приблизительно строка 240), перед обработкой исключений except Exception as e ....... добавил:

val_comfort = "0"
if humidity < 40:
val_comfort = "2"
elif humidity <= 70:
val_comfort = "1"
elif humidity > 70:
val_comfort = "3"
domoticzrequest("http://" + domoticzserver + "/json.htm?type=command&param=udevice&idx=" + str(idx_temp) + "&nvalue=0&svalue=" + str(temp) + ";" + str(humidity) + ";"+ str(val_comfort) + "&battery=" + str(batteryLevel))

Всё, с файлом больше ничего делать не нужно.
Проверить работу можно командой: 
/usr/bin/python3 /home/pi/mijia-sensor-domoticz/MiTemperature2-master/LYWSD03MMC.py -d A4:C1:38:18:8C:A5 -r -b -c 1 -urc 20



pi@raspberrypi:~ $ /home/pi/mijia-sensor-domoticz/MiTemperature2-master/LYWSD03MMC.py -d A4:C1:38:18:8C:A5 -r -b -c 1 -urc 20
Trying to connect to A4:C1:38:18:8C:A5
Temperature: 23.0
Humidity: 45
Battery voltage: 2.861 V
Battery level: 76
http://127.0.0.1:8080/json.htm?type=command&param=udevice&idx=31&nvalue=0&svalue=23.0;45;1&battery=76
...............................
1 measurements collected. Exiting in a moment.


Запускаем редактор конфигурации крона:

crontab -e

и в конце файла дописываем строку (запуск раз в минуту):

* * * * * /usr/bin/python3 /home/pi/mijia-sensor-domoticz/MiTemperature2-master/LYWSD03MMC.py -d A4:C1:38:18:8C:A5 -r -b -c 1 -urc 20 >/dev/null 2>&1
---------------------------


Заметки:
иногда вся эта кухня подвисает с нагрузкой на процессор 100%
точная причина пока не ясна.
один из простых вариантов очистки от них - убивать их всех раз в час: 

crontab -e

* * * * *    sudo killall -s 9 --older-than 2m  /home/pi/.local/lib/python3.7/site-packages/bluepy/bluepy-helper >/dev/null 2>&1




Комментарии

Популярные сообщения