電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>NEST恒溫器的自動離開輔助

NEST恒溫器的自動離開輔助

2022-11-10 | zip | 0.17 MB | 次下載 | 免費

資料介紹

描述

介紹

Nest Thermostat 是一款支持 Wi-Fi 的設備,可以使用天氣信息和本地傳感器數(shù)據(jù)優(yōu)化加熱和冷卻系統(tǒng)的使用。該設備也可以遠程控制,因此您可以在下班開車回家時做一些很酷的事情,例如將房子設置為加熱/冷卻。不過,該設備有點像一個黑匣子,它使用一些底層的機器學習機制(無論如何我都聽到了)來創(chuàng)建您特定使用習慣的模型,并嘗試確定您是否在家。

問題是 Nest 并不總是正確地確定家/離家。例如,我有兩個 Nest 單元控制家里的兩個 HVAC 單元(一個在樓上控制我房子的左側(cè),另一個在樓下控制右側(cè))。通常,我發(fā)現(xiàn)自己在樓上的辦公室(位于房子的右側(cè))工作,并且由于認為我離開房子而關閉了空調(diào)。這是一個問題,通常涉及通過移動/Web 應用程序手動啟動 Nest 控制器,或者跑出辦公室并觸發(fā)我的其他 Nest 設備之一上的運動傳感器。

Nest 是一款支持 Wi-Fi 的設備,所以為什么不在家時使用運動感應或類似的東西告訴它呢?Nest 意識到了這個問題,并出售了一個運動傳感器和一個附加監(jiān)控恒溫器,用于控制 Nest 控制器位置以外房間的溫度。這些傳感器非常昂貴,并且僅與 Nest v3 恒溫器兼容(我們中的許多人都有 v2 型號)。Nest v2 已啟用 Wi-Fi,因此您會認為存在基于 Wi-Fi 的設備來解決此問題,但事實并非如此。

解決方案

我們真正需要的是一種使用某種形式的基于硬件的觸發(fā)器(PIR 運動/簧片開關/更復雜的東西)通知 Nest 我們在家的方法。有人會認為If This Then That將通過他們的 Nest 集成支持此功能,但目前沒有任何具體設置 Nest 的 Home / Away 狀態(tài)。這不是破壞交易,我們可以自己動手。

要創(chuàng)建我們自己的更新 Nest Home / Away 狀態(tài)的機制,我們只需要幾個要素:

  • 一個有效的 Oauth 令牌,允許我們通過Nest 的開發(fā)人員 API發(fā)出 API 請求以更新 Home / Away 狀態(tài)
  • 可以檢測存在并發(fā)送事件以觸發(fā)此 API 調(diào)用的設備。我們將使用粒子核心/光子和 PIR 運動傳感器以及集成將消息轉(zhuǎn)發(fā)到 Azure IoT 中心
  • 對 Nest API 進行實際調(diào)用的服務。我們將使用無服務器 Azure 函數(shù)來調(diào)用 Nest API,當事件通過上述 Azure IoT 中心到達時將觸發(fā)該 API。

下面提供了概述整體架構的圖表:

?
pYYBAGNsTs6AV1PQAADDS0xbb0o386.png
硬件 => Particle.io => Azure IoT Hub => Azure Function => Nest API。
?

獲取 Oauth Token 以訪問 Nest API

1. 您需要創(chuàng)建一個活躍的 Nest 開發(fā)者帳戶

2. 在創(chuàng)建一個新的 OAuth 客戶端

確保啟用“離開讀/寫”設置!

?
poYBAGNsTtGALnG0AAE-NRdmtgE440.png
?

3. 從下面的屏幕獲取 OAuth 客戶端的授權 URL 值,然后選擇“允許”。允許您的申請后,您將收到一個密碼,請務必將其復制下來。授權 URL 可以從 OAuth 客戶端的概覽屏幕獲取,如下所示。

?
poYBAGNsTtOALyz1AACc1y0_oHs236.png
?

4. 在您??獲得授權 URL 的概覽屏幕中,記下“客戶端 ID”和“客戶端密碼”值。接下來,從安裝了“curl”的合適命令提示符處,執(zhí)行以下命令以獲取您的 AUTH_TOKEN:

curl -X POST "https://api.home.nest.com/oauth2/access_token?client_id=<YOUR_CLIENT_ID>&code=<YOUR_PIN_CODE>&client_secret=<YOUR_CLIENT_SECRET>&grant_type=authorization_code"

5. 最后,我們需要獲取您想要的 STRUCTURE_ID,這是您的 Home 的表示,它與特定的 Nest 設備相關聯(lián)。以下將返回一個 json 有效負載。您需要記下 structure_id 屬性的值。

curl --location-trusted \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -X GET "https://developer-api.nest.com/

構建硬件

我們將使用提供的 Particle Photon 或 Particle Core 設備以及數(shù)字 PIR 傳感器來創(chuàng)建一個設備,該設備可以監(jiān)控運動并能夠?qū)⑹录l(fā)布到 Particle.io。

1. 首先獲取一個數(shù)字 PIR 傳感器并根據(jù)以下示意圖連接到可用的粒子設備:

?
pYYBAGNsTtaAPHgDAAFbrjbltgQ270.png
?
?
poYBAGNsTveAShkbAAs3XLzyFog535.jpg
?

2. 在粒子 Web IDE 中創(chuàng)建一個新程序

您將需要刷新附加的nest-motion.ino并確保包含相關的 CircularBuffer.h

該程序使用 CircularBuffer 來允許通過采樣窗口監(jiān)控傳感器讀數(shù)。這使我們能夠非常精確地從硬件控制運動觸發(fā)事件的靈敏度。通常,PIR 傳感器很容易產(chǎn)生誤報事件,而沒有根據(jù)調(diào)速器評估樣本讀數(shù)的機制。要獲得更高的靈敏度,請減少“PostiveSamplesToTriggerMotion”變量。要為觸發(fā)器需要更長的運動窗口,您可以調(diào)整“SampleWindowSize”。

為了方便起見,下面提供了nest-motion.ino :

/*
*********************
Nest Motion Detection
*********************
A tunable program for determining motion events using a PIR sensor, with an emphasis on reducing false-positives and minimizing energy consumption.
When motion is detected, an event is published to Particle.io.
This event is then forwarded to an Azure IoT Hub which calls a Serverless function informing Nest to set Away Status to "Home"
Instruction for end-to-end configuration are avaiable @ 
*/
#include "CircularBuffer.h"
#define PIRPIN D0 //The Pin attached to the PIR Sensor
const int CalibrationTimeInSeconds = 30; //Seconds to await for calibration of the PIR sensor
const int SampleWindowSize = 10; //Ex: SampleWindowSize is the amount of samples to keep track of for evaluating the occurence of a motion event
const int PostiveSamplesToTriggerMotion = 10; //Ex: A value of x will require that at least x samples produced within the sampleWindow are postive to trigger a motion event 
const int SleepIntervalInSeconds = 600;  //The amount of time to go into deep sleep mode afer motion is reported, 600 seconds equates to a max of 10 alerts per hour
CircularBuffer<bool, SampleWindowSize> sampleWindow;
char output[50];
//Per PIR spec, allow 30s to calibrate (warm up) the sensor
void CalibrateSensor()
{
   Serial.print("Calibrating Sensor... ");
   for(int i = 0; i < CalibrationTimeInSeconds; i++){
       delay(1000);
   }
   Serial.println("PIR Sensor Calibrated");
}
void setup() {
   Serial.begin(9600);
   Serial.println("***************************************");
   Serial.println("    Nest Motion Detection Started ");
   Serial.println("***************************************");
   pinMode(PIRPIN, INPUT);
   CalibrateSensor();
}
void loop() {
   sampleWindow.push(SamplePIR());
   if(CheckSampleWindowForMotion())
   {
       Serial.print("Publishing motion event... ");
       //Motion accurately detected, time to inform Nest that we are we are home
       Particle.publish("motion",  "true", PRIVATE); //Trigger the integration
       delay(1000); //Extra sleep to ensure message delivery
       Serial.println("Motion event published");
       Serial.println("Going to sleep now...");
       System.sleep(SLEEP_MODE_DEEP, SleepIntervalInSeconds); //Go into deep sleep low-power mode for SleepIntervalInSeconds seconds
       CalibrateSensor();//Recalibrate Sesnor on awaken
   }
}
//Takes ten readings per second, returns true if a postive reading is encountered
bool SamplePIR() {
   Serial.print("Sampling PIR... ");
   int val = 0;
   for(int i = 0; i < 10; i += 1)
   {
       if(val == LOW)
           val = digitalRead(PIRPIN);
       delay(100);
   }
   if(val)
    {
        Serial.println(" Motion Detected in sample!");
        return true;
    }
   else
   {
       Serial.println(" No Motion Detected in sample");
       return false;
   }
}
//Loops through the sampleWindow, returns true if enough positive samples are found
bool CheckSampleWindowForMotion()
{
   Serial.print("Checking Sample Window... ");
   int positiveSamples = 0;
   for(int i = 0; i < SampleWindowSize ; i++){
       if(sampleWindow.pop() == true)
           positiveSamples++;
   }
   Serial.print(positiveSamples);
   Serial.println(" positive samples were found in sample window");
   if(positiveSamples >= PostiveSamplesToTriggerMotion)
       return true;
   else
       return false;
}

設置粒子集成以將事件轉(zhuǎn)發(fā)到 Azure IoT 中心

此步驟需要一個活動的 Azure 帳戶。我們將創(chuàng)建的服務將是免費的,或者幾乎不需要任何費用來運營。

1. 在http://azure.com創(chuàng)建一個 Azure IoT 中心

?
poYBAGNsTv2AL3d-AALkOGaa_J4557.png
?

2.創(chuàng)建粒子集成

創(chuàng)建一個新的粒子集成。請務必遵循所有說明,并特別注意有關創(chuàng)建“共享訪問策略”的部分。在生成的設置頁面上使用值“motion”作為事件名稱。

填寫相應信息后,啟用集成。

?
pYYBAGNsTv-ADtmhAADvrG8tiUM644.png
?

現(xiàn)在,當Particle.publish("motion", "true", PRIVATE);nestmotion.ino中調(diào)用時,該事件將被發(fā)送到Particle.io ,然后轉(zhuǎn)發(fā)到您的 Azure IoT Hub。

使用 Azure 函數(shù)設置嵌套“離開”狀態(tài)

我們幾乎完成了,我們只需要觸發(fā)對 Nest 的 API 的調(diào)用,以便在檢測到運動時將 Nest 的“離開”狀態(tài)設置為 home。

我已盡我最大的努力使用執(zhí)行此任務的預制 Azure 函數(shù)使此操作盡可能簡單。

1. 在創(chuàng)建一個新的 Azure Function 應用

2. 在Visual Studio Code中,打開源代碼庫中包含的Nest-Controller文件夾,

您將需要編輯local.settings.json配置文件:

ACCESS_TOKENSTRUCTURE_ID應設置為“獲取 Oauth 令牌以訪問 Nest API ”的步驟 4 和 5 中獲得的值

在 Azure 門戶中,導航到 IoT 中心并選擇“設置”下的“內(nèi)置終結點”部分。

< EventHub-Compatible-Endpoint> 應更改為“Event Hub-compatible endpoint”的值。

?
poYBAGNsTwOAHjFDAAFCf7XR_vs074.png
?

您現(xiàn)在可以調(diào)試和測試 Azure 函數(shù)。當從粒子設備發(fā)送運動事件時,您應該會看到函數(shù)觸發(fā)器。

?
poYBAGNsTxKAfuBEAALWobGHuUw240.png
?

當您能夠驗證函數(shù)是否按預期工作時,您可以通過右鍵單擊項目并選擇“部署到函數(shù)應用程序”來將函數(shù)發(fā)布到 Visual Studio 中的 Azure。

可選:如果您知道自己在做什么,則可以使用下面提供的代碼完全在 Azure 門戶中創(chuàng)建函數(shù)。請注意,您必須通過訪問http://.scm.azurewebsites.net、導航到“wwwroot”并發(fā)出命令“ npm install request -g ”來滿足“request.js”的依賴項,在 kudu cli 中安裝“請求”依賴項。

module.exports = function (context, eventInput) {
   context.log('Triggered!');
   if(eventInput.event === "motion" && eventInput.data === "true");
   {
       var url = 'https://developer-api.nest.com/structures/' + process.env.STRUCTURE_ID + '/away?auth=' + process.env.ACCESS_TOKEN;
       var request = require('request');
       request({ method: 'PUT', url: url, followAllRedirects : true, 'content-type': 'application/json', body: '"home"' }, function (err, res, body) {        
               context.log('Away status set to: ' + JSON.parse(body));
               context.done();
       });
   }             
}

4. 更新函數(shù) AppSettings 以使用您的值

ACCESS_TOKEN、STRUCTURE_IDparticle-iot-hub_events_IOTHUB應設置為在“使用Azure 函數(shù)設置嵌套”狀態(tài)“的步驟2 中配置的local.settings.json配置文件的值。

?
pYYBAGNsTxaAanZlAAI7AWKSR38510.png
?

您可以在 Azure 門戶中使用sample.dat的內(nèi)容測試函數(shù):

?
poYBAGNsTxmAVk6oAAFRMIiIMJA788.png
?

你有它!您現(xiàn)在應該在 Azure 中有一個完整的管道來處理來自 Hardware => Particle.io => Azure IoT Hub => Azure Function => Nest API 的消息。

您可以在監(jiān)控粒子積分點的運動事件,然后選擇您的積分并向下滾動到歷史記錄。請務必檢查此區(qū)域以確保您沒有發(fā)送誤報運動事件:

?
pYYBAGNsTxyAOtntAAEnLTQd-kA865.png
?

我的傳感器在我的辦公室里工作,我巧合地在過去 5 天不在城里。很高興看到發(fā)送了零誤報!

結論

Nest 擁有一系列非常棒的產(chǎn)品,但是,我們已經(jīng)證明,通過訪問他們的開發(fā)人員 API,我們可以讓它們變得更好!我再也不用擔心在樓上工作時我的空調(diào)會關閉。我可以簡單地將nest-motion.ino代碼閃爍到多個粒子設備,并在房子的多個房間內(nèi)提醒Nest 家庭入住。目前,我有一個設備連接到我辦公室打印機的 USB 端口(始終開啟),另一個在我兄弟的房間里插入墻上,還有一個連接到我樓下電視的 USB 端口,只有在電視開著。這種設置可以讓 Nest 真正知道我們何時在家。

我們使用的服務都是免費的,只需大約 22 美元,您就可以根據(jù)需要構建任意數(shù)量的設備。硬件是節(jié)能的,因為它在運動檢測事件發(fā)生后默認進入深度睡眠模式 10 分鐘,僅消耗200uA 此外,我們可以通過使用各種附加傳感器來擴展功能。我們甚至可以通過使用溫度傳感器和顯示器來創(chuàng)建自己的Nest Thermostat 。

在評論中讓我們知道您的想法,并隨時分享您的想法以改進設計!


評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅(qū)動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費