博客/社区

监控一个宠物与Grafana python

2022年9月9日 11分钟

保罗·勒罗伊是一个完成了顾问20多年的技术经验和背景的工业电气工程。他拥有七个谷歌云认证目前可用的。保罗曾与多种技术在大数据和分析空间包括表、Cloudera Alteryx。他经营着一个06 10节点树莓πk3集群他监视和控制各种系统(包括植物园)。在业余时间他喜欢摄影和潜水(有时在同一时间)。

Astri勒罗伊在对职业中学学习兽医科学或工程(仍有足够的时间来决定)。她自豪地拥有椒盐卷饼,并帮助在植物园的建设,焊接至少一半的传感器向董事会和构建工作流。她的爱好包括艺术和Minecraft——并不是必须的。她在业余时间响应Grafana警报;P

有趣的故事:在2020年的夏天,我的女儿Astri决定她想要一只宠物。她喜欢Minecraft意味着蝾螈(发现的一些游戏的生物群落)选择1号,但是作为第一个宠物不理想(见:pH值、水温度、喂)。

选项2是一条蛇。我的要求之前,她被允许在蛇,她做研究。最终,她的选择是缩小至玉米蛇(伟大的起动器蛇,但相当精力充沛),皇家pythonpython,或者一个球。作为一个Python开发人员,我是倾向于Python。令人担忧的是,我们生活在英国,这是西非比国内更冷。蟒蛇需要50 - 70%之间的湿度和温度梯度之间的植物园25±1°C (77°F)和31±1°C (87.8°F)

(在我继续之前,有两件事需要注意:大部分在英国皇家蟒蛇圈养繁殖,没有非法贸易;以防,我们买了我们从一个有信誉的商店。第二件事是,所有类型的蟒蛇不能忍受寒冷,所以他们没有威胁三个当地的物种。他们相当高价值,所以有很多育种者)。

一旦我们选定了一个宠物python——Astri命名椒盐卷饼——我们需要一个监控系统,将支持她照顾蛇的能力。这意味着它必须移动和容易使用。好处:它给了我机会列举的一些技术我在某个时候“我需要学习一下这个”列表。

在这篇文章中,我将带你通过如何建立使用Grafana、InfluxDB Mosquitto, Node-RED。对于她来说,Astri帮助在植物园的建设,焊接至少一半的传感器向董事会和建筑的一些工作流。

椒盐卷饼——互联网的蛇
椒盐卷饼——互联网的蛇

开始

我们需要相当多的片段构建系统:

我们使用Kubernetes计算层的解决方案,因为它有意义使用容错平台。此外,它做了测试和交换层的解决方案非常简单。

高级体系结构

所需的高级体系结构几件工作。自动化的核心元素。从传感器数据推到通过Node-RED InfluxDB。Grafana设置存储在MySQL用户界面是通过身份意识到代理。我认为谷歌可以构建一个比我更好的验证系统。所以你可以看到之前我写了这个Grafana太棒了集成功能使用JSON web标记

传感器系统

住房的传感器系统
住房的传感器系统
ESP32Thing驱动继电器板和传感器利用(允许我们换出故障传感器很快)
ESP32Thing驱动继电器板和传感器利用(允许我们换出故障传感器很快)
延长传感器电缆到达动物园
延长传感器电缆到达动物园
焊接的线束
焊接的线束

使用一个传感器系统构建ESP32Thing8 xDHT22温度/湿度传感器。我使用本指南来构建模板和修改代码来支持8个输入(上/下、左/右、前/后),而不是一个,和我使用本指南构建MQTT的部分

椒盐卷饼和左前传感器底部,备份温度传感器电缆仍然可见。
椒盐卷饼和左前传感器底部,备份温度传感器电缆仍然可见。

控制系统

我需要建立一个自定义容器,因为我希望必要的库预装在容器被加载到集群。当容器配置加载库添加几分钟启动一次,所以我选择了预构建的容器的形象。

关键是构建手臂覆盆子π的容器谷歌云构建这是我使用的代码:

构建命令:(使用谷歌云构建ARM64容器)

gcloud构建提交——替换=“_DOCKER_BUILDX_PLATFORMS”=“linux / arm64 _REGISTRY_LOCATION =“europe-west1-docker.pkg.dev _REGISTRY =“pi-cluster _REGISTRY_APPLICATION =“nodered _BUILD_FILE =“Dockerfile.NodeRedBase _BUILD_CONTEXT =“。”--config="cloudbuild.yaml"

Cloudbuild.yaml

步骤:名字:“gcr。io / cloud-builders /码头工人的arg游戏:[“运行”,“——特权”,' linuxkit / binfmt: v0.7 '] id:“initialize-qemu gcr -名称:。io / cloud-builders /码头工人的arg游戏:[“buildx”、“创造”,“——名称”,“mybuilder”) id:“create-builder gcr -名称:。io / cloud-builders /码头工人的arg游戏:[‘buildx’,‘使用’,‘mybuilder] id:“select-builder gcr -名称:。io / cloud-builders /码头工人的arg游戏:[“buildx”、“检查”,“——引导”)id:“show-target-build-platforms gcr -名称:。io / cloud-builders /码头工人的入口点:bash的超时:“2400年代的参数:- - c”- - - - - - |码头工人buildx构建平台_DOCKER_BUILDX_PLATFORMS美元——标签_REGISTRY_LOCATION / PROJECT_ID / _REGISTRY美元/美元_REGISTRY_APPLICATION:最新\——标签_REGISTRY_LOCATION / PROJECT_ID / _REGISTRY美元/美元_REGISTRY_APPLICATION:美元(日期+ Y % m % d % H % % % S)——- f _BUILD_FILE _BUILD_CONTEXT超时美元推:“2400年代”选项:env:“DOCKER_CLI_EXPERIMENTAL =启用替换:_DOCKER_BUILDX_PLATFORMS: linux / amd64, linux / arm64‘_REGISTRY_LOCATION: europe-west1-docker.pkg.dev‘_REGISTRY: fixme‘_REGISTRY_APPLICATION: fixme‘_BUILD_FILE: Dockerfile _BUILD_CONTEXT:“。

Dockerfile.nodered

从nodered / node-red #复制包。json WORKDIR所以npm构建所有Node-RED # #你的添加节点模块复制方案。json。运行npm安装——unsafe-perm no-update-notifier——no-fund只=生产运行npm安装——审计no-update-notifier no-fund——保存——save-prefix = ~ #生产你应该添加额外的节点通过你的包。json文件,但您也可以将它们添加在这里:# WORKDIR /usr/src/node-red运行npm安装node-red-node-smooth node-red-contrib-amqp node-red-contrib-bigtimer node-red-contrib-cron-plus node-red-contrib-filter \ node-red-contrib-google-cloud node-red-contrib-google-iot-core node-red-contrib-huemagic node-red-contrib-iot-in-gcp node-red-contrib-redis \ node-red-node-mysql node-red-node-base64 node-red-node-google node-red-node-mysql node-red-node-rbe node-red-node-tail node-red-node-stomp \ node-red-contrib-kubernetes-client node-red-node-feedparser node-red-contrib-influxdb node-red-node-irc node-red-contrib-slack \ node-red-contrib-slackbot node-red-contrib-sun-position node-red-node-rbe node-red-node-tail node-red-node-email node-red-node-irc \ node-red-node-twitter node-red-contrib-auth node-red-node-email node-red-node-feedparser node-red-node-twitter node-red-contrib-neo4j-bolt \ node-red-contrib-neo4j node-red-contrib-prometheus-exporter node-red-contrib-counter node-red-contrib-msg-speed node-red-contrib-web-worldmap \ node-red-contrib-telegrambot node-red-contrib-sendgrid node-red-contrib-proj4 node-red-dashboard node-red-node-geofence \ node-red-contrib-discord node-red-contrib-postgresql node-red-contrib-uuid node-red-node-snmp node-red-contrib-discord \ node-red-contrib-kafka-client \ node-red-contrib-smartthings \ node-red-contrib-zigbee2mqtt-devices \ node-red-node-mongodb google-auth-library \ # googleapis \ # node-red-contrib-zigbee
从传感器MQTT输入InfluxDB Node-RED流
从传感器MQTT输入InfluxDB Node-RED流

数据捕获

数据从Node-RED推向InfluxDB。我跑InfluxDB作为容器——这是一个相当坚实的起动器清单。我创建了一个名为“Snek”的桶我女儿的请求。它还在那里。流入的数据是原始时间序列与八个地点和类型、湿度和温度。价值只是一个浮点数,湿度0 - 100,在摄氏温度。

有三个数据点我想跟踪:两灯的状态,从Node-RED测试点。测试点给我一种警报,如果不见了,所以我可以检测Node-RED失败了。如果涌入失败,我会得到一个警报在Node-RED来源。

在下面的流入桶视图中,测试点上面的蓝线;之间的湿度范围是35 - 80马克;温度/之间的集群;和底部的两个零和一线光传感器的读数。

流入桶视图
流入桶视图

报警

挑战这是发送正确的警报在正确的条件。温度是即时控制的问题:如果温度变化太大即使是很短的时间内,蛇的健康是有害的。自动控制系统是充分的。然而,在我目前设置湿度没有直接的方式控制,所以提醒人类对修复至关重要。

仪表盘上的如下图所示,我们设置关键的面板显示植物园的湿度和温度在热端,冷端(是的,蛇需要一个温度梯度,所以可以移动到感觉舒适),和一个预测中间带(没有传感器)。

加班时间的图表跟踪湿度和温度分析用于报警。图表显示底部输入(和空白数据)以及涌入测试点(告诉我如果数据丢失从传感器或Node-RED)。

仪表板监测温度和湿度
仪表板监测温度和湿度

瞬时值不需要聚合在很长一段时间。涌入似乎减缓了大型查询(一个SD卡和覆盆子π)的津贴,所以限制关键图表的数据是伟大的。这是这些图表的代码(过滤器可以调整任何传感器):

从(斗:“snek”) | >范围(开始:5米,停止:v.timeRangeStop) | >过滤器(fn: r (r) = > [“_measurement”] = ~ / ^植物园\ \ / /传感器。* \ /温度/美元和r (“_measurement”) = ~左/ \ / \ /前面/)| > aggregateWindow(每个:v。windowPeriod fn:意思是,createEmpty: false) | >产量(名字:“的意思是”)

监控其他部分很有趣,因为当日光光关掉它影响温度和湿度。同样,如果蛇活跃或门打开,这将严重影响湿度和温度,。在这里,你可以看到冷端不够冷,但这是外面的温度在热浪的副产品。

左前传感器给最近的阅读最热的点在地上,这是用于趋势图与不同的过滤器的每个区域。

从(斗:“snek”) | >(开始:v范围。timeRangeStart,停止:v.timeRangeStop) | >过滤器(fn: r (r) = > [“_measurement”] = ~ / ^植物园左/ \ /传感器\ \ /顶级\ /面前\ /温度/美元)| >地图(fn: (r) = > ({r _measurement:“温度”,_value: r._value})) | > aggregateWindow(每个:5 m, fn:意思是,列:“_value createEmpty:真正的)

响应

调整温度是相对简单的,因为它可以使用一个简单的开/关控制或调光器连接到加热灯。

松弛警报Grafana链接到web端点。这是一个没有价值的错误。设置这些以防你不获取数据,这是一样坏的是如果温度太高或低。
松弛警报Grafana链接到web端点。这是一个没有价值的错误。设置这些以防你不获取数据,这是一样坏的是如果温度太高或低。

移动客户端

使用Node-RED UI,我们可以创建一个简单的视图和控制系统,以防加热器的温度太高了,需要关闭。它也让我知道打开灯在日落之后当椒盐卷饼的喂食时间。从互联网控制至关重要,如果蛇了几天。

UI的客户机,它仅仅是一个扩展的流动显示界面上的温度和湿度。然而,我使用了来自开关的输入而不是流的输出显示灯是否打开或关闭。这意味着信号来打开或关闭后的流程将等待确认ESP32验证控制信号被发送。需要一个未知数的循环(光实际上开/关吗?)。

Node-RED传感器从传感器输入流(8温度/湿度传感器)输出(两盏灯)
Node-RED传感器从传感器输入流(8温度/湿度传感器)输出(两盏灯)
移动界面温度和亮度控制
移动界面温度和亮度控制

这是它!所有这些元素给我们所有我们需要了解动物园的条件。

未来的工作

椒盐卷饼是做好由于监控系统,但有两个组件,我不是很满意。第一,我希望Grafana webhook发送警报控制系统而不是依靠Node-RED。Node-RED是伟大的,但报警并不是它的强项。问题是,Grafana webhook需要一个有效的证书。我想要建立正确而不是打破安全,所以我想构建证书服务规模,确保它是有效的。

我的第二个问题是,无线在ESP32Thing焦躁不安。它有一个巨大的开销和代码之间的长延迟连接设置和数据发布。所以我测试一个RFM装置,Featherwing RFM69。我现在有原型测量兰花。

原型兰花传感器使用RFM而非wifi。
原型兰花传感器使用RFM而非wifi。

搭配一个调光器控制,而不是一个开关。这里有两个面板。

兰花湿度和低功率电池水平监测。
兰花湿度和低功率电池水平监测。

我们监控python的成功,我期待看到这个结果。

想分享你的Grafana故事和仪表板与社区?给我们留下stories@www.tubolov.com