-- ============================================================ -- addon/iot/install.sql —— iot 插件数据表 -- 框架约定:插件安装时由 ywxapp\service\AddonService 执行本文件 -- (仅允许 CREATE TABLE / INSERT,见 importsql 白名单)。 -- 表名须为 __PREFIX__<插件名>_*,与 __PREFIX__addon 等核心表命名一致。 -- 时间字段统一约定:create_at / update_at / delete_at -- ============================================================ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; CREATE TABLE IF NOT EXISTS `__PREFIX__iot_connection` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `client_id` varchar(191) NOT NULL DEFAULT '' COMMENT 'MQTT客户端标识', `username` varchar(191) DEFAULT NULL COMMENT '用户名', `ip` varchar(64) DEFAULT NULL COMMENT '客户端IP', `status` tinyint(1) DEFAULT '1' COMMENT '1在线 0离线', `create_at` int DEFAULT NULL COMMENT '连接时间', `update_at` int DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_client_id` (`client_id`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT客户端连接表'; CREATE TABLE IF NOT EXISTS `__PREFIX__iot_message` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `client_id` varchar(191) DEFAULT NULL COMMENT '发布者client_id', `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题', `payload` longtext COMMENT '消息内容', `qos` tinyint(1) DEFAULT '0' COMMENT 'QoS等级', `retain` tinyint(1) DEFAULT '0' COMMENT '是否保留消息', `source` varchar(32) DEFAULT 'client' COMMENT '来源:client 客户端 / manual 后台手动', `create_at` int DEFAULT NULL COMMENT '时间', PRIMARY KEY (`id`), KEY `idx_topic` (`topic`), KEY `idx_create_at` (`create_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT消息日志表'; CREATE TABLE IF NOT EXISTS `__PREFIX__iot_topic` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `client_id` varchar(191) NOT NULL DEFAULT '' COMMENT '订阅者client_id', `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '订阅主题(支持通配符)', `qos` tinyint(1) DEFAULT '0' COMMENT 'QoS等级', `create_at` int DEFAULT NULL COMMENT '订阅时间', PRIMARY KEY (`id`), KEY `idx_client_id` (`client_id`), KEY `idx_topic` (`topic`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT订阅关系表'; -- 认证账号表(allow_anonymous=0 或提供用户名时校验密码) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_auth` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `username` varchar(191) NOT NULL DEFAULT '' COMMENT '用户名', `password` varchar(191) NOT NULL DEFAULT '' COMMENT '密码(bcrypt哈希,兼容明文)', `member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '归属框架会员ID(0=非会员账号;会员直通时回填对应 member_user.id)', `is_superuser` tinyint(1) NOT NULL DEFAULT '0' COMMENT '超级用户跳过ACL', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0禁用', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `create_at` int DEFAULT NULL, `update_at` int DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT认证账号表'; -- ACL 主题权限表(按 sort 顺序匹配,命中即决定 allow/deny) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_acl` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `target_type` varchar(16) NOT NULL DEFAULT 'all' COMMENT 'all/user/client', `target` varchar(191) NOT NULL DEFAULT '' COMMENT '匹配值:用户名/clientid,all时忽略', `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题过滤器,支持通配符与占位符%u %c', `access` tinyint(1) NOT NULL DEFAULT '3' COMMENT '1订阅 2发布 3两者', `allow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1允许 0拒绝', `sort` int NOT NULL DEFAULT '0' COMMENT '匹配优先级,越小越先', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `create_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_sort` (`sort`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT ACL权限表'; -- 保留消息持久化表(重启后恢复 retained) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_retain` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题', `payload` longblob COMMENT '消息内容(二进制安全)', `qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'QoS等级', `update_at` int DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_topic` (`topic`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT保留消息表'; -- 离线消息队列表(clean=false 会话离线期间的 QoS1/2 消息) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_offline` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `client_id` varchar(191) NOT NULL DEFAULT '' COMMENT '目标订阅者client_id', `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题', `payload` longblob COMMENT '消息内容(二进制安全)', `qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'QoS等级', `create_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_client_id` (`client_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT离线消息队列表'; -- 实时运行指标快照(Broker 周期写入单行 id=1,后台仪表盘轮询读取,跨进程安全) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_stats` ( `id` int unsigned NOT NULL, `uptime` int DEFAULT '0' COMMENT '运行时长(秒)', `clients_online` int DEFAULT '0' COMMENT '在线连接数', `clients_total` int DEFAULT '0' COMMENT '累计会话数', `subscriptions` int DEFAULT '0' COMMENT '订阅关系数', `messages_received` int DEFAULT '0' COMMENT '累计接收消息数', `messages_sent` int DEFAULT '0' COMMENT '累计发送消息数', `retained` int DEFAULT '0' COMMENT '保留消息数', `timestamp` int DEFAULT '0' COMMENT '快照时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT实时运行指标快照'; -- 转发规则表(规则引擎:匹配源主题后转发到外部 Broker,如 EMQX) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_rule` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `name` varchar(191) NOT NULL DEFAULT '' COMMENT '规则名称', `source_filter` varchar(255) NOT NULL DEFAULT '' COMMENT '源主题过滤器(支持通配符 + #)', `target_type` varchar(16) NOT NULL DEFAULT 'mqtt' COMMENT '转发目标类型:mqtt', `target_broker` varchar(255) NOT NULL DEFAULT '' COMMENT '外部Broker地址 host:port', `target_clientid` varchar(191) DEFAULT '' COMMENT '连接外部Broker的clientId(可选)', `target_username` varchar(191) DEFAULT '' COMMENT '外部Broker用户名(可选)', `target_password` varchar(191) DEFAULT '' COMMENT '外部Broker密码(可选)', `target_topic` varchar(255) NOT NULL DEFAULT '' COMMENT '转发目标主题,支持 ${topic} 变量', `target_qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT '转发QoS', `enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0停用', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `create_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_enabled` (`enabled`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT转发规则(规则引擎)'; -- 手动发布出站队列(后台/API 发布经 DB 出栈,Broker 消费后内部路由,零外部依赖) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_outbox` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题', `payload` longblob COMMENT '消息内容(二进制安全)', `qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'QoS等级', `retain` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否保留', `source` varchar(32) DEFAULT 'manual' COMMENT '来源: manual/api/admin', `create_at` int DEFAULT NULL, `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0待投递 1已投递', PRIMARY KEY (`id`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT手动发布出站队列(跨进程内部路由)'; -- 智能设备绑定表(华为式:后台预登记SN+配对码+激活令牌 → 设备入云激活领凭证 → 用户扫码+配对码绑定) -- 绑定与激活分离:pair_code 机身贴纸防抢绑;activate_token 出厂预置一次性,设备 activate() 领取 uuid/secret -- 连接约定:MQTT username=clientId=uuid,密码=secret(bcrypt) -- Topic 规范:/devices/{uuid}/state 设备上报(影子,retain) / /devices/{uuid}/cmd 下发命令 CREATE TABLE IF NOT EXISTS `__PREFIX__iot_device` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `sn` varchar(64) NOT NULL DEFAULT '' COMMENT '设备序列号(机身二维码内容,绑定凭证)', `mac` varchar(32) NOT NULL DEFAULT '' COMMENT '设备MAC(去冒号小写,即插即用注册身份)', `uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '设备连接用户名(clientId约定同值)', `secret` varchar(191) NOT NULL DEFAULT '' COMMENT '连接密码(bcrypt哈希,明文仅激活/重置时返回一次)', `pair_code` varchar(16) NOT NULL DEFAULT '' COMMENT '配对码(机身贴纸,绑定时校验防抢绑)', `activate_token` varchar(64) NOT NULL DEFAULT '' COMMENT '入云激活令牌(一次性,设备出厂预置)', `title` varchar(128) NOT NULL DEFAULT '' COMMENT '设备名称', `model` varchar(64) NOT NULL DEFAULT '' COMMENT '产品型号', `dev_type` varchar(64) NOT NULL DEFAULT '' COMMENT '设备类型(esp32c3_temp等,App据此渲染面板)', `ver` varchar(32) NOT NULL DEFAULT '' COMMENT '固件版本(OTA检测/提示)', `pins` varchar(64) NOT NULL DEFAULT '' COMMENT '总线GPIO表(CSV如3,4,10;下标=位置序号;设备上线时上报一次)', `member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '绑定会员ID(0=未绑定)', `room` varchar(64) NOT NULL DEFAULT '' COMMENT '房间/位置', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0禁用', `bind_at` int DEFAULT NULL COMMENT '绑定时间', `create_at` int DEFAULT NULL, `update_at` int DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_sn` (`sn`), UNIQUE KEY `uk_mac` (`mac`), UNIQUE KEY `uk_uuid` (`uuid`), KEY `idx_member` (`member_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT智能设备绑定表'; -- 传感器位置配置表(配置真源:位置数/别名/探头数/上下限/gap 一律由服务端下发,不进 state 报文) -- 三方一致:服务端(本表 + iot_device.cfg_ver) → retained /devices/{uuid}/config → 设备 NVS + config_ack → App 经 HTTP 读同一份 CREATE TABLE IF NOT EXISTS `__PREFIX__iot_sensor_cfg` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `device_uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '设备uuid', `pos_index` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '位置序号(OneWire总线A/B/C,0起)', `alias` varchar(32) NOT NULL DEFAULT '' COMMENT '位置名称(如 进水/回水)', `probes` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '该位置探头数(1~3)', `upper` decimal(6,2) NOT NULL DEFAULT '85.00' COMMENT '超温上限(℃)', `lower` decimal(6,2) NOT NULL DEFAULT '0.00' COMMENT '低温下限(℃)', `gap` decimal(6,2) NOT NULL DEFAULT '0.00' COMMENT '位置内温差告警阈值(0=关闭)', `enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0停用', `create_at` int DEFAULT NULL, `update_at` int DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_dev_pos` (`device_uuid`,`pos_index`), KEY `idx_device` (`device_uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='传感器位置配置表(配置真源)'; -- 设备共享表(华为式家庭授权:设备主人把设备共享给其他会员,按 perm 分级) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_share` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `device_id` int unsigned NOT NULL DEFAULT '0' COMMENT '设备ID(iot_device.id)', `owner_id` int unsigned NOT NULL DEFAULT '0' COMMENT '设备主人会员ID', `member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '被共享会员ID', `perm` tinyint(1) NOT NULL DEFAULT '2' COMMENT '1只读 2可控制', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1生效 0撤销', `create_at` int DEFAULT NULL, `update_at` int DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_dev_member` (`device_id`, `member_id`), KEY `idx_member` (`member_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT设备共享表'; -- 设备日志表(设备维度:状态上报/事件/下发命令留痕,智慧生活诊断与审计) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_device_log` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '设备uuid', `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题', `payload` longtext COMMENT '消息内容', `direction` varchar(8) NOT NULL DEFAULT 'in' COMMENT 'in=设备上报 out=服务端下发', `create_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_uuid` (`uuid`), KEY `idx_create_at` (`create_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT设备日志表'; -- 告警记录表(设备离线/场景联动/OTA失败等推送与展示) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_alert` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '归属会员', `uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '关联设备uuid(可空)', `pos_index` tinyint unsigned NOT NULL DEFAULT '255' COMMENT '传感器位置序号(255=不适用,如离线/场景告警)', `type` varchar(32) NOT NULL DEFAULT '' COMMENT 'offline/scene/condition/custom', `level` tinyint(1) NOT NULL DEFAULT '2' COMMENT '1提示 2警告 3严重', `title` varchar(128) NOT NULL DEFAULT '' COMMENT '标题', `content` varchar(512) NOT NULL DEFAULT '' COMMENT '内容', `is_read` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0未读 1已读', `create_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_member` (`member_id`), KEY `idx_create_at` (`create_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT设备告警记录表'; -- OTA 固件版本表 CREATE TABLE IF NOT EXISTS `__PREFIX__iot_ota` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `model` varchar(64) NOT NULL DEFAULT '' COMMENT '适用设备型号', `version` varchar(32) NOT NULL DEFAULT '' COMMENT '版本号', `filename` varchar(128) NOT NULL DEFAULT '' COMMENT '固件文件名', `file_hash` varchar(64) NOT NULL DEFAULT '' COMMENT 'SHA256', `size` int unsigned NOT NULL DEFAULT '0' COMMENT '字节数', `url` varchar(255) NOT NULL DEFAULT '' COMMENT '固件下载地址', `remark` varchar(255) DEFAULT NULL COMMENT '备注/更新说明', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1可下发 0停用', `create_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_model` (`model`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT OTA固件版本表'; -- 设备分组表(房间/自定义分组) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_group` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '归属会员(0=后台全局分组)', `title` varchar(64) NOT NULL DEFAULT '' COMMENT '分组名', `type` varchar(16) NOT NULL DEFAULT 'room' COMMENT 'room=房间 custom=自定义', `sort` int NOT NULL DEFAULT '0' COMMENT '排序', `create_at` int DEFAULT NULL, `update_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_member` (`member_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT设备分组表'; -- 分组-设备关联表 CREATE TABLE IF NOT EXISTS `__PREFIX__iot_group_device` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `group_id` int unsigned NOT NULL DEFAULT '0' COMMENT '分组ID', `device_id` int unsigned NOT NULL DEFAULT '0' COMMENT '设备ID(iot_device.id)', `create_at` int DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_group_device` (`group_id`,`device_id`), KEY `idx_device` (`device_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT分组设备关联表'; -- 场景表(智慧生活:设备状态/定时/手动 三类触发器 → 动作组) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_scene` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '归属会员(0=后台全局场景)', `title` varchar(64) NOT NULL DEFAULT '' COMMENT '场景名', `icon` varchar(32) NOT NULL DEFAULT '' COMMENT '图标标识', `enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0停用', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `create_at` int DEFAULT NULL, `update_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_member` (`member_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT场景表'; -- 场景触发器(device_state=设备状态/事件条件,schedule=定时cron,manual=手动) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_scene_trigger` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `scene_id` int unsigned NOT NULL DEFAULT '0' COMMENT '场景ID', `type` varchar(16) NOT NULL DEFAULT 'device_state' COMMENT 'device_state/schedule/manual', `topic` varchar(255) NOT NULL DEFAULT '' COMMENT 'device_state: 主题过滤器', `condition_json` text COMMENT '条件JSON', `cron` varchar(64) NOT NULL DEFAULT '' COMMENT 'schedule: 5段cron,如 0 8 * * *', `enabled` tinyint(1) NOT NULL DEFAULT '1', `create_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_scene` (`scene_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT场景触发器'; -- 场景动作(send_cmd=下发命令 http=HTTP回调 notify=站内告警) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_scene_action` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `scene_id` int unsigned NOT NULL DEFAULT '0' COMMENT '场景ID', `sort` int NOT NULL DEFAULT '0' COMMENT '执行顺序', `type` varchar(16) NOT NULL DEFAULT 'send_cmd' COMMENT 'send_cmd/http/notify', `device_uuid` varchar(64) NOT NULL DEFAULT '' COMMENT 'send_cmd: 目标设备', `payload_json` text COMMENT 'send_cmd: 命令payload / http: 请求体', `topic` varchar(255) NOT NULL DEFAULT '' COMMENT 'http: 回调URL / notify: 通知标题', `create_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_scene` (`scene_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT场景动作'; -- 场景执行日志(命中/未命中留痕) CREATE TABLE IF NOT EXISTS `__PREFIX__iot_scene_log` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `scene_id` int unsigned NOT NULL DEFAULT '0' COMMENT '场景ID', `trigger_type` varchar(16) NOT NULL DEFAULT '' COMMENT 'device_state/schedule/manual', `matched` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1命中 0未命中', `message` text COMMENT '命中摘要/失败原因', `create_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_scene` (`scene_id`), KEY `idx_create_at` (`create_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT场景执行日志'; -- 传感器结构化时序表(一行 = 一个位置的一次上报) -- 与 iot_device_log 的分工:log 存原始报文(longtext) 供诊断审计;本表存解析后的数值, -- 供曲线绘制、统计、云端阈值复核 —— longtext 里加不了数值索引,画不了曲线。 -- iv 必须存:设备是「事件驱动稀疏上报」,相邻两点可能隔几十秒,画图/统计须按 ts→ts+iv 前向填充。 -- 探头身份(ROM 短码)作为 vs_json 的 key,使换探头后仍能把同一颗探头的数据串起来。 CREATE TABLE IF NOT EXISTS `__PREFIX__iot_sensor_point` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '设备uuid', `pos_index` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '位置序号(0起)', `ts` int unsigned NOT NULL DEFAULT '0' COMMENT '设备NTP秒(0=未对时,已取服务端接收时间)', `iv` smallint unsigned NOT NULL DEFAULT '0' COMMENT '本条数据覆盖秒数(前向填充用)', `t` decimal(6,2) DEFAULT NULL COMMENT '位置温度=有效探头均值', `df` decimal(6,2) DEFAULT NULL COMMENT '位置内极差', `v` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1=位置有有效读数', `vs_json` varchar(255) NOT NULL DEFAULT '' COMMENT '逐探头明细 {"A3F2":25.6}', `ok_mask` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '探头有效位图', `alert_mask` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '云端复核告警位图(bit7=gap)', `cfg_ver` int unsigned NOT NULL DEFAULT '0' COMMENT '上报时的配置版本', `create_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_dev_pos_ts` (`uuid`,`pos_index`,`ts`), KEY `idx_create_at` (`create_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='传感器结构化时序(曲线/统计/云端复核)';