inSona API 开发者文档

专业的照明控制系统API接口文档

总览

inSona照明控制系统由硬件、云端、用户App组成。硬件包括网关、灯具、传感器、面板等。

网关通过蓝牙MESH协议与其他设备进行通信,通过Wi-Fi或者有线与云端/本地服务器通信。App通过局域网或者服务器与网关通信,并实现设备的控制。

网关:一个特殊硬件设备,所有系统的其他类型设备统称为子设备,而与之相对的就是网关,称为桥设备。子设备本身只有蓝牙通信能力,而桥设备同时具备蓝牙和WiFi和以太网能力。桥设备是连接互联网和蓝牙MESH网络的桥梁,在中间承担协议翻译,信息存储和转发的功能。

inSona提供本地控制协议,第三方设备可以通过局域网发现协议扫描发现附近的网关,然后设备可以网关建立TCP连接,后续所有操作都建立在TCP通讯的基础上。整个流程如下:本地发现网关→建立socket连接→同步设备信息→设备控制/状态同步等。

系统架构
  • 网关设备
  • 灯具设备
  • 传感器
  • 控制面板

快速开始

版本历史:
  • V1 - 用户通过TCP会话并请求与网络相关的信息
  • V2 - 2020.1210 添加传感器支持
  • V3 - 2021.423 增加场景数据和控制支持
  • V4 - 2021.526 增加面板按键数量标识,开关灯亮度色温反馈
  1. 获取网关IP地址,通过inSona APP操作添加网关设备
  2. 进入网关页面,查看网关设备IP
  3. 通过控制TCP连接与网关建立会话

建立TCP连接

通过TCP建立网络连接,网关端口号为:8091

Python示例

from socket import *

HOST = '127.0.0.1'  # 或 'localhost'
PORT = 8091
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)

控制协议

消息内容

客户端和网关之间使用JSON格式的消息进行交互,消息基于TCP协议进行传递;消息之间以"\r\n"作分隔

请求消息的基本格式:
{
    "version": 1,
    "uuid": 1234,
    "type": "all",
    "method": "c.query"
}
字段定义
字段 类型 说明
version integer 协议版本,目前只有一个可用版本1
uuid integer 请求uuid,请求消息与回应消息的uuid相同,可根据这个来匹配
method string 方法名
支持的消息方法
方向 Method 说明 类型
客户端 → 网关 c.query 请求mesh内设备信息 查询
网关 → 客户端 s.query 返回mesh内设备信息 响应
客户端 → 网关 c.control 控制设备 控制
网关 → 客户端 s.control 返回控制设备是否成功 响应
网关 → 客户端 s.event 网关主动通知 事件

设备同步

客户端发起同步请求

{
    "version": 1,
    "uuid": 1234,
    "type": "all",
    "method": "c.query"
}

服务端返回设备信息

字段 类型 说明
devices array 设备列表
rooms array 房间列表,可与devices中设备的roomId对应表示设备所处房间
did string 设备唯一标识
pid integer 表示产品型号
ver string 软件版本
alive integer 设备在线状态(1.在线,0.不在线)
name string 设备名称(APP内修改)
type integer 设备类型:灯具(1984) 开合帘(1860) 卷帘(1861) 开合帘带角度(1862) 面板(1218) 传感器(1344)
设备功能类型
func 说明 value 说明
2 只能开关的设备 0/1 关/开
3 只能调亮度的灯或窗帘 0-100 当前亮度或位置百分比
4 双色温灯 0-100,
0-100
亮度百分比,
色温百分比 色温0表示最暖 100表示最冷
5 HSL灯 0-100,
0-360,
0-100
亮度百分比,
色相(如红色为0,绿色120,蓝色240),
饱和度
9 面板按键 N 按键数量
10 传感器 - -
14 空调 0/1,
1-5,16,
0,1,2,7,
16-30,
-10-40
开关,
风速,1最小,5最大,16自动
模式,0通风,1制热,2制冷,7除湿
设定温度
环境温度
21 地暖 0/1,
10-30,
-10-40
开关,
设定温度
环境温度
24 新风 0/1,
1-5,16
开关,
风速,1最小,5最大,16自动
完整响应示例
{
    "version": 1,
    "uuid": 1234,
    "method": "s.query",
    "result": "ok",
    "rooms": [{
        "roomId": 6,
        "name": "办公区"
    }, {
        "roomId": 14,
        "name": "会议室"
    }],
    "devices": [{
        "did": "ECC57F10015800",
        "pid": 3,
        "ver": "61719",
        "type": 1984,
        "alive": 1,
        "roomId": 2,
        "name": "左",
        "func": 0,
        "funcs": [],
        "value": []
    }, {
        "did": "ECC57F1003E000",
        "pid": 3,
        "ver": "61719",
        "type": 1984,
        "alive": 1,
        "roomId": 2,
        "name": "右",
        "func": 0,
        "funcs": [],
        "value": []
    }]
}

设备控制

客户端发起控制设备请求

字段 类型 说明
did string 设备唯一标识
action string 控制类型
value int[] 控制参数
transition int 灯控时的渐变时间,0表示默认,单位毫秒(ms)
Action 和 Value 说明
action(value长度) value 含义
onoff(1) 0/1 开关
level(1) 0-100 调节亮度或窗帘百分比
temperature(1) 0-100 色温百分比 色温0表示最暖 100表示最冷
ctl(2) 0-100,
0-100
亮度百分比,
色温百分比 色温0表示最暖 100表示最冷
hsl(3) 0-100,
0-360,
0-100
亮度百分比,
色相(如红色为0,绿色120,蓝色240),
饱和度
scene(1) 0-255 触发场景,场景号获取通过c.query.scene
curtainStop(0) NA 窗帘停止
控制示例
{
    "version": 1,
    "uuid": 1,
    "method": "c.control",
    "did": "F0ACD777770300",
    "action": "onoff",
    "value": [0],
    "transition": 0
}

表示把设备"F0ACD777770300"设为关闭

{
    "version": 1,
    "uuid": 1,
    "method": "c.control",
    "did": "a0",
    "action": "level",
    "value": [30],
    "transition": 0
}

表示把组设备"a0"设为亮度30%

服务器主动上报Event

evt 值 含义
"meshchange" 配置或在线状态变化,客户端需重新发送 (c.query) 同步设备
"status" 设备状态改变。 did,func,value解析同"服务端返回设备信息"
"sensor" 传感器检测状态变化
"switch.key" 按键事件
"scene.recall" 触发场景
"heartbeat" 心跳包,1分钟发一次

设备状态改变示例

{
    "version": 1,
    "uuid": 14,
    "method": "s.event",
    "evt": "status",
    "did": "F0ACD777770300",
    "func": 2,
    "value": [0]
}

表示设备"F0ACD777770300"被关了

{
    "version": 1,
    "uuid": 16,
    "method": "s.event",
    "evt": "status",
    "did": "F0ACD777770300",
    "func": 4,
    "value": [15, 50]
}

表示设备"F0ACD777770300"亮度色温被调到15%,50%

场景控制

同步场景数据

{
    "version": 1,
    "uuid": 1234,
    "method": "c.query.scene"
}

服务端返回场景信息

{
    "version": 1,
    "uuid": 0,
    "method": "s.query.scene",
    "scenes": [{
            "sceneId": 2,
            "name": "喝茶"
        },
        {
            "sceneId": 4,
            "name": "会议"
        }
    ]
}

场景控制请求

{
    "version": 1,
    "uuid": 1,
    "method": "c.control",
    "action": "scene",
    "value": [33],    // 此value为上面同步获取的场景ID 
    "transition": 0
}

代码示例

Python 示例

# 连接网关
import socket
import json

def connect_gateway(ip, port=8091):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((ip, port))
    return sock

# 发送查询请求
def send_query(sock, uuid):
    query = {
        "version": 1,
        "uuid": uuid,
        "type": "all",
        "method": "c.query"
    }
    sock.send(json.dumps(query).encode() + b'\r\n')

JavaScript 示例

// TCP连接示例 (Node.js)
const net = require('net');

const client = new net.Socket();
client.connect(8091, '127.0.0.1', () => {
    console.log('Connected to gateway');
    
    const query = {
        version: 1,
        uuid: Date.now(),
        type: 'all',
        method: 'c.query'
    };
    
    client.write(JSON.stringify(query) + '\r\n');
});