Напишите свой первый пак
Примерно за десять минут эта страница с нуля собирает эталонный пак
shelly-plug: умная розетка Shelly (Plus, Pro или Gen3), читаемая через её
локальный API, с мощностью, энергией и температурой и оповещением о перегреве.
Вам понадобится Docker, а также либо розетка Shelly в вашей сети, либо приведённый ниже захваченный ответ.
1. Посмотрите, что отвечает устройство
Заголовок раздела «1. Посмотрите, что отвечает устройство»Устройства Shelly второго поколения описывают реле одним вызовом:
curl http://192.168.1.50/rpc/Switch.GetStatus?id=0{ "id": 0, "source": "HTTP_in", "output": true, "apower": 8.9, "voltage": 237.5, "current": 0.069, "aenergy": { "total": 6532.2, "by_minute": [45.199, 47.141, 88.397] }, "temperature": { "tC": 41.3, "tF": 106.3 }}Сохраните этот ответ как shelly-plug/fixtures/status.json: это фикстура, на
которой будет тестироваться пак, так что вы сможете работать без устройства под
рукой.
2. Заголовок
Заголовок раздела «2. Заголовок»Создайте shelly-plug/pack.yaml:
schema: 1id: shelly-plugversion: 1.0.0label: Shelly plug (Gen2+)summary: Power, energy, voltage and temperature of a Shelly Plus/Pro/Gen3 plug or relay.examples: [Shelly Plus Plug S, Shelly Pro 1PM]address_hint: 192.168.1.50default_port: 80credentials: [none]id определяет два имени: тип монитора pack.shelly-plug и префикс метрик
dumbmonit_shelly_plug_.
3. Один источник
Заголовок раздела «3. Один источник»Источник — это один запрос, всегда на собственный адрес монитора:
options: - key: switch_id label: Switch channel help: 0 for a plug; 0, 1, 2… for each channel of a multi-channel relay. input: number default: 0
sources: - id: status type: http path: /rpc/Switch.GetStatus?id={{option.switch_id}}{{option.switch_id}} заменяется собственной настройкой монитора, которая
показывается в форме монитора как Switch channel. Имя файла фикстуры,
status.json, совпадает с id источника.
4. Метрики
Заголовок раздела «4. Метрики»Каждая метрика выбирает значение с помощью выражения JSONPath. Имена пишутся без префикса:
metrics: - name: output_on help: 1 when the relay is closed (power flows), 0 when it is open. source: status json: $.output - name: power_watts source: status json: $.apower - name: voltage_volts source: status json: $.voltage - name: current_amperes source: status json: $.current - name: energy_watthours_total source: status kind: counter json: $.aenergy.total - name: temperature_celsius source: status json: $.temperature.tCoutput — булево значение: оно становится 1 или 0. Суммарная энергия только
растёт, поэтому это counter: графики и правила читают её через rate(), и
перезапуск розетки не выглядит как падение.
5. Проверьте
Заголовок раздела «5. Проверьте»docker run --rm -v "$PWD:/work" --user "$(id -u)" ghcr.io/laupernoe/dumbmonit:latest \ pack test /work/shelly-plug --updateok: shelly-plug 1.0.0 (pack.shelly-plug, 6 metrics, 0 rules) wrote /work/shelly-plug/expected.promexpected.prom показывает в точности то, что сервер сохранил бы из фикстуры:
# TYPE dumbmonit_shelly_plug_power_watts gaugedumbmonit_shelly_plug_power_watts 8.9# TYPE dumbmonit_shelly_plug_temperature_celsius gaugedumbmonit_shelly_plug_temperature_celsius 41.3…Прочитайте его один раз. Начиная с этого момента pack test без --update
завершается ошибкой, если изменение пака меняет извлекаемые данные, и выводит
отличающиеся строки.
6. Правило оповещения
Заголовок раздела «6. Правило оповещения»Правила поставляются вместе с паком и используют его метрики по полным именам. Порог может задаваться опцией, так что у каждой розетки может быть свой:
options: # … switch_id, then: - key: max_temperature label: Temperature alert (°C) input: number default: 70
rules: - name: overheating title: Shelly plug overheating description: The internal temperature stayed above the limit for five minutes. expr: dumbmonit_shelly_plug_temperature_celsius op: ">" threshold: "{{option.max_temperature}}" for: 5m severity: warning unit: °CВыполните pack lint, чтобы проверить весь файл: правило, ссылающееся на
метрику, которую пак не создаёт, несуществующая опция или путь, ведущий в
другое место, будут показаны с указанием, где они находятся.
docker run --rm -v "$PWD:/work:ro" ghcr.io/laupernoe/dumbmonit:latest pack lint /work/shelly-plug7. Установите его
Заголовок раздела «7. Установите его»С токеном API, имеющим область write:
curl -H 'Authorization: Bearer dmt_…' -H 'Content-Type: application/yaml' \ --data-binary @shelly-plug/pack.yaml https://localhost:8080/api/packsОткройте Monitors → Add monitor: Shelly plug (Gen2+) есть в списке. Добавьте свою розетку по её адресу; первый опрос произойдёт в течение минуты, а правило Shelly plug overheating появится в Alerts → Rules.
Чтобы опубликовать новую версию, увеличьте version, выполните pack test и
установите пак снова: извлечение данных заменяется, а правило, которое вы,
возможно, настроили, сохраняется.
Полный пак вместе с уведомлением по настройке находится в
packs/shelly-plug.
Всё, что принимает формат, описано в справочнике.