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
-
Подготовка скрипта
- Склонируйте репозиторий в удобное место - главное, чтобы оно было доступно через http (а лучше - https)
- Переименуйте файл
settings.sample.php
вsettings.php
- Создайте базу данных, откройте settings.php и впишите туда настройки базы данных (массив
$_DATABASE
) - Импортируйте SQL-файл структуры в БД
- Отредактируйте переменную
$_PASSWORD
и впишите туда свой пароль для доступа к сайту (он же будет ключом для входящих ifttt-запросов) - Выдайте web-серверу права на запись в файл
actions.log
. Это можно сделать черезchmod
(не рекомендуется), либо просто сменив владельца файла черезchown
-
Подготовка Telegram-бота
- Создайте нового бота через
@botfather
, получите его API-ключ - Создайте новую группу (или используйте существующую). Можно использовать личные сообщения с ботом
- Узнайте ID группы. Как вариант, можно добавить моего бота
@ADARefactorBot
в чат и написать команду/whoami
(бота потом из чата лучше удалить, вы же не хотите, чтобы я за вами следил?). Если вы хотите использовать личные сообщения со своим ботом, ту же самую команду напишите в личные сообщения - Откройте файл
settings.php
и впишите в настройки API-ключ бота и ID чата (массив$_TG
)
- Создайте нового бота через
-
Заполните сайт
- Создайте требуемые комнаты
- Добавьте оборудование. Каждый канал == одно устройство, т.е., например, выключатели T2 или Sonoff Dual будут работать как 2 устройства, а выключатель T3 - как 3 устройства. Обратите внимание на пункт "Короткое название". Оно должно быть уникальным и не содержать в себе ничего, кроме букв латинского алфавита и цифр. В дальнейшем оно будет использоваться для обращения к серверам IFTTT и для получения вебхуков от них же.
- Датчики добавляются через отдельное меню. Короткое название так же должен быть уникальным (но может совпадать с каким-либо реле). На текущий момент есть поддержка только простых датчиков, из вариаций функционала - присылать или не присылать уведомление о простом срабатывании в Telegram.
-
Первичная настройка IFTTT
- Создайте учетную запись на https://ifttt.com (разумеется, можно использовать существующую)
- Подключите сервис ewelink - https://ifttt.com/ewelink , пройдите процедуру авторизации
- Подключите сервис Maker Webhook - https://ifttt.com/maker_webhooks, в верхнем правом углу нажмите кнопку "Documentation"
- На открывшейся странице скопируйте ключ - Your key is: ***
- Впишите его в
settings.php
(массив$_IFTTT
)
-
Создание апплетов (для выключателей, реле и т.д.)
-
На каждое устройство (в т.ч. на каждый канал в случае с многоканальными устройствами) необходимо создать 4 апплета на ifttt:
- Включение (через кнопку на самом устройстве или через приложение ewelink)
- Выключение (через кнопку на самом устройстве или через приложение ewelink)
- Включение (с сайта)
- Выключение (с сайта)
-
Порядок настройки неважен, но я рекомендую начать с первых двух:
- Открыть меню создания апплетов - https://ifttt.com/create и нажать на "+" после слова IF
- В поиске найти eWeLink Smart Home и выбрать нужный тип устройства:
- Sonoff Basic, Sonoff Slampher - "1 Channel Switch turned on or off"
- Sonoff Dual, Sonoff Touch T2 - "1 Channel Switch turned on or off"
- Sonoff T3 - "3 Channel Switch turned on or off"
- В случае использования каких-то других устройств попробуйте найти их самостоятельно (к сожалению, я использую только перечисленные выше)
- Выберите нужное устройство из списка и выберите тип события (on или off). В случае с многоканальными устройствами необходимо так же выбрать channel
- Нажмите "+" слева от слова "THAT"
- Найдите в поиске Webhooks и далее в нем "Make a web request"
- Укажите URL-адрес вида:
https://yoursite.ru/address/to/process.php?key=%KEY%&switch=%SWITCH%&action=%ACTION%
где%KEY%
- пароль для доступа, он содержится в переменной$_PASSWORD
%SWITCH%
- краткое название устройства (см пункт 2.2)%ACTION%
- тип события (on или off)
- Выберите Method - GET, Content-type - text/plain, поле Body оставьте пустым
- Укажите любое имя для апплета (оно не будет нигде фигурировать, можно оставить стандартное). Если оставить тумблер Receive notifications when this Applet runs включенным, будут приходить уведомления о каждом событии (например, в приложение ifttt на телефон). Опять же, ни на что не влияет
- Создайте аналогичный апплет на другое событие (если начали с включения, то сделайте выключение, и наоборот)
- Создайте аналогичную пару апплетов на каждый канал каждого устройства
- После создания апплета на ваш вебхук, скорее всего, придет событие с текущим состоянием устройства (т.е. как будто бы устройство было только что включено или выключено). Если на момент создания устройства оно было не в сети, событие будет проигнорировано и не записано в базу, в Telegram придет соответствующее сообщение)
-
Для включения и выключения с сайта необходимо настроить "обратные" апплеты (т.е. в пункте IF - webhooks, в поле THAT - ewelink)
- Открыть меню создания апплетов - https://ifttt.com/create и нажать на "+" после слова IF
- В поиске найти Webhooks и далее выбрать Receive a web request
- Ввести Event Name. Оно складывается следующим образом: ewelink_
%SWITCH%
_%ACTION%
где%SWITCH%
- краткое название устройства (см пункт 2.2)%ACTION%
- тип события (on или off) - Нажмите "+" слева от слова "THAT"
- В поиске найти eWeLink Smart Home и выбрать нужный тип устройства:
- Sonoff Basic, Sonoff Slampher - "1 Channel Switch turned on or off"
- Sonoff Dual, Sonoff Touch T2 - "1 Channel Switch turned on or off"
- Sonoff T3 - "3 Channel Switch turned on or off"
- В случае использования каких-то других устройств попробуйте найти их самостоятельно (к сожалению, я использую только перечисленные выше)
- Выберите нужное устройство из списка и выберите тип события (on или off). В случае с многоканальными устройствами необходимо так же выбрать channel
- Укажите любое имя для апплета (оно не будет нигде фигурировать, можно оставить стандартное). Если оставить тумблер Receive notifications when this Applet runs включенным, будут приходить уведомления о каждом событии (например, в приложение ifttt на телефон). Опять же, ни на что не влияет
- Создайте аналогичный апплет на другое событие (если начали с включения, то сделайте выключение, и наоборот)
- Создайте аналогичную пару апплетов на каждый канал каждого устройства
-
-
Создание апплетов (для датчиков, сенсоров и т.д.)
-
Порядок добавления аналогичен добавлению реле, однако не требуется создавать два правила на каждое устройство, т.к. у датчиков нет никакой обратной связи и смены состояния - мы можем лишь фиксировать его срабатывание
-
Порядок настройки неважен, но я рекомендую начать с IFTTT:
- Открыть меню создания апплетов - https://ifttt.com/create и нажать на "+" после слова IF
- В поиске найти eWeLink Smart Home и выбрать RF Bridge Alarm activated
- Выбрать нужный датчик, срабатывание которого мы будем фиксировать
- Нажмите "+" слева от слова "THAT"
- В поиске найти Webhooks и далее выбрать Receive a web request
- Укажите URL-адрес вида:
https://yoursite.ru/address/to/process_sensors.php?key=%KEY%&sensor=%SENSOR%
где%KEY%
- пароль для доступа, он содержится в переменной$_PASSWORD
%SWITCH%
- краткое название устройства (см пункт 2.3)
- Выберите Method - GET, Content-type - text/plain, поле Body оставьте пустым
- Укажите любое имя для апплета (оно не будет нигде фигурировать, можно оставить стандартное). Если оставить тумблер Receive notifications when this Applet runs включенным, будут приходить уведомления о каждом событии (например, в приложение ifttt на телефон). Опять же, ни на что не влияет
-
-
В скрипте учтена вероятность "задвоения" событий реле. Как она может проявиться:
- IFTTT спонтанно присылает событие с последним состоянием, спустя несколько минут после этого события
- IFTTT дважды посылает запрос на вебхук с состоянием
- IFTTT не посылает произошедшее событие, но шлет следующее, допустим, включение. Получается два одинаковых события подряд - система игнорирует последнее. Это может вызвать погрешности в статистике использования, но, к сожалению, я тут бессилен. UPD: за полтора года использования сбоев не замечено