总览
inSona照明控制系统由硬件、云端、⽤⼾App组成。 硬件包括⽹关、灯具、传感器、⾯板等。
⽹关通过蓝⽛MESH协议与其他设备进⾏通信,通过Wi-Fi或者有线与云端/本地服务器通信。App通过局域⽹或者服务器与⽹关通信,并实现设备的控制。
⽹关:⼀个特殊硬件设备,所有系统的其他类型设备统称为⼦设备,⽽与之相对的就是⽹关, 称为桥设备。⼦设备本⾝只有蓝⽛通信能⼒,⽽桥设备同时具备蓝⽛和WiFi和以太⽹能⼒。桥设备是连接互联⽹和蓝⽛MESH⽹络的桥梁,在中间承担协议翻译,信息存储和转发的功能。
inSona提供本地控制协议,第三⽅设备可以通过局域⽹发现协议扫描发现附近的⽹关,然后设备可以⽹关建⽴TCP连接,后续所有操作都建⽴在TCP通讯的基础上。整个流程如下: 本地发现⽹关-->建⽴socket连接-->同步设备信息-->设备控制/状态同步等。
inSona API
inSona API 用于从本地网关通过TCP连接获取到蓝牙mesh网络内的设备信息
版本历史
- V1-用户通过TCP会话并请求与网络相关的信息
- V2-2020.1210 添加传感器支持
- V3-2021.423 增加场景数据和控制支持
- V4-2021.526 增加面板按键数量标识,开关灯亮度色温反馈,
开始吧
- 获取网关IP地址,通过inSona APP操作添加网关设备
- 进入网关页面,查看网关设备IP
- 通过控制TCP连接与网关建立会话
建立TCP连接
通过TCP建立网络连接,网关端口号为:8091
以Python为例
from socket import * HOST = '127.0.0.1' # or '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:
协议版本,⽬前只有⼀个可⽤版本1。
uuid:
请求uuid,请求消息与回应消息的uuid相同,可根据这个来匹配
method:
方法名
⽬前以⽀持的上下⾏消息的⽅法有如下⼏种:
方向 | Method | 说明 |
---|---|---|
客户端->网关 | c.query | 请求mesh内设备信息 |
网关->客户端 | s.query | 返回mesh内设备信息 |
客户端->网关 | c.control | 控制设备 |
网关->客户端 | s.control | 返回控制设备是否成功 |
网关->客户端 | s.event | 网关主动通知 |
同步设备
客户端发起同步请求
{ "version": 1, "uuid": 1234, "type":"all", "method": "c.query" }
服务端返回设备信息
字段 | 含义 |
---|---|
devices | 设备列表 |
rooms | 房间列表,可与devices中设备的roomId对应表示设备所处房间 |
did | 设备唯一标识 |
pid | 表示产品型号 |
ver | 软件版本 |
alive | 设备在线状态 (1.在线,0.不在线) |
name | 设备名称(APP内修改) |
type | 设备类型: 灯具(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": "ECC57F1031F100", "pid": 256, "ver": "61706", "type": 1984, "alive": 1, "roomId": 26, "name": "会议过道", "func": 4, "funcs": [2, 3, 4, 11], "value": [0, 100, 8] }, { "did": "ECC57F10327200", "pid": 256, "ver": "61706", "type": 1984, "alive": 1, "roomId": 26, "name": "茶柜灯", "func": 4, "funcs": [2, 3, 4, 11], "value": [0, 100, 8] }, { "did": "ECC57F1038DD00", "pid": 256, "ver": "61706", "type": 1984, "alive": 1, "roomId": 26, "name": "沙发射灯", "func": 4, "funcs": [2, 3, 4, 11], "value": [0, 54, 8] }] } 表示有2个设备 其中单设备为 "F0ACD777770300" 支持亮度色温,当前为on,50%,50%, 组地址“A0” 支持亮度色温,当前为on,50%,50% “F0ACD760002D00” 为传感器 "rooms"为当前蓝牙网络内的房间信息,roomId与设备内的roomId对应 { "did": "ECC57F11A6B0FF", "pid": 27, "ver": "61736", "type": 1218, "alive": 1, "roomId": 1, "name": "大厅右面板", "func": 9, "funcs": [9], "value": [4] } 面板数据,通过value[4]代表此面板按键数量为4键面板 关于灯具类型区分,inSona设备分为 继电器开关,单色温调光,双色温,RGB,RGB+双色温 根据同步返回的数据,对设备的funcs进行解析 【2,11】继电器的灯 【2,3,11】 只调光的灯 【2,3,4,11】双色温灯 【2,3,5,11】RGB灯 【2,3,4,5,11】 RGB+双色温
控制设备
客户端发起控制设备请求
字段 | 含义 |
---|---|
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 |
lightmode(1) | 0-单色温呼吸 1-双色温白光呼吸 2-双色温暖光呼吸 3-双色温暖白呼吸 |
呼吸模式 |
adaptiveLight(1) | 0/1 | 节律开关 |
curtainStop(0) | NA | 窗帘停止 |
curtainAngel(1) | 0-180 | 窗帘的角度控制 |
swBgLightness(1) | 0-100 | 面板背光灯亮度 |
sensorEnable(1) | 0/1 | 传感器启用禁用 |
acOnoff(1) | 0/1 | 空调开关 |
acMode(1) | 0-通风 1-制热 2-制冷 7-除湿 |
空调模式 |
acTemperature(1) | 16-30 | 空调温度,摄氏度 |
acSpeed(1) | 1-5,16 | 1表示风量最小 5表示风量最大 16表示自动 |
fhOnoff(1) | 0/1 | 地暖开关 |
fhTemperature(1) | 10-30 | 地暖温度,摄氏度 |
faOnoff(1) | 0/1 | 新风开关 |
faSpeed(1) | 1-5,16 | 1表示风量最小 5表示风量最大 16表示自动 |
代码示例:
{ "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% { "version": 1, "uuid": 1, "method": "c.control", "did": "ECC57F10B3C500", "action": "curtainstop", "value": [], "transition": 0 } "action": "curtainstop",为窗帘停止命令 value为空
服务端返回控制设备是否成功
如果控制成功服务端将返回“OK”
{ "version": 1, "uuid": 1, "method": "s.control", "result": "ok" }
服务器主动上报event
evt 值 | 含义 |
---|---|
"meshchange" | 配置或在线状态变化,客户端需重新发送 (c.query) 同步设备 |
"status" | 设备状态改变。 did,func,value解析同"服务端返回设备信息" |
"sensor" | 传感器检测状态变化 |
"switch.key" | 按键事件 |
"scene.recall" | 触发场景 |
"scene.off" | 场景关闭 |
"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": 617, "method": "s.event", "evt": "status", "did": "A9", "func": 2, "value": [1], "status": [4, 85, 0] } value [1] 表示设备被打开,status[4,85,0] 4表示双色温CTL命令,85表示当前亮度,0表示色温值
传感器状态上报事件
value[0]值 | value[1]值 |
---|---|
1-人感 | 1-有人 0-无人 |
2-光感 | lux值 |
{ "version": 1, "uuid": 4, "method": "s.event", "evt": "sensor", "did": "F0ACD760002D00", "func": 10, "value": [1, 1] } 表示传感器" F0ACD760002D00"人感被触发值为1
面板按键状态上报事件
value[0] | value[1] |
---|---|
按键序号 | 按键事件 0-按下 1-松开 2-长按 3-双击 4-旋转 value[2]=旋转百分比[-100,100] |
{ "version": 1, "uuid": 1632, "method": "s.event", "evt": "switch.key", "did": "ECC57F108F3BFF", "func": 9, "value": [3, 0] } 表示面板" ECC57F108F3BFF"第3个按键被按下 【3,0】代表按键3被按下
同步场景数据
客户端发起同步请求
{ "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 }