При очередной смене счетчиков воды, поставил с импульсным выходом и родилась задача автоматизировать передачу показаний в УК. Только вот проблема, что моя УК Территория не имеет подобного API. Мою просьбу реализовать API восприняли в штыки и тактично послали на йюх). Однако на сайте API таки есть для внутреннего использования. В общем я разобрал работу сайта УК и реализовал передачу показаний.
Попытка реализовать отправку средствами одного SLS не увенчалась успехом, поскольку его функция http.request2()
на момент разработки (прошивка 2023.11.09d1) не умеет работать с данными сессии и заголовками, а http.request()
не умеет https. Ну и SLS банально может не хватить ресурсов для парсинга сайта УК.
Поэтому нужен промежуточный сервер. Выделять сервер для такой простой задачи не хотелось и я решил сделать обработку в уже знакомом мне сервисе Яндекс облака по разработке навыка Алисы для SLS
Yandex Cloud Functions - это безсерверная функция. Для подобных задач бесплатного тарифа хватает с лихвой. А это 1 млн. вызовов функции в месяц.
Очередной сюрприз меня ждал уже внутри Yandex Cloud Functions (YCF). В nodejs я не смог победить авторизацию на сайте УК. Перешел на незнакомый мне Python. На Python всё получилось.
Поскольку http.request2()
не умеет заголовки, то функцию пришлось сделать публичной и реализовать авторизацию шлюза, однако авторизацию в приватной я все же реализовал на будущее.
- на стороне SLS
- сбор показаний со счетчиков воды посредством zigbee счетчиков импульсов купленных у Олега
- получение IAM токена для авторизации в приватной функции YCF
- Формирование запроса к YCF, в котором:
- показания счетчиков с привязкой к их номеру
- возможность отключить передачу по отдельным счетчикам
- данные для авторизации в функции
- обработка результата
- уведомление в Телеграм
- на стороне YCF
- авторизация SLS
- авторизация в личном кабинете (ЛК) управляющей компании (УК)
- парсинг страницы сайта УК со счетчиками дабы получить данные
- номер счетчика
- его тип: ХВС/ГВС
- зону: некая зона "Общая"
- некий параметр licId
- формирование и отправка данных для передачи показаний
- обработка результата и возврат в SLS
Создать скрипт sendMeters.lua.
- Прописать свои токены:
local tokenYaOAuth = '' -- OAuth-токен для аккаунта Yandex
local tokenSLS = '' -- API-токен SLS
- Внести в него данные по своим счетчикам импульсов в блоке:
-- получаю данный счетчиков в кубах
-- ipuSend - отправлять поаказания (Y) или нет (N)
local meters = '{\z
\"23-256124\": {\"value\": ' .. (zigbee.value('0x00124B0027AEBF18', 'counter_1')/1000) .. ', \"ipuSend\": \"Y\"},\z
\"23-364334\": {\"value\": ' .. (zigbee.value('0x00124B0027AEBF18', 'counter_2')/1000) .. ', \"ipuSend\": \"Y\"},\z
\"23-286253\": {\"value\": ' .. (zigbee.value('0x00124B0027AEBF1C', 'counter_1')/1000) .. ', \"ipuSend\": \"Y\"},\z
\"23-367214\": {\"value\": ' .. (zigbee.value('0x00124B0027AEBF1C', 'counter_2')/1000) .. ', \"ipuSend\": \"Y\"}}'
- При необходимость отключить передачу показаний параметром
ipuSend
- подготовить скрипт index.py с функцией
- подготовить файл зависимостей для pip requirements.txt
- создать функцию YCF со следующими настройками
- Среда выполнения:
Python 3.12
- Способ:
редактор кода
- Точка входа:
index.handler
- Таймаут, c: я поставил 120. Зависит от времени выполнения функции, а по факту от времени запросов к ЛК УК. Оно считается и возвращается в
body['duration']
- Память: дефолтных 128Мб достаточно в моем случае
- Переменные окружения:
- USER_LOGIN: логин к ЛК УК
- USER_PASSWORD: пароль к ЛК УК
- SLS_API_KEY: API-токен SLS
- создать файл
index.py
и скопировать в него содержимое скрипта index.py с функцией - создать файл
requirements.txt
и скопировать в него содержимое файла зависимостей для pip requirements.txt
- Среда выполнения:
- Сохранить изменения: сохранение запустит сборку новой версии функции
После этого можно приступать к отладке и пользоваться
Enjoy :)
PS Помогу разобраться с премудростями автоматизиции в SLS. В режиме удаленного доступа покажу и расскажу как реализовать Ваши идеи.
Также, Вы можете поддержать меня здесь. Любые суммы, даже самые маленькие мотивируют на разработку чего-то нового и улучшение уже существующего.