我需要帮助,我有一个问题,我有发送我的Zigbee温度计的数据流入,通过telegraf。
这是路径: Zigbee Sonoff SNZB-02 -> Tasmota ZBBridge -> MQTT -> Telegraf -> InfluxDB
zigbee温度计的id:0x4EF9可能会更改,因为它是随机分配给设备的,在Tasmota中,我可以指定一个“友好名称”,在本例中是:
对于简单的tasmota设备,我没有问题,我在MQTT主题中有该设备的一个条目,Telegraf很好地处理了这些条目。我的问题是来自Zigbee的数据,因为它有一个单一的主题,而且在流入中的输出有点难以处理:
例如,Zigbee温度计的MQTT消息:
tele/tasmota_ABDCEF/ZB_Sonoff_Temp01/SENSOR {"ZbReceived":{"0x4EF9":{"Device":"0x4EF9","Name":"ZB_Sonoff_Temp01","Humidity":94.84,"Endpoint":1,"LinkQuality":34}}}数据采用Json格式,如您所见,在Telegraf中,我使用的是mqtt_consumer,下面是config: /etc/telegraf/telgraf.d/mqtt.conf
[[inputs.mqtt_consumer]]
servers = ["tcp://192.168.10.10:1883"]
## Topics that will be subscribed to.
topics = [
"tele/tasmota_ABCDEF/ZB_Sonoff_Temp01/SENSOR"
]
qos = 0
connection_timeout = "30s"
username = "user"
password = "password"
data_format = "json"
[[outputs.influxdb]]
urls = ["http://localhost:8086"]
database = "test_temp"
# skip_database_creation = true这是我的/etc/telegraf/telgraf.conf:
[global_tags]
[agent]
logfile = "/var/log/telegraf/telegraf.log"
interval = "10s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = ""
hostname = ""
omit_hostname = false以下是大量涌入的数据:
time ZbReceived_0x4EF9_Endpoint ZbReceived_0x4EF9_Humidity ZbReceived_0x4EF9_LinkQuality ZbReceived_0x4EF9_Temperature host topic
---- -------------------------- -------------------------- ----------------------------- ----------------------------- ---- -----
2021-12-24T15:43:55.26962955Z 1 99.99 26 32.24 influxdb-test tele/tasmota_ABCDEF/ZB_Sonoff_Temp01/SENSOR
2021-12-24T15:43:55.560162845Z 1 21 25.18 influxdb-test tele/tasmota_ABDCEF/ZB_Sonoff_Temp01/SENSOR这是可以的,因为我可以通过“主题”字段选择设备,但问题是"ZbReceived_0x4EF9_Temperature“字段在与zigbee重新关联时更改ID时”理智“,这可能会发生。
我找到的解决方法是为字段添加一个重命名:
[[processors.rename]]
[[processors.rename.replace]]
field = "ZbReceived_0x4EF9_Temperature"
dest = "Temperature"
[[processors.rename.replace]]
field = "ZbReceived_0x4EF9_Humidity"
dest = "Humidity"
[[processors.rename.replace]]
field = "ZbReceived_0x4EF9_Endpoint"
dest = "Endpoint"
[[processors.rename.replace]]
field = "ZbReceived_0x4EF9_LinkQuality"
dest = "LinkQuality"它可以根据我的需要改变字段(没有湿度,但并不总是被推送,所以没关系,我在更改之间删除db ):
time Endpoint LinkQuality Temperature host topic
---- -------- ----------- ----------- ---- -----
2021-12-24T15:47:09.992947108Z 1 21 23 influxdb-test tele/tasmota_ABCDEF/ZB_Sonoff_Temp01/SENSOR
2021-12-24T15:47:25.868416967Z 1 13 27.06 influxdb-test tele/tasmota_ABCDEF/ZB_Sonoff_Temp01/SENSOR我不太喜欢这个解决方案,因为它有硬编码在telegraf配置中的设备it,所以当我添加或更改传感器时,我需要编辑telegraf。
我现在遇到的问题是,我希望找到一个通配符或一种方法来独立于设备id更改字段,例如:
[[processors.rename]]
[[processors.rename.replace]]
field = "*_Temperature"
dest = "Temperature"但是我找不到它,我已经阅读了方法的所有文档(也是字符串),但我无法找到实现这一目标的方法。
你有什么能帮我的提示吗?
非常感谢您,祝您节日快乐!
发布于 2021-12-25 00:02:37
我需要使用processors.regex.field_rename,但是我的telegraf版本比最新版本(1.21.1-1)超过了(1.20.2-1),所以field_rename是不可用的。
我用过的正则表达式:
[[processors.regex]]
[[processors.regex.field_rename]]
pattern = '(^ZbReceived_)\w+_'
replacement = "${2}"结果:
time Endpoint Humidity LinkQuality Temperature host topic
---- -------- -------- ----------- ----------- ---- -----
2021-12-24T23:51:48.289677669Z 1 0 25.26 influxdb-test tele/tasmota_ABCDEF/ZB_Sonoff_Temp01/SENSORhttps://stackoverflow.com/questions/70474713
复制相似问题