Мой первый пост здесь, так что извиняюсь, если это не совсем ясно.И да, я искал этот и другие форумы и мог найти решение (спасибо), но я уверен, что это не лучший способ.
Зарядные устройства и контроллеры солнечных батарей Victron подают большое количество данных в облачное хранилище (Victron Remote Management), к которым я могу получить доступ с помощью их API.
Ответ в форме JSON представляет собой серию записей, на которые, как я полагаю, похожисловари, каждый из которых имеет определенный набор пар ключ: значение, называемых записями в выходных данных VRM.
Пример ниже (всего 2 записи из 116):
{
"idSite": 10986,
"timestamp": 1543599455,
"Device": "Battery Monitor",
"instance": 258,
"idDataAttribute": 47,
"description": "Battery voltage",
"formatWithUnit": "%.2F V",
"dbusServiceType": "battery",
"dbusPath": "/Dc/0/Voltage",
"code": "V",
"formattedValue": "24.01 V",
"id": 44
},
{
"idSite": 10986,
"timestamp": 1543599455,
"Device": "Battery Monitor",
"instance": 258,
"idDataAttribute": 49,
"description": "Current",
"formatWithUnit": "%.2F A",
"dbusServiceType": "battery",
"dbusPath": "/Dc/0/Current",
"code": "I",
"formattedValue": "-2.40 A",
"id": 45
Я хочу извлечь «Напряжение батареи» и другие параметры для отчета в Home Assistant и автоматике электропитания.
Я начал с использования шаблонов Jinja2, нацеленных на значение на основе идентификатора записи.Например, в этом примере напряжение аккумулятора указано в записи 44.
Проблема заключается в том, что время от времени Victron меняет номер или последовательность этих записей, а мой шаблон с жестким кодом возвращает бессмысленный трюк.
Итак, я посмотрел, как передать нужные мне показатели в качестве параметров в последовательности циклов for и if, и нашел способ, который дает мне то, что мне нужно.
{%- set object = "formattedValue" -%}
{%- set vrm_records = states.sensor.vrm_data.attributes.records -%}
{%- for device in ["Gateway", "258", "256", "Inverter"] -%}
{%- for target in ["Local ip address", "Remote ip address", "Battery voltage", "Current", "Consumed Amphours", "State of charge", "Time to go", "Maximum voltage", "Discharged Energy", "Charged Energy", "Battery current", "Battery watts", "Load state", "Charger on/off", "Charge state", "PV voltage", "PV current", "PV power", "Yield today", "Maximum charge power today", "Yield yesterday", "Maximum charge power yesterday", "Error code", "Output voltage", "Inverter on/off/eco", "Inverter state", "Low battery voltage alarm"] -%}
{%- for record in vrm_records -%}
{%- for key, value in record.items() -%}
{%- if value|string() == target|string() -%}
{%- for key, value in record.items() -%}
{%- if value|string() == device|string() -%}
{%- for key , value in record.items() -%}
{%- if key|string() == object|string() -%}
{{ target }} is {{ value }}
{% endif -%}
{%- endfor -%}
{%- endif -%}
{%- endfor -%}
{%- endif -%}
{%- endfor -%}
{%- endfor -%}
{%- endfor -%}
{%- endfor -%}
Значение, которое я хочу получить, имеет ключ "formattedValue", поэтому я объявляю его как объект.
В строке set vrm_records извлекаются все 116 записей, которые, как я считаю, являются словарями.
Каждая запись связана с устройствомв настройках VRM, таких как 256 (монитор батареи) или 258 (солнечное зарядное устройство), поэтому я использую этот список для фильтрации на устройстве в первом цикле for.
Второй цикл for содержит список целевых ключей Iхотите получить значения для.
Следует длинная последовательность операторов if и for, которая работает!
Но я просто уверен, что это далеко не элегантный способ сделать это.
Любая помощь приветствуется.
Спасибо.