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. 输出处理后的数据

虽然这只是编程的一小步,但对于理解智能家居设备如何工作是一大步!

希望这个教程对你有所帮助。记住,编程就像学骑自行车,刚开始可能会摔几跤,但只要坚持,很快就能掌握!


Github
Gitee
微信交流群
QQ交流群
商务咨询
北京极益科技有限公司 版权所有 ICP:京ICP备15045763号-12