本文用树莓派连接温湿度传感器,配合阿里云DataWorks、MaxCompute以及Quick BI等产品,完成了家庭温湿度数据采集与分析。
引言
夏日已至,气温升高,又到了一年难熬的梅雨季节。作为一名技术宅,我望了眼藏在角落里吃灰的树莓派,便萌生了通过树莓派完成数据采集,经过大数据处理,得到可视化家庭温湿度报表的想法。
最终的效果如下,我产出了两个看版,第一个可以看到最近1小时每分钟的温湿度情况,第二个可以看到一天每小时的温湿度情况。
![image.png](https://ucc.alicdn.com/dlacj2xtezugq_20240422_c02bfb2311a44e3794abc4d5e868acf2.png?x-oss-process=image/resize,w_1400/format,webp)
大数据处理流程概览
首先,我们先来了解一下大数据处理的主要步骤,主要为数据产生、数据采集与存储、数据分析与处理、数据应用4个步骤,通过访问阿里云大数据产品官网,可以了解到这些信息:
数据产生:业务系统每天产生的大量业务数据、日志,存储在各自独立的数据源里。
数据采集与存储:通过DataWorks提供数据集成服务,可以将多种数据源类型,根据设定的调度任务,定时同步系统的数据至MaxCompute。
数据分析与处理:完成数据采集后,可以在MaxCompute中对数据进行离线处理(俗称ETL过程,Extract-Transform-Load);也可以结合Flink和Hologres对数据进行实时处理。
数据应用:数据加工完成后,可以通过报表进行可视化展示与分享。
![image.png](https://ucc.alicdn.com/dlacj2xtezugq_20240422_9b3c29df01174c97a3d57eb8a6a20018.png?x-oss-process=image/resize,w_1400/format,webp)
图片来源:https://www.aliyun.com/product/bigdata/ide
我整理出了本次实现案例的数据开发方案:
数据产生:树莓派连接温湿度传感器,间隔2秒读取数据,并实时上报到SLS日志服务进行存储。
数据采集与存储:使用数据集成工具,将SLS日志服务的数据同步至MaxCompute。
数据分析与处理:遵循数仓规范,在DataWorks里完成数据开发。
数据应用:将开发完成的数据关联到Quick BI,进行可视化报表搭建。
接下来,我们按照这个流程逐步实现。
一、数据产生
概览:使用树莓派连接温湿度传感器,基于JavaScript我们可以快捷完成数据的读取,随后基于阿里云SLS服务,将采集到的数据实时上报并存储。
什么是树莓派
![image.png](https://ucc.alicdn.com/dlacj2xtezugq_20240422_0464180975cc4d8e8ca082eeb1a9b05e.png?x-oss-process=image/resize,w_1400/format,webp)
图片来源:https://www.raspberrypi.com/products/raspberry-pi-4-model-b/
树莓派于2012年问世,外形只有信用卡大小,它是一款基于ARM的微型电脑主板,却具有电脑的所有基本功能,此外还具有GPIO接口能力,可以很方便完成与硬件的通信。
它出现的本意并非撼动消费者市场,而是以低廉的价格去促进计算机教育,做出好玩的实验,这是树莓派流行的主要原因。
什么是GPIO编程
GPIO(General-Purpose IO Ports),即通用IO接口。GPIO主要分为输入和输出两种功能。可以实现一些简单设备的控制。比如在输入模式下,将该IO连接传感器,可以用于检测外部状态;当作为输出时,可以通过输出高/低电平来控制外部设备的运转。
树莓派天然支持GPIO编程,以树莓派4B为例,它提供了40个接口,其中21个为GPIO接口,见下图圈出来的位置。
![image.png](https://ucc.alicdn.com/dlacj2xtezugq_20240422_dcdf62881f4b4cf281c40e6b593ea3b3.png?x-oss-process=image/resize,w_1400/format,webp)
图片来源:https://pinout.xyz/
树莓派目前提供多种编程语言的开发SDK,这极大地降低了我们操作硬件的成本,我们不需要掌握电位变化的基础知识,只需要调用API便可以轻松读取数据,接下来我们来介绍本文的核心 -- DHT11温湿度传感器。
DHT11温湿度传感器
DHT11温湿度传感器,可以测量20-90%的湿度区间, 0~50℃的温度区间,采样周期 >= 1秒/次,外观如下图所示。
![image.png](https://ucc.alicdn.com/dlacj2xtezugq_20240422_be4639efdfab4c829f80ae82914c84eb.png?x-oss-process=image/resize,w_1400/format,webp)
图片来源:https://developer.aliyun.com/article/843529
它包含三个针脚,分别是电源正负极、一个数据针脚。通过将信号针脚与树莓派的某一个GPIO针脚连接,便可以源源不断的读取信息。
采集与上报数据
我们按照下图将树莓派与传感器进行连接,其中传感器的数据针脚连接到树莓派的编号为21的GPIO针脚。
连接成功后,我们基于开源项目node-dth-sensor来完成传感器数据的获取,只需要编写简单的JavaScript代码,调用 read
方法,就可以获取到温湿度数据,如下所示。
const sensor = require("node-dht-sensor");
const SENSOR_TYPE = 11; // 传感器类型,本例为DHT11型号传感器,因此赋值为11
const GPIO_PIN = 21;// GPIO针脚编号,本例中连接到了21编号,这里根据实际连线情况需要变化参数。
sensor.read(SENSOR_TYPE, GPIO_PIN, function (err, temperature, humidity) {
if (!err) {
console.log("temperature", temperature, "humidity", humidity);
}
});
随后,我们结合阿里云SLS日志服务,每隔2秒,做一次数据上报,示意代码如下。
const sensor = require("node-dht-sensor");
const SLS = require("./sls"); // 基于sls日志服务的sdk做简单封装
const projectName = "自定义";
const logStoreName = "自定义";
const reporter = new SLS(projectName);
const SENSOR_TYPE = 11; // 传感器类型,本例为DHT11型号传感器,因此赋值为11
const GPIO_PIN = 21; // GPIO针脚编号,本例中连接到了21编号,这里根据实际连线情况需要变化参数。
setInterval(() => {
sensor.read(SENSOR_TYPE, GPIO_PIN, function (err, temperature, humidity) {
if (!err) {
reporter.put(logStoreName, {
temperature,
humidity,
});
}
});
}, 2000);
最后,我们使用pm2运行该段脚本,使其在后台常驻运行。
$ pm2 start dht11.js
进入SLS日志服务控制台,检查是否有数据上报成功。
![image.png](https://ucc.alicdn.com/dlacj2xtezugq_20240422_b8cfeb528cc74f73ab0f35076b8c5c29.png?x-oss-process=image/resize,w_1400/format,webp)
二、数据采集与存储
概览:这一节我们的目标是将SLS的日志数据采集并存储到MaxCompute里,本案例中我们为了尽可能实时地看到数据情况,将数据采集的频率设置为5分钟/次,实现近实时数据采集,也可以大致满足我们的需求。
第一步:建立需要存储同步后的数据的表,按照数仓规范,存放业务源头数据的表,我们需要将其命名为ods_前缀,其英文全称为Operational Data Store,在数据分析与处理章节,我们会详细介绍。
![](https://ucc.alicdn.com/dlacj2xtezugq_20240422_50055b8c0abd462aa985ecf19bbef1fa.png?x-oss-process=image/resize,w_1400/format,webp)
第二步:使用数据集成工具完成数据同步,获取SLS里的上报时间需要将采集字段命名为__receive_time__
。
![](https://ucc.alicdn.com/dlacj2xtezugq_20240422_cbce0d696e8246bfb7c6b2c1f646b16b.png?x-oss-process=image/resize,w_1400/format,webp)
第三步:设置任务调度时间,每5分钟执行一次,每次获取执行时向前5分钟的数据,在调度配置里使用$[yyyymmddhh24miss]
参数表达当前时间(精确到秒),使用$[yyyymmddhh24miss-1/24/60*5]
参数表达当前时间的前5分,提交任务,进入到运维中心后,便可以看到调度任务已经在等待中了。
![](https://ucc.alicdn.com/dlacj2xtezugq_20240422_2e2482ec8ab64aedac6f0d291276d6c8.png?x-oss-process=image/resize,w_1400/format,webp)
第四步:使用临时查询工具,检查数据是否成功同步。
![](https://ucc.alicdn.com/dlacj2xtezugq_20240422_508e0a8be59d45a58abc13218116a335.png?x-oss-process=image/resize,w_1400/format,webp)
三、数据分析与处理
概览:在DataWorks里进行数据处理,依据数仓建设规范分别构建ODS层、DWD层、DWS层、ADS层。根据上报的温湿度明细数据,计算出最近1小时每分钟的温湿度数据、每天每小时的温湿度数据。
首先,在数据分析处理之前,需要先明确最终需要产出的结果是什么:
最近1小时每分钟的温湿度情况
每小时的温湿度变化情况以及是否舒适
每日舒适率
以下是个人的定义,不一定严谨,仅供参考: 舒适区间:人体感觉适宜的温度在22到26度之间,相对湿度在40%到70%,在这样的温度和湿度的环境下人体感觉相对比较舒服。 舒适率:(舒适小时数 / 当天已统计小时数) * 100%,例如上午10:00,当天共统计10个小时,其中舒适小时数为5个小时,因此当天舒适率为 (5/10)*100% = 50%
随后我们进行数据处理阶段,数据处理阶段是非常灵活的,为了尽可能让数据资产规范可持续消费,应当遵循一定规范进行建设,目前业界普遍按照维度建模和数仓建模的思路来组织整个开发过程,具体如下:
第一步:构建ODS层,目标是1比1完整接入,不考虑易用性,仅仅要求全。这一步将SLS日志同步到ods_sensor表里
第二步:构建DWD层,目标是加入规范,数据清洗,拼接相关字段,让数据好用。这一步将ods_sensor里的日期时间戳转化为标准的date格式,并且完成是否为舒适数据的判断,最终生产为dwd_sensor表
第三步:构建DWS层,目标是对数据适度汇总,让数据易用。这一步根据dwd_sensor表,生产出最近1小时和每小时的轻度汇总表,分别为dws_sensor_latest_1h和dws_sensor_1day
第四步:构建ADS层,与业务直接关联的需求在此完成,上述舒适率便是一个个性化需求,因此放在这里构建,产出ads_comfort_rate_day
最终构建后的数仓结构如下(在DataWorks里以可视化方式呈现表依赖关系)。
![image.png](https://ucc.alicdn.com/dlacj2xtezugq_20240422_3b506ef3d8504d36805bb36aae6429e0.png?x-oss-process=image/resize,w_1400/format,webp)
四、数据应用
概览:这一步只需要将产出的数据表,关联到Quick BI中,便可以快捷搭建出可视化看板。
第一步:新建数据源,与MaxCompute形成关联,随后便可以获取到所有的表信息。
![image.png](https://ucc.alicdn.com/dlacj2xtezugq_20240422_9c9c2c081522491d9681c45a02579bc0.png?x-oss-process=image/resize,w_1400/format,webp)
第二步:新建数据集,将MaxCompute表在这里进一步加工,例如调整名称,字段类型调整,展示格式调整。
![image.png](https://ucc.alicdn.com/dlacj2xtezugq_20240422_669bd626ece04d8db33c7919d66068fb.png?x-oss-process=image/resize,w_1400/format,webp)
第三步:搭建看板,挑选适合的图表,将字段关联,你还可以增加各种过滤器进行筛选。
![](https://ucc.alicdn.com/dlacj2xtezugq_20240422_113486592aa8450f957fa6619d20b894.png?x-oss-process=image/resize,w_1400/format,webp)
五、小结
通过采集温湿度数据并进行可视化处理,让沉睡已久的树莓派重新焕发生机,整个过程是充满乐趣的。提及日常生活,我们每天每个人其实都在不断地产生数据,大数据离我们并不远,运动手环、智能家居、购物推荐其实都在无形应用着这些数据,我们既是生产者,亦是消费者。
希望本文可以唤起大家动手进行大数据处理的热情,采集并消费身边的数据,人人都可以做大数据分析。