文档

用户定义的计数器

注意:cFos充电管理器可以使用SunSpec(设备类型为 "SunSpec太阳能逆变器/仪表")读出大多数太阳能逆变器。在这种情况下,您不需要创建自己的电表定义。

cFos 计费管理器允许您创建自己的计费表定义,以支持标准剧目中没有的计费表。目前有三种类型:Modbus 计数器、HTTP/JSON 计数器和 MQTT/JSON 计数器。这些计数器的定义文件非常相似。Modbus 计数器通过 Modbus 从特定寄存器读取数据,而 HTTP/JSON 计数器则通过 HTTP 请求检索数据,并以 JSON 格式读取响应。对于 MQTT/JSON 仪表,cFos 计费管理器会订阅 MQTT 主题,并读取主题下发布的 JSON 消息。cFos 计费管理器使用一种小型 "查询语言 "进行读取。以下是有关cFos 计费管理器 MQTT 功能的文档。

除了一系列预定义变量(如电流和电压)外,用户自定义计数器还可以读入未知变量、用户自定义变量、查询输入和设置输出。通过读入变量和设置输出,可以对公式进行分析。结合下文所述的充电管理器变量和全局充电管理器输出,这是一项强大的功能,甚至可以执行某些家庭自动化任务和控制外部设备,如电池存储单元。如果您使用该功能实现了控制任务,请给我们反馈。我们对客户使用 cFos 充电管理器进行的控制非常感兴趣,这有助于我们根据客户需求进一步开发充电管理器。

下面是一个简单的定义Modbus的例子,它读取一个单一的有功功率的寄存器。你可以根据你的具体应用轻松地修改寄存器的编号。
单个寄存器的定义示例.

这里有一个Modbus定义的例子和一个HTTP/JSON定义的例子。
下载Modbus仪表的定义样本
下载HTTP/JSON表的定义样本

充电管理器已经带有一些这样的文件,但你可以在 "系统配置 "下上传你自己的文件,也可以再次删除它们。
在这里,你会发现我们提供的大部分仪表定义。
下载提供的计数器定义

如果你已经创建了自己的计数器文件,并且它可能与其他用户有关,如果你能将它提供给我们,我们将非常感激。然后我们将在未来版本的收费管理器中提供它。

下载更多电表的定义

定义文件的结构。

计数器定义是 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_slavetr ue:多次访问同一设备时也保持停顿。 retries:设备未响应时的重试次数。

这些全局属性适用于Modbus TCP和RTU。

modbus_read

modbus_read_max_reg isters:一次可读取的最大寄存器数目。 modbus_ allow_gaps:true = 在读取操作中可读取未使用的寄存器区域。

对于Modbus TCP和HTTP/JSON,有一个对象'tcp',其属性如下。


connect_timeout:毫秒:TCP 连接的最长等待时间。delay_after_ connect:毫秒:建立连接后发送第一条命令前的暂停时间。

这两种定义类型(Modbus和HTTP/JSON)都有以下附加属性。

upd_delay: 单位:毫秒:确定读取设备的时间间隔。
如果查询过于频繁,某些设备会超载。 manufacturer(制造商):字符串,制造商名称。


delay_accum ulated: true = 只在每 3 秒或有足够电量时才查询累积值(千瓦时)。 false = 始终查询这些值。 ui_addr: URL,如果与调用网络界面的设备地址不同:包含解释为 0 的值的数组(如果设备根据型号支持某些值,则该数组非常有用)。

如果省略上面列出的属性,cFos 充电管理器会使用默认值,这在大多数情况下都很有效。

JSON 定义的下一步是定义仪表用来读取或计算电流、电压等值的变量。
充电管理器可识别以下变量:type_designation、version、firmware_version、serial:这些变量构成了型号名称,显示在磁贴的扩展信息中。电压_l1......电压_l3、电流_l1......电流_l3、功率_w、功率_var、功率_va、功率_w_l1......功率_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,分配的值将存储在全局充电管理器变量中(见下文),并可进行相应查询。
带 * 的变量如果定义了以 "*"开头的变量,则这些变量将显示在用户界面的仪表瓦片中的扩展信息下,例如电池存储单元的温度。
注意:变量名只能使用数字、字母 a-z 和 A-Z。

一个变量的定义。


该对象以上述变量的名称命名,并具有以下属性: fixed:具有固定值的字符串。
如果无法确定值,例如 type_designation 或电压值,则该对象非常有用。exp r:字符串。类型:如果不是固定值或 expr,则是变量的类型:int16、uint16、int32、uint32、float、int64、字符串。uint16 和 uint32 是只能接受正数的类型。
对于 JSON/HTTP,通常可以使用 float。读取值乘以 "分辨率"。电压值必须以伏特为单位,电流以毫安为单位,功率以瓦特为单位,能量以瓦特小时(Wh)为单位。
如果 "分辨率 "为负,则可以反转具有相反符号的数值。 Once:bool(真或假)。
如果为 "true",则只在设备初始化时读取一次,否则将定期读取。 地址:数字(Modbus)或字符串(HTTP/JSON)。
要读取的值的 Modbus 寄存器编号或 HTTP URL:字符串。
对于 HTTP JSON,充电管理器在 JSON 响应中找到要读取的 使用的查询语言规范。对于 Modbus,值所在的字节顺序("hl "或 "lh")。长度:数字。对于 Modbus,以寄存器为单位的字符串长度;对于变量 "版本 "和 "固件版本","长度 "用于将数字版本转换为带点的字符串。长度 "允许取值 2 或 4,这样就会产生版本格式 a.b 和 a.b.c.d。长度 "为 2 且类型为 "int16 "或 "uint16 "时,计费管理器用点分隔低字节和高字节,用 "int32 "或 "uint32 "分隔低字节和高字节,用 "int64 "分隔低字节和高字节。对于 "lenth "4 和 "int32 "或 "uint32",计费管理器将数值分成 4 个字节,中间用点隔开。
re gex:字符串。如果指定了正则表达式,则计数器响应不需要使用 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+?字符串开 :^字符串结尾:$

投入的定义。

充电管理器可从各种寄存器或 JSON 元素中为每个设备请求多达 32 个输入值。输入 "属性是一个 JSON 数组。
必须为每个输入定义以下属性: address: 地址(Modbus 寄存器或 URL)。
计数
通过此请求读取的输入位数:对于 HTTP/JSON,在响应中查找值的查询语言。

每次更新时,cFos 计费管理器都会读取以这种方式定义的所有输入,并将比特存储在内部数组中,然后可以通过公式 Input1...InputN.进行查询。

产出的定义。

充电管理器最多可为每个设备切换 32 个输出。输出在 "输出 "中定义为输出对象的 JSON 数组。 在每个更新周期结束时,如果相应输出的状态发生变化,则会切换所有输出。

必须在输出对象中为每个输出定义以下属性: 地址:HTTP URL,可选 HTTP 方法,如 GET http://www.example.com?output1=${var1}。要设置 Modbus 寄存器,可以使用 cFos 计费管理器的 HTTP API。计费管理器会识别本地主机上的适当访问,并将请求重定向到内部处理程序,因此无需像访问外部 HTTP API 那样需要授权。如果所有替换后 URL 为空,则不会设置输出。例如,只有当某些变量存在时,才能切换输出(参见公式:exists() 函数)。您还可以在地址中指定 ${address} 和 ${id}。这是设置中定义的当前设备地址和 Modbus ID。
地址 "和 "id "主要用于使用 Modbus API(见下文)。 body:用于 POST 或 PUT 的可选 HTTP 主体。
在 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,则使用 text1,否则使用 text2。对于 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 秒写入一次该值。

查询语言的定义:

目前,成员名称和运算符". "和"[]"可以在 "查询 "搜索表达式中使用,例如。

测试名为 "测试 "的元素
name1.name2子对象 "name1 "中名为 "name2 "的元素
名称[idx]对象元素 "name "的元素 "idx"。"idx "可以是一个数字,例如对数组而言,或者是一个字符串。
name["u2"]对象元素 "name "的元素 "u2",对应于 "name.u2"
name[{"el1": "v1", "el2": 3}].value选择满足对象符号条件的数组元素,评估名为'value'的元素。例如,在这里,在数组'name'中,选择具有作为对象元素的'el1',值为'v1'和'el2',值为3的元素,然后从这个对象中返回元素'value'的值。

全球充电管理器变量:

您可以在计费管理器配置中创建变量。可以使用固定值或公式作为值。在每个更新周期结束时,充电管理器会根据需要重新计算这些变量的值。然后,您可以在(某些)计费管理器参数、计费规则或控制输出中使用这些变量。您也可以将Ex.member 或Mx.member 写成变量。在这种情况下,ExMx是充电管理器中设置的墙壁盒或仪表的设备 ID。member "是一个 "用户定义 "变量,保存在相应的设备中。某些变量具有特殊含义:对于 KEBA,"out1 "是开关输出;对于 ABB B23 电表,"out1 "和 "out2 "是开关输出(对于支持此功能的型号)。1 "打开输出,"0 "再次关闭输出。

如果你有一些电器必须在某些条件下被打开,但又要运行一段时间(如洗衣机、洗碗机),你也可以把变量定义为 "触发器"。然后,该变量的公式就是该变量被设置为1的条件。在一个可调整的时间后,它又会被设置为0。只要条件满足,"再触发条件 "可以使关闭(即把变量设置为0)之前的时间一再延长。

注意:变量名只能使用数字、字母 a-z 和 A-Z。

出于测试目的,您可以显示充电管理器和电表变量,例如当前的 Awattar 价格:


                        计数器变量截图显示

全球充电管理器的输出。

在充电管理器配置中,可以配置全局输出,如上文 "输出 "下计数器定义中所述。如果状态发生变化,则在每个更新周期结束时对其进行设置。如果要控制用户定义设备中的开关输出,建议使用上述惯例(参见充电管理器变量):在用户定义的计数器中设置名称为 "out1"、"out2 "等的变量,并在用户定义的计数器中设置输出,根据这些变量的值切换输出。

充电管理器的全局 Modbus API:

充电管理器的 Modbus API 用于控制具有任何 Modbus RTU 或 TCP 地址(可从充电管理器访问)的 Modbus 设备。与单个设备的配置一样,输入 COMx,bd,8,p,s 作为 Modbus RTU 的地址,其中 x 是 COM 端口号,bd 是波特率,p 是奇偶校验("N"、"E "或 "O"),s 是停止位数(1 或 2)。对于 Modbus TCP,地址是充电管理器网络中设备的 IP 地址,包括端口号。



Modbus API 的 URL(HTTP GET)为:/cnf?cmd=modbus_get 或 /cnf?cmd=modbus_set:

f
unc:Modbus 功能编号,如读取 3 或 4,写入 6 或 16。 id:Modbus 设备的设备 ID。
值可以指定为十进制或十六进制(带前缀 0x)。 val:数字:要写入寄存器的值。类型:'w' 16 位(默认),d = 32 位,f = 浮点数,q = 64 位,s = 字符串。

cnt:数字:寄存器中字符串的最大长度,其他类型省略或设置为 1。 order:字符串:字节顺序,可以是 "hl "或 "lh"。

注意:如果你的 "计数器 "主要有控制任务,你可以在这个瓦片的设置中勾选 "隐藏设备 "选项,这样这个设备就不会出现在开始页。

注意:一些通过HTTP读取的仪表需要一个用户名/密码作为授权。你可以在HTTP访问的地址中指定,例如用http://username:password@192.168.2.111。如果你的用户名或密码包含"@",你必须用"%40 "代替。