-- 1. 创建数据库 mqtt（如果不存在）
-- 建议指定时间精度为 ms（毫秒），与 EMQX 规则中的 now_timestamp('millisecond') 匹配
CREATE DATABASE IF NOT EXISTS mqtt PRECISION 'ms' KEEP 3650;

-- 2. 切换到 mqtt 数据库
USE mqtt;

-- 3. 创建超级表 device_heartbeat
CREATE STABLE IF NOT EXISTS device_heartbeat (
    ts TIMESTAMP,           -- 必填，时间戳 (毫秒级)，8字节
    online BOOL,            -- 设备状态：true=online, false=offline，1字节
    ip VARCHAR(15),           -- IPv4 地址，最多15字符，1字节/字符 + 1字节长度
    rssi SMALLINT,          -- 信号强度 (-128 到 127/32767)，2字节
    screen_on BOOL          -- 屏幕开启状态 (true / false) 1字节
) TAGS (
    sn VARCHAR(32)            -- 设备SN码，可变长字符串，比NCHAR省一半以上空间
);

-- 4.emqx rules
SELECT
    payload.sn AS sn,
    payload.status AS status,
    payload.ip AS ip,
    payload.rssi AS rssi,
    payload.screenOn AS screen_on,
    now_timestamp('millisecond') AS ts
FROM "ttstd/device/status"
WHERE is_not_null(payload.sn)

-- 5.emqx action 没有数据打开 "未定义变量作为 NULL" 开关
INSERT INTO mqtt.`hb_${sn}` USING mqtt.device_heartbeat TAGS ('${sn}')
VALUES (${ts}, '${status}', '${ip}', ${rssi}, ${screen_on})