专业的照明控制系统API接口文档
inSona照明控制系统由硬件、云端、用户App组成。硬件包括网关、灯具、传感器、面板等。
网关通过蓝牙MESH协议与其他设备进行通信,通过Wi-Fi或者有线与云端/本地服务器通信。App通过局域网或者服务器与网关通信,并实现设备的控制。
网关:一个特殊硬件设备,所有系统的其他类型设备统称为子设备,而与之相对的就是网关,称为桥设备。子设备本身只有蓝牙通信能力,而桥设备同时具备蓝牙和WiFi和以太网能力。桥设备是连接互联网和蓝牙MESH网络的桥梁,在中间承担协议翻译,信息存储和转发的功能。
inSona提供本地控制协议,第三方设备可以通过局域网发现协议扫描发现附近的网关,然后设备可以网关建立TCP连接,后续所有操作都建立在TCP通讯的基础上。整个流程如下:本地发现网关→建立socket连接→同步设备信息→设备控制/状态同步等。
通过TCP建立网络连接,网关端口号为:8091
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长度) | 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%
| 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
}
# 连接网关
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')
// 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');
});