适用于 Modbus 或 645 的上下行模板;重点不是“AI 会不会写”,而是“你有没有把正确的信息喂给 AI”。
很多人第一次用模板模式时,会觉得 Lua 难、模板复杂。
实际上对新手更难的,往往不是写代码,而是不知道怎么把自己的需求准确地告诉 AI。
这篇教程的目标很明确:
建议你先把 Modbus 或 645 的映射键值、上下行原始数据格式确认好,再让 AI 帮你生成模板。
VS Code,或者使用你习惯的 AI 软件也可以;ChatGPT 或其他 AI 插件并安装;

AI 生成模板能不能成功,核心取决于你有没有告诉它下面这些内容:
table,不是示例 JSON 字符串。你描述得越清楚,AI 生成结果越稳定。
无论是 Modbus 还是 645,都建议先把“模板函数规则”先发给 AI。
这样 AI 不容易乱写。
先把下面这段发给 AI:
我在使用 lua 写一个 hook 功能,需要实现函数:
function(tm,td,ex) return tm end
这是上行数据处理函数。
说明:
- tm 是混合模式输入,table 格式,例如 {"a":10,"b":11}
- td 是设备模式输入,table 或数组格式,例如 [{"c":3,"v":{"a":0},"i":1},{"c":3,"v":{"b":0},"i":2}]
- ex 是用户参数 table,例如 {"imei":"1224234"}
需要根据 tm、td、ex 生成一个新的 table 返回。
要求:
1. 只输出 lua 函数代码
2. 返回值必须是 table
3. 模板里要做好判空处理
4. 如果字段可能为空,请使用类似 (tm.a or 0) 的写法
5. 如果 td 可能为空,请使用 if not td or #td < 1 then return {} end
6. 不要输出解释,只输出最终函数
这一步很重要。先告诉 AI“规则”,再告诉它“你的具体需求”。
如果你要写下行模板,先把下面这段发给 AI:
我在使用 lua 写一个 hook 功能,需要实现下行模板函数:
function(sub,ex) return sub end
说明:
- sub 是下发 JSON 反序列化后的 table
- ex 是用户参数 table
返回值最多可以有 4 个:
1. 转换后的 table
2. bool,表示是否主动读取
3. 自定义串口命令,通常没有时返回 nil
4. msgid
要求:
1. 只输出 lua 函数代码
2. 必须做判空处理
3. 返回的第一个值必须是 table
4. 如果是主动读取,第二个返回值为 true
5. 如果是写入,第二个返回值为 false
6. 不要输出解释,只输出最终函数
先把上面的“上行模板通用前提”发给 AI。
这一段才是你真正要改的部分。
你以后只需要替换这里的“原始输入”和“目标输出”。
比如你当前输入是:
{"temp":25.5,"humi":76.8}
用户参数是:
{"csq":31,"vbat":11.988}
你想要的结果是:
{
"version": "1.0",
"id": "0",
"params": {
"temperature": {
"value": 25.5,
"unit": "°C"
},
"humidity": {
"value": 76.8,
"unit": "%"
},
"signalStrength": {
"value": 31,
"unit": "RSRP"
},
"voltage": {
"value": 11.988,
"unit": "V"
}
}
}
那你给 AI 的完整提问可以这样写:
现在我输入的 tm 是:
{"temp":25.5,"humi":76.8}
ex 是:
{"csq":31,"vbat":11.988}
我需要的结果格式是:
{
"version": "1.0",
"id": "0",
"params": {
"temperature": {
"value": 25.5,
"unit": "°C"
},
"humidity": {
"value": 76.8,
"unit": "%"
},
"signalStrength": {
"value": 31,
"unit": "RSRP"
},
"voltage": {
"value": 11.988,
"unit": "V"
}
}
}
请帮我生成一个可以直接使用的 lua 上行模板函数。
要求:
1. 只输出函数代码
2. 返回的是 table
3. 要做判空处理
4. 不要输出解释
AI 生成的结果可能类似这样:
function(tm, td, ex)
local result = {
version = "1.0",
id = "0",
params = {
temperature = {
value = tm.temp or 0,
unit = "°C"
},
humidity = {
value = tm.humi or 0,
unit = "%"
},
signalStrength = {
value = ex.csq or 0,
unit = "RSRP"
},
voltage = {
value = ex.vbat or 0,
unit = "V"
}
}
}
return result
end
AI 给出的代码可能不够简洁,但只要逻辑对、能通过模板测试,就是可以使用的。

注意:最后填入模板输入框时,不要再额外包一层名字;直接填写
function(tm,td,ex)开头的匿名函数即可。
如果你要用的是设备模式,那就不要再重点描述 tm,而要重点描述 td。
例如你要告诉 AI:
现在我输入的 td 是:
{
"1":{"v":{"bb":0,"aa":0},"i":1},
"2":{"v":{"bb":0,"aa":0},"i":2}
}
ex 是:
{"vbat":11.988}
我需要的结果是:
{
"1":{
"v":{
"bb":0,
"aa":0,
"vbat":11.988
},
"i":1
},
"2":{
"v":{
"bb":0,
"aa":0,
"vbat":11.988
},
"i":2
}
}
请帮我生成一个可以直接使用的 lua 上行模板函数。
要求:
1. 只输出函数代码
2. 要考虑 td 可能为空
3. 返回结果必须是 table
4. 不要输出解释
设备模式最容易出错的地方就是
td为空时没有判空,所以这一点一定要明确告诉 AI。
下行模板的思路也是一样的:
先告诉 AI 固定规则,再告诉它“原始输入是什么”“目标输出是什么”。
你可以这样问 AI:
现在我有一个下发的 lua hook 函数需要实现。
函数格式是:
function(sub,ex)
local data = sub.data or {}
return data, sub.read
end
sub 是输入参数:
{"data":{"DO1":1},"msgid":12345,"read":false}
最终输出的格式是:
{"DO1":1}
请帮我生成一个类似的函数。
要求:
1. 只输出函数代码
2. 要有判空处理
3. 返回格式正确
4. 不要输出解释
AI 一般会给出类似这样的结果:
function(sub, ex)
local data = sub.data or {}
return data, sub.read or false, nil, sub.msgid
end
比如当前输入 JSON 是:
[
{ "id": "temperature", "value": "27.43", "remark": "" },
{ "id": "humidity", "value": "32.18", "remark": "" }
]
你想让它变成:
{"temperature":27.43,"humidity":32.18}
那么你可以这样问:
现在我有一个输入的 json 是:
[
{ "id": "temperature", "value": "27.43", "remark": "" },
{ "id": "humidity", "value": "32.18", "remark": "" }
]
我想把它转换成:
{"temperature":27.43,"humidity":32.18}
请帮我生成一个 lua 下行模板函数。
要求:
1. 只输出函数代码
2. 返回格式是 return data, false
3. 要做判空处理
4. value 要转换成数字
5. 不要输出解释
AI 生成结果可能类似:
function(sub, ex)
local data = {}
for _, item in ipairs(sub or {}) do
if item.id and item.value then
data[item.id] = tonumber(item.value)
end
end
return data, false
end

如果你怕自己每次不会组织语言,可以直接用这个万能模板:
我在使用 lua 写 DevelopLink 的模板函数。
请根据我给你的原始输入格式和目标输出格式,帮我生成可以直接使用的 lua 模板函数。
已知规则:
- 上行模板格式是 function(tm,td,ex) ... end
- 下行模板格式是 function(sub,ex) ... end
- 返回值必须符合模板要求
- 必须做判空处理
- 不要输出解释
- 只输出最终函数代码
原始输入格式:
<把你当前实际输入贴在这里>
目标输出格式:
<把你想要的最终格式贴在这里>
补充要求:
<如果有 read、msgid、设备模式、字段改名等要求,也写在这里>
对新手来说,最稳的方式不是一句话问完,而是“规则 + 原始输入 + 目标输出 + 补充要求”四段式提问。
AI 写完后,不要马上上设备,建议先自己看这几个点:
function(tm,td,ex) 或 function(sub,ex)(tm.a or 0)if not td or #td < 1 then return {} endAI 最常见的问题不是语法报错,而是字段名写错、输入结构理解错、忘了判空。
这样成功率最高,也最容易排查问题。
pubhook 函数示例发给 AI;如果你描述得足够具体,AI 生成模板通常会比手写更快;但前提是你要先把“输入是什么、输出要什么”说清楚。