文档

MQTT的应用范围

MQTT是一个互联网协议,有一个中央消息代理。通过这个消息中介,参与者可以订阅某些 "主题",并向主题发送消息。cFos Charging Manager可以监听特定主题的消息,从而通过MQTT进行控制。它还可以传达它所管理的设备的状态。cFos Power Brain Wallbox也可以通过MQTT进行控制并传输其状态。这在连接到家庭自动化系统、工业控制(M2M)以及监测和记录时非常有用。所有主题都以cfos_mqtt开头。如果你想把多个 cFos MQTT 设备连接到一个 MQTT 代理商,主题可以选择以cfos_mqtt_<serial number>/开头,在配置下可调。在配置中,你也可以为默认的MQTT代理设置一个URL。URL可以选择以mqtt://mqtts://开头。通过mqtts://,cFos充电管理器或cFos电脑墙盒建立了一个TLS连接。未加密连接采用标准端口1883,TLS连接采用标准端口8883。然而,你也可以在URL中指定一个端口。你可以用通常的URL符号指定用户名和密码,例如:mqtt://user:password@192.168.2.111。如果你在cFos Charging Manager配置中指定一个MQTT代理,你可以指定一个单独的代理,或者直接写mqtt。在这种情况下,使用存储在配置中的默认经纪人。

cFos Charging Manager同时支持MQTT 3.1.1和MQTT 5。 如果你让URL以mqtt3://或mqtt5://(mqtts3://和mqtts5://用于加密连接)开头,你就可以确定协议版本。默认是MQTT 3.1.1。如果显示错误信息,cFos Charging Manager会尝试将MQTT 5切换回MQTT 3.1.1。这对老的Mosquitto经纪商有效,但对其他经纪商不一定有效。

注意:由于MQTT的设置需要管理员密码,计费管理器相应地处理数据。因此,故意发送只能用管理员密码访问的数据。

关于MQTT经纪人的说明:感谢Stefan G. (#diebestenuserderwelt),我们能够测试ioBroker中内置的MQTT经纪人。这个MQTT 3.1.1经纪商的行为(截至2023年2月)在几个方面不符合标准:连接尝试被无声地终止,没有错误信息,有效载荷有时在PUBLISH数据包中丢失,PUBLISH数据包显然被发送两次(这可以通过配置设置来关闭吗)。这意味着这个代理不适合控制收费管理器的API,因为API请求可能被执行一次以上。尽管我们对我们的MQTT实现与尽可能多的经纪商兼容很感兴趣,但我们目前推荐使用Mosquitto的ioBroker。

通过设备类型 "HTTP输入 "整合仪表和墙盒。

这些设备不是通过HTTP提供的(见HTTP API -> HTTP仪表和壁挂炉),而是也可以听从MQTT。输入mqtt或一个MQTT代理的URL作为设备地址。然后相应的仪表或壁挂箱监听主题cfos_mqtt/set/<device ID>,例如,对于设备ID为M1的仪表,监听cfos_mqtt/set/M1。然后,HTTP输入仪表期望一个JSON字符串作为消息,如HTTP API中 "HTTP仪表和墙盒 "下的描述。因此,你的MQTT源必须以这种格式传递数据。这使您可以通过从其他来源(如家庭自动化系统)获得数据,然后将其输入充电管理器,从而整合cFos充电管理器不支持的设备。
注意:如果来自源头的数据与HTTP计数器所期望的格式不同,你也可以创建一个自定义计数器。对于MQTT,这将在下面描述。


例子:你已经创建了一个HTTP输入计数器,它的设备ID是M3。你输入了Mosquitto代理的地址,例如mqtt://192.168.2.30。如果你在运行Mosquitto的计算机上的命令行中输入以下命令:
mosquitto_pub -h localhost -t cfos_mqtt/set/M3 -m '{ "model": "TestModell", "import_wh": 12345, "export_wh": 23456, "voltage": [231, 232, 233], "current": [10001, 10002, 10003] }'
然后,该计数器应包含上述值。

转移充电管理器设备的状态

在充电管理器的配置中,你可以指定一个MQTT代理URL(或标准代理的mqtt),然后充电管理器在cfos_mqtt/get/dev_info主题下发布所有设备的状态。它以HTTP get_dev_info中已知的格式传输。这给你提供了所有设备的值,因为它们在用户界面中也是可见的,例如电表的功率值或壁挂箱的状态。如果你只想订阅单个设备,你可以停用 "通过MQTT发布信息 "的复选框,而在 "显示 "下单个设备的设置中勾选 "通过MQTT发布信息 "选项。然后在cfos_mqtt/get/<device-ID>主题下发布关于相应设备的相应JSON字符串此外,你可以在cfos_mqtt/get/params主题下订阅所有的全局值,因为它们是以HTTP get_dev_info的格式在 "params "下输出的。

通过MQTT控制cFos Charging Manager API

在 cFos 计费管理器配置中,您可以在 "通过 MQTT 访问 API 的代理 "下指定 MQTT 代理 URL(或标准代理的 mqtt)。如果该值不是空的,cFos 计费管理器就会订阅以 cfos_mqtt/api/ 开头的所有主题。然后,它会把这些主题下的信息当作以 /cnf? 开头的 HTTP URL 来解释,并转发给 HTTP API。然后,计费管理器会将 HTTP API 的响应以 JSON 格式发布到主题 cfos_mqtt/api_res 下。这样,您就能通过 MQTT 控制几乎整个 HTTP API。提供长 JSON 响应的 API 调用除外。例如:cfos_mqtt/api/cmd=set_cm_vars&name=x&val=1使用 API 函数 set_cm_var 将充电管理器变量 x 设为 1。cfos_mqtt/api/cmd=enter_rfid&rfid=5678&dev_id=E1下的消息将输入设备 ID 为 E1 的墙盒的 RFID 5678(另请参阅我们的扩展 RFID 功能)。
通过 HTTP POST 发送的数据可放在主题下的信息中。

示例:定期更改充电管理器可用的最大总电流:
在充电管理器常规设置的 "通过 MQTT 访问 API 的代理 "下输入您的代理(如果要使用存储在 "配置 "下的默认代理,则只需输入 mqtt)。然后,使用 MQTT 向主题
cfos_mqtt/api/cmd=set_params
发布一个 JSON 对象,内容如下:
{"max_total_cur_prc": p}
其中 p 表示应占用预设最大总流的百分比。
注意:某些 HTTP API 调用会导致计费管理器保存配置。如果执行次数过多,(cFos Power Brain 或 cFos Wallbox Booster 中的)闪存或 Raspberry 中的 SD 卡就会磨损。因此,使用单一参数 "max_total_cur_prc "的 API 调用 "set_params "不会保存参数。

通过MQTT控制墙盒

如果 cFos 充电管理器不是在 "负载管理 "模式下,而是在 "观察 "模式下,您可以使用 MQTT 亲自控制所有墙盒。这尤其适用于在 "观察 "模式下作为从机操作的cFos Power Brain壁挂炉。要做到这一点,您必须在MQTT下的充电管理器设置中勾选 "激活对墙盒的控制 "选项。然后cFos计费管理器监听MQTT主题cfos_mqtt/ctl,并期待有JSON对象的消息。这个对象有子对象作为属性,设备ID作为名称。这些子对象看起来像这样:{"cur": c, "ena": b, "wke": b},其中c是以mA为单位的充电电流,b可以分别为真或假。"ena": false 停用壁挂炉的充电功能,"wke": true 试图向壁挂炉发送 "唤醒汽车 "命令(目前只有cFos Power Brain壁挂炉可以做到)。你也可以省略 "cur"、"ena "和 "wke",从而只执行某些控制功能。
例如: {"E1":


{cur: 8000, ena: true, wke: true}, "E2": {cur: 10000}}

. 将设备ID的壁挂炉的充电电流设置为8A,激活充电并尝试唤醒汽车。此外,壁挂炉E2的充电电流被设置为10A。

通过MQTT发送日志和交易日志

你可以在 "配置 "下指定一个MQTT代理URL,用于在系统日志中传输日志条目。然后,cFos计费管理器在cfos_mqtt/log主题下发布所有日志条目。这使你可以远程监控充电管理器的日志。你也可以在 "配置 "下为交易日志条目指定一个MQTT代理URL。然后所有的收费交易都在cfos_mqtt/ta_log主题下发送。这允许远程评估收费交易会计数据,并在另一个系统上创建收费交易备份。充电交易在充电插头插入时开始,在插头拔出时结束。

使用MQTT的用户定义的计数器

你可以使用MQTT的rtype = 2创建自定义计数器。这些计数器的定义与HTTP计数器(rtype = 1)类似。然而,这里的地址不是HTTP URL,而是MQTT主题。




例如:" power_w": {"地址": "/test_topic3", "类型": "float", "查询": "power_w"
}这里,用户定义的计数器订阅主题/test_topic3,并期望得到一个属性为 "power_w "的JSON对象,例如:{"power_w": 1234}。不同的计数器变量可以有不同的主题,一旦有消息在相应的主题下发布,就会立即更新。