ThingsPanel编写数据处理脚本,将电压从3000改成3
发布日期:
想象一下,你有一个传感器,它可能把电池电压发送为"3000",但这实际上表示的是3.0伏特。
脚本就像一个翻译官,它可以把传感器的"机器语言"翻译成我们能理解的人类语言。我们现在就来学习写脚本。
基本概念解释
在开始编写脚本前,先了解几个基本概念:
● JSON: 一种数据格式,像是一个整齐的列表,保存各种信息
● Lua: 我们将使用的编程语言,它很简单易学
● 函数: 一段可以重复使用的代码,像个机器人,给它原料,它就能加工出成品
开始编写我们的脚本
第一步:设置基本框架
-- 引入需要的工具箱
local json = require("json")
-- 创建我们的翻译官函数
function encodeInp(msg, topic)
-- 这里我们将写处理代码
return msg -- 先简单地返回原始消息
end
这就像准备好了一个空白的工作台,我们接下来往里面添加工具和步骤。
第二步:理解输入数据
传感器可能会发送这样的数据:
{"temperature": 25.7, "humidity": 60.2, "voltage": 3000}
这表示:
● 温度是25.7度
● 湿度是60.2%
● 电池电压是3000毫伏(即3.0伏)
第三步:解析数据
-- 尝试理解传感器发来的消息
local jsonData = {}
local status, err = pcall(function()
jsonData = json.decode(msg)
end)
-- 如果无法理解,记录下原因并原样返回
if not status or type(jsonData) ~= "table" then
print("无法理解消息: " .. tostring(err))
return msg
end
这就像接收到一封外语信件,我们先尝试理解它。如果实在看不懂,就记下原因,把原信交给别人处理。
第四步:处理各种数据
处理电压数据:
-- 检查是否有电压信息
if jsonData.voltage ~= nil then
-- 把毫伏转换为伏特
jsonData.voltage = jsonData.voltage / 1000
print("电压是: " .. jsonData.voltage .. "V")
-- 根据电压判断电池状态
if jsonData.voltage >= 3.0 then
jsonData.battery_status = "很好"
elseif jsonData.voltage >= 2.7 then
jsonData.battery_status = "一般"
else
jsonData.battery_status = "电量低"
end
end
这就像我们看到"3000毫伏",然后在脑子里计算:"哦,这是3.0伏",然后判断:"嗯,电池状态很好"。
处理温度和湿度:
-- 处理温度数据
if jsonData.temperature ~= nil then
-- 保留一位小数
jsonData.temperature = math.floor(jsonData.temperature * 10) / 10
print("温度是: " .. jsonData.temperature .. "°C")
end
-- 处理湿度数据
if jsonData.humidity ~= nil then
-- 转为整数
jsonData.humidity = math.floor(jsonData.humidity)
print("湿度是: " .. jsonData.humidity .. "%")
end
这就像把"25.73度"四舍五入为"25.7度",把"60.2%"简化为"60%"。
第五步:返回处理后的数据
-- 把处理好的数据转回JSON格式
local newJsonString = json.encode(jsonData)
return newJsonString
这就像把我们翻译和整理好的信息重新写成一封信,交给下一个处理者。
完整脚本
把上面的所有部分组合起来,就得到了我们完整的脚本:
-- 导入JSON库用于处理数据
local json = require("json")
function encodeInp(msg, topic)
-- 尝试解析JSON数据
local jsonData = {}
local status, err = pcall(function()
jsonData = json.decode(msg)
end)
-- 如果解析失败,记录错误并返回原消息
if not status or type(jsonData) ~= "table" then
print("无法理解消息: " .. tostring(err))
return msg
end
-- 处理电压数据
if jsonData.voltage ~= nil then
-- 将毫伏转换为伏特
jsonData.voltage = jsonData.voltage / 1000
print("电压是: " .. jsonData.voltage .. "V")
-- 判断电池状态
if jsonData.voltage >= 3.0 then
jsonData.battery_status = "很好"
elseif jsonData.voltage >= 2.7 then
jsonData.battery_status = "一般"
else
jsonData.battery_status = "电量低"
end
end
-- 处理温度数据
if jsonData.temperature ~= nil then
-- 保留一位小数
jsonData.temperature = math.floor(jsonData.temperature * 10) / 10
print("温度是: " .. jsonData.temperature .. "°C")
end
-- 处理湿度数据
if jsonData.humidity ~= nil then
-- 转为整数
jsonData.humidity = math.floor(jsonData.humidity)
print("湿度是: " .. jsonData.humidity .. "%")
end
-- 将处理后的数据转换回JSON字符串
local newJsonString = json.encode(jsonData)
return newJsonString
end
常见问题解决
如果脚本不工作,可能是因为:
1. 数据格式不对: 确保传感器发送的真的是JSON格式
2. 字段名不匹配: 可能传感器用的是temp而不是temperature
3. 数据类型不对: 可能电压值不是数字而是字符串
如何测试和调试
可以在脚本中添加更多的print语句来查看每一步的结果:
print("收到的原始消息: " .. msg)
print("解析后的数据: " .. json.encode(jsonData))
print("最终输出的消息: " .. newJsonString)
配置到ThingsPanel中
小结
恭喜你!现在你已经学会了如何编写一个简单的数据处理脚本。这个脚本可以:
1. 接收传感器数据
2. 解析JSON格式
3. 转换数值(如毫伏到伏特)
4. 添加新信息(如电池状态)
5. 输出处理后的数据
虽然这只是编程的一小步,但对于理解智能家居设备如何工作是一大步!
希望这个教程对你有所帮助。记住,编程就像学骑自行车,刚开始可能会摔几跤,但只要坚持,很快就能掌握!