Терморегулятор Terneo SX в Apple HomeKit с помощью Node-Red

24 марта 2020, 06:29

Введение

В данной статье мы детально разберем как управлять термостатом Terneo SX через HomeKit, используя при этом Node-Red.
Написать данную статью меня сподвигло желание поделиться результатом моей работы. Также я бы хотел призвать сообщество оптимизировать данный флоу, так как я только начал познавать азы Node-Red и уверен, что многое можно сделать проще.

Требования

Для интеграции терморегулятора Terneo SX в HomeKit нам потребуется следующее:

Подготовка

Получение access token'a

Для работы с локальным API нам нужно получить auth-key из облачного API. Сделать это можно с помощью POST запроса на URL - https://my.hmarex.com/api/login/ с передачей вашего логина (email) и пароля от облака Terneo в формате JSON.

Данный флоу будет выглядеть так:

    После применения изменений и запуска данного флоу в debug-панели, вы сможете увидеть ответ сервера:

      Сохраните где-либо данный access token, он нам пригодится в дальнейшем.

      Снятие блокировок на работу с API

      В устройствах Terneo по умолчанию стоит блокировка на управление через локальное API. О том, как ее отключить, замечательно написано в документации к API:

      Отключается блокировка через меню устройства - параметр bLc надо изменить на oFF

      В 2-х кнопочных устройствах для этого надо удерживать кнопку меню до надписи bLc, отпустить и выбрать oFF

      В 3-х и более кнопочных - кратковременно нажимать на среднюю кнопку до надписи bLc, после этого кнопками выбора изменить на oFF.

        HomeKit сервис Thermostat

        Чтобы интегрировать терморегулятор в HomeKit, нам нужно понять, как работает сервис Thermostat в HomeKit. В нашем случае используется только нагревание (без охлаждения). Исходя из примера мы понимаем, что термостат получает от терморегулятора несколько параметров:

        • текущую температуру;
        • температуру уставки (ту, которую мы выставляем на терморегуляторе);
        • текущий режим (включен/выключен).

        В свою очередь, нода термостата отправляет следующие параметры на терморегулятор:

        • установка температуры уставки;
        • установка режима (включен/выключен).

        Получается, что нам нужно получить статус и параметры с терморегулятора, а также отправить на терморегулятор выставленные в HomeKit'e параметры.

          Непосредственно flow

          Именно так выглядит мой flow для Node-Red. 

          Слева от HomeKit-ноды Terneo происходит сбор данных с терморегулятора. А также преобразование значений в HomeKit формат. В правой части мы обрабатываем полученные от HomeKit команды и передаем их терморегулятору с помощью http-запроса к API.

          Мы производим два запроса к API терморегулятора. Почему два? Потому что, к сожалению, нам требуется информация из двух разных запросов к АПИ. Рассмотрим детально все ноды.

            Нода Запрос телеметрии

            {
                "cmd": 4
            }

            Inject-нода. Запускается с задержкой в 1 секунду и повторяется с интервалом 1 минуту. В ответе на данный запрос мы получим массив данных, в котором нас интересуют только значения ключей sn, f.0t.1 и t.5.

              {
                  "sn": "08000A000C43504735323620000159",
                  "t.0": "533",
                  "t.1": "387",
                  "t.5": "432",
                  "m.0": "0",
                  "m.1": "3",
                  "m.2": "96",
                  "m.3": "0",
                  "f.1": "0",
                  "f.2": "0",
                  "f.3": "0",
                  "f.4": "0",
                  "f.7": "0",
                  "f.8": "0",
                  "f.13": "0",
                  "f.14": "0",
                  "f.0": "0",
                  "f.9": "0",
                  "f.10": "0",
                  "f.11": "0",
                  "f.12": "0",
                  "o.0": "-75",
                  "o.1": "6",
                  "f.15": "0",
                  "par.26": "45",
                  "par.27": "5"
                  }

              "sn" - это серийный номер терморегулятора. Его требуется указывать в запросах на изменение параметров.

              "f.0" - данный параметр показывает включена ли нагрузка. Если по простому то греет ли в данный момент пол. 

              "t.1" - это текущая температура с датчика терморегулятора. Но она отдается, умноженная на 16. Чтобы получить температуру в градусах Цельсия, нужно разделить данное число на 16. В данном примере получим, что сейчас температура теплого пола 24.18℃.

              "t.5" - данный параметр отдает значение температуры уставки. В нашем случае задана температура 432/16=27℃.

              Но из данного запроса мы не можем узнать, включен ли сейчас терморегулятор и нагрев соответственно, поэтому нам требуется выполнить еще один запрос.

                Нода Запрос параметров

                {
                    "cmd": 1
                }

                Inject-нода запускается с задержкой 30 секунд и повторяется с интервалом в 1 минуту. Задержка в 30 секунд обусловлена тем, чтобы запрос не пересекался с запросом телеметрии. В ответе мы получим JSON, в котором нам интересен 26-ой ключ массива "par"(последний), а именно [125,7,"1"]. Данный параметр отображает, включен или нет терморегулятор. Значение "1" означает, что терморегулятор выключен и нагрев не осуществляется. Если терморегулятор включен, то значение будет "0".

                  {
                      "sn":"08000A000C43504735323620000159",
                      "par":[[23,2,"6"],
                      [114,7,"0"],
                      [115,7,"0"],
                      [0,6,"0"],
                      [1,6,"0"],
                      [2,2,"1"],
                      [3,2,"0"],
                      [4,1,"30"],
                      [5,1,"27"],
                      [6,1,"25"],
                      [7,1,"5"],
                      [18,2,"2"],
                      [19,2,"10"],
                      [21,1,"0"],
                      [25,2,"15"],
                      [26,1,"45"],
                      [27,1,"5"],
                      [28,2,"16"],
                      [29,1,"26"],
                      [17,4,"80"],
                      [116,7,"0"],
                      [117,7,"0"],
                      [118,7,"0"],
                      [121,7,"0"],
                      [122,7,"0"],
                      [124,7,"0"],
                      [125,7,"1"]]
                  }

                  Нода http-request

                  Таких нод в нашем флоу 4 штуки и все они одинаковые. Используется метод POST и URL - http://IP_адрес_терморегулятора/api.cgi

                  Для удобства отображения выбран вывод ответа в виде parsed JSON.

                  Нода функции из ветки телеметрии

                  //Получаем текущую температуру в градусах Цельсия
                  Current = Number(msg.payload["t.1"]/16); 
                  //Округляем текущую температуру до 1 десятичного знака
                  Current = Math.round(Current*10)/10      
                  //Получаем температуру уставки в градусах Цельсия
                  Target = Number(msg.payload["t.5"]/16);  
                  //Округляем температуру уставки до 1 десятичного знака
                  Target = Math.round(Target*10)/10  
                  //Получаем текущий статус нагрузки
                  CurrentState = Number(msg.payload["f.0"])
                  //Приводим значения температур к виду который примет HomeKit-нода и записываем их в msg.payload
                  msg.payload = {"CurrentTemperature":Current,"TargetTemperature":Target, "CurrentHeatingCoolingState":CurrentState}  //Приводим значения температур к виду который примет HomeKit-нода и записываем их в msg.payload
                  return msg;

                  Данная нода получает данные из запроса к API, делает некоторя е преобразования (описано в комментариях в коде) и подготавливает данные для HomeKit ноды.

                  Нода функции из ветки параметров

                  //Записываем значение 26-го параметра в переменную
                  State = Number(msg.payload.par[26][2]);  
                  //Условие при котором значение 0 меняется на значение 1 и наоборот
                  if (State == 1) {   
                    State = 0;
                  } else {
                    State = 1;
                  }
                  //Подготовка данных для передачи в HomeKit-ноду
                  msg.payload = {"TargetHeatingCoolingState":State}
                  return msg;
                  

                  Данная нода получает значение "1", если терморегулятор выключен. Но в HomeKit ноде значение "1" означает, что терморегулятор включен. Поэтому в функции используем условие и меняем значение на противоположные.

                  Нода HomeKit

                  В настройках данной ноды выставляем Service - Thermostat, создаете или выбираете ранее созданный Bridge. 

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

                  Значения 0 и 1 - это диапазон возможных статусов работы нашего термостата. Статус 0 означает, что термостат выключен, а статус 1 означает нагревание.


                  Нода Switch

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

                  В нашем случае, нода получает либо режим работы термостата TargetHeatingCoolingState, либо температуру уставки TargetTemperature.



                  Нода функции для включения/выключения терморегулятора

                  //Условие при котором меняем 1 на 0 и наоборот
                  if (msg.payload.TargetHeatingCoolingState == 1) {  
                    msg.payload.TargetHeatingCoolingState = 0;
                  } else {
                    msg.payload.TargetHeatingCoolingState = 1;
                  }
                  //Записываем значение в переменную v
                  v = String(msg.payload.TargetHeatingCoolingState)   
                  //Создаем JSON из серийного номера терморегулятора, access-token'a полученного из облака Terneo и параметра на включение/выключение и записываем его в msg.payload
                  msg.payload = {"sn":"08000A000C43504735323620000159","auth":"76c51a6625d1b474d54fad768002caddcd56dd1c","par":[[125,7,v]]};  
                  return msg;
                  

                  В данной функции мы преобразуем значение, полученное из Homekit ноды, в значение, которое примет API терморегулятора. Функция выходит из первого (верхнего) выхода ноды Switch.

                  Также мы формируем JSON, в котором прописываем следующие ключи:

                  • sn - серийный номер терморегулятора, который можно получить из вывода ноды http-request.
                  • auth - это тот самый access-token, который я просил вас записать где-нибудь в подготовительной части.
                  • par - список параметров, которые мы передаем терморегулятору. В данном случае только один параметр - на включение/выключение.

                  Далее с помощью ноды http-reaquest отправляем данные через API непосредственно терморегулятору.

                  Нода функции для передачи температуры уставки терморегулятору

                  //Записываем полученное из Homekit значение температуры уставки в переменную v
                  v = String(msg.payload.TargetTemperature)
                  //Создаем JSON из серийного номера терморегулятора, access-token'a полученного из облака Terneo и параметра температуры уставки и записываем его в msg.payload
                  msg.payload = {"sn":"08000A000C43504735323620000159","auth":"76c51a6625d1b474d54fad768002caddcd56dd1c","par":[[5,1,v]]};
                  return msg;
                  

                  В данной функции мы формируем JSON для отправки терморегулятору.
                  Функция выходит из второго (нижнего) выхода ноды Switch.

                  Используются те же ключи, что и в функции включения/выключения:

                  • sn - серийный номер терморегулятора, который можно получить из вывода ноды http-request.
                  • auth - это тот самый access-token, который я просил вас записать где-нибудь в подготовительной части.
                  • par - список параметров, которые мы передаем терморегулятору. В данном случае только один параметр - на изменение температуры уставки.

                  Далее с помощью ноды http-request отправляем данные через API непосредственно терморегулятору.

                  Демонстрация работы

                  В видео ниже я продемонстрировал управление терморегулятором Terneo SX через HomeKit. Справа в кадре имеется панель облака my.terneo.ru, в которой виден результат управления. Данные в облаке обновляются с некоторой задержкой. На самом терморегуляторе задержка отсутствует.

                  Исходник 

                  Заключение

                  Я буду очень рад, если кому-то пригодится данный флоу. Я постарался описать все максимально подробно, чтобы данная статья могла помочь кому-то самостоятельно создать флоу к похожему девайсу. Приглашаю в комментарии спецов по Node-Red и JavaScript для коллективной оптимизации и исправления данного флоу, а если кто-то захочет помочь мне с созданием отдельной ноды для данного терморегулятора, то я буду безмерно благодарен. Пишите в телеграм).

                  P.S.: Моя первая статья на портале, не судите строго =)


                  Все новости мира умных домов - t.me/SprutAI_News или Instagram
                  Остались вопросы? Мы в Telegram - @Soprut

                  Хочешь умный дом но нет времени разбираться?
                  Посмотри примеры работ и выбери себе интегратора.
                  1. Дмитрий Батюшин (ReD)
                    Дмитрий Батюшин (ReD) 4 месяца назад

                    Отличная статья =) хорошо когда на модерации нечего править 

                    • Сергей Кутовой (Mustik)
                      Сергей Кутовой (Mustik) 4 месяца назад

                      Спасибо) Прочитал все гайды как писать и оформлять статьи. Постарался выполнить все требования)

                  2. Антон Км (wiistriker)
                    Антон Км (wiistriker) 4 месяца назад

                    Для работы с локальным API не требуется никакого ключа

                    https://github.com/wiistriker/...

                  3. Кирилл Григоров (kyruxa)
                    Кирилл Григоров (kyruxa) 4 месяца назад

                    Статья применима к модели Terneo AX?

                  4. Алексей Трошин (catch)
                    Алексей Трошин (catch) 4 месяца назад

                    Сергей, спасибо! Это просто блеск! Давно откладывал задачку затянуть в HomeKit эти терморегуляторы. Побежал реализовывать! 

                  5. Дмитрий Гребнев (SidZZ)
                    Дмитрий Гребнев (SidZZ) 4 месяца назад

                    Спасибо за проделанный труд!

                  6. Максим Олейник (profx5015)
                    Максим Олейник (profx5015) 3 месяца назад
                    При использовании, как интеграция homekit устройства в Hassio, нет возможности выключить терморегулятор, работает только изменение температуры. В чем может быть проблема?

                  К списку статей

                  Устройства в материале

                  Терморегулятор Terneo SX

                  Производитель: Terneo
                  Заказать на:

                  Скидки для сообщества

                  УЮТНЫЙ ДОМ

                  +7 495 797-21-74
                  Промокод:
                  SPRUT
                  Размер скидки:
                  5%

                  Z-Wave Ukraine

                  +380 68 641 9670
                  Промокод:
                  Sprut-UA
                  Размер скидки:
                  15%

                  Интернет-магазин yourhomekit.ru

                  +7 914 550-51-11
                  Промокод:
                  SPRUT-BLG
                  Размер скидки:
                  8%
                  Cамый большой ассортимент в России аксессуаров Apple HomeKit

                  Тематические чаты

                  Похожие статьи

                  09 ноября 2018, 20:54
                  Кейс создания умного дома без каких либо прокладок в виде Raspberry pi
                  04 сентября 2018, 12:14
                  Интеграция RGB ленты на ESP8266 с прошивкой tasmota в систему HomeBridge (HomeKit)
                  15 октября 2018, 09:05
                  Прошивка для Sonoff c нативным HomeKit
                  15 ноября 2018, 09:42
                  Способы автоматизации механических ворот
                  27 октября 2018, 12:20
                  Нативный Термостат для котла на ESP8266 с поддержкой Apple HomeKit
                  15 ноября 2018, 13:11
                  Xiaomi Mi Remote 360 добавляем Apple HomeKit
                  01 октября 2018, 07:43
                  Нативный HomeKit на ESP8266
                  02 июля 2020, 07:24
                  Я хочу поделиться своей разработкой: "умным открывателем пластикового окна". В статье вы найдете все необходимое, чтобы повторить проект и изготовить собственный привод для открывания окна с использованием штатной фурнитуры окна.
                  28 августа 2018, 09:48
                  От голого Raspbian до веб-интерфейса homebridge за четыре команды в терминале.
                  02 октября 2018, 18:41
                  Установка SDK для компиляции прошивок под HomeKit