我在最近的几篇文章中一直提到 Raspberry Pis。我一直在这些系统中发现奇怪的东西。问题是:为什么我会突然争吵这些奇怪的小盒子?答案涉及供暖和空调的故事。
首先,我需要备份并讲述一个可能发生在 10 年前的故事。我听到鼓风机所在的内部单元发出可怕的噪音。听起来像是水流出来了,我半信半疑地天花板打开了,淹没了这个地方。那没有发生,但那是我热空气的尽头。从那时起,它将不再为空间产生热量。
我向那栋楼的维修人员报告了这件事。他们实际上告诉我“按下向上按钮”。你知道恒温器上的按钮让它从 70 到 71 到 72 吗?实际目标温度?是的。他们告诉我推动那个……并且没有进一步调查。就在停止之前,它发出了可怕的声音,这一事实对他们没有任何影响。那时我已经正常运行该系统五年了,并且知道该死的恒温器是如何工作的,这对它们没有影响。
我终于不得不向管理人员提出我的理由,他们出来了真正的暖通空调技术人员。事情发生时我不在,但后来我发现这东西确实存在机械类型问题。换句话说,恒温器无法“修复”任何东西。
我本可以把那个东西放在 90 上,它只会把空气吹走。明显地。我知道这一点,但他们拒绝接受我的表面价值,直到我超越他们的头脑。怎么回事? (我的意思是,我确切地知道为什么。但如果我把它写下来,那么一群 12 岁的孩子会攻击我。所以我要谈论它,房间里大约 50% 的成年人会知道我会说什么。这绝对是真的。)
跳到几个月前。我在不同的建筑物中有不同的空间,这次是空调不工作。我不希望再次发生某种废话。现在,当然,这一次它会是一个“向下箭头”的东西,但我没有那个。我想要他们无法反驳的硬数据。
为此,我获得了几个“气象站”类型的无线传感器。通常人们在购买所谓的“原子钟”(这是一个长波收音机,非常感谢)“气象站”时会得到它们,它可以显示内部和外部的温度,实际上可能会从60 kHz 传输同步时间。您将一部分(带有大显示器)停在里面,另一部分放在外面。
外部零件往往会损坏很多,因此销售替代品的业务蒸蒸日上。我拿起了其中的一些并开始忙碌。其中一个毫无歉意地用拉链系在通风口上。另一个停在系统恒温器旁边,第三个放在外面。
有一个名为 rtl_433 的程序,它将使用便宜的 20 美元 SDR(软件定义无线电)USB 记忆棒来接收和解码信号。我接受了它,说服它发出一些并不完全糟糕的输出,并为我自己的目的包装它。然后我把它安装在一对树莓派上,并在上面放了一个 RPC 服务器。
为什么要使用多个 Pi?嗯,有几个原因。首先,我希望我的无线电接收器具有多样性。通过将它们放在不同的位置,我可能会从一个位置获得良好的解码,即使有东西阻止它到达另一个位置。它还可以让我更新、升级甚至重新启动(!)它们,只要我一次做一个。 Raspberry Pi 系统只是坐在那里收听 (433 MHz) 无线电,尽可能解码。如果它看起来像一个传感器,那么它会将该信息保存在内存中并记住它何时听到它。然后,如果有东西通过网络查询它,它就会咳出所有数据。每个传感器都有一个“id”和“channel”,加上实际的温度和湿度值,最后还有一个年龄值。
我的 Debianized Mac Mini 运行这个系统的另一个部分。每隔 15 秒左右,它就会与 Pis 联系并询问他们发生了什么事。理论上,它们都将具有相同的数据集,但在实践中,可能会略有不同。这可以。它知道这会发生,它只保留它实际关心的所有传感器的最新样本。现在你知道为什么我有那个“年龄”字段了!
是的,“它关心的传感器”很重要。由于这是一个未经许可的乐队,而且这些东西很受欢迎,我的收音机经常从附近的来源接收其他看似合理的传输。它们不一致,但它们确实存在。
如果我们有对我们关心的传感器来说不太旧的好数据,那么它会将这些数据点作为行刷新到 Mac mini 上的 Postgres 数据库中。然后它又进入睡眠状态 15 秒左右。很容易。
快速进入这个阶段很重要。您不测量和记录的任何温度变化都将永远消失。任何您未播出的数据点都将永远消失。只要您不轮询 Pis 上的“无线电服务器”,这些样本就会永远消失。对我来说最重要的是获得一长串不间断的数据,这样我就可以提出自己的观点。
为什么要同时测量房间和通风口?这很容易。当交流电打开时,从一个到另一个应该有相当大的下降。下降不足意味着系统损坏了,或者它在某种程度上太热了,以至于当它通过那里的线圈泵送时无法散发任何热量。这就是为什么我在外面有第三个传感器:它告诉我建筑物的温度是多少——不是在其中一个机场,在某些理想情况下也不是。它就埋在 HVAC 系统外半部分所在的同一个城市“热岛”中。(不,外部传感器不在外部系统可以影响它的位置。)
有了这个,我可以证明尽管(超本地)外部温度完全合理,但根本没有下降。它应该给我带来冷空气。不是。这一切都在数字中。我猜他们意识到他们必须认真对待我,因为我收到了更换整个装置的计划。这将包括在天花板上挖一个大洞,拉出现有的单元,然后安装一个全新的单元。
现在,这发生在这些“供应链” shananigans 中,所以这需要 *几个月* 才能收到,而一直以来,我只是坐在这里,注销,忙于收集数据点。我最终厌倦了查看原始日志,然后再运行 SQL 查询,所以我开始进行一些可视化。
我的第一种方法是编写一个非常简单的网页,它基本上完成了 1995 年的“元刷新”技巧。它会给 IMG SRC 一个 CGI 程序。该 CGI 程序刚刚访问了数据库,询问了过去 N 小时的数据,将其渲染为 PNG 中的图形,然后将其发送到标准输出。这给了我一个很好的图形视图,所有三个传感器都使用相同的比例,很容易看到发生了什么(和没有发生)。
这工作正常,但很烦人。重新加载 1995 年风格的整个页面意味着它闪烁,因为每次都返回整个页面。它具有固定的宽度和高度,基本上只能在我的一台机器上的常用网络浏览器窗口上运行。如果我从其他任何地方加载它,那么它看起来是错误的。
这是一个非常糟糕的渲染器,但它只是一个开始。它看起来像这样:
这就是空间“随心所欲”时的样子。我对周期性峰值的猜测是附近冰箱的除霜循环,但我从来没有费心去证明这一点。至于更大的周期,这就是人来人往,阳光照在窗户上与否,以及那种性质的事情。
除了一些小的改进(比如小时的竖条),这就是我运行了几个月的情况。然后,有一天我得到了一个奇怪的想法:如果它在客户端渲染到 JavaScript 中的画布会怎样?这将让它适应页面碰巧的大小,并且它可以计算出在保持合理密度的同时要回退多远——也就是说,多少秒可以分解到每个水平像素?
所以,当我提到我不久前在 JS 中做一些事情时,这也不是夸大其词。我实际上是在写那个,因为在这件事上真的别无选择。如果你想在浏览器中做这种事情,那就是这个或什么都没有。
无论如何,这就是事情变成的样子(在外面显示):
有趣的部分是通过抓住我的浏览器窗口的一角并鞭打它来完全滥用 Mac Mini 上的网络服务器。那东西会在整个地方重新绘制,并在新设置下生成大量对新聚合数据的请求。我没有打扰它的速率限制或去抖动,因为它只是我使用它,我可以生成我想要的所有请求。
您无法从第二张屏幕截图中看到它,但我什至做了一些鼠标悬停魔术,因此它将画布的 TITLE 设置为我结束的任何 X 偏移处的温度值。因此,如果我发现一些奇怪的峰值并想知道该值,指向它并等待工具提示片刻将立即回答该问题。
实际更换发生在前一段时间,现在空间再次得到妥善管理。我没有停止监视它,因为,嗯,为什么不呢。看起来仍然很有趣,此外,它可能会再次发生。
…
就这里的移动部件而言,它看起来像这样:
两个树莓派:一个 3B,一个 3B+,我刚在附近闲逛。库存 Raspbian 安装,尽管已经应用了很多“这是 WTF?Buh-bye”删除。我扔了一大堆没有业务的包裹。
我还挂着两根 RTLSDR 棒:每个 Pi 一根。
rtl_433,可从 apt 作为“rtl-433”获得。它被配置为吐出 JSON,因为这是我能从中得到的最不讨厌的输出。 (这仍然很烦人。有时向我询问传感器通道的数字与字符。)
我自己的“thermo_server”执行 pipe/fork/dup2/exec 来包装 rtl_433,然后坐在那里解析输出并将其存储在一个线程中的内存中。然后我现有的 RPC gunk 将这些数据提供给授权客户端。它使用 jansson 来咀嚼 JSON,因为要使用的代码已经存在于其他项目中。
在 Mac Mini 上:它是一个 Debian 盒子,如前所述。它有 postgres 和 Apache。它还运行我的“thermo_logger”,它知道每隔一段时间就会通过网络(使用 RPC gunk)戳“thermo_server”进程。然后它将可用数据刷新到数据库:INSERT INTO x … 随便什么。很容易。
一大块 HTML 和另一块 JS 生成对服务器的请求并将数据点呈现为合理的图形外观。还有一些 CSS 可以让它呈现出来。
一个难以想象的称为“数据”的 CGI 程序,它实际上从 JS 标注中获取这些请求,访问数据库,然后将其扔给请求者。它也使用 jansson,因为 JSON,因为 Web 浏览器。它基本上是一个有点意义的地方。
…
所以,是的,就是这样:我编写了一个温度监控系统,以防止被维护人员虐待。有趣的是它是如何工作的。