如何给智能家居设备场景?智能家居开源平台——智汀家庭云

智数溯光鹤
• 阅读 447

场景是指通过SA实现设备联动。例如,自动检测今天的天气情况,今天无雨,定时智能音箱播放浇花提醒,并且播报今天的天气情况。 根据自身需求,把多种控制并发的事情编辑成一个场景,并命名,可以通过场景控制很多设备,实现一键操作的功能。

场景的相关操作

1.1创建场景

创建智能场景前请确保您的家庭已添加设备,且用户是否拥有创建智能场景的权限。

·场景名称

场景名称在该家庭下需要确保唯一性。

·触发条件

通过配置触发条件,达到条件后能执行对应的任务,并且可以设置触发条件的生效时段。触发条件分为三种

·手动执行,点击即可执行

·定时执行,如每天8点

·设备状态变化时,如开灯时,感应到人时

当触发条件为手动触发时只能添加一种触发条件。而选择其他两种可以添加多种,同时需要确定条件关系。条件关系可以选择

·满足所有条件

·满足任一条件

·技术实现

系统中启动一个服务,作为消息队列(以下简称smq)的消费者,消费者不断去轮训消息队列,看看有没有新的数据,如果有就消费。 查看下面为伪代码:

for {
    select {
    case ct := <-ticker.C:
        fmt.Printf("current ticket at: %d:%d \n", ct.Minute(), ct.Second())
        if pq.Len() == 0 {
            ticker.Reset(sleepTickTime)
            continue
        }

        task := heap.Pop(pq).(*Task)
        now := time.Now()
        timeAt := now.Unix()

        if task.Priority > timeAt {
            nextTick := time.Unix(task.Priority, 0).Sub(now)
            ticker.Reset(nextTick)
            qs.push(task)
        } else {
            ticker.Reset(defaultTickTime)
            go task.Run()
        }
    }
}

当设置为手动执行的场景时,会添加一条任务数据,执行时间为当前时间,加进smq,等待消费者消费。

t = NewTask(WrapSceneFunc(scene, false), 0)
PushTask(t, scene)

而设置为自动执行的场景时,会计算任务今天的下次执行时间,并添加任务数据,加进smq,等待消费者消费。

// 获取任务今天的下次执行时间
days := time.Now().Sub(c.TimingAt).Hours() / 24
nextTime := c.TimingAt.AddDate(0, 0, int(days))
t = NewTaskAt(WrapSceneFunc(scene, true), nextTime)
PushTask(t, scene)

如果自动执行场景的生效时段为重复性,那么会在每天 23: 55:00 进行第二天任务编排

// AddArrangeSceneTask 每天定时编排场景任务
func AddArrangeSceneTask(executeTime time.Time) {
    var f TaskFunc
    f = func(task *Task) error {
        addSceneTaskByTime(executeTime.AddDate(0, 0, 1))
    
        // 将下一个定时编排任务排进队列
        AddArrangeSceneTask(executeTime.AddDate(0, 0, 1))
        return nil
    }
    
    task := NewTaskAt(f, executeTime)
    MinHeapQueue.Push(task)
}

// 每天 23:55:00 进行第二天任务编排
AddArrangeSceneTask(now.EndOfDay().Add(-5 * time.Minute))

1.2执行任务

当满足触发条件后,可以自动执行配置好的执行任务。执行任务认为两种

·智能设备,如开灯,播放音乐

·控制场景,如开启夏季晚会场景

·技术实现

任务执行,通过消费者消费smq中的任务,去执行run方法去执行对应的任务。

func (item *Task) Run() {
    fmt.Println("Run ", item.ToString())
    if item.f != nil {
        f := item.f
        for _, wrapper := range item.wrappers {
            f = wrapper(f)
        }
        if err := f(item); err != nil {
            log.Println("task run err:", err)
        }
    }
}

1.3查看场景

场景分成 “手动” 和 “自动” 两个执行类型,页面加载时判断用户是否拥有控制场景的权限,在页面展示中 “手动”场景排在“自动”场景的上方;

·手动类场景为“执行”按键,可直接点击触发执行任务

·自动类场景为“开关”按键,设置打开或者关闭状态

  1. 注意事项

· 场景的修改和控制不仅仅取决于用户是否拥有修改和控制场景的权限,还包括该用户是否有对场景中的设备操作项的控制权限。

eg:如果您拥有控制场景A的权限,但是您没有场景A里面设备B的开关控制权限,则您同样没有控制该场景A的权限。修改的场景也是如此。
如何给智能家居设备场景?智能家居开源平台——智汀家庭云

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
4年前
List的Select 和Select().tolist()
List<PersondelpnewList<Person{newPerson{Id1,Name"小明1",Age11,Sign0},newPerson{Id2,Name"小明2",Age12,
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这