Пока типичные студии разработки выбивают бюджеты на создание кастомного бэкенда для банального управления реле, прагматичный бизнес собирает автоматизацию из готовых кубиков. Если вы пытались управлять умными розетками или обогревателями Tuya напрямую со смартфона через MacroDroid, то наверняка разбились о суровую реальность: роутеры изолируют Wi-Fi клиентов, а локальный протокол требует сложного шифрования пакетов.
Решение в стиле Block-Fox — бесплатный микро-сервер в Google Apps Script. Смартфон шлет простейший интернет-клик на вашу личную ссылку, а облако Google само берет на себя всю криптографию, генерирует подписи по стандартам Tuya Cloud Sign v2.0 и мгновенно переключает реле. Компьютер для этого держать включенным не нужно, всё работает в режиме 24/7. Минимум кода, ноль затрат.
Блок 1. Добываем API-ключи Tuya
Прежде чем настраивать автоматизацию, нужно получить «паспортные данные» вашей экосистемы. Постарайтесь не запутаться в трех соснах интерфейса разработчиков:
- Перейдите на iot.tuya.com и создайте аккаунт разработчика.
- В панели слева зайдите в Cloud -> Development -> нажмите Create Cloud Project. Имя проекта пишите любое, а в поле Data Center выберите Central Europe Data Center (для СНГ и Европы).
- Внутри проекта перейдите во вкладку Link Tuya App. Нажмите Add App Account и отсканируйте появившийся QR-код через ваше мобильное приложение (Tuya Smart или Smart Life). Все устройства автоматически подтянутся в облако.
- Вернитесь во вкладку Overview вашего проекта и скопируйте два главных параметра: Access ID (Client ID) и Access Secret (Client Secret).
- Перейдите во вкладку Devices, найдите в списке нужный гаджет и скопируйте его Device ID.
Блок 2. Развертывание скрипта в облаке Google
Google Apps Script идеален для нашей задачи, так как умеет в криптографию (HMAC-SHA256), которую не способны переварить стандартные HTTP-запросы в смартфонах.
- Перейдите на script.google.com под своей учетной записью Google.
- Нажмите «Новый проект» (New project) , полностью сотрите шаблонный бред и вставьте следующий скрипт:
JavaScript
// ====== НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ======
const CLIENT_ID = "ВАШ_ACCESS_ID_ИЗ_ШАГА_1";
const SECRET = "ВАШ_ACCESS_SECRET_ИЗ_ШАГА_1";
const DEVICE_ID = "ВАШ_DEVICE_ID_УСТРОЙСТВА";
const TUYA_BASE_URL = "https://openapi.tuyaeu.com"; // [cite: 28, 29]
// ===================================
function doGet(e) {
try {
let action = e.parameter.action; // [cite: 30]
let turnOn = (action === 'off') ? false : true; // [cite: 31]
// 1. Получаем свежий токен доступа
let t_token = new Date().getTime().toString(); // [cite: 32]
let signUrl_token = "/v1.0/token?grant_type=1";
let bodyHash_token = calcSha256(""); // [cite: 33]
let stringToSign_token = CLIENT_ID + t_token + "GET\n" + bodyHash_token + "\n\n" + signUrl_token; // [cite: 34]
let sign_token = calcHmacSha256(stringToSign_token, SECRET);
let tokenOpts = {
"method": "get",
"headers": { "client_id": CLIENT_ID, "sign": sign_token, "t": t_token, "sign_method": "HMAC-SHA256" },
"muteHttpExceptions": true
}; // [cite: 35]
let tokenRes = JSON.parse(UrlFetchApp.fetch(`${TUYA_BASE_URL}${signUrl_token}`, tokenOpts).getContentText()); // [cite: 36]
if (!tokenRes.success) return ContentService.createTextOutput(JSON.stringify({ error: "Token failed", detail: tokenRes})).setMimeType(ContentService.MimeType.JSON); // [cite: 37]
let accessToken = tokenRes.result.access_token;
// 2. Формируем и подписываем команду для реле
let t_cmd = new Date().getTime().toString(); // [cite: 38]
let signUrl_cmd = `/v1.0/devices/${DEVICE_ID}/commands`;
let payloadStr = JSON.stringify({ "commands": [{ "code": "switch_1", "value": turnOn }] }); // [cite: 39]
let bodyHash_cmd = calcSha256(payloadStr);
let stringToSign_cmd = CLIENT_ID + accessToken + t_cmd + "POST\n" + bodyHash_cmd + "\n\n" + signUrl_cmd; // [cite: 40]
let sign_cmd = calcHmacSha256(stringToSign_cmd, SECRET);
let cmdOpts = {
"method": "post",
"contentType": "application/json",
"headers": {
"client_id": CLIENT_ID,
"access_token": accessToken,
"sign": sign_cmd,
"t": t_cmd,
"sign_method": "HMAC-SHA256"
},
"payload": payloadStr,
"muteHttpExceptions": true
}; // [cite: 41, 42]
let response = UrlFetchApp.fetch(`${TUYA_BASE_URL}${signUrl_cmd}`, cmdOpts);
return ContentService.createTextOutput(response.getContentText()).setMimeType(ContentService.MimeType.JSON); // [cite: 43]
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({ error: err.toString()})).setMimeType(ContentService.MimeType.JSON); // [cite: 44]
}
}
function calcSha256(input) {
let rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, input, Utilities.Charset.UTF_8); // [cite: 45]
return rawHash.map(function(b) { return ('0' + (b & 0xFF).toString(16)).slice(-2); }).join(''); // [cite: 46]
}
function calcHmacSha256(input, key) {
let rawHmac = Utilities.computeHmacSha256Signature(input, key, Utilities.Charset.UTF_8); // [cite: 46]
return rawHmac.map(function(b) { return ('0' + (b & 0xFF).toString(16)).slice(-2); }).join('').toUpperCase(); // [cite: 47]
}- Нажмите «Развернуть». Если система попросит авторизацию (Authorize access) — соглашайтесь, выбирайте свой аккаунт, жмите Advanced -> Go to ... (unsafe) и подтверждайте.
- Скопируйте сгенерированный URL веб-приложения (ссылка, заканчивающаяся на /exec).
⚠️ Важно на будущее: Если решите отредактировать этот код, обычного сохранения мало. Вам придется нажать «Управление развертываниями» -> «Редактировать» (карандаш) -> Версия: «Новая версия» -> «Развернуть». Ссылка при этом останется прежней.
Блок 3. Настройка автоматизации в MacroDroid
Скрипт в облаке полностью универсален. Забудьте про программистский булшит с настройкой переменных, заголовков и JSON-тел в самом телефоне.
- Для включения устройства: Создайте макрос в MacroDroid с любым триггером (геозона, будильник, кнопка). Добавьте действие: «Сеть» -> «HTTP GET-запрос». В поле URL вставьте вашу ссылку из Шага 2, приписав на конце параметр включения: ?action=on. Все остальные поля оставьте пустыми.
- Для выключения устройства: Создайте аналогичное действие в макросе выключения, но на конце ссылки укажите параметр: ?action=off.
Финал
Готово. Модуль собран. Вместо изобретения велосипеда и оплаты мифических человеко-часов ленивых разработчиков вы получили готовую, работающую связку API. Умный дом моментально подчиняется триггерам смартфона из любой точки мира через надежные и абсолютно бесплатные серверы Google. Прагматично, быстро и максимально эффективно.