作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
奥维迪乌-尼库·安德烈的头像

Ovidiu-Nicu Andrei

Ovidiu-Nicu是一个具有丰富PHP经验的全栈开发人员, JavaScript, 和Linux管理. 他开发了许多WordPress插件, large-scale apps, 以及性能优化的MySQL过程.

Years of Experience

14

Share

许多家庭的空调缺乏像中央自动化这样的现代化设备, 可编程恒温器, multiple sensors, or Wi-Fi control. 但旧的空调技术仍然可靠, so in many cases, 它不太可能很快升级.

That, however, 要求用户经常中断工作或睡眠来打开或关闭空调. 在布局紧凑的房子里尤其如此,比如我的房子:

平面图,空调机组在顶部,在中间的右边. 它的输出必须绕过两个拐角才能到达大多数房间,包括左下角的卧室.
我的非正统的平面设计使得用一个窗内空调机组制冷成为一个挑战. 卧室里没有遥控器的直接视线,也没有冷空气到达所有房间的直接路径.

美国家庭通常都有中央空调,但全球并非如此. 没有中央空调限制了自动化选项, 这使得在整个家庭中达到相同的温度变得更加困难. In particular, 这使得难以避免温度波动,可能需要人工干预来解决.

As an engineer and 物联网(IoT) 作为一个热心的人,我看到了一次做一些有用的事情的机会。

  • 提高独立空调装置的效率,有助节约能源
  • 通过自动化和Google home集成,让我的家更舒适
  • 完全按照我想要的方式定制我的解决方案, 而不是局限于商业上可用的选项
  • 使用久经考验的硬件,温习一下我的专业技能

我的空调是一个简单的红外遥控器的基本设备. 我知道有一些设备可以让空调机组与智能家居系统一起使用, 比如Sensibo和Tado. Instead, 我自己动手做了一个树莓派恒温器, 允许基于来自不同房间的传感器输入的更复杂的控制.

树莓派恒温器硬件

我已经用了几个了 Raspberry Pi 零w,加上 DHT22 传感器模块,监测不同房间的温度和湿度. 因为分割的平面图, 我安装了传感器来监测房子不同地方的温度.

我也有一个家庭监控系统(不需要这个项目)在Windows 10 PC与WSL 2. 我想把传感器读数整合到监控视频中, 作为视频馈送的文本覆盖.

Wiring the Sensor

传感器的接线很简单,只有三种连接方式:

第一个连接是从传感器到PIN1 - 3v3的VCC,第二个是“数据从传感器到PIN7 - GPIO4”, 第三是从传感器到PIN9 - GND的“GND”."
DHT22模块的接线图,显示用于连接到树莓派的引脚.

I used Raspberry Pi OS Lite,安装Python 3与PiP和 Adafruit_DHT library 用于Python读取传感器数据. 它在技术上已弃用,但安装和使用更简单. 另外,对于我们的用例,它需要更少的资源.

我还想有所有读数的日志,所以我使用了第三方服务器, ThingSpeak,托管我的数据,并通过API调用提供服务. 这是相对简单的, 因为我不需要实时读数, 我选择每五分钟发送一次数据.

import requests
import time
import random
import Adafruit_DHT
KEY = 'api key'
def pushData(temp:float, hum:float):
        “测量温度和湿度,并将其推送到万物对话”
        url = 'http://api.thingspeak.com/update'
        params = {'api_key': KEY, 'field5': temp, 'field6': hum}
        res = requests.get (url, params =参数)
defgetdata(传感器:int,引脚:int):
    '''
    输入DHT传感器类型和RPi GPIO引脚采集数据样本

    Parameters:
    传感器:11或22,取决于所使用的传感器(DHT11或DHT22)
    pin:使用的GPIO引脚.g. 4)
    '''
    try:
        湿度,温度= Adafruit_DHT.read_retry(传感器、销)
        返回湿度、温度
    except:
        异常(“读取传感器数据出错”)
        return False
如果__name__ == "__main__":
    如果使用DHT11,则更改为11
    我使用GPIO引脚4
    while True:
        h, t = getData(传感器,引脚)
        pushData(t, h)
        time.sleep(300)

在我的专用监视PC上,运行WSL 2,我设置了一个 PHP 脚本,从ThingSpeak获取数据,格式化,并写入一个简单的 .txt file. This .txt 我的监控软件需要这个文件才能将其覆盖在视频流上.

因为我家里已经安装了一些自动化设备, 包括智能灯泡和Google Home中的几个程序, 接下来,我将把传感器数据用作Google Home中的智能恒温器. 我的计划是创建一个Google Home程序,可以根据房间温度自动打开或关闭空调, 无需用户输入.

一张黑色冰球形状装置的照片.
PNI SafeHome PT11IR Wi-Fi智能遥控器.

Sensibo和Tado等更昂贵的一体化解决方案需要更少的技术设置, 但成本只是它的一小部分, PNI安全之家PT11IR 让我可以用手机控制其范围内的任意数量的红外设备. The control app, Tuya,与Google Home集成.

克服谷歌家庭集成问题

配备智能空调和传感器数据, 我试图在Google Home中将树莓莓识别为恒温器,但无济于事. 我能够将传感器数据发送到谷歌物联网云和它的Pub/Sub服务, 但没有办法把它发送到谷歌主页,根据这些数据创建一个例程.

经过几天的思考,我想到了一个新的方法. 如果我不需要将数据发送到Google Home呢? 如果我可以在本地查看数据并向Google Home发送命令来打开或关闭空调会怎么样? 我对语音命令进行了成功的测试,所以这种方法似乎很有希望.

快速搜索出现了 Assistant Relay, a Node.js驱动的系统,允许用户向Google Assistant发送命令, 允许用户将任何东西绑定到谷歌助手,只要它知道如何处理它收到的输入.

Even better, with Assistant Relay, 我可以通过简单地向运行Node的设备发送POST请求来结束对Google Assistant的命令.js服务器(在本例中,我的Raspberry Pi Zero W)和一些必要的参数. That’s it. The script is well documented 所以我不会在这里讲太多细节.

因为传感器的数据已经在监控电脑上读取了, 我认为可以将请求集成到PHP脚本中,以便将内容保存在一个地方.

因为你可能没有 .txt file requirement, 您可以通过直接读取传感器数据并根据该数据向Google Assistant Service发出命令来简化该过程, via Assistant Relay. 所有这些都可以在一个Raspberry Pi设备上完成,而不需要额外的硬件. 然而,由于我已经完成了一半的工作,所以使用我所拥有的东西是有意义的. Both scripts in this article can be used on a single machine; furthermore, PHP脚本可以用Python重写, if needed.

设置条件和自动化操作

我希望自动电源循环只在夜间发生, 所以我定义了我想要自动操作的时间——晚上10点到早上7点——并设置了首选温度. 确定正确的温度间隔——既要达到一个舒适的温度范围,又不要因为频繁地循环供电而缩短空调机组的寿命——需要几次尝试才能做到正确.

创建传感器数据覆盖的PHP脚本通过cron作业设置为每五分钟运行一次, 所以我只添加了条件和POST请求.

然而,这产生了一个问题. 如果条件满足, 脚本将每五分钟发送一个“打开”命令, 即使空调已经开着. 这导致单位发出烦人的哔哔声,即使是在“关闭”命令下. 为了解决这个问题,我需要一种方法来读取单元的当前状态.

优雅并不是优先考虑的问题,所以我制作了一个包含数组的JSON文件. 无论何时“打开”或“关闭”命令都将成功完成, 然后,脚本将最后一个状态追加到该数组. This solved redundancy; however, 特别炎热的天气或冬季过度加热可能会导致这些情况再次出现. 我认为在这种情况下手动控制就足够了. 我将在switch代码段之前添加一个return语句,作为读者的练习:

 27:
        turnAc('on');
        break;
    case $temperature < 24:
        turnAc('off');
        break;
}

函数turnAc(美元地位)
{
    $command = 'turn on hallway ac'; // hallway ac is the Google Home device name for my AC
    If ($status == 'off')
    {
        $command = '关闭走廊空调';
    }

    if ($status == 'on' && checkAc() == 'on')
    {
        return;
    }

    if ($status == 'off' && checkAc() == 'off')
    {
        return;
    }

    $curl = curl_init();
    curl_setopt_array($卷发,数组(
      CURLOPT_URL => 'local assistant server ip',
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => '',
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 0,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => 'POST',
      CURLOPT_POSTFIELDS =>'{
        "command": '.$command.',
        "converse": false,
        user:指定用户
        }',
      CURLOPT_HTTPHEADER => array(
        “application / json内容类型:
      ),
    ));

    $response = curl_exec($curl);
    curl_close($curl);
    $obj = null;

    try {
        $obj = json_decode($response);
    } catch(异常$e) {
    }

    if (!$obj || $obj->success != true)
    {
        markAc($status == 'on') ? 'off' : 'on'); // if error, mark it as opposite status
        return;
    }

    markAc($status);
}

函数markAc(美元地位)
{
    $file = __DIR__ . "/markAc.json";
    $json = json_decode(file_get_contents($file), true);
    $json[] = array(date('F j, Y H:i:s'), $status);

    $handler = fopen($file, "w")或die("无法打开文件!");
    $txt = json_encode($json);
    写入文件(处理程序,txt美元);
    fclose($handler);
}

function checkAc()
{
    $file = __DIR__ . "/markAc.json";
    $json = json_decode(file_get_contents($file), true);
    $end = array_pop($json);
    return $end[1];
}

这种方法奏效了,但第一次尝试就失败了. 我必须在这个过程中弄清楚事情,并根据需要进行调整. Hopefully, 根据我的经验, 你不需要做太多就能在第一次就做好.

树莓派恒温控制器的价值

我有动力把空调自动化,因为我家的非常规布局有时会导致不同房间的温度差异很大. 但是,即使对那些没有这个特殊问题的人来说,自动化供暖和制冷也有好处.

世界各地的人们生活在不同的气候条件下,支付不同的能源价格(一天中不同时间的价格也不同)。, 因此,即使是能源效率的适度提高,也能使自动化在某些地区变得有价值.

Furthermore, 随着越来越多的家庭实现自动化, 有理由探索自动化旧的耗电设备和电器(如空调)的潜力, electric heaters, and water heaters. 因为这些设备通常都很笨重, difficult to install, 升级也很贵, 许多人在接下来的几年里都会被它们困住. 让这些“愚蠢”的设备变得更智能,不仅可以提高舒适度和能源效率,还可以延长它们的使用寿命.

关于总博客的进一步阅读:

了解基本知识

  • 智能恒温器有什么好处?

    智能恒温器在灵活性方面优于普通恒温器. 他们可以考虑到一天中的时间,季节和传感器数据,特别是湿度. 智能恒温器还可以与移动设备以及谷歌Home或亚马逊Alexa集成.

  • 我可以用我的树莓派做什么?

    您可以以多种方式使用树莓派, 从一台正常工作的个人电脑(在车间), 例如)到游戏控制台(retroPi). 您还可以创建用于监控您的家庭、植物、手持设备等的系统. 唯一的限制——除了电力供应——就是你的想象力.

  • 树莓派的缺点是什么?

    那些配备了Wi-Fi的手机会受到信号衰减的影响. 如果你是便携式的,那么饥饿的电源适配器也会导致电池很快耗尽, 但你可以随时使用高容量的充电宝.

  • 树莓派3b +是做什么的?

    这完全取决于你将它与其他版本进行比较. Pi Zero更小,但内存更少,CPU速度也稍慢. 3B+就其尺寸而言相当强大,拥有1.4ghz的CPU和1GB的内存,千兆以太网,Wi-Fi,四个USB 2.0端口,全高清HDMI, PINOUT扩展和摄像头端口.

  • 树莓派3B和3B+有什么区别?

    树莓派3B+是3B的升级版, 提供千兆以太网速度, newer Wi-Fi bands, 处理器速度从1提高了一步.2 GHz to 1.4 GHz, a Bluetooth upgrade, 以及通过以太网连接通过PoE帽供电的能力(作为单独的模块提供).

就这一主题咨询作者或专家.
Schedule a call
奥维迪乌-尼库·安德烈的头像
Ovidiu-Nicu Andrei

Located in Târgoviște, Dâmbovița罗马尼亚县

Member since May 30, 2018

About the author

Ovidiu-Nicu是一个具有丰富PHP经验的全栈开发人员, JavaScript, 和Linux管理. 他开发了许多WordPress插件, large-scale apps, 以及性能优化的MySQL过程.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

Years of Experience

14

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

Toptal Developers

Join the Toptal® community.