Skip to content

Latest commit

 

History

History
92 lines (67 loc) · 7.51 KB

Readme.md

File metadata and controls

92 lines (67 loc) · 7.51 KB

Отправка показаний в УК когда у нее нет API

Введение

При очередной смене счетчиков воды, поставил с импульсным выходом и родилась задача автоматизировать передачу показаний в УК. Только вот проблема, что моя УК Территория не имеет подобного 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

Настройка на стороне 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

Настройка на стороне YCF

  • подготовить скрипт 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. В режиме удаленного доступа покажу и расскажу как реализовать Ваши идеи.

Также, Вы можете поддержать меня здесь. Любые суммы, даже самые маленькие мотивируют на разработку чего-то нового и улучшение уже существующего.