TTN V3对接Telegraf时Dragino LSE01土壤温湿度字段无法写入Influx
问题根因
- 对比提供的MQTT原始报文和InfluxDB已入库字段可以发现:所有成功入库的字段均为JSON原生数值类型(无引号包裹),缺失的
temp_SOIL、water_SOIL、temp_DS18B20三个字段均为字符串类型(双引号包裹的数值,如"19.20")。 - 当前Telegraf的
mqtt_consumer配置使用默认JSON解析规则,未指定采集字符串类型字段,也未开启字符串转数值的配置,因此这三个字符串格式的字段被直接丢弃,未写入InfluxDB。 - 同品牌LHT65传感器能正常采集所有字段,是因为其TTN端解码器输出的温湿度字段为原生数值类型,不存在字符串类型问题。
- 额外隐患:当前配置的
client_id = "telegraf"如果和其他MQTT消费端重复,会导致MQTT连接互踢、随机丢消息,建议一并修改。
修复方案
二选一即可,优先选第一种改Telegraf配置,操作最快。
方案1:修改Telegraf配置(推荐)
在原有mqtt_consumer配置块中新增字符串字段采集、字符串数值自动转换配置,同时修改client_id为唯一值,参考配置如下:
## 湿度传感器 Dragino LSE01-8 [[inputs.mqtt_consumer]] name_override = "TTN-LSE01" servers = ["tcp://eu1.cloud.thethings.network:1883"] qos = 0 connection_timeout = "30s" topics = [ "v3/lse01-8@ttn/devices/+/up" ] # 改为独立client_id,避免和其他消费端互踢 client_id = "telegraf-lse01" username = "lse01-8@ttn" password = "NNSXS.LLSNSE67AP..................P67Q.Q...........HPG............KJA..........." data_format = "json" # 指定需要采集的字符串字段 json_string_fields = [ "uplink_message_decoded_payload_temp_SOIL", "uplink_message_decoded_payload_water_SOIL", "uplink_message_decoded_payload_temp_DS18B20" ] # 自动将字符串格式的数值转为数值类型存储 json_numeric_strings = true
修改完成后重启Telegraf服务,等待新的设备上行报文即可。
方案2:修改TTN端Payload解码器
进入TTN控制台对应应用的Payload Formatter配置页,找到LSE01的解码逻辑,将temp_SOIL、water_SOIL、temp_DS18B20三个字段的返回值从字符串改为数值类型,例如将原本类似temp_SOIL: tempVal.toFixed(2)的逻辑改为temp_SOIL: Number(tempVal.toFixed(2)),确保解码器输出的JSON中这三个字段是无引号的原生数值,和LHT65的输出格式保持一致即可,无需修改Telegraf配置。
验证与排障
- 修改完成后等待2-3个设备上报周期(LSE01默认上报间隔为5-10分钟),再到InfluxDB查询对应字段是否存在。
- 如果仍无法查询到字段,查看Telegraf运行日志:
- 若存在字段类型冲突报错,说明之前该measurement下已有同名字段的其他类型数据,可修改
name_override为新的测量名(如TTN-LSE01-v2)规避,或清理旧的冲突数据。 - 若存在MQTT频繁断连报错,检查client_id是否唯一,MQTT账号密码、topic配置是否正确。
- 若存在字段类型冲突报错,说明之前该measurement下已有同名字段的其他类型数据,可修改
内容的提问来源于stack exchange,提问作者Peter Moellmann
相关产品推荐
相关产品推荐

