我有以下情况:我正在使用 Telegraf 从 ModBUS 获取数据并将其存储到 InfluxDB 中。 一个度量是一个整数,它们实际上都是布尔/位值。 例如,int 9 是 true (1)、 false (0)、 false (0) 和 true (1) 值。 获取该整数并将其作为单独的位/布尔值再次保存到 InfluxDB 中的最佳方法是什么? 安装的工具有 Telegraf、InfluxDB 和 Kapacitor。它还具有 Grafana,但希望将后处理的布尔值保存到 InfluxDB 中,以便以后使用其他工具进行分析。 预先感谢!
您可以使用 Telegraf 的 starlark 处理器插件和 Python 的 bitshift 运算符
完成您想要的操作这是 Telegraf 配置示例:
[[inputs.modbus]]
interval = "10s"
name_override="TestModbusDevice"
tagexclude = ["type", "name", "host", "slave_id"]
name = "NOT USED"
slave_id = 12
timeout = "3s"
controller = "tcp://127.0.0.1:502"
holding_registers = [
{ name = "Status1", byte_order = "AB", data_type = "UINT16", scale=1.0, address = [32008]},
]
[inputs.modbus.tags]
location="Test Location"
[[processors.starlark]]
namepass = ["*Modbus*"]
source = '''
def apply(metric):
data1 = metric.fields.get("Status1")
metric.fields["bit00"] = bool(data1 & 1)
metric.fields["bit01"] = bool(data1 >> 1 & 1)
metric.fields["bit02"] = bool(data1 >> 2 & 1)
metric.fields["bit03"] = bool(data1 >> 3 & 1)
metric.fields["bit04"] = bool(data1 >> 4 & 1)
metric.fields["bit05"] = bool(data1 >> 5 & 1)
metric.fields["bit06"] = bool(data1 >> 6 & 1)
metric.fields["bit07"] = bool(data1 >> 7 & 1)
metric.fields["bit08"] = bool(data1 >> 8 & 1)
metric.fields["bit09"] = bool(data1 >> 9 & 1)
metric.fields["bit10"] = bool(data1 >> 10 & 1)
metric.fields["bit11"] = bool(data1 >> 11 & 1)
metric.fields["bit12"] = bool(data1 >> 12 & 1)
metric.fields["bit13"] = bool(data1 >> 13 & 1)
metric.fields["bit14"] = bool(data1 >> 14 & 1)
metric.fields["bit15"] = bool(data1 >> 15 & 1)
return metric
'''
[[outputs.file]]
files = ["stdout"]
输出示例:
TestModbusDevice,location=Test\ Location Status1=9i,bit00=true,bit01=false,bit02=false,bit03=true,bit04=false,bit05=false,bit06=false,bit07=false,bit08=false,bit09=false,bit10=false,bit11=false,bit12=false,bit13=false,bit14=false,bit15=false 1704120270000000000
TestModbusDevice,location=Test\ Location Status1=5i,bit00=true,bit01=false,bit02=true,bit03=false,bit04=false,bit05=false,bit06=false,bit07=false,bit08=false,bit09=false,bit10=false,bit11=false,bit12=false,bit13=false,bit14=false,bit15=false 1704120280000000000
如果您不需要原始整数(上例中的 Status1)并且只需要结果指标中的位,只需将 metric.fields.get 更改为 metric.fields.pop