Skip to content

Webhook, Telegram integration & management Sonoff Ewelink devices through web

Notifications You must be signed in to change notification settings

D13410N3/sonoff-ewelink-php-webhook

Repository files navigation

Система управления устройствами Sonoff через web и их мониторинг

UPD 11.07.2020: Sonoff (ewelink) добавил премиум-аккаунты. Из-за введения на IFTTT платы с разработчиков платформ, данная система будет работать только на платных аккаунтах (стоимость - от 5 до 10 долларов в год).

UPD-2: Sonoff почему-то не стал списывать деньги за второй год использования - но теперь на бесплатном аккаунте IFTTT возможно лишь 5 бесплатных приложений, больше - требуется PRO аккаунт стоимостью 5 долларов в год

UPD-3: Все старые "костыльные" API постепенно перестают работать. Появилось официальное, но, к сожалению, с очень ограниченным списком устройств - http://developers.sonoff.tech/sonoff-diy-mode-api-protocol.html

Зачем:

  • У Sonoff-устройств нет публичного API для разработки своих приложений. Единственный способ полноценно перевести Sonoff на полное управление через свое приложение - перевести их в режим DIY, что вызывает определенные сложности (требуется разборка устройства и танцы с бубном)
  • Данный скрипт работает на основе IFTTT, с которым интеграция у Sonoff есть по умолчанию. Имеющийся функционал позволяет выполнять базовые функции (включение и выключение) устройства, помимо этого имея весьма удобный функционал
  • Добавление каких-то иных "плюшек" в систему возможно в будущем, но ничего обещать не буду , но можете слать реквесты :)

Функционал:

  • Просмотр, изменение, удаление: комнат, устройств
  • Просмотр полной статистики использования (включений, выключений, общее время работы, среднее время работы) за все время, на указанную дату
  • Просмотр событий
  • Включение / выключение устройств через сайт
  • При наличии Sonoff RF Bridge существует возможность добавления простых датчиков, которые работают на частоте 433.92 МГц и умеют присылать только одно событие - срабатывание датчика (пожарные сигнализации, датчики открытия окон и дверей, утечки воды, движения и т.д.). На текущий момент функционал ограничивается ведением истории событий и оповещением в Telegram, в дальнейшем представлю примеры автоматизации на основе алгоритмов.
  • Frontend - Bootstrap 4.4.1. Удобное использование и с компьютера, и с мобильных устройств.

Для работы требуется:

  • PHP 5 (PHP 7 подойдет только при условии самостоятельной компиляции legacy-библиотеки mysql.so либо если вы самостоятельно перепишите исходники на mysqli/pdo/etc.)
  • MariaDB / MySQL. Обратите внимание - для разработки использовался движок Aria, если вы используете обычный MySQL и у вас нет Aria - перепишите sql-дамп на MyISAM / InnoDB / etc.
  • Telegram-бот и доступ к его API-ключу
  • Чат в Telegram для уведомлений о включении
  • Учетная запись на IFTTT.com

Порядок работы

  1. Подготовка скрипта

    1. Склонируйте репозиторий в удобное место - главное, чтобы оно было доступно через http (а лучше - https)
    2. Переименуйте файл settings.sample.php в settings.php
    3. Создайте базу данных, откройте settings.php и впишите туда настройки базы данных (массив $_DATABASE)
    4. Импортируйте SQL-файл структуры в БД
    5. Отредактируйте переменную $_PASSWORD и впишите туда свой пароль для доступа к сайту (он же будет ключом для входящих ifttt-запросов)
    6. Выдайте web-серверу права на запись в файл actions.log. Это можно сделать через chmod (не рекомендуется), либо просто сменив владельца файла через chown
  2. Подготовка Telegram-бота

    1. Создайте нового бота через @botfather, получите его API-ключ
    2. Создайте новую группу (или используйте существующую). Можно использовать личные сообщения с ботом
    3. Узнайте ID группы. Как вариант, можно добавить моего бота @ADARefactorBot в чат и написать команду /whoami (бота потом из чата лучше удалить, вы же не хотите, чтобы я за вами следил?). Если вы хотите использовать личные сообщения со своим ботом, ту же самую команду напишите в личные сообщения
    4. Откройте файл settings.php и впишите в настройки API-ключ бота и ID чата (массив $_TG)
  3. Заполните сайт

    1. Создайте требуемые комнаты
    2. Добавьте оборудование. Каждый канал == одно устройство, т.е., например, выключатели T2 или Sonoff Dual будут работать как 2 устройства, а выключатель T3 - как 3 устройства. Обратите внимание на пункт "Короткое название". Оно должно быть уникальным и не содержать в себе ничего, кроме букв латинского алфавита и цифр. В дальнейшем оно будет использоваться для обращения к серверам IFTTT и для получения вебхуков от них же.
    3. Датчики добавляются через отдельное меню. Короткое название так же должен быть уникальным (но может совпадать с каким-либо реле). На текущий момент есть поддержка только простых датчиков, из вариаций функционала - присылать или не присылать уведомление о простом срабатывании в Telegram.
  4. Первичная настройка IFTTT

    1. Создайте учетную запись на https://ifttt.com (разумеется, можно использовать существующую)
    2. Подключите сервис ewelink - https://ifttt.com/ewelink , пройдите процедуру авторизации
    3. Подключите сервис Maker Webhook - https://ifttt.com/maker_webhooks, в верхнем правом углу нажмите кнопку "Documentation"
    4. На открывшейся странице скопируйте ключ - Your key is: ***
    5. Впишите его в settings.php (массив $_IFTTT)
  5. Создание апплетов (для выключателей, реле и т.д.)

    1. На каждое устройство (в т.ч. на каждый канал в случае с многоканальными устройствами) необходимо создать 4 апплета на ifttt:

      1. Включение (через кнопку на самом устройстве или через приложение ewelink)
      2. Выключение (через кнопку на самом устройстве или через приложение ewelink)
      3. Включение (с сайта)
      4. Выключение (с сайта)
    2. Порядок настройки неважен, но я рекомендую начать с первых двух:

      1. Открыть меню создания апплетов - https://ifttt.com/create и нажать на "+" после слова IF
      2. В поиске найти eWeLink Smart Home и выбрать нужный тип устройства:
        1. Sonoff Basic, Sonoff Slampher - "1 Channel Switch turned on or off"
        2. Sonoff Dual, Sonoff Touch T2 - "1 Channel Switch turned on or off"
        3. Sonoff T3 - "3 Channel Switch turned on or off"
        4. В случае использования каких-то других устройств попробуйте найти их самостоятельно (к сожалению, я использую только перечисленные выше)
      3. Выберите нужное устройство из списка и выберите тип события (on или off). В случае с многоканальными устройствами необходимо так же выбрать channel
      4. Нажмите "+" слева от слова "THAT"
      5. Найдите в поиске Webhooks и далее в нем "Make a web request"
      6. Укажите URL-адрес вида: https://yoursite.ru/address/to/process.php?key=%KEY%&switch=%SWITCH%&action=%ACTION% где
        1. %KEY% - пароль для доступа, он содержится в переменной $_PASSWORD
        2. %SWITCH% - краткое название устройства (см пункт 2.2)
        3. %ACTION% - тип события (on или off)
      7. Выберите Method - GET, Content-type - text/plain, поле Body оставьте пустым
      8. Укажите любое имя для апплета (оно не будет нигде фигурировать, можно оставить стандартное). Если оставить тумблер Receive notifications when this Applet runs включенным, будут приходить уведомления о каждом событии (например, в приложение ifttt на телефон). Опять же, ни на что не влияет
      9. Создайте аналогичный апплет на другое событие (если начали с включения, то сделайте выключение, и наоборот)
      10. Создайте аналогичную пару апплетов на каждый канал каждого устройства
      11. После создания апплета на ваш вебхук, скорее всего, придет событие с текущим состоянием устройства (т.е. как будто бы устройство было только что включено или выключено). Если на момент создания устройства оно было не в сети, событие будет проигнорировано и не записано в базу, в Telegram придет соответствующее сообщение)
    3. Для включения и выключения с сайта необходимо настроить "обратные" апплеты (т.е. в пункте IF - webhooks, в поле THAT - ewelink)

      1. Открыть меню создания апплетов - https://ifttt.com/create и нажать на "+" после слова IF
      2. В поиске найти Webhooks и далее выбрать Receive a web request
      3. Ввести Event Name. Оно складывается следующим образом: ewelink_%SWITCH%_%ACTION% где %SWITCH% - краткое название устройства (см пункт 2.2) %ACTION% - тип события (on или off)
      4. Нажмите "+" слева от слова "THAT"
      5. В поиске найти eWeLink Smart Home и выбрать нужный тип устройства:
        1. Sonoff Basic, Sonoff Slampher - "1 Channel Switch turned on or off"
        2. Sonoff Dual, Sonoff Touch T2 - "1 Channel Switch turned on or off"
        3. Sonoff T3 - "3 Channel Switch turned on or off"
        4. В случае использования каких-то других устройств попробуйте найти их самостоятельно (к сожалению, я использую только перечисленные выше)
      6. Выберите нужное устройство из списка и выберите тип события (on или off). В случае с многоканальными устройствами необходимо так же выбрать channel
      7. Укажите любое имя для апплета (оно не будет нигде фигурировать, можно оставить стандартное). Если оставить тумблер Receive notifications when this Applet runs включенным, будут приходить уведомления о каждом событии (например, в приложение ifttt на телефон). Опять же, ни на что не влияет
      8. Создайте аналогичный апплет на другое событие (если начали с включения, то сделайте выключение, и наоборот)
      9. Создайте аналогичную пару апплетов на каждый канал каждого устройства
  6. Создание апплетов (для датчиков, сенсоров и т.д.)

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

    2. Порядок настройки неважен, но я рекомендую начать с IFTTT:

      1. Открыть меню создания апплетов - https://ifttt.com/create и нажать на "+" после слова IF
      2. В поиске найти eWeLink Smart Home и выбрать RF Bridge Alarm activated
      3. Выбрать нужный датчик, срабатывание которого мы будем фиксировать
      4. Нажмите "+" слева от слова "THAT"
      5. В поиске найти Webhooks и далее выбрать Receive a web request
      6. Укажите URL-адрес вида: https://yoursite.ru/address/to/process_sensors.php?key=%KEY%&sensor=%SENSOR% где
        1. %KEY% - пароль для доступа, он содержится в переменной $_PASSWORD
        2. %SWITCH% - краткое название устройства (см пункт 2.3)
      7. Выберите Method - GET, Content-type - text/plain, поле Body оставьте пустым
      8. Укажите любое имя для апплета (оно не будет нигде фигурировать, можно оставить стандартное). Если оставить тумблер Receive notifications when this Applet runs включенным, будут приходить уведомления о каждом событии (например, в приложение ifttt на телефон). Опять же, ни на что не влияет
  7. В скрипте учтена вероятность "задвоения" событий реле. Как она может проявиться:

    1. IFTTT спонтанно присылает событие с последним состоянием, спустя несколько минут после этого события
    2. IFTTT дважды посылает запрос на вебхук с состоянием
    3. IFTTT не посылает произошедшее событие, но шлет следующее, допустим, включение. Получается два одинаковых события подряд - система игнорирует последнее. Это может вызвать погрешности в статистике использования, но, к сожалению, я тут бессилен. UPD: за полтора года использования сбоев не замечено

About

Webhook, Telegram integration & management Sonoff Ewelink devices through web

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published