Электропривод штор – интеграция

Итак, в предыдущем посте шторы собрали и установили, но что дальше? Теперь надо разобраться, как подключить новый привод Zemismart ZM79E-DT в общую систему. Один в поле не воин, и открывать вручную или пользоваться оригинальной облачной китайской прилкой не вариант. Необходимо подключить привод в общую систему, и реализовать разные сценарии, типа:

  • Открывать шторы автоматически утром в согласовании с эмуляцией рассвета
  • Закрывать шторы автоматически вечером по расписанию, включении определенной сцены или по мастер-кнопке
  • Заменить дурацкий родной пульт на что-то более удобное
  • Открывать шторы автоматически исходя из погоды, прогноза на сегодня, наличия людей в доме, наличия будильника и т.п.

Я подключил шторы в общую систему OpenHAB и интеграция работает хорошо. Давайте посмотрим, что получилось.

Оригинальные органы управления

Из коробки, привод Zemismart ZM79E-DT имеет три способа управления:

  • Родной пульт на частоте 433 МГц
  • WiFi с управлением через облако и локальное подключение
  • Разъём для прямого управления через контакты команд и RS485

Родной пульт – требует экзотическую батарейку, а именно CR2430. Но без проблем работает если засунуть куда более распространённую CR2032.

Родной пульт в общем работает без проблем, но всё же довольно неудобный. Он универсальный, и может управлять несколькими шторами, из-за этого имеет избыток кнопок. Кроме того, кнопки расположены неудобно и надо каждую долго нащупывать, если хочешь отдать команду в темноте. Он у меня повисел возле кровати некоторое время – не понравилось.

Разъём для прямого управления – я не использовал, т.к. подключился к устройству напрямую. Но, это отличный вариант про запас.

WiFi подключение – использует систему Tuya IoT и может управляться через облако или напрямую через локальную сеть.

Вот тут уже интереснее. Конечно, управление через облако ненадёжное и требует стабильного интернета (и работы этого самого облака), поэтому подходит слабо как постоянное решение. Но так же присутствует и управление напрямую через локальную сеть. Его и попробуем заюзать. На самом деле, метод имеет существенный минус – облако всё равно требуется для настройки и привязки устройства, но на данный момент это может быть разумный компромисс.

Получение ключей

Первым делом, надо получить авторизацию данного устройства. Есть два способа:

Я использовал второй метод – зарегистрировался и подключил свою копию прилки SmartLife. Инструкция выглядит довольно запутанной, но на деле всё просто. Единственный нюанс – выбирайте все дата-центры которые предложат, если выбрать какой-то один, то в случае несовпадения – привязка приложения будет вываливаться с невразумительной ошибкой.

Последовательность такая (выдержка из оригинальной инструкции):

  • Create a new account on iot.tuya.com and make sure you are logged in. Select United States as your country when signing up. This seems to skip a required verify step.
  • Go to Cloud -> Development in the left nav drawer. If you haven’t already, you will need to “purchase” the Trial Plan before you can proceed with this step. You will not have to add any form of payment, and the purchase is of no charge. Once in the Projects tab, click “Create”. Make sure you select “Smart Home” for both the “Industry” field and the development method. Select your country of use in the for the location access option, and feel free to skip the services option in the next window. After you’ve created a new project, click into it. The “Access ID/Client ID” and “Access Secret/Client Secret” are the API Key and API Secret values need in step 7.
  • Go to Cloud -> Development -> “MyProject” -> Service API -> “Go to authorize”. “Select API” > click subscribe on “IoT Core”, “Authorization”, and “Smart Home Scene Linkage” in the dropdown. Click subscribe again on every service (also check your PopUp blocker). Click “basic edition” and “buy now” (basic edition is free). Check if the 3 services are listed under Cloud -> Projects -> “MyProject” -> API. If not, click “Add Authorization” and select them.
  • Go to Cloud -> Development and click the project you created earlier. Then click the “Devices” tab. Click the “Link Tuya App account” tab, and select the right data center in the upper right dropdown (eg Western America).
  • Click “Add App Account” and scan the QR code from your smart phone/tablet app by going to the ‘Me’ tab in the app, and tapping a QR code / Scan button in the upper right. Your account will now be linked.
  • On the command line, run tuya-cli wizard. It will prompt you for required information, and will then list out all your device names, IDs, and keys for use with TuyAPI. Copy and save this information to a safe place for later reference.

Пройдя инструкцию, имеем ключи:

$ cat /srv/openhab-data/conf/tuya-mqtt/devices.conf

[
  {
    name: 'SZ Curtain',
    id: '99754106633f94d350db34d548d6091a',
    key: '7f55a0ed8b021',
    version: '3.3',
    ip: '192.168.0.122'
  }
]

Этого уже достаточно для интеграции. Обратите внимание, что если удалить и заново добавить устройство, то ключи будут другие!

Обязательно выделяем статический IP-адрес и версию протокола 3.3.

Tuya <-> MQTT

Теперь можно настроить и запустить прокси-сервис локально, который будет подключаться к устройству и проксировать его в MQTT шину.

Переходим на Github TheAgentK/tuya-mqtt и следуем инструкциям. Я использую docker-compose для управления сервисами на серверу умного дома, поэтому я подготовил compose-файл и конфиг для самого сервиса. Конфиг устройства приведен выше.

$ cat /srv/openhab-data/conf/tuya-mqtt/config.json

{
    "host": "Openhab-mosquitto",
    "port": 1883,
    "topic": "tuya/",
    "mqtt_user": "user",
    "mqtt_pass": "password"
}

После запуска видим что сервис работает и устройство подключено и появилось на шине MQTT.

tuya-mqtt:info Connection established to MQTT server
tuya-mqtt:tuyapi Search for device id 99754106633f94d350db34d548d6091a
tuya-mqtt:tuyapi Found device id 99754106633f94d350db34d548d6091a
tuya-mqtt:tuyapi Received JSON data from device 99754106633f94d350db34d548d6091a -> {"1":"close","2":91,"3":90,"5":false,"7":"opening","10":0}
tuya-mqtt:tuyapi Connected to device SZ Curtain (192.168.0.122, 99754106633f94d350db34d548d6091a, 7f55a0ed8b021)
tuya-mqtt:tuyapi Received JSON data from device 99754106633f94d350db34d548d6091a -> {"1":"close","2":91,"3":90,"5":false,"7":"opening","10":0}
tuya-mqtt:state MQTT DPS JSON: tuya/sz_curtain/dps/state ->  {"1":"close","2":91,"3":90,"5":false,"7":"opening","10":0}
tuya-mqtt:state MQTT DPS1: tuya/sz_curtain/dps/1/state ->  close
tuya-mqtt:state MQTT DPS2: tuya/sz_curtain/dps/2/state ->  91
tuya-mqtt:state MQTT DPS3: tuya/sz_curtain/dps/3/state ->  90
tuya-mqtt:state MQTT DPS5: tuya/sz_curtain/dps/5/state ->  false
tuya-mqtt:state MQTT DPS7: tuya/sz_curtain/dps/7/state ->  opening
tuya-mqtt:state MQTT DPS10: tuya/sz_curtain/dps/10/state ->  0

И появилась первая информация по каналам. Дальше всё просто 🙂 Я немного протупил, думал что канал №2 он для чтения и установки значения (типично для Zigbee устройств), но выяснилось что канал №2 – только для команды положения, канал №3 – репортит текущее положение. Канал №1 принимает разовую команду – open / close / stop.

tuya-mqtt:tuyapi Set device 99754106633f94d350db34d548d6091a -> {"dps":"1","set":"open"}
tuya-mqtt:error Timeout waiting for status response from device id: 99754106633f94d350db34d548d6091a
tuya-mqtt:error Error connecting to device id 99754106633f94d350db34d548d6091a...retry in 10 seconds.
tuya-mqtt:tuyapi Received JSON data from device 99754106633f94d350db34d548d6091a -> {"3":0}
tuya-mqtt:state MQTT DPS JSON: tuya/sz_curtain/dps/state ->  {"3":0}
tuya-mqtt:state MQTT DPS3: tuya/sz_curtain/dps/3/state ->  0

Интересно, что сервис постоянно жалуется на таймауты команд, но тем не менее, всё работает отлично. По всей видимости, устройство не отвечает пока не завершит команду (а она занимает время, пока щтора движется). Команды принимаются, положение штор репортится как надо. Интересно, что репорт команды всегда округляется до 10, видимо лучше точность не позволяет алгоритм определения. Делаем Thing в OpenHAB:

// Zemismart WiFi Curtain Motor Tuya Smart Life
// https://www.aliexpress.com/item/4000695814463.html
Thing mqtt:topic:openhab:sz-curtain (mqtt:broker:openhab) {
	Channels:
        // Device channels
        // 1 : command general(open, close, stop)
        // 2 : command in % open
        // 3 : current position status

        // Command
        // Recieves number from channel 3 to "reset" command status
		Type string : command  [ commandTopic="tuya/sz_curtain/dps/1/command", stateTopic="tuya/sz_curtain/dps/3/state" ]
        // Position
        // Channel 2 - command, 3 - current position
		Type dimmer : position  [ commandTopic="tuya/sz_curtain/dps/2/command", stateTopic="tuya/sz_curtain/dps/3/state", min=0, max=100 ]
}

Данный код создаёт Generic mqtt thing, у которой настроено два канала – текстовый command (open/close/stop) и диммер position, который принимает и сообщает текущую позицию в процентах.

Вот и всё! Теперь у нас есть объект в общей системе, который принимает команды и репортит статус, как любой другой. Можно воротить любые правила или логику, на какую хватит фантазии.

Шторы в общей панели управления Умным домом, закрыты на 70%

Автоматизация

Теперь можно писать правила. У меня пока что хватило фантазии на три основных:

  • Открытие по событию Civil Dawn – когда Солнце достигает 6° за горизонтом перед рассветом
  • Закрытие по событию Set – когда Солнце достигает 0° к горизонту при закате
  • Закрытие по команде сцены «я иду спать» по кнопке в спальне – она так же выключет ненужный свет и включает неяркое декоративное освещение

Исходный код астрономических правил: Github: petrows/smarthome-openhab/rules/astro.rules

Исходный код сцены: Github: petrows/smarthome-openhab/rules/remotes_switches.rules#L291

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

Альтернативный пульт

Так как оригинальный пульт мне совсем не нравится, у кровати я приделал кнопку-диммер Ikea. Она намного удобнее и не имеет проблем с нажатиями на ощупь, т.к. не имеет ничего лишнего.

Иконки на кнопке имеют не те символы – она есть диммер для лампочек, но у меня есть изолента и маркер 🙂 Пока что оставил так. Вообще, у Икеи есть специальная кнопка именно для штор, но её просто так не достать – об этом напишу отдельный пост. Поэтому сейчас логика эмулируется программой:

  • Короткое нажатие просто открывает или закрывает полностью
  • Длинное нажатие начинает движение в нужную сторону, при отпускании отправляется команда стоп. Таким образом можно приоткрыть насколько нужно

Код правила очень простой:

rule "SZ remote curtain"
when
    Channel "mqtt:topic:openhab:sz_curtain_remote:action" triggered
then
	var state = receivedEvent
    switch(state) {
        // Single action, just full open/close
        case "on": {
            sz_curtain_switch.sendCommand("open")
        }
        case "off": {
            sz_curtain_switch.sendCommand("close")
        }
        // Emulation of IKEA E1766 (curtain switch)
        // Hold up/down to start move, release to stop
        case "brightness_move_up": {
            sz_curtain_switch.sendCommand("open")
        }
        case "brightness_move_down": {
            sz_curtain_switch.sendCommand("close")
        }
        case "brightness_stop": {
            sz_curtain_switch.sendCommand("stop")
        }
    }
end

Таким образом, имеем и удобную кнопочку и автоматизацию.

Такая вот получилась интеграция. Работает отлично – статус репортится корректно, при управлении вручную, с пульта, с родного приложения и через OpenHab.

Leave a Reply

Your email address will not be published. Required fields are marked *