跳到主要内容

NatureMiniPro服务扩展

在NatureMiniPro上提供设备控制和展示能力。

使用要求

此功能用来NatureMiniPro上的页面设备配置,支持的页面包括首页/场景页面/设备页面。

首页上最多可以有4个设备或者io对象。

场景页面上最多可以有6个设备或者io对象。

设备页面只能对应一个设备对象。

开发的应用界面可以替换到首页或者场景页面,然后通过服务接口查询和控制原来页面上配置的设备对象,也可以通过服务接口使用其他信息服务。

设备访问

设备通过路径id来访问,路径格式为 $PAGENAME.IDX,其中PAGENAME为页面名称,IDX为此页面下的设备编号。

当前页面名称列表:

  • NM_HOME : 首页,IDX取 1..4
  • NM_SCENE : 场景页,IDX取 1..6
  • NM_SCENE2 : 扩展场景页,IDX取 1..6

设备信息查询 svcget(path)

下面例子获取首页上第一个设备的信息:

local obj=svcget('$NM_HOME.1')
if type(obj)=='table' then
printh(obj.cgy)
printh(obj.cls)
printh(obj.name)
if cgy=='io' then
printh(obj.type&1)
elseif cgy=='ep' then
elseif cgy=='ai' then
printh(obj.stat)
end
end

可以通过stat(6)来获取当前所在的UI页面位置,根据位置来决定使用的设备配置路径。

例子:

local PATH=stat(6) or 'NM_HOME'
if PATH=='SS' then
printh('screen saver')
elseif PATH=='NM_HOME' then
printh('Home page')
elseif PATH=='NM_SCENE' then
printh('Scene page 1')
elseif PATH=='NM_SCENE2' then
printh('Scene page 2')
else
print(PATH)
end

设备控制 svcreq("epctl",string.format("json:%s:%s",path,cmd))

'epctl'服务用来控制设备,指令通过json字符串表示,格式为 json:path:cmd 。

其中path为对象路径,cmd为操作指令。

cmd可以选下面的值:

  • click : 点击操作,根据设备对象自动选择真正的操作. 如果是开关,就会取反,如果是设备或者传感器,就会打开设备页面
  • on : 打开
  • off : 关闭
  • set[sw=1 type=0x81 val=50] : 设置打开,同时更改模拟量数值,type可以省略,val也可以省略,省略后会用设备原来的值. sw表示开关,0为关,1为开,可以方便的替代type(如果不知道type如何设定的话)
  • selbind : 打开重新设定设备对象的界面

下面例子:

svcreq("epctl","json:$NM_SCENE.1:set[sw=1 val=127]") --操作场景上第一个设备(调光灯),打开并设置50%亮度
svcreq("epctl","json:$NM_HOME.1:click") --操作首页上第一个设备,开关反向

打开主菜单 svcreq("epctl","json:openmenu")

打开系统主菜单

对象信息描述

svcget获取到对象数据成功时,返回table,table里面有详细的信息。

  • cgy: 对象类型 (ep,io,ai)
  • cls: 详细规格
  • name: 名称,可能为空

ep: 设备对象,可以使用设备下的所有的io数据。

io: io对象,对应一个设备上的功能点. 此时表格里面可以使用 vidx,type,val,rv数据。

ai: 智能/场景对象. 此时表格里面可以使用stat数据,stat是ai的状态。

系统信息

获取设备类型

svcget('$sys.model') 获取设备类型,NatureMiniPro的model='LSNAMIV3'

获取语言设置

svcget('$sys.lang') 获取语言设置,返回语言序号,1表示英文,2表示中文,暂时不支持的都是返回英文

获取设备温度

svcget('$sc.T') 查询设备温度数据

获取天气预报

svcget('$weather.cur') 查询天气预报

天气预报数据例子内容格式如下:

+"wind" ["355.08,15.96"]
+"pressure" [101348.367]
+"pm25" [9]
+"nextHours"(table: 0x0b4d0680)
| +1(table: 0x0b4d06a8)
| +"wind" ["355.35,15.39"]
| +"pressure" [101303.365]
| +"pm25" [8]
| +"skycon" ["CLOUDY"]
| +"hourFullStr" ["2023-04-25T16:00+08:00"]
| +"hourTs" [1682409600]
| +"temperature" [19.67]
| +"humidity" [0.68]
| +"aqi" [33]
+"queryCity"(table: 0x0b4cf290)
| +"distance" [12779.155401337]
| +"lat" [23.021548]
| +"city" ["广东省佛山市"]
| +"lng" [113.121416]
+"skycon" ["CLOUDY"]
+"queryHourTs" [1682406000]
+"queryHourFullStr" ["2023-04-25T15:00+08:00"]
+"temperature" [19.5]
+"humidity" [0.71]
+"aqi" [30]

skycon可能的取值:

local skycon_namemap={
CLEAR_DAY='白天晴朗';
CLEAR_NIGHT='夜间晴朗';
PARTLY_CLOUDY_DAY='白天多云';
PARTLY_CLOUDY_NIGHT='夜间多云';
CLOUDY='阴天';
LIGHT_HAZE='轻度雾霾';
MODERATE_HAZE='中度雾霾';
HEAVY_HAZE='重度雾霾';
RAIN='雨';
LIGHT_RAIN='小雨';
MODERATE_RAIN='中雨';
HEAVY_RAIN='大雨';
STORM_RAIN='暴雨';
FOG='雾';
LIGHT_SNOW='小雪';
MODERATE_SNOW='中雪';
HEAVY_SNOW='大雪';
STORM_SNOW='暴雪';
DUST='浮尘';
SAND='沙尘';
WIND='大风';
}

工具脚本

为了方便程序编写,我们提供一些写好的脚本,完成特定的功能。

工具包(点击下载)

实用工具 colox_mini.lua

colox_mini.lua - 提供方便的LifeSmart场景控制

定义按键区域

mini:add_touch(path,cmd,idx,flag,x,y,x2,y2,kv) 定义一个按键区域

  • path: 对应的场景(例如:$NM_HOME.1)

  • cmd: 按键对应的命令

    • click : 点击操作,根据设备对象自动选择真正的操作。如果是开关,就会取反,如果是设备或者传感器,就会打开设备页面
    • on : 打开
    • off : 关闭
    • set[sw=1 type=0x81 val=50] : 设置打开,同时更改模拟量数值,type可以省略,val也可以省略,省略后会用设备原来的值。sw表示开关,0为关,1为开,可以方便的替代type(如果不知道type如何设定的话)
    • selbind : 打开重新设定设备对象的界面
  • idx: 整数,按键序号,从1开始

  • flag: 整数。(0:默认按键,允许页面被滑动; 1:触摸区域不允许页面滑动)

  • x,y,x2,y2: 按键热区。(如果是多边形区域,那么x为数组,数组内容为多边形点)

  • kv: 表,存放自定义数据

#include colox_mini.lua
local mini=cx_mini_init()
mini:add_touch('$HOME.1',nil,1,0,309,180,480,480)
mini:add_touch('$HOME.2',nil,2,0,0,0,480,232)
mini:add_touch('$HOME.3',nil,3,0,0,230,306,480)

处理按键操作

hotidx,trigger=mini:scantouch(dotrigger) 处理按键操作

  • dotrigger:是否执行动作
  • 返回:
    • hotidx: 触摸所在的按键序号
    • trigger: 是否触发动作(如果dotrigger为 true,trigger也为true,那么内部会执行定义的cmd)
local hotidx,trigger=mini:scantouch(true)

绘制按键状态

  • 用户需要自己绘制按键
  • 通过扫描处理所有定义的按键,进行绘制

示例:

function _draw()
cls()
local hotidx,trigger=mini:scantouch(true)
for k,v in pairs(mini.mini_objs) do
local info=mini:get_info(k)
if info then
--判断开关状态
if info.sw then
--绘制按下状态, 简单填充热区矩形
rectfill(v[3],v[4],v[5],v[6],red)
else
--绘制空闲状态, 简单填充热区矩形
rectfill(v[3],v[4],v[5],v[6],blue)
end
else
--无效状态(配置的path不是开关场景设备)
rectfill(v[3],v[4],v[5],v[6],orange)
end
end
end

实用工具 colox_layer.lua

colox_layer.lua - 提供方便的多层图片绘制

  • 通过定义树形的绘图节点(层次),方便进行背景/按键/修饰图片的绘制
  • 每个layer里面的对象实用相对坐标
  • 绘制时按照layer层次进行绘图
  • 可以控制每个layer是否绘制
  • 可以动态修改layer里面的绘制数据

使用步骤

  • 定义顶层对象
  • 添加子层对象,以及子层对象的子层对象
  • 引用需要动态修改的对象,方便后面操作
  • 主循环里面根据状态修改对象,并绘制

创建LAYER,目前支持以下种类:

  • CXLAYER(id,z,x,y) 逻辑层,没有实际的绘制
  • CXLAYER_LABEL(id,z,txt,x,y,col,opt,size,fname,outlinecol) 字符串绘制
  • CXLAYER_IMG(id,z,x,y,img,anch,sx,sy,sw,sh) 图像绘制

通用参数说明(大部分参数可以省略):

  • id: 标记名,可用来查找
  • z: 同层次的绘图顺序(小优先绘制)
  • x,y: 对象相对上层的坐标
  • txt: 绘制的字符串
  • outlinecol: 绘制带外边的颜色
  • img: 绘制的图像
  • anch: 图像绘制参数
    • bit0 1 表示alpha混合绘制(只有32位颜色模式有效)
    • bit1-2 表示x方向的锚点 0:左,1:右,2:中间
    • bit3-4 表示y方向的锚点 0:上,1:下,2:中间