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

Користувацькі лічильники

Примітка: cFos Charging Manager може зчитувати дані більшості сонячних інверторів за допомогою SunSpec (тип пристрою "SunSpec Solar Inverter / Meter"). В цьому випадку вам не потрібно створювати власне визначення лічильника.

Диспетчер зарядки 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.

На додаток до ряду попередньо визначених змінних, таких як струм і напруга, користувацькі лічильники також можуть зчитувати невідомі, визначені користувачем змінні, запитувати входи і встановлювати виходи. Зчитування змінних і налаштування виходів дозволяє аналізувати формули. У поєднанні зі змінними диспетчера заряджання та глобальними виходами диспетчера заряджання, описаними нижче, це потужна функція, яка навіть дозволяє виконувати певні завдання домашньої автоматизації та керувати зовнішніми пристроями, такими як акумуляторні батареї. Якщо ви реалізували завдання керування за допомогою цієї функції, будь ласка, дайте нам зворотний зв'язок. Ми дуже зацікавлені в тому, що наші клієнти контролюють за допомогою cFos Charging Manager, і це допомагає нам надалі розвивати Charging Manager відповідно до потреб клієнтів.

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

Ось приклад визначення для Modbus і один для HTTP/JSON:
Завантажити зразок визначення для лічильника Modbus
Завантажити зразок визначення для HTTP/JSON лічильника

Диспетчер зарядки вже постачається з декількома такими файлами, але ви можете завантажити власні файли в розділі "Конфігурація системи", а також видалити їх знову.
Тут ви знайдете більшість визначень meter, які ми надаємо:
Завантажити визначення лічильників, що постачаються

Якщо ви створили свій власний контр-файл і він може бути корисним для інших користувачів, ми будемо дуже вдячні, якщо ви надасте його нам. Тоді ми доставимо його з наступними версіями Диспетчера нарахувань.

Завантажити визначення лічильників для додаткових лічильників

Структура файлу визначення:

Визначення лічильників - це 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: is msec: Максимальний час очікування TCP-з'єднання. delay_after_connect: in msec: Пауза після встановлення з'єднання до відправлення першої команди.

Обидва типи визначень (Modbus та HTTP/JSON) мають наступні додаткові властивості:

upd_delay: в мс: Визначає інтервал, з яким можна зчитувати дані з пристрою.
Деякі пристрої перевантажуються, якщо їх запитувати занадто часто. manufacturer: Рядок, назва виробника.


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

Якщо ви не вкажете перераховані вище властивості, cFos Charging Manager використовує значення за замовчуванням, які добре працюють у більшості випадків.

Наступним кроком у визначенні JSON є визначення змінних, які лічильник використовує для зчитування або обчислення значень струму, напруги тощо.
Charging Manager розпізнає такі змінні: 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 Charging Manager намагається розрахувати на основі цих значень напругу_l1..l3, знаки струму_l1..l3, потужності_w та потужності_va. Вам не обов'язково вказувати всі змінні.
Диспетчер заряджання cFos намагається обчислити значення з наявних змінних. import_wh, export_wh: Диспетчер заряджання використовує ці змінні для відображення import_wh та export_wh. Для односпрямованих лічильників (наприклад, інверторів) слід завжди визначати тільки import_wh.

Для двонаправлених лічильників (наприклад, акумуляторних або мережевих еталонних лічильників) слід визначати export_wh. soc: За наявності, тут у плитці відображається стан заряду акумуляторної батареї у відсотках.
Ви також можете визначити інші змінні з іншими назвами, які зчитуються при кожному оновленні або обчислюються за формулами. Якщо ви визначите змінні, які починаються з "CM.", наприклад, CM._set_price, присвоєні значення зберігаються у глобальних змінних Диспетчера заряджання (див. нижче) і можуть бути запитані відповідним чином.
Змінні з символом *: Якщо ви визначаєте змінні, які починаються з "*", вони відображаються в інтерфейсі користувача на плитці лічильника під розширеною інформацією, наприклад, температура акумуляторної батареї.
Примітка: Як імена змінних можна використовувати лише цифри та літери a-z і A-Z.

Визначення змінної:


Об'єкт називається за назвою змінної, перерахованої вище, і має такі властивості: fixed: Рядок з фіксованим значенням.
Корисно, якщо, наприклад, неможливо визначити значення, наприклад, для type_designation або напруги. expr: Рядок.
Змінна не зчитується, а обчислюється як формула. type: Якщо не fixed або expr, тип змінної: int16, uint16, int32, uint32, float, int64, string. Це важливо для Modbus, щоб читати регістри в правильному форматі. uint16 і uint32 - це типи, які можуть приймати тільки додатні числа.
З JSON/HTTP зазвичай можна використовувати float. resolution: float. Зчитане значення множиться на "роздільну здатність". Значення для напруги повинні бути у вольтах, струму в міліамперах, потужності у ватах, енергії у ват-годинах (Wh).
З від'ємною роздільною здатністю ви можете інвертувати значення, якщо воно має протилежний знак. один раз: bool (true або false).
Якщо значення true, значення зчитується лише один раз під час ініціалізації пристрою, інакше воно зчитується періодично. адреса: число (Modbus) або рядок (HTTP/JSON).
Номер регістру Modbus або HTTP-адреса значення, яке потрібно прочитати. query: Рядок.
Для HTTP JSON - специфікація мовою запитів диспетчера заряджання, за допомогою якої він знаходить значення, яке потрібно прочитати у відповіді JSON. order: Рядок. Для 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' - молодше і старше dword. Для 'lenth' 4 і 'int32' або 'uint32' диспетчер заряджання розбиває значення на 4 байти, розділені крапкою.
Для 'int64' на 4 слова відповідно. regex: Рядок. Якщо вказано регулярний вираз, відповідь лічильника не обов'язково має бути у форматі JSON. Як результат оцінюється або весь збіг регулярного виразу, або перша група. Будь ласка, використовуйте це тільки якщо пристрій не повертає JSON.

Ось список можливостей наших регулярних виразів: будь-які char: . іменовані класи:



\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. Властивість "Входи" - це масив JSON.
Для кожного входу потрібно визначити такі властивості: address: Адреса (регістр Modbus або URL-адреса).
count:
Кількість бітів входу, які зчитуються за допомогою цього запиту. query: Для HTTP/JSON, мова запиту для пошуку значення у відповіді.

CFos Charging Manager зчитує всі входи, визначені таким чином, при кожному оновленні та зберігає біти у внутрішньому масиві, який потім можна запитувати у формулах, Input1...InputN.

Визначення результатів:

Диспетчер заряджання може перемикати до 32 виходів на один пристрій. Виходи визначені у розділі "outputs" як JSON-масив вихідних об'єктів. Всі виходи перемикаються в кінці кожного циклу оновлення, якщо стан відповідного виходу змінився.

Ви повинні визначити наступні властивості в об'єкті "output" для кожного виходу: адреса: HTTP URL з необов'язковим HTTP-методом, наприклад, GET http://www.example.com?output1=${var1}. Для налаштування регістрів Modbus можна використовувати HTTP API cFos Charging Manager. Charging Manager розпізнає відповідні доступи на 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-адресі на інший залежно від формули, наприклад, для WLAN-сокетів Shelly, ви можете записати це так: ${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". Це дозволяє скидати виходи до початкових значень, коли пристрій вимкнено. Це можна використовувати у поєднанні з визначеними користувачем змінними та "один раз": true для скидання пристрою до початкового стану.
Періодично записувати виходи: Для деяких пристроїв виходи потрібно записувати періодично, інакше пристрій скине значення до "за замовчуванням". Наприклад, пам'ять Kostal повертається до правил за замовчуванням, якщо управління пам'яттю не було активно записано протягом деякого часу. Для періодичного налаштування виходів можна додати до адреси префікс #xxx#, де xxx вказує на те, через скільки секунд вихід перезаписується, навіть якщо значення, що записується, залишилося незмінним. Наприклад, якщо адреса має вигляд /cnf?cmd=set_cm_vars&name=test&val=42, ви можете використати #30#/cnf?cmd=set_cm_vars&name=test&val=42, щоб забезпечити запис цього значення кожні 30 секунд.

Визначення мови запитів:

Наразі у пошукових виразах "query", прикладах, можна використовувати імена членів та оператори "." і "[]":

випробуванняЕлемент з назвою "тест"
ім'я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.

Змінні Global Charging Manager:

Ви можете створювати змінні в конфігурації Charging Manager. Ви можете використовувати фіксоване значення або формулу як значення. Наприкінці кожного циклу оновлення 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:


                        Скріншот відображення змінних лічильника

Результати роботи Глобального менеджера зарядки:

У конфігурації Диспетчера заряджання ви можете налаштувати глобальні виходи, як описано вище у визначенні лічильника в розділі "Виходи". Вони встановлюються в кінці кожного циклу оновлення, якщо їхній стан змінився. Якщо ви хочете керувати перемиканням виходів у визначених користувачем пристроях, рекомендується використовувати наведену вище схему (див. Змінні диспетчера заряджання): Ви встановлюєте змінні з іменами "out1", "out2" і т.д. у визначеному користувачем лічильнику і налаштовуєте виходи у визначеному користувачем лічильнику, які перемикають вихід залежно від значення цих змінних.

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

Modbus API диспетчера заряджання використовується для керування пристроями Modbus, які мають будь-яку Modbus RTU або TCP-адресу (доступну з диспетчера заряджання). Як і в конфігурації окремих пристроїв, введіть 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 Charging Manager підтримує такі додаткові параметри запиту: 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".