資料介紹
描述
介紹
Nest Thermostat 是一款支持 Wi-Fi 的設備,可以使用天氣信息和本地傳感器數據優化加熱和冷卻系統的使用。該設備也可以遠程控制,因此您可以在下班開車回家時做一些很酷的事情,例如將房子設置為加熱/冷卻。不過,該設備有點像一個黑匣子,它使用一些底層的機器學習機制(無論如何我都聽到了)來創建您特定使用習慣的模型,并嘗試確定您是否在家。
問題是 Nest 并不總是正確地確定家/離家。例如,我有兩個 Nest 單元控制家里的兩個 HVAC 單元(一個在樓上控制我房子的左側,另一個在樓下控制右側)。通常,我發現自己在樓上的辦公室(位于房子的右側)工作,并且由于認為我離開房子而關閉了空調。這是一個問題,通常涉及通過移動/Web 應用程序手動啟動 Nest 控制器,或者跑出辦公室并觸發我的其他 Nest 設備之一上的運動傳感器。
Nest 是一款支持 Wi-Fi 的設備,所以為什么不在家時使用運動感應或類似的東西告訴它呢?Nest 意識到了這個問題,并出售了一個運動傳感器和一個附加監控恒溫器,用于控制 Nest 控制器位置以外房間的溫度。這些傳感器非常昂貴,并且僅與 Nest v3 恒溫器兼容(我們中的許多人都有 v2 型號)。Nest v2 已啟用 Wi-Fi,因此您會認為存在基于 Wi-Fi 的設備來解決此問題,但事實并非如此。
解決方案
我們真正需要的是一種使用某種形式的基于硬件的觸發器(PIR 運動/簧片開關/更復雜的東西)通知 Nest 我們在家的方法。有人會認為If This Then That將通過他們的 Nest 集成支持此功能,但目前沒有任何具體設置 Nest 的 Home / Away 狀態。這不是破壞交易,我們可以自己動手。
要創建我們自己的更新 Nest Home / Away 狀態的機制,我們只需要幾個要素:
- 一個有效的 Oauth 令牌,允許我們通過Nest 的開發人員 API發出 API 請求以更新 Home / Away 狀態
- 可以檢測存在并發送事件以觸發此 API 調用的設備。我們將使用粒子核心/光子和 PIR 運動傳感器以及集成將消息轉發到 Azure IoT 中心。
- 對 Nest API 進行實際調用的服務。我們將使用無服務器 Azure 函數來調用 Nest API,當事件通過上述 Azure IoT 中心到達時將觸發該 API。
下面提供了概述整體架構的圖表:
獲取 Oauth Token 以訪問 Nest API
2. 在創建一個新的 OAuth 客戶端
確保啟用“離開讀/寫”設置!
3. 從下面的屏幕獲取 OAuth 客戶端的授權 URL 值,然后選擇“允許”。允許您的申請后,您將收到一個密碼,請務必將其復制下來。授權 URL 可以從 OAuth 客戶端的概覽屏幕獲取,如下所示。
4. 在您??獲得授權 URL 的概覽屏幕中,記下“客戶端 ID”和“客戶端密碼”值。接下來,從安裝了“curl”的合適命令提示符處,執行以下命令以獲取您的 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 設備相關聯。以下將返回一個 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 設備以及數字 PIR 傳感器來創建一個設備,該設備可以監控運動并能夠將事件發布到 Particle.io。
1. 首先獲取一個數字 PIR 傳感器并根據以下示意圖連接到可用的粒子設備:
您將需要刷新附加的nest-motion.ino并確保包含相關的 CircularBuffer.h
該程序使用 CircularBuffer 來允許通過采樣窗口監控傳感器讀數。這使我們能夠非常精確地從硬件控制運動觸發事件的靈敏度。通常,PIR 傳感器很容易產生誤報事件,而沒有根據調速器評估樣本讀數的機制。要獲得更高的靈敏度,請減少“PostiveSamplesToTriggerMotion”變量。要為觸發器需要更長的運動窗口,您可以調整“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;
}
設置粒子集成以將事件轉發到 Azure IoT 中心
此步驟需要一個活動的 Azure 帳戶。我們將創建的服務將是免費的,或者幾乎不需要任何費用來運營。
1. 在http://azure.com創建一個 Azure IoT 中心
2.創建粒子集成
在創建一個新的粒子集成。請務必遵循所有說明,并特別注意有關創建“共享訪問策略”的部分。在生成的設置頁面上使用值“motion”作為事件名稱。
填寫相應信息后,啟用集成。
現在,當Particle.publish("motion", "true", PRIVATE);
在nestmotion.ino中調用時,該事件將被發送到Particle.io ,然后轉發到您的 Azure IoT Hub。
使用 Azure 函數設置嵌套“離開”狀態
我們幾乎完成了,我們只需要觸發對 Nest 的 API 的調用,以便在檢測到運動時將 Nest 的“離開”狀態設置為 home。
我已盡我最大的努力使用執行此任務的預制 Azure 函數使此操作盡可能簡單。
1. 在創建一個新的 Azure Function 應用
2. 在Visual Studio Code中,打開源代碼庫中包含的Nest-Controller文件夾,
您將需要編輯local.settings.json配置文件:
ACCESS_TOKEN和STRUCTURE_ID應設置為“獲取 Oauth 令牌以訪問 Nest API ”的步驟 4 和 5 中獲得的值
在 Azure 門戶中,導航到 IoT 中心并選擇“設置”下的“內置終結點”部分。
< EventHub-Compatible-Endpoint> 應更改為“Event Hub-compatible endpoint”的值。
您現在可以調試和測試 Azure 函數。當從粒子設備發送運動事件時,您應該會看到函數觸發器。
當您能夠驗證函數是否按預期工作時,您可以通過右鍵單擊項目并選擇“部署到函數應用程序”來將函數發布到 Visual Studio 中的 Azure。
可選:如果您知道自己在做什么,則可以使用下面提供的代碼完全在 Azure 門戶中創建函數。請注意,您必須通過訪問http://
、導航到“wwwroot”并發出命令“ 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. 更新函數 AppSettings 以使用您的值
ACCESS_TOKEN、STRUCTURE_ID和particle-iot-hub_events_IOTHUB應設置為在“使用Azure 函數設置嵌套”狀態“的步驟2 中配置的local.settings.json配置文件的值。
您可以在 Azure 門戶中使用sample.dat的內容測試函數:
你有它!您現在應該在 Azure 中有一個完整的管道來處理來自 Hardware => Particle.io => Azure IoT Hub => Azure Function => Nest API 的消息。
您可以在監控粒子積分點的運動事件,然后選擇您的積分并向下滾動到歷史記錄。請務必檢查此區域以確保您沒有發送誤報運動事件:
我的傳感器在我的辦公室里工作,我巧合地在過去 5 天不在城里。很高興看到發送了零誤報!
結論
Nest 擁有一系列非常棒的產品,但是,我們已經證明,通過訪問他們的開發人員 API,我們可以讓它們變得更好!我再也不用擔心在樓上工作時我的空調會關閉。我可以簡單地將nest-motion.ino代碼閃爍到多個粒子設備,并在房子的多個房間內提醒Nest 家庭入住。目前,我有一個設備連接到我辦公室打印機的 USB 端口(始終開啟),另一個在我兄弟的房間里插入墻上,還有一個連接到我樓下電視的 USB 端口,只有在電視開著。這種設置可以讓 Nest 真正知道我們何時在家。
我們使用的服務都是免費的,只需大約 22 美元,您就可以根據需要構建任意數量的設備。硬件是節能的,因為它在運動檢測事件發生后默認進入深度睡眠模式 10 分鐘,僅消耗200uA 。此外,我們可以通過使用各種附加傳感器來擴展功能。我們甚至可以通過使用溫度傳感器和顯示器來創建自己的Nest Thermostat 。
在評論中讓我們知道您的想法,并隨時分享您的想法以改進設計!
- 智能恒溫器開源項目
- 手機控制的撥號恒溫器
- 使用螺栓的恒溫器
- Arduino供電恒溫器和風扇控制器 0次下載
- 藍牙控制恒溫器
- 智能恒溫器開源案例
- 迷你恒溫器開源分享
- Vishay NTC恒溫器的模擬
- 智能恒溫器開源分享
- 恒溫器開源分享
- 如何使用固態繼電器驅動恒溫器
- 恒溫器控制電路原理圖 56次下載
- 烙鐵恒溫器電路圖 34次下載
- 恒溫器控制電路原理圖免費下載 11次下載
- 2017全球WiFi恒溫器市場發展現狀及趨勢研究 4次下載
- 高壓隔離開關用途 2478次閱讀
- 使用MOSFET作為恒溫加熱器 1154次閱讀
- 如何制作一個通過本地WiFi網絡瀏覽器進行控制的恒溫器 1873次閱讀
- 高壓隔離開關型號含義_高壓隔離開關檢修 6819次閱讀
- 恒溫加熱器的工作原理_恒溫加熱器保養 1.8w次閱讀
- 恒溫電烙鐵的選擇及使用注意事項 1.1w次閱讀
- 即熱式熱水器自動恒溫實驗電路圖 1.9w次閱讀
- 電熨斗自動調溫原理 3.2w次閱讀
- 恒溫電烙鐵及焊接知識 3147次閱讀
- 電子恒溫器 4168次閱讀
- 用于植物的土壤加熱器 3770次閱讀
- 小型恒溫控制器 2519次閱讀
- 魚缸電子恒溫器電路圖 3403次閱讀
- 雙線遙控交流電子恒溫器電路圖 2168次閱讀
- 三線電子恒溫器電路圖 6041次閱讀
下載排行
本周
- 1Keysight B1500A 半導體器件分析儀用戶手冊、說明書 (中文)
- 19.00 MB | 4次下載 | 免費
- 2使用TL431設計電源
- 0.67 MB | 2次下載 | 免費
- 3BT134雙向可控硅手冊
- 1.74 MB | 2次下載 | 1 積分
- 4一種新型高效率的服務器電源系統
- 0.85 MB | 1次下載 | 1 積分
- 5LabVIEW環形控件
- 0.01 MB | 1次下載 | 1 積分
- 6PR735,使用UCC28060的600W交錯式PFC轉換器
- 540.03KB | 1次下載 | 免費
- 751單片機核心板原理圖
- 0.12 MB | 1次下載 | 5 積分
- 8BP2879DB支持調光調滅的非隔離低 PF LED 驅動器
- 1.44 MB | 1次下載 | 免費
本月
- 1開關電源設計原理手冊
- 1.83 MB | 54次下載 | 免費
- 2FS5080E 5V升壓充電兩串鋰電池充電管理IC中文手冊
- 8.45 MB | 23次下載 | 免費
- 3DMT0660數字萬用表產品說明書
- 0.70 MB | 13次下載 | 免費
- 4UC3842/3/4/5電源管理芯片中文手冊
- 1.75 MB | 12次下載 | 免費
- 5ST7789V2單芯片控制器/驅動器英文手冊
- 3.07 MB | 11次下載 | 1 積分
- 6TPS54202H降壓轉換器評估模塊用戶指南
- 1.02MB | 8次下載 | 免費
- 7STM32F101x8/STM32F101xB手冊
- 1.69 MB | 8次下載 | 1 積分
- 8基于MSP430FR6043的超聲波氣體流量計快速入門指南
- 2.26MB | 7次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935119次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420061次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191367次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73807次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65987次下載 | 10 積分
評論
查看更多