Товары из Китая

Как я прикручивал часы LYWSD02MMC от Xiaomi к «умному дому» Domoticz на raspberry pi 3


Как я прикручивал часы  LYWSD02MMC от Xiaomi к «умному дому» Domoticz на raspberry pi 3

Новый датчик температуры/влажности с часами на электронных чернилах с BLE от Xiaomi появился в продаже относительно недавно. На вид это скорее часы, нежели датчик температуры и влажности – большую часть экрана занимают показания часов, а показания температуры и влажности пристроились скромно внизу вместе с индикатором комфорта, стилизованного под рожицу. Обзоров этих часов в инете хватает, здесь, например.

Часы довольно симпатичные, мне понравились. К Mihome подключились без проблем. Стало интересно, можно ли передавать показания датчиков в систему «умного дома» Domoticz.

Поиск вывел на сайт, где автор подробно расписал, как получить данные с этих часов.

У меня Domoticz установлен на raspberry pi 3 и первое, что попробовал — связаться с часами по блютузу, для этого наколхозил скрипт на python3:

#!/usr/bin/env python3

# -*- coding: utf-8 -*-
from bluepy import btle
import struct
mac_addr_LYWSD02 = '3F:59:C8:61:10:CF'
class MyDelegate(btle.DefaultDelegate):
def handleNotification(self, cHandle, data):
global HUM
global TEMP
HUM = data[2]
TEMP = struct.unpack('H', data[:2])[0] / 100
p = btle.Peripheral(mac_addr_LYWSD02)
p.setDelegate(MyDelegate())
uuid = 'EBE0CCC1-7A0A-4B0C-8A1A-6FF2997DA3A6'
ch = p.getCharacteristics(uuid=uuid)[0]
desc = ch.getDescriptors(forUUID=0x2902)[0]
desc.write(0x01.to_bytes(2, byteorder="little"), withResponse=True)
print ("LYWSD02")
i = 0
while True:
HUM = 0
TEMP = 0
p.waitForNotifications(1)
i += 1
print(i,"T =",TEMP,"*C, H =", HUM,"%")
if i >= 20 :
break
p.disconnect()

В строке mac_addr_LYWSD02 = ‘xx:xx:xx:xx:xx:xx’ необходимо прописать MAC адрес своих часов, его можно посмотреть в приложении Mihome:

Как я прикручивал часы  LYWSD02MMC от Xiaomi к «умному дому» Domoticz на raspberry pi 3

В результате (не сразу, конечно 🙂 увидел следующие:

root@raspberrypi:/home/pi/domoticz/devices/lywsd02mmc# python3 test.py

LYWSD02
1 T = 0 *C, H = 0 %
2 T = 0 *C, H = 0 %
3 T = 26.11 *C, H = 44 %
4 T = 0 *C, H = 0 %
5 T = 0 *C, H = 0 %
6 T = 0 *C, H = 0 %
7 T = 0 *C, H = 0 %
8 T = 0 *C, H = 0 %
9 T = 26.08 *C, H = 44 %
10 T = 0 *C, H = 0 %
11 T = 0 *C, H = 0 %
12 T = 0 *C, H = 0 %
13 T = 0 *C, H = 0 %
14 T = 0 *C, H = 0 %
15 T = 26.08 *C, H = 44 %
16 T = 0 *C, H = 0 %
17 T = 0 *C, H = 0 %
18 T = 0 *C, H = 0 %
19 T = 0 *C, H = 0 %
20 T = 0 *C, H = 0 %
root@raspberrypi:/home/pi/domoticz/devices/lywsd02mmc#

Нулевые значения получились, потому что 1 сек мало для времени ожидания ответа в waitForNotifications(timeout). Подробнее можно посмотреть здесь.Теперь можно было подумать о связке с Domoticz. В оборудовании добавил Dummy (Does nothing, use for virtual switches only):

Как я прикручивал часы  LYWSD02MMC от Xiaomi к «умному дому» Domoticz на raspberry pi 3

Затем создал виртуальный датчик температуры/влажности:

Как я прикручивал часы  LYWSD02MMC от Xiaomi к «умному дому» Domoticz на raspberry pi 3

В устройствах надо посмотреть Idx датчика, в моем случае 27:

Как я прикручивал часы  LYWSD02MMC от Xiaomi к «умному дому» Domoticz на raspberry pi 3

Теперь попробуем новому датчику передать данные. В адресной строке браузера пишем:



http://192.168.8.10:8080/json.htm?type=command&param=udevice&idx=27&nvalue=0&svalue=25;38;0

192.168.8.10:8080 – адрес Domoticz; idx=27 – индекс датчика. Подробнее можно почитать здесь. В результате должны получить:

Как я прикручивал часы  LYWSD02MMC от Xiaomi к «умному дому» Domoticz на raspberry pi 3

А в датчике появятся переданные значения температуры и влажности:

Как я прикручивал часы  LYWSD02MMC от Xiaomi к «умному дому» Domoticz на raspberry pi 3

Все функционирует, осталось собрать воедино. Опять же наколхозил скрипт:

#!/usr/bin/env python3

# -*- coding: utf-8 -*-
domoticzserver = '127.0.0.1:8080'
domoticzusername = 'Admin'
domoticzpassword = 'admin'
IDX = '27'
mac_addr_LYWSD02 = '3F:59:C8:61:10:CF'
from bluepy import btle
import struct
import urllib.request
import base64
class MyDelegate(btle.DefaultDelegate):
def handleNotification(self, cHandle, data):
global HUM
global TEMP
HUM = data[2]
TEMP = struct.unpack('H', data[:2])[0] / 100

def _encodeBase64(consumer_key, consumer_secret):
dummy_param_name = 'bla'
key_url_encoded = urllib.parse.urlencode({dummy_param_name: consumer_key})[len(dummy_param_name) + 1:]
secret_url_encoded = urllib.parse.urlencode({dummy_param_name: consumer_secret})[len(dummy_param_name) + 1:]
credentials = '{}:{}'.format(key_url_encoded, secret_url_encoded)
bytes_base64_encoded_credentials = base64.encodebytes(credentials.encode('utf-8'))
return bytes_base64_encoded_credentials.decode('utf-8').replace('n', '')
def domoticzrequest (url):
request = urllib.request.Request(url)
request.add_header("Authorization", "Basic %s" % base64string)
response = urllib.request.urlopen(request)
respond = response.read()
response.close()
return respond

p = btle.Peripheral(mac_addr_LYWSD02)
p.setDelegate(MyDelegate())
uuid = 'EBE0CCC1-7A0A-4B0C-8A1A-6FF2997DA3A6'
ch = p.getCharacteristics(uuid=uuid)[0]
desc = ch.getDescriptors(forUUID=0x2902)[0]
desc.write(0x01.to_bytes(2, byteorder="little"), withResponse=True)
print ("LYWSD02")
i = 0
HUM = 0
TEMP = 0
while not p.waitForNotifications(5):
i += 1
if i >= 20 :
break

p.disconnect()
print(i,"T =",TEMP,"*C, H =", HUM,"%")
base64string = _encodeBase64(domoticzusername, domoticzpassword)
HUM_STAT = "0" # Норма
if HUM > 85:
HUM_STAT = "3" # Влажно
elif HUM < 20:
HUM_STAT = "2" # Сухо
elif HUM <= 60 and HUM >= 40:
HUM_STAT = "1" # Комфортно

print(domoticzrequest("http://" + domoticzserver + "/json.htm?type=command&param=udevice&idx=" + IDX + "&nvalue=0&svalue=" + str(TEMP)[:4] + ";" + str(HUM) + ";" + HUM_STAT))

В начале скрипта необходимо прописать свои данные:

Как я прикручивал часы  LYWSD02MMC от Xiaomi к «умному дому» Domoticz на raspberry pi 3

Скрипт я назвал lywsd02.py и поместил в :/home/pi/domoticz/devices/lywsd02mmc. При запуске, если все хорошо, в датчике отобразятся данные с часов, а в консоли увидим:

root@raspberrypi:/home/pi/domoticz/devices/lywsd02mmc# python3 lywsd02.py

LYWSD02
0 T = 26.12 *C, H = 44 %
b'{n "status" : "OK",n "title" : "Update Device"n}n'
root@raspberrypi:/home/pi/domoticz/devices/lywsd02mmc#
# Здесь во второй строчке данные полученные от часов, в третьей строчке ответ от Domoticz

Ну и осталась самая малость — прописать запуск скрипта каждый час в cron:

# Даем права на исполение:

pi@raspberrypi:~/domoticz/devices/lywsd02mmc $ sudo chmod 755 lywsd02.py
# Теперь пропишем запуск скрипта в cron:
pi@raspberrypi:~/domoticz/devices/lywsd02mmc $ sudo crontab -e
# В nano правим: в начале вставляем строчку
MAILTO=""
# в конце дописывам:
0 * * * * /home/pi/domoticz/devices/lywsd02mmc/lywsd02.py > /dev/null 2>&1
# Ctrl X сохраняем, получаем:
crontab: installing new crontab
# Перегружаемся:
pi@raspberrypi:~/domoticz/devices/lywsd02mmc $ sudo reboot

Ну вот, как-то так.

И да, это не готовое решение, а скорее размышление и эксперимент.


СМОТРИ ТАКЖЕ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *