Документация

Счетчики, определяемые пользователем

Примечание: Менеджер зарядки cFos может считывать данные с большинства солнечных инверторов с помощью SunSpec (тип устройства "Солнечный инвертор SunSpec / счетчик"). В этом случае вам не нужно создавать собственное определение счетчика.

Менеджер зарядки cFos позволяет создавать собственные определения счетчиков для поддержки счетчиков, которые не входят в стандартный репертуар. В настоящее время существует три типа: Счетчики Modbus, счетчики HTTP/JSON и счетчики MQTT/JSON. Файлы определений для этих счетчиков очень похожи. Счетчики Modbus считывают данные через Modbus из определенных регистров, а счетчики HTTP/JSON получают данные через HTTP-запрос и анализируют JSON в качестве ответа. Для счетчиков MQTT/JSON менеджер зарядки cFos подписывается на темы MQTT и анализирует сообщения, опубликованные в теме, как JSON. Для разбора Менеджер зарядки cFos использует небольшой "язык запросов". Вот документация по возможностям MQTT в cFos Charging Manager.

Помимо ряда предопределенных переменных, таких как ток и напряжение, пользовательские счетчики также могут считывать неизвестные пользовательские переменные, запрашивать входы и устанавливать выходы. Чтение переменных и установка выходов позволяет оценивать формулы. В сочетании с переменными Charging Manager и глобальными выходами Charging Manager, описанными ниже, это мощная функция, позволяющая выполнять некоторые задачи домашней автоматизации и управлять внешними устройствами, такими как аккумуляторные батареи. Если вы реализуете задачи управления с помощью этого, пожалуйста, дайте нам обратную связь. Нам очень интересно, что люди контролируют с помощью cFos Charging Manager, и это помогает нам в дальнейшем развивать Charging Manager в соответствии с потребностями клиентов.

Вот простой пример определения для Modbus, который считывает один регистр для активной мощности. Вы можете легко изменить номер регистра для вашего конкретного приложения:
Пример определения для одного регистра.

Вот пример определения для Modbus и для HTTP/JSON:
Скачать образец определения для Modbus-измерителя
Скачать образец определения для счетчика HTTP/JSON

Менеджер зарядки уже поставляется с несколькими такими файлами, но вы можете загрузить свои собственные файлы в разделе "Конфигурация системы", а также удалить их снова.
Здесь вы найдете большинство определений счетчиков, которые мы предоставляем:
Скачать прилагаемые определения счетчиков

Если вы создали свой собственный файл счетчика и он может быть полезен другим пользователям, мы будем очень признательны, если вы предоставите его нам. Тогда мы будем поставлять его с будущими версиями Charging Manager.

Загрузите определения счетчиков для дополнительных счетчиков

Структура файла определения:

Определения счетчиков представляют собой JSON-файлы с глобальным JSON-объектом, который имеет свойства и подобъекты. 'rtype' определяет тип операции чтения: 0 = Modbus, 1 = HTTP/JSON, 2 = MQTT/JSON. 'mtype' определяет тип устройства: 0 = Другое устройство, 1 = Счетчик, 2 = Инвертор, 4 = Аккумулятор.

Числа можно указывать как в десятичной, так и в шестнадцатеричной системе с префиксом 0x. Также допускаются однострочные комментарии с использованием //.

Мы рекомендуем прогонять файлы определений через валидатор JSON5, например, этот валидатор JSON5 Вам обязательно нужно прочитать главу "Формулы", чтобы понять, какие значения можно использовать в формулах в следующей ссылке.

Определения Modbus имеют объект 'rtu' со следующими свойствами:

silence_period, в мсек. определяется, длительность паузы перед обращением к Modbus RTU, чтобы устройство распознало начало сообщения.
silence_same_slave, true: Пауза также соблюдается при нескольких обращениях к одному и тому же устройству.
retries: Количество повторных попыток, если устройство не отвечает.
rcv_timeout: в мсек. максимальное время ожидания при обращении до ответа устройства.

Эти глобальные свойства применяются к Modbus TCP и RTU:

modbus_read: Номер функции команды чтения Modbus, обычно 3 или 4.
modbus_read_max_registers: максимальное количество регистров, которые могут быть прочитаны за один раз.
modbus_allow_gaps: true = Неиспользуемые области регистров могут быть прочитаны в операции чтения.

Для Modbus TCP и HTTP/JSON существует объект 'tcp' со следующими свойствами:

connect_timeout: в мсек. максимальное время ожидания TCP-соединения.
delay_after_connect: в мсек. Сделайте паузу после установления соединения перед отправкой первой команды.

Оба типа определений (Modbus и HTTP/JSON) имеют следующие дополнительные свойства:

upd_delay: в мсек. определяет интервал, через который устройство может быть считано. Некоторые устройства перегружаются, если их запрашивать слишком часто.
manufacturer: String, название производителя. Отображается в расширенной информации плитки.
delay_accumulated: true = Накопленные значения (кВт-ч) запрашиваются только каждые 3 секунды или при наличии достаточной мощности. false = Эти значения запрашиваются всегда.
ui_addr: URL, если он отличается от адреса устройства для вызова веб-интерфейса.
reserved: Массив со значениями, которые интерпретируются как 0 (полезно, если устройство поддерживает определенные значения в зависимости от модели).

Если опустить перечисленные выше свойства, то cFos Charging Manager примет значения по умолчанию, которые хорошо работают в большинстве случаев.

В определении JSON следующим шагом является определение переменных, которые счетчик использует для чтения или вычисления значений тока, напряжения и т.д. Следующие переменные используются менеджером зарядки. Менеджер зарядки знает следующие переменные:
type_designation, version, firmware_version, serial: Они формируют имя модели, как показано в расширенной информации плитки. Они запрашиваются один раз при настройке или сбросе счетчика.
voltage_l1...voltage_l3, current_l1...current_l3, power_w, power_var, power_va, power_w_l1...power_w_l3: Менеджер зарядки cFos пытается вычислить из них значения напряжения_l1...l3, подписанного тока_l1...l3, мощности_w и мощности_va. Указывать все переменные не обязательно. Менеджер зарядки cFos попытается вычислить значения из имеющихся переменных.
import_wh, export_wh: Менеджер зарядки использует эти переменные для отображения import_wh и export_wh. Для однонаправленных счетчиков (например, инверторов) всегда следует определять только import_wh. Export_wh следует задавать только для двунаправленных счетчиков (например, накопителей или счетчиков опорной сети).

soc: Если доступно, состояние заряда аккумуляторной батареи отображается в % на плитке.
Кроме того, можно определить другие переменные с различными именами, которые считываются при каждом обновлении или вычисляются по формулам. При определении переменных, начинающихся с CM., например CM._set_price, присвоенные значения сохраняются в глобальных переменных Charging Manager (см. ниже) и могут быть запрошены соответствующим образом.
Переменные с символом *: Если вы определяете переменные, начинающиеся с *, то они отображаются в пользовательском интерфейсе в плитке счетчика под расширенной информацией, например, температура аккумуляторной батареи.

Определение переменной:


Объект называется по имени переменной, указанной выше, и имеет следующие свойства: fixed: строка с фиксированным значением.

Полезно, если, например, невозможно определить значение, например, для type_designation или voltage. expr: Строка, переменная не считывается, а оценивается как формула. type: Если не fixed или expr, то тип переменной: int16, uint16, int32, uint32, float, int64, string. Это важно для Modbus, чтобы читать регистры в правильном формате. uint16 и uint32 - типы, которые могут принимать только положительные числа.
В JSON/HTTP обычно можно использовать float. resolution: float, считанное значение умножается на 'resolution'. Значения напряжения должны быть в вольтах, тока - в миллиамперах, мощности - в ваттах, энергии - в ватт-часах (Wh).


При отрицательном "разрешении" можно инвертировать значение, если оно имеет противоположный знак. once: bool (true или false), если true, значение считывается только один раз при инициализации устройства, в противном случае - периодически. address: number (Modbus) или string (HTTP/JSON), номер регистра Modbus или HTTP URL значения для чтения. query:
Строка, для HTTP JSON спецификация языка запросов менеджера зарядки, с помощью которого он находит значение для чтения в ответе JSON. порядок: Строка, для Modbus порядок байт, либо "hl", либо "lh", в котором находится значение. длина: Число, для Modbus длина строки в регистрах. Для переменных 'version' и 'firmware_version' 'length' используется для преобразования числовых версий в строки с точками. Для 'length' допустимы значения 2 или 4, что приводит к форматам версий a.b и a.b.c.d. При значении 'length' 2 и типе 'int16' или 'uint16' менеджер заряда разделяет точкой младший и старший байт, при 'int32' или 'uint32' - младшее и старшее слово, при 'int64' - младшее и старшее слово. Для 'lenth' 4 и 'int32' или 'uint32' менеджер заряда разделяет значение на 4 байта, разделенных точкой.
Для 'int64' - на 4 слова соответственно. regex: Строка. Если указано регулярное выражение, ответ счетчика не обязательно должен быть в JSON. В качестве результата оценивается либо все совпадение регулярного выражения, либо первая группа. Используйте эту функцию только в том случае, если устройство не возвращает JSON.

Вот список возможностей наших регулярных выражений: any char: . named classes:



\d \s \w \D \S \W анонимные классы: [a-z0-9_], [^0-9], [^\d] группы с альтернативами: (ab|cd|ef) незахваченные группы: (?:ab|cd) (жадный) один раз или ни одного: a?, a???
(жадный ) много или ни одного: a*, a*?


(жадный) один или более раз: a+, a+? начало строки: ^ конец строки: $

Определение входов:

Менеджер зарядки может запрашивать до 32 входных значений из различных регистров или элементов JSON для каждого устройства. Свойство "Inputs" представляет собой массив JSON. Вы должны определить следующие свойства для каждого входа:
адрес: Адрес (регистр Modbus или URL).
считать: Количество входных битов, которые будут считаны с помощью этого запроса.
запрос: Для HTTP/JSON - язык запросов для поиска значения в ответе.

Менеджер зарядки cFos считывает все входы, определенные таким образом, при каждом обновлении и помещает биты внутри массива, который затем может быть запрошен в формулах Input1..InputN.

Определение выходов:

Менеджер зарядки может коммутировать до 32 выходов на устройство. Выходы определяются в "outputs" как массив JSON объектов выходов. Все выходы переключаются в конце каждого цикла обновления, если статус соответствующего выхода изменился.
Для каждого выхода необходимо определить следующие свойства в объекте выхода:
адрес: HTTP URL с необязательным HTTP методом, например, GET http://www.example.com?output1=${var1}. Для установки регистров Modbus можно использовать HTTP API менеджера зарядки cFos. Менеджер зарядки обнаруживает совпадающие доступы на localhost и перенаправляет запрос на внутренний обработчик, поэтому авторизация не требуется, как при внешних HTTP API-доступах. Если после всех замен URL пуст, вывод не устанавливается. Например, вы можете переключать выходы, только если существуют определенные переменные (см. формулы: функция exists()). В адресе можно дополнительно указать ${address} и ${id}. Это текущий адрес устройства и Modbus ID, определенные в настройках. Адрес и id в основном используются для использования Modbus API (см. ниже).
body: Необязательное тело HTTP для POST или PUT.
В URL и теле можно использовать формулы ${expr}, которые ссылаются на глобальные переменные Charging Manager или на соответствующий счетчик. Формула 'expr' оценивается при установке вывода и заменяется в тексте URL или тела. Если в приведенном выше примере http://www.example.com?output1=1 устанавливает вывод, а http://www.example.com?output1=0 удаляет его, вы можете определить переменную 'var1' и установить ее в 1 или 0 по желанию. Таким образом, вы также можете записывать числовые значения для управления производительностью памяти в регистры Modbus, которые вы ранее сохранили в переменной с помощью формулы.
Если вместо передачи числового значения в URL необходимо заменить один текст на другой в зависимости от формулы, как, например, в случае с сокетами Shelly WLAN, можно написать так: ${if expr`text1`text2}. Апостроф" - это обратный знак (ASCII код 96). Если 'expr' != 0, то вставляется текст1, иначе текст2. Для сокета Shelly WLAN URL выглядит следующим образом: http://<ip-addr>/relay/0?turn=${if expr`on`off}, т.е. если expr != 0, Менеджер зарядки вызывает http://<ip-addr>/relay/0?turn=on, иначе http://<ip-addr>/relay/0?turn=off.

Если вы вводите относительный путь в качестве URL, Менеджер зарядки берет адрес, настроенный для соответствующего устройства. Если в качестве домена указан 'localhost', менеджер зарядки принимает адрес устройства, на котором он запущен. Если он обнаруживает обращение к собственному API, он использует внутренний обработчик вместо выполнения полного HTTP-доступа, так что вам не придется хранить имя пользователя и пароль в определении счетчика. URL, начинающийся с *, заставит диспетчер заряда всегда выполнять полный HTTP-доступ.

Сброс выходов: В дополнение к массиву "outputs" вы можете определить массив "resets", который структурирован подобно массиву "outputs". Его можно использовать для сброса выходов к их начальным значениям при деактивации устройства. С его помощью, в сочетании с пользовательскими переменными и параметром "once": true, вы можете вернуть устройство в исходное состояние.
Периодически записывать выходы: Для некоторых устройств необходимо периодически записывать значения выходов, иначе устройство сбрасывает их в состояние "по умолчанию". Например, память Kostal снова использует свои правила по умолчанию, если в течение некоторого времени не было активной записи управления памятью. Чтобы периодически устанавливать выходы, вы можете префикснуть адрес с #xxx#, где xxx указывает, через сколько секунд выход перезаписывается, даже если записываемое значение осталось неизменным. Например, если адрес /cnf?cmd=set_cm_vars&name=test&val=42, вы можете использовать #30#/cnf?cmd=set_cm_vars&name=test&val=42, чтобы гарантировать, что это значение будет записываться каждые 30 секунд.

Определение запроса langage:

В настоящее время в поисковых выражениях "запрос" можно использовать имена членов и операторы "." и "[]", примеры:

тестЭлемент с именем "тест"
имя1.имя2Элемент с именем "name2" в дочернем объекте "name1"
имя[idx]Элемент "idx" элемента объекта "name". "idx" может быть числом, например, для массивов, или строкой
name["u2"]Элемент "u2" элемента объекта "name", соответствует "name.u2"
name[{"el1": "v1", "el2": 3}].valueВыберите элемент массива, который удовлетворяет условию объектной нотации, и оцените элемент с именем 'value'. Здесь, например, в массиве 'name' выбирается элемент, который имеет в качестве объектных элементов 'el1' со значением 'v1' и 'el2' со значением 3, а затем из этого объекта возвращается значение элемента 'value'.

Глобальные переменные менеджера зарядки:

Вы можете создавать переменные в конфигурации Charging Manager. В качестве значения можно использовать фиксированное значение или формулу. В конце каждого цикла обновления Менеджер зарядки при необходимости пересчитывает значение этих переменных. Затем вы можете использовать их в (определенных) параметрах менеджера зарядки, правилах зарядки или для управления выходами. Вы также можете записать Ex.member или Mx.member в качестве переменных. Здесь Exи Mx- это идентификатор устройства настенного ящика или счетчика, установленного в Charging Manager. member - это "определяемая пользователем" переменная, которая хранится в соответствующем устройстве. Некоторые из переменных могут иметь особое значение: Для KEBA "out1" является коммутационным выходом, для счетчиков ABB B23 "out1" и "out2" являются коммутационными выходами (для моделей, которые это поддерживают). 1 включает выход, 0 снова выключает его.

Если у вас есть приборы, которые должны включаться при определенных условиях, но затем работать некоторое время (например, стиральная машина, посудомоечная машина), вы также можете определить переменную как "триггер". Тогда формула переменной является условием, при котором переменная устанавливается в 1. По истечении регулируемого времени она снова устанавливается в 0. Условие "ретриггера" позволяет продлевать время до выключения (т.е. установки переменной на 0) снова и снова, пока выполняется условие.

В тестовых целях можно отобразить переменные Charging Manager и счетчика, например, текущие цены Awattar:


                        Скриншот отображения переменных счетчика

Глобальный менеджер зарядки Выходы:

В конфигурации Charging Manager можно настроить глобальные выходы, как описано выше в определении счетчика в разделе 'Выходы'. Они устанавливаются в конце каждого цикла обновления, если их состояние изменилось. Если вы хотите управлять коммутационными выходами в устройствах, определяемых пользователем, рекомендуется использовать вышеуказанное соглашение (см. Переменные менеджера зарядки): Вы задаете переменные с именами "out1", "out2" и т.д. в пользовательском счетчике и устанавливаете выходы в пользовательском счетчике, которые переключают выход в зависимости от значения этих переменных.

Глобальный Modbus API диспетчера зарядки:

Modbus API менеджера зарядки используется для управления устройствами Modbus, имеющими любой адрес Modbus RTU или TCP (доступный из менеджера зарядки). Для Modbus RTU введите COMx,bd,8,p,s в качестве адреса, где x - номер порта COM, bd - скорость передачи данных, p - четность ('N', 'E' или 'O') и s - количество стоповых битов (1 или 2), в соответствии с конфигурацией отдельных устройств. Для Modbus TCP адресатом является IP-адрес устройства в сети Charging Manager, включая номер порта.
URL (для HTTP GET) Modbus API выглядит так:
/cnf?cmd=modbus_get или /cnf?cmd=modbus_set
Менеджер зарядки cFos поддерживает следующие дополнительные параметры запроса:
addr: Адрес устройства Modbus RTU или TCP, указанный выше.
func: Номер функции Modbus, например, для чтения 3 или 4, для записи 6 или 16.
id: Идентификатор устройства Modbus.
reg: Номер регистра Modbus. Значение может быть задано в десятичном или шестнадцатеричном виде (с префиксом 0x).
val: число, значение для записи в регистр. Опускать при чтении.
Тип: 'w' 16bit (по умолчанию), d = 32bit, f = float, q = 64bit, s = string.
cnt: число, максимальная длина строки в регистрах, опустите для других типов или установите значение 1.
order: строка, порядок следования байтов, либо "hl", либо "lh".

Примечание: Если ваш "счетчик" в первую очередь имеет задачи управления, вы можете отметить опцию "Скрыть устройство" в настройках этой плитки, чтобы это устройство не появлялось на стартовой странице.

Примечание: Некоторые счетчики, считываемые через HTTP, требуют ввода имени пользователя/пароля в качестве авторизации. Вы можете указать это в адресе для HTTP-доступа, например, с помощью http://username:[email protected]. Если ваше имя пользователя или пароль содержат "@", вы должны заменить его на "%40".