本文档面向已经了解 面板小程序开发 的开发者,您需要充分了解什么是 面板小程序产品功能。若对上述概念有所疑问,涂鸦推荐您了解以下预备知识。如已了解,可跳过本文。

理解关系

面板是 IoT 智能设备在 App 终端上的产品形态。创建产品之前,首先来了解一下什么是面板,以及面板和产品、设备之间的关系:

照明灯带模板使用 SDM (Smart Device Model) 开发。关于 SDM 相关,可以参考 SDM 文档

相关概念

产品名称:照明幻彩灯带三路灯

产品介绍

根据支持的白光、彩光 DP 不同,照明中灯分为一路至五路。

其含义为:

需求原型

功能汇总

当前照明灯带模板必需的功能点:

switch_led,
work_mode,
paint_colour_data,
dreamlight_scene_mode,
dreamlightmic_music_data,
light_pixel,
lightpixel_number_set,

当前照明灯带模板可选的功能点:

countdown,
light_length,

开关

参数

取值

dpid

20

code

switch_led

type

布尔型(Bool)

mode

可下发可上报(rw)

工作模式

参数

取值

dpid

21

code

work_mode

type

枚举型(Enum)

mode

可下发可上报(rw)

property

枚举值: white, colour, scene, music

倒计时

参数

取值

dpid

26

code

countdown

type

value

mode

可下发可上报(rw)

property

{ "unit": "s", "min": 0, "max": 86400, "scale": 0, "step": 1, "type": "value"}

灯带长度

参数

取值

dpid

46

code

light_length

type

value

mode

上报(ro)

property

{"unit": "cm", "min": 1, "max": 10000, "scale": 0, "step": 1, "type": "value" }

灯带点数

参数

取值

dpid

47

code

light_pixel

type

value

mode

上报(ro)

property

{ "min": 1, "max": 1024, "scale": 0, "step": 1, "type": "value" }

点数/长度设置

参数

取值

dpid

53

code

lightpixel_number_set

type

value

mode

可下发可上报(rw)

property

{ "min": 1, "max": 1000, "scale": 0, "step": 1, "type": "value" }

以上为raw 类型 以外的功能点,raw 类型 DP 请查看具体协议。

首先需要创建一个产品,定义产品有哪些功能点,然后再在面板中一一实现这些功能点。

注册登录 涂鸦开发者平台,并在平台创建产品:

  1. 单击页面左侧 产品 > 产品开发,在 产品开发 页面单击 创建产品
  2. 标准类目 下选择 照明,产品品类选择 幻彩灯带
  3. 选择智能化方式,选择产品方案为 幻彩灯带三路,并完善产品信息,如填写产品名称为 PublicLamp
  4. 单击 创建产品 按钮,完成产品创建。

注意:本模版只支持幻彩灯带三路,其它路可按逻辑自行适配。

🎉 在这一步,一个名为 PublicLamp 的照明灯带产品创建完成。

开发者平台创建面板小程序

面板小程序的开发在 小程序开发者 平台上进行操作,首先请前往 小程序开发者平台 完成平台的注册登录。

详细操作步骤可以参考 面板小程序 > 创建面板小程序

拉取并运行模板项目

面板模板仓库:仓库地址

  1. 首先,拉取项目。
    git clone https://github.com/Tuya-Community/tuya-ray-materials.git
    
  2. 进入照明灯带模板,安装依赖并启动项目。
    cd ./template/PublicPanelStripLamp
    
  3. 打开 IDE 并点击导入。
  4. 选择下载的路径进行导入,并关联到已经创建的面板小程序与产品。
  5. 绑定具体设备即可,IDE 会自动安装依赖并构建项目。

工程目录

完成以上步骤后,一个面板小程序的开发模板初始化完成。以下为工程目录及其介绍:

├── public
│ ├── images # 项目的静态资源
├── src
│ ├── app.config.ts # 自动生成配置
│ ├── app.tsx # App 根组件
│ ├── components # 组件目录
│ ├── constant # 常量目录
│ ├── containers # 聚合的组件目录
│ ├── devices # 智能设备模型目录
│ │ ├── index.ts # 定义并导出智能设备模型
│ │ ├── protocols # 定义当前设备所需要的 DP 声明
│ │ ├─────parses # 定义当前设备所需要的 DP 复杂协议
│ │ └── schema.ts # 当前智能设备 DP 功能点描述,IDE 可自动生成
│ ├── global.config.ts
│ ├── hooks # 自定义 Hooks 目录
│ ├── i18n # 多语言目录
│ ├── pages # 页面目录
│ └── routes.config.ts # 路由配置
│─── typings # 业务类型定义目录
│ └── sdm.d.ts # 智能设备类型定义文件

需求实现

IDE 生成 SDM schema 到项目

生成 SDM schema 至项目中,可以查看 src/devices/schema.ts

export const defaultSchema = [
	{
		attr: 641,
		canTrigger: true,
		code: "switch_led",
		defaultRecommend: true,
		editPermission: false,
		executable: true,
		extContent: "",
		iconname: "icon-dp_power",
		id: 20,
		mode: "rw",
		name: "开关",
		property: {
			type: "bool",
		},
		type: "obj",
	},
	{
		attr: 640,
		canTrigger: true,
		code: "work_mode",
		defaultRecommend: true,
		editPermission: false,
		executable: true,
		extContent: "",
		iconname: "icon-dp_mode",
		id: 21,
		mode: "rw",
		name: "模式",
		property: {
			range: ["white", "colour", "scene", "music"],
			type: "enum",
		},
		type: "obj",
	},
	// ...
] as const;

首页:调节色盘下发彩光调色

分析需求

  1. 首页添加组件 开关按钮
    • 根据 switch_led 下发的值展示不同按钮图片。
    • 单击开关组件触发事件,上报 的 DP 值。
  2. 确认开关 DP 为 switch_led,可作为属性传入组件。
  3. 使用 useProps 获取实时下发的 DP 值。示例:
    import React from "react";
    import { View } from "@ray-js/ray";
    import { useProps } from "@ray-js/panel-sdk";
    
    export default function () {
    	const power = useProps((props) => props.switch_led);
    	return (
         <View style={{ flex: 1 }}>
             <View>switch_led: {power}</View>
         </View>
    	);
    }
    
  4. 使用 useActions 下发 DP。关于如何通过 SDM 下发 DP,请参考:SDM 下发教程

示例:

import React from "react";
import { View } from "@ray-js/ray";
import { useActions } from "@ray-js/panel-sdk";

export default function () {
	const handleTogglePower = () => {
		actions.switch_led.toggle({ throttle: 300 });
	};
	return (
		<View style={{ flex: 1 }}>
			<Button img={power} onClick={handleTogglePower} />
		</View>
	);
}

实现开关组件

根据上述分析,来实现开关组件:开关组件实现

import React from "react";
import res from "@/res";
import { View, Image } from "@ray-js/ray";
import dpCodes from "@/config/dpCodes";
import { Button } from "@/components";
import { useActions, useProps } from "@ray-js/panel-sdk";
import styles from "./index.module.less";

export const PowerButton = () => {
	const power = useProps((props) => props.switch_led);
	const actions = useActions();
	const handleTogglePower = () => {
		actions.switch_led.toggle({ throttle: 300 });
	};
	return (
		<View className={styles.container}>
			<Image className={styles.bg} mode="aspectFill" src={bottom_dark} />
			<Button
				img={power}
				onClick={handleTogglePower}
				imgClassName={styles.powerBtn}
				className={styles.powerBox}
			/>
		</View>
	);
};

其它