钉钉久坐提醒系统

风裁
  • 收获赞:42
  • 擅长领域:这个同学很专业,但是有点神秘哟~

本文为您介绍如何使用阿里云物联网平台和钉钉打造办公室久坐提醒系统。

概述

方案介绍

身边很多从事办公室的白领,经常会听他们说:腰椎不行了,有点难受,要不就颈椎也不舒服,这些常见的现象不可忽视,它会对人们后面的生活产生很多负面的影响,所以我们想到能不能有这么一个设备,它会定期提醒人们不要坐太久。其实久坐提醒不是一个新鲜事,市面上也有许许多多关于久坐提醒的工具神器,但是,今天我们HaaS团队就手把手教长期在办公室久坐着的你亲手打造一款属于自己的久坐提醒设备,当你长时间在工位上坐着,它会通过钉钉提醒你,让你一段时间去活动一下筋骨,走动走动,这样让我们上班的同时身体也变得更健康。 

目标读者

物联网开发者、办公室工作人员。

背景知识

久坐提醒设备是通过人体红外监测周围区域是否有人移动,本系统有两种情况会出现:

  • 漏提醒:当没在红外区域内检测到移动(休息睡觉等),就不会触发提醒动作,这个会出现漏提醒。

  • 多提醒:当离开红外区域时间太短(小于设置窗口时间),检测不到人员离开(比如上厕所时间小于设置窗口时间),这个时候不会认为你有运动,到时间还是会提醒你,就会给人感觉多提醒了。

方案架构

方案架构图

本方案的整体架构图分为云端、设备端以及钉钉三部分,其中:

设备端主要负责以下功能:

  • 通过红外人体检测系统检测人的移动状态。

  • OLED显示当前设备信息。

云端主要负责如下功能:

  • 接收从设备端上报人的久坐信息事件。

  • IoT Studio平台和物联网平台创建的久坐信息事件实现绑定,并且与钉钉机器人系统形成关联。

钉钉主要负责如下功能:

  • 创建机器人平台。

  • 钉钉系统与IoT Studio实现消息交互。

久坐提醒架构

方案优势

  • 设备端开发采用HaaS Python开发框架,入门门槛低,没有物联网开发经验的人也可以很快掌握开发的过程,开发效率高。

  • 控制功能的逻辑在物联网平台端进行设定,随时随地可以根据需求在远端进行调整,易用性高。

  • 与钉钉系统协同,打造了云端钉一体的开发框架体系。

  • 在硬件连线完成之后进行云端和设备端开发前可以先使用一分钟上云体验功能预先体验本案例的实际运行效果。

阿里云物联网平台介绍

常见物联网平台主要功能包括:设备接入、设备数据存储、设备信息管理、设备状态监控、设备数据的分析与展示以及对设备的控制、运维和管理,从而满足应用层不同业务场景的需求。阿里云物联网平台的请参考链接

本方案中会使用到物联网平台的设备接入规则引擎(监控设备状态并执行预设逻辑)的功能。

IoT Studio介绍

物联网应用开发(IoT Studio)是阿里云针对物联网场景提供的生产力工具,属于阿里云物联网平台的一部分,提供了Web可视化开发、移动可视化开发、业务逻辑开发与物联网数据分析等一系列便捷的物联网开发工具。主要解决的是物联网开发领域开发链路长、定制化程度高、投入产出比低、技术栈复杂、协同成本高以及方案移植困难等问题,目的是帮助物联网企业完成设备上云的最后一公里。

IoT Studio详细介绍请参考链接

方案实施

前提条件

请读者先开通阿里云账号之后再进行如下的操作。开通阿里云账号分为两步:

  1. 打开阿里云官网

  2. 点击阿里云官网首页的右上角立即注册按钮,按提示一步步操作注册。

操作步骤

下图是本案例除硬件连线外的3步导学,每个步骤中实现的功能请参考图中的说明。

久坐提醒操作步骤

硬件准备

准备本案例只需要如下硬件:

  • ESP32一台。

  • IR人体红外传感器一个。

  • SSD1306显示屏一个。

  • 杜邦线若干。

  • Micro-USB数据线一条。

硬件连线图如下图所示。

根据上面ESP32的硬件连线图所示:人体红外传感器监测到人体移动,GPIO32引脚电平会拉高,没有监测到人体移动,引脚电平会拉低,然后,SSD1306显示屏通过I2C与MCU连接。

步骤一:物联网平台设备创建

对于第一次使用物联网平台的读者,需要开通实例以使用物联网平台的功能。这里可以使用免费的公共实例进行开发。

物联网平台中,左上角选择华东2-上海,点击公共实例,即可开通。

开通物联网平台功能之后,需要完成下面的3个步骤完成云端设备的操作:

  1. 创建云端产品。

  2. 创建产品属性(物模型)。

  3. 创建云端设备(获取三元组)。

创建云端产品

点击上图中的公共实例,即可进入控制台进行产品创建。然后,点击创建产品按钮,如下图所示。

在新建产品设定页面按照下图所示,设定产品名称,选择所属的自定义品类(如果创建的产品品类为标准品类,可以选择标准品类),节点类型选择直连设备,联网方式选择Wi-Fi,数据格式选择ICA标准数据格式,检验类型和认证方式选择默认设定即可。还可以根据开发者自己的需求在产品描述页面添加针对此产品的描述。

选择之后,点击确认按钮,即可完成产品创建。返回产品页面之后可以看到产品类表中会出现刚刚创建的久坐提醒器的产品,如下图所示。

创建产品属性

点击上图中的查看按钮,即可看到产品信息,Topic列表,功能定义,数据解析等跟产品相关功能的设定。点开功能定义标签页,可以看到设备物模型定义,点击添加自定义功能,其中功能名称、标识符、数据类型和定义如下所示。

标识符是设备端上报设备属性状态的消息中需要使用的标识符,并且只有在设备上报的属性内容符合数据定义中的数据取值范围的时候才会被物联网平台记录,否则会被物联网平台认定为非法属性而过滤掉。

产品及其物模型创建完成后就可以创建这个产品的设备了。

在产品列表页面中,点击管理设备,就会进到设备管理页面。

创建云端设备

设备页面点击添加设备按钮,如下图所示。

添加设备页面中设定DeviceName,这里开发者可以自己填入自己想设定的设备名称,也可以不填任何内容让系统自动生成设备名称,如下图所示。

设备添加完成后,点击前往查看按钮,就可以看到此设备端详细信息了。

设备信息中有两个信息需要和设备端开发相匹配:三元组和物模型属性信息。

如上图所示,点击查看按钮,就可以看到设备的三元组信息,三元组是物联网设备端和物联网云端设备相关联的唯一标识符,在设备端连接云端的时候会使用三元组信息和云端进行鉴权,鉴权通过之后云端会认为设备已激活并上线。

设备详情信息页中的物模型数据标签页中可以看到设备的所有属性信息、设备时间上报情况及设备服务调用情况。待物联网设备按照设备属性对应的标识符上报设备属性的时候,本图片中的提醒休息等属性值就会显示设备最新的属性信息。

创建产品和设备的过程是按照面向对象的思想进行设计的,其中创建产品可以看成是新建一个类,其中的物模型则是类的对象,创建设备则是进行类的实例化。

至此,久坐提醒器云端的产品、设备以及物模型就全部创建完成了,三元组信息也拿到,接下去开始进行设备端的开发

步骤二:设备端开发

在进行下一步之前请确保ESP32开发环境已经搭建完毕。

创建解决方案

点击下图中的快速开始按键会弹出HaaS Studio的欢迎页面,请点击创建项目按钮。

在随后弹框中,设定好项目名称(“sedentary_remind”)及工作区路径之后,硬件类型选择ESP32,点击立即创建,创建一个Python轻应用的解决方案。

将代码文件复制后覆盖sedentary_remind工程目录下的原有文件。其中main.py脚本的内容如下所示:

#########
from aliyunIoT import Device     # iot组件是连接阿里云物联网平台的组件
import network                   # Wi-Fi功能所在库
import ujson
##################

from driver import I2C,GPIO,TIMER
import utime
from ssd1306 import SSD1306_I2C
import ir
import time

temptimerObj = 0
time_dict = {}

#########
# 物联网平台连接标志位
iot_connected = False
wlan = None

# 三元组信息
productKey = "产品密钥" #需要填入物联网云平台申请到的productKey信息
deviceName = "设备名称" #需要填入物联网云平台申请到的deviceName信息
deviceSecret = "设备密钥" #需要填入物联网云平台申请到的deviceSecret信息

# 物联网设备实例
device = None

# Wi-Fi SSID和Password设置
wifiSsid = "请填写您的路由器名称"
wifiPassword = "请填写您的路由器密码"

...

if __name__ == '__main__' :
    oled_init()
    #########
    wlan = network.WLAN(network.STA_IF)   #创建WLAN对象
    get_wifi_status()
    connect_lk(productKey, deviceName, deviceSecret)
    #########
    ir_check_init()
    timer_init()
    while True:
        if has_rest == 1:
            has_rest = 0
            report_event(1)
            print('report rest')
        if has_leve == 1:
            has_leve = 0
            report_event(0)
            print('report leve')
        utime.sleep(1)

代码修改

对main.py里边的内容后需要完成以下三处代码修改。

  • 修改路由器名称及密码

修改sedentary_remind工程里main.py中wifiSsid和wifiPassword的值为读者实际要连接的路由器的名称及密码(请注意名称和密码都需要放在""符号中间)。

# Wi-Fi SSID和Password设置
wifiSsid = "请填写您的路由器名称"
wifiPassword = "请填写您的路由器密码"

修改完成之后get_wifi_status函数中的wlan.connect(wifiSsid, wifiPassword)语句就会连接读者自己设定的路由器。

  • 修改设备端三元组

修改sedentary_remind工程里main.py中productKey、deviceName和deviceSecret的值为读者创建的物联网设备的三元组信息,如下所示:

# 三元组信息
productKey = "产品密钥"
deviceName = "设备名称"
deviceSecret = "设备密钥"
  • 修改设备端上报提醒休息信息标识符

sedentary_remind工程里main.py中下面的代码实现的是上传提醒休息到云端的功能。其中call_rst消息提醒上报时所用的标识符。

# 上传休息提醒状态到物联网平台
def report_event(data):
    upload_data = {'params': ujson.dumps({
        'call_rst': data,
        })
    }
    device.postProps(upload_data)

确保代码中的call_rst标识符和物联网产品的物模型中属性标识符是一样的,如下图所示:

下面是本节添加的重点代码段落讲解:

人体红外区域判断是否有人的两个参数,可以根据实际情况调整。

check_max_time1 = (90) #单位s ,用于判断当前区域没有人的时间阈值 (90*timer_interval_1000ms)
check_max_time2 = (45*60) #单位s,用于判断人在当前区域的最大时间阈值 (45*60*timer_interval_1000ms)
CHECK_NOPERSON_MAX_TIME = check_max_time1 #超过这个值,说明人已经离开改红外区域
CHECK_HASPERSON_MAX_TIME = check_max_time2 #超过这个值,提醒休息

新增函数用于判断红外区域信息。

def irq_handler(data):
    global tick_time,total_time,gpioirDev,first_move,has_rest,has_leve,ir_event

    if first_move == 0:
        first_move = 1

    ret = gpioirDev.read()
    if ret == 1:
        print('person come')
        if tick_time >= CHECK_NOPERSON_MAX_TIME:
            print("person has left ",tick_time)
            total_time = 0
            tick_time = 0
            has_leve = 1
            ir_event = PERSON_LEAVE
            return
        else:
            total_time += tick_time
            print("check person move ",tick_time,total_time)
            tick_time = 0
            ir_event = PERSON_MOVE
    elif ret == 0:
        total_time += tick_time
        print('check person nomove ',tick_time,total_time)
        tick_time = 0
        ir_event = PERSON_NOMOVE

    if total_time >= CHECK_HASPERSON_MAX_TIME:
        has_rest = 1
        total_time = 0
        print('you need has rest,because you work too long')

运行结果

推送此脚本到ESP32之后,运行此脚本,ESP32串口会周期性的打印如下日志。其中:

  • “物联网平台连接成功” 代表成功连接到物联网平台。

  • "person come"说明人员在移动。

  • "check person nomove"说明监控区域人员在未移动。

  • "report rest"上报久坐提醒信息到云端。

mount fs
 ==== python execute bootpy ====
 ==== python file check /data/pyamp/main.py ====
 ==== python execute from /data/pyamp/main.py ====
ssd1306 inited!
wifi_connected: False
wifi_connected: False
wifi_connected: False
wifi_connected: False
('192.168.0.166', '255.255.255.0', '192.168.0.1', '192.168.0.1')
establish tcp connection with server(host='a1iDYXz7nCT.iot-as-mqtt.cn-shanghai.aliyuncs.com', port=[443])
sleep for 1 s
sleep for 1 s
sleep for 1 s
sleep for 1 s
sleep for 1 s
tcp_connect: can only connect from state CLOSED
success to establish tcp, fd=54
sleep for 1 s
物联网平台连接成功
sleep for 2s
person come
check person nomove  0 0
person come
check person move  10 10
...

you need has rest,because you work too long
report rest

物联网设备的系统启动成功并连接到物联网平台之后,物联网平台上对应的设备状态会从”未激活状态“变为”上线“,在物模型数据标签页上会显示设备上报到物联网平台的属性值。

此时如果有久坐提醒的信息和人员离开的信息都会上报,物联网平台的物模型数据会更新为设备上报的最新的属性值。

步骤三:钉钉消息提醒

在钉钉上创建一个群组并进入群设置->智能群助手->添加机器人->自定义

首先选择智能群助手

然后进入机器人管理,选择点击“自定义”。

开始配置机器人,如下图所示:

点击完成,在下一个界面中,会展现出一个webhook地址,把这个地址拷贝下来,后面会用到。

首先从物联网平台的功能页面,点击相关产品,进入IoT Studio产品页,开通服务后(首次访问)选择应用开发->业务服务->新建一个测试用的业务服务

给服务起个名字,如果下面所属项目没内容,可以从链接进去新建一个项目。

如果下面所属项目没内容,点击上面的新建项目按钮,创建如下:

进入开发界面后,点击下图红框中的部分,进入拖拽式开发界面。

拖一个设备触发节点到右边的画布上。

再拖一个钉钉机器人上来。

点击红框中的小正方形,即可拉出一条线,接到右边红框中的小正方形,把两块积木连接起来,相当于是说数据从左边流向右边。

然后开始配置设备触发和钉钉机器人信息。

重要

配置信息是在上面物联网平台创建产品和设备的时候存在,第一次使用的时候需要进行关联添加。

第一次使用的时候需要进行如下产品设备的关联添加:

点击钉钉机器人节点,并将你的钉钉机器人webhook地址填入其中,其余选项按下图中配置即可,注意之前配置机器人的关键词为设备,因为这里的通知消息里带有设备两字。

到这里时,你已经完成了全部的配置,可以部署和运行了,依次点击下图中的部署和发布。

运行后,就可以通过对设备上下电,触发消息,实现你的钉钉消息通知了!