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

Дефинирани от потребителя броячи

Забележка: Мениджърът за зареждане cFos може да отчита повечето соларни инвертори, използващи SunSpec (тип устройство "SunSpec Solar Inverter / Meter"). В този случай не е необходимо да създавате своя собствена дефиниция на измервателен уред.

Мениджърът за таксуване на cFos ви позволява да създавате собствени дефиниции на измервателни уреди, за да поддържате измервателни уреди, които не са в стандартния репертоар. Понастоящем има три вида: Modbus броячи, HTTP/JSON броячи и MQTT/JSON броячи. Файловете с дефиниции за тези броячи са много сходни. Modbus броячите четат данните си чрез Modbus от определени регистри, докато HTTP/JSON броячите получават данните си чрез HTTP заявка и анализират JSON като отговор. За броячите MQTT/JSON мениджърът за таксуване на cFos се абонира за теми MQTT и анализира съобщенията, публикувани в рамките на темата, като JSON. За анализиране мениджърът за зареждане на cFos използва малък "език за заявки". Ето документацията за възможностите на MQTT в мениджъра за зареждане на cFos.

В допълнение към редица предварително дефинирани променливи, като например ток и напрежение, дефинираните от потребителя броячи могат също така да четат неизвестни дефинирани от потребителя променливи, да задават заявки на входовете и да задават изходи. Четенето на променливи и задаването на изходи позволява оценяването на формули. В комбинация с описаните по-долу променливи на Charging Manager и глобални изходи на Charging Manager това е мощна функция, която дори позволява изпълнението на определени задачи за автоматизация на дома и управление на външни устройства, като например акумулаторни батерии. Ако реализирате задачи за контрол с това, моля, дайте ни обратна връзка. Много ни интересува какво контролират хората с мениджъра за зареждане cFos и това ни помага да доразвием мениджъра за зареждане според нуждите на клиентите.

Ето една проста примерна дефиниция за 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, в msec. определено, продължителността на паузата преди достъп до Modbus RTU, така че устройството да разпознае началото на съобщението.
silence_same_slave, true: Паузата се наблюдава и при няколко достъпа до едно и също устройство.
retries: Броят на повторните опити, ако устройството не отговори.
rcv_timeout: в msec. максималното време за изчакване на достъп, докато устройството отговори.

Тези глобални свойства се прилагат за Modbus TCP и RTU:

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

За Modbus TCP и HTTP/JSON има обект 'tcp' със следните свойства:

connect_timeout: е msec. максималното време за изчакване на TCP връзка.
delay_after_connect: в msec. Направете пауза след установяване на връзката, преди да изпратите първата команда.

И двата типа дефиниции (Modbus и HTTP/JSON) имат следните допълнителни свойства:

upd_delay: в msec. определя интервала, през който може да се чете устройство. Някои устройства се претоварват, ако се запитват твърде често.
manufacturer: String, име на производителя. Това се показва в разширената информация на плочката.
delay_accumulated: true = Натрупаните стойности (kWh) се заявяват само на всеки 3 секунди или ако има достатъчно енергия. false = Тези стойности се заявяват винаги.
ui_addr: URL, ако е различен от адреса на устройството за извикване на уеб интерфейса.
reserved: Масив със стойности, които се интерпретират като 0 (полезно, ако устройството поддържа определени стойности в зависимост от модела).

Ако пропуснете изброените по-горе свойства, мениджърът за зареждане cFos приема стойности по подразбиране, които работят добре в повечето случаи.

В дефиницията на 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 се опитва да изчисли от тях стойностите за voltage_l1..l3, signed current_l1..l3, power_w и power_va. Не е необходимо да посочвате всички променливи. Мениджърът за зареждане cFos се опитва да изчисли стойностите от съществуващите променливи.
import_wh, export_wh: Мениджърът за зареждане използва тези променливи, за да покаже import_wh и export_wh. За еднопосочни измервателни уреди (напр. инвертори) винаги трябва да дефинирате само import_wh. Export_wh трябва да се дефинира само за двупосочни измервателни уреди (например резервоари за съхранение или референтни измервателни уреди за мрежата).

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

Определяне на променлива:


Обектът е кръстен на името на променливата, посочена по-горе, и има следните свойства: fixed: String с фиксирана стойност.

Полезно, ако например не може да се определи стойност, например за type_designation или voltage. expr: String, променливата не се чете, а се оценява като формула. 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:
String (низ), за HTTP JSON спецификацията на езика за заявки на мениджъра за зареждане, с който той намира стойността за четене в JSON отговора. order (ред): String (низ), за Modbus редът на байтовете, или "hl", или "lh", в който се намира стойността. length (дължина): number (число), за Modbus дължината на низ в регистри. За променливите "version" (версия) и "firmware_version" (версия на фърмуера) "length" се използва за превръщане на цифровите версии в низове с точки. Позволени са стойности от 2 или 4 за 'length', което води до форматите на версиите a.b и a.b.c.d. При 'length' 2 и тип 'int16' или 'uint16' мениджърът за зареждане отделя ниския и високия байт с точка, при 'int32' или 'uint32' ниската и високата дума, при 'int64' ниската и високата дума. За 'lenth' 4 и 'int32' или 'uint32', мениджърът за таксуване разделя стойността на 4 байта, разделени с точка.
За 'int64' съответно 4 думи. regex: String. Ако е посочен регулярен израз, не е необходимо отговорът на брояча да бъде в 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).
брой: Брой на входните битове, които ще бъдат прочетени с тази заявка.
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()). В адреса можете да посочите допълнително ${адрес} и ${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 адреса, трябва да замените един текст с друг в зависимост от формулата, например при 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, Charging Manager взема адреса, конфигуриран за съответното устройство. Ако въведете "localhost" като домейн, Charging Manager взема адреса на устройството, на което е стартиран. Ако открие достъп до собствения си 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:

Понастоящем имената на членовете и операторите "." и "[]" могат да се използват в изразите за търсене "заявка", например:

тестЕлемент с име "test"
name1.name2Елемент с име "name2" в дъщерен обект "name1"
name[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) да се удължава отново и отново, стига условието да е изпълнено.

За тестови цели можете да покажете променливите на мениджъра за таксуване и електромера, например текущите цени на Awattar:


                        Екранна снимка на променливите на брояча

Глобален мениджър за зареждане Изходи:

В конфигурацията на мениджъра за зареждане можете да конфигурирате глобалните изходи, както е описано по-горе в дефиницията на брояча в раздел "Изходи". Те се задават в края на всеки цикъл на актуализация, ако състоянието им се е променило. Ако искате да управлявате превключващи изходи в устройства, дефинирани от потребителя, се препоръчва горната конвенция (вж. Променливи на мениджъра за зареждане): Задавате променливи с имена "out1", "out2" и т.н. в дефинирания от потребителя брояч и задавате изходи в дефинирания от потребителя брояч, които превключват изхода в зависимост от стойността на тези променливи.

Глобален Modbus API на мениджъра за зареждане:

Приложният програмен интерфейс Modbus на мениджъра за зареждане се използва за управление на устройства 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: число, стойност, която да бъде записана в регистъра. Изпуска се при четене.
type: 'w' 16bit (по подразбиране), d = 32bit, f = float, q = 64bit, s = string.
cnt: число, максималната дължина на низа в регистри, пропуска се за други типове или се задава 1.
order: String, редът на байтовете, или "hl", или "lh".

Забележка: Ако в "брояча" има предимно задачи за контрол, можете да поставите отметка на опцията "Скриване на устройството" в настройките на тази плочка, за да не се показва това устройство на началната страница.

Забележка: Някои измервателни уреди, които се отчитат чрез HTTP, изискват потребителско име/парола за оторизация. Можете да го посочите в адреса за HTTP достъп, например с http://username:password@192.168.2.111. Ако потребителското ви име или парола съдържа "@", трябва да го замените с "%40".