Примечание: Менеджер зарядки cFos может считывать данные с большинства солнечных инверторов с помощью SunSpec (тип устройства "Солнечный инвертор SunSpec / счетчик"). В этом случае вам не нужно создавать собственное определение счетчика.
Менеджер зарядки cFos позволяет создавать собственные определения счетчиков для поддержки счетчиков, отсутствующих в стандартном репертуаре. В настоящее время существует три типа: Modbus-счетчики, HTTP/JSON-счетчики и MQTT/JSON-счетчики. Файлы определений для этих счетчиков очень похожи. Счетчики Modbus считывают данные из определенных регистров через Modbus, в то время как счетчики HTTP/JSON получают данные через HTTP-запрос и читают в JSON в ответ. Для счетчиков MQTT/JSON менеджер cFos Charging Manager подписывается на темы MQTT и считывает сообщения, опубликованные в рамках темы, в формате JSON. Для чтения cFos Charging Manager использует небольшой "Язык запросов". Вот документация по возможностям 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 Вам обязательно нужно прочитать главу "Формулы", чтобы понять, какие значения могут быть использованы в формулах в следующей ссылке.
silence_period, in msec: Определяет длительность паузы перед обращением к Modbus RTU, чтобы устройство распознало начало сообщения. silence_same_slave, true: Пауза сохраняется и при нескольких обращениях к одному устройству. retries: Количество повторных попыток, если устройство не отвечает. rcv_timeout: in msec: Максимальное время ожидания ответа от устройства, для каждого обращения.
modbus_read:
Номер функции команды Modbus для чтения, обычно 3 или 4. modbus_read_max_registers: Максимальное количество регистров, которые могут быть прочитаны за один раз. modbus_allow_gaps: true = неиспользуемые области регистров могут быть прочитаны в операции чтения.
connect_timeout: is msec: Максимальное время ожидания TCP-соединения. delay_after_connect: in msec: Пауза после установления соединения перед отправкой первой команды.
upd_delay: in msec: Определяет интервал, через который устройство может быть считано.
Некоторые устройства перегружаются, если их запрашивают слишком часто. 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 (см. ниже) и могут быть запрошены соответствующим образом.
Переменные с символом *: Если вы определите переменные, начинающиеся с '*', они будут отображаться в пользовательском интерфейсе в плитке счетчика под расширенной информацией, например, температура аккумуляторного блока.
Примечание: В качестве имен переменных можно использовать только цифры и буквы a-z и A-Z.
Объект называется по имени переменной, указанной выше, и имеет следующие свойства: fixed: Строка с фиксированным значением.
Полезно, если, например, невозможно определить значение, например, для type_designation или voltage. expr: Строка.
Переменная не считывается, а оценивается как формула. type: Если не fixed или expr, то тип переменной: int16, uint16, int32, uint32, float, int64, string. Это важно для Modbus, чтобы читать регистры в правильном формате. uint16 и uint32 - типы, которые могут принимать только положительные числа.
В JSON/HTTP обычно можно использовать float. разрешение: float. Считанное значение умножается на 'resolution'. Значения напряжения должны быть в вольтах, тока - в миллиамперах, мощности - в ваттах, энергии - в ватт-часах (Wh).
При отрицательном "разрешении" вы можете инвертировать значение, если оно имеет противоположный знак. once: bool (true или false).
Если true, значение считывается только один раз при инициализации устройства, в противном случае оно считывается периодически. адрес: число (Modbus) или строка (HTTP/JSON).
Номер регистра Modbus или HTTP URL-адрес считываемого значения. запрос: Строка.
Для HTTP JSON - спецификация языка запросов менеджера зарядки, с помощью которого он находит значение для считывания в ответе JSON. порядок: Строка. Для Modbus - порядок байтов, либо "hl", либо "lh", в котором находится значение. length: число. Для 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.
Вы должны определить следующие свойства для каждого входа: address: Адрес (регистр Modbus или URL).
count:
Количество входных битов, которые считываются с помощью данного запроса. query: Для 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, заданные в настройках.
'address' и 'id' в основном используются для работы с Modbus API (см. ниже). body: Необязательное тело HTTP для POST или PUT.
В URL и теле можно использовать ${expr}, чтобы использовать формулы, которые ссылаются на глобальные переменные менеджера зарядки или на соответствующий счетчик. Формула '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-доступ.
Сброс выходов: В дополнение к массиву "выходы" вы можете определить массив с именем "сбросы", который структурирован так же, как массив "выходы". Это позволяет сбрасывать выходы к их начальным значениям при деактивации устройства. Это можно использовать в сочетании с пользовательскими переменными и параметром "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 секунд.
В настоящее время в поисковых выражениях "запрос" можно использовать имена членов и операторы "." и "[]", примеры:
тест | Элемент с именем "тест" |
имя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- это идентификатор устройства настенной коробки или счетчика, установленного в диспетчере зарядки. 'member' - это "пользовательская" переменная, которая сохраняется в соответствующем устройстве. Некоторые переменные могут иметь особое значение: Для KEBA 'out1' - это переключающий выход, для счетчиков ABB B23 'out1' и 'out2' - переключающие выходы (для моделей, которые это поддерживают). 1 включает выход, 0 снова выключает его.
Если у вас есть приборы, которые должны включаться при определенных условиях, но затем работать некоторое время (например, стиральная машина, посудомоечная машина), вы также можете определить переменную как "триггер". Тогда формула переменной является условием, при котором переменная устанавливается в 1. По истечении регулируемого времени она снова устанавливается в 0. Условие "ретриггера" позволяет продлевать время до выключения (т.е. установки переменной на 0) снова и снова, пока выполняется условие.
Примечание: В качестве имен переменных можно использовать только цифры и буквы a-z и A-Z.
В тестовых целях можно отобразить переменные менеджера зарядки и счетчика, например, текущие цены Awattar:
В конфигурации Charging Manager можно настроить глобальные выходы, как описано выше в определении счетчика в разделе "Выходы". Они устанавливаются в конце каждого цикла обновления, если их состояние изменилось. Если вы хотите управлять коммутационными выходами в пользовательских устройствах, рекомендуется использовать вышеуказанное соглашение (см. раздел "Переменные Charging Manager"): Вы задаете переменные с именами "out1", "out2" и т. д. в пользовательском счетчике и устанавливаете в пользовательском счетчике выходы, которые переключают выход в зависимости от значения этих переменных.
API Modbus в Charging Manager используется для управления устройствами Modbus, имеющими любой адрес Modbus RTU или TCP (доступный из Charging Manager). Как и при настройке отдельных устройств, введите COMx,bd,8,p,s в качестве адреса для Modbus RTU, где 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: число: значение, записываемое в регистр.
Опускать при чтении. type: 'w' 16bit (по умолчанию), d = 32bit, f = float, q = 64bit, s = string.
c nt: число: максимальная длина строки в регистрах, для других типов опускается или устанавливается в 1. order: строка: порядок байтов, либо "hl", либо "lh".
Примечание: Если ваш "счетчик" в первую очередь имеет задачи управления, вы можете отметить опцию "Скрыть устройство" в настройках этой плитки, чтобы это устройство не появлялось на стартовой странице.
Примечание: Некоторые счетчики, считываемые через HTTP, требуют ввода имени пользователя/пароля в качестве авторизации. Вы можете указать это в адресе для HTTP-доступа, например, с помощью http://username:password@192.168.2.111.
Если ваше имя пользователя или пароль содержат "@", вы должны заменить его на "%40".