當前位置: 華文世界 > 科技

就這?何不食肉糜?換個思路來討論智慧家居整合吧

2024-07-11科技

前兩天發了個小品類的文章

沒想到還有人回復認為文章內有內容。

那麽今天咱們就來展開講講吧。

提前得說一下,可以想象得到,發這種文章會有很多HA黨來說用HA可以完成其中的一些功能,會有「何不食肉糜」或者「Let them eat cake」的感覺。

但「何不食肉糜」並不代表不了解民間疾苦的白癡行徑,而是代表著認知偏差。人嘛往往會對自己熟知的領域下手,卻往往忽略相同的問題有不同的解決方法,這樣的現象也很符合今天要討論的內容。

沒錯,上一篇文章的確是利用編程來解決問題的,這讓很多人提出異議和望而卻步。 然而,如果要對智慧裝置進行控制,「編程」往往是最簡單粗暴且最有效的方式。

如果覺得「編程」這件事很難,那就是「何不食肉糜」般的認知偏差了。

而大家要知道的一個現實是——編程控制智慧家居其實並不像大家想象的那麽難。尤其是目前很多作業系統是預設帶有python這樣的膠水語言的,我們可以很簡單的利用python對智慧家居裝置進行整合,其難度並不比現在很多面向青少年的python編程學習班課程更高。

在今天的例子裏面預設在你的家裏已經有一台安裝了ubuntu2024的電腦,在現在最新版本的ubuntu中已經包含了編寫python程式所需要的大部份前提條件。

那麽,我們再來聊下一塊,就是——智慧家居系統的API介面。大部份智慧家居系統的程式互動都是以API作為互動前提的,API(Application Programming Interface,應用程式介面),現在已經是一個基本的編程標準。不同的廠家、產品、裝置都有一套自己的API不僅僅為裝置功能進行呼叫,而且也被利用於裝置之間的互動過程。

我們透過合適的方法向API發送指令,其實就可以達到控制這些裝置的目的。而這一些做法也恰恰是很多智慧家居平台所使用的一貫方法。

以iN家裏的HUE裝置來做個例子:

在飛利浦的網站中我們可以去直接查閱HUE的API的使用方法,其實無非就是利用程式發送http請求,這個過程和大家存取網頁是沒什麽區別的。唯一的要點在於API的參數和存取點比較多也比較嚴格和規範。但好在有文件可以讓我們真正的查閱和參考,這種事情就不是一件什麽難事。

例如在接入了HUE後我們可以寫這樣的程式來取得家裏所有的燈具資訊:

def get_lights(): url = f'http://{HUE_BRIDGE_IP}/api/{API_KEY}/lights' response = requests.get(url) if response.status_code == 200: lights = response.json() return lights else: print(f"Failed to get lights: {response.status_code} - {response.json()}") return None

或者寫這樣的程式碼來取得家裏的所有傳感器資訊:

def get_sensors(): url = f'http://{HUE_BRIDGE_IP}/api/{API_KEY}/sensors' response = requests.get(url) if response.status_code == 200: sensors = response.json() return sensors else: print(f"Failed to get sensors: {response.status_code} - {response.json()}") return None

實際上,我們所使用的形式 也都是url = f'http://{HUE_BRIDGE_IP}/api/{API_KEY}/'程式碼後面是lights(燈)還是sensors(傳感器)

現在既有了可以執行的燈具又有了可以感知的傳感器,對於編程來說,實際上我們就有了輸入和輸出。內部的 處理過程其實就是大家所需要用到的「規則」。這個「規則」就是大家依據自己的想法要實作的程式碼。

例如iN的工作室有四個HUE的頂燈,來客人在裏面玩是不是要一些氛圍感呢?我們做個disco燈效果如何呢?

我們可以透過上面的取得燈具的方法得到燈具的ID和資訊:

這時候寫一段程式控制燈光的顏色和效果就可以:

import timeimport requestsimport randomHUE_BRIDGE_IP = '你的 HUE_BRIDGE_IP'API_KEY = '你的key'LIGHT_IDS = [30, 31, 32, 33] # 工作室頂燈的ID列表def set_light_state(light_id, state): url = f'http://{HUE_BRIDGE_IP}/api/{API_KEY}/lights/{light_id}/state' response = requests.put(url, json=state) if response.status_code == 200: print(f"Light {light_id} state set successfully.") else: print(f"Failed to set light {light_id} state: {response.status_code} - {response.text}")def disco_effect(light_ids, duration=60, interval=0.5): start_time = time.time() while time.time() - start_time < duration: for light_id in light_ids: # 隨機生成亮度(bri)和色溫(ct) bri = random.randint(1, 254) ct = random.randint(153, 500) # 色溫範圍(153是最暖,500是最冷) state = { "on": True, "bri": bri, "ct": ct } set_light_state(light_id, state) time.sleep(interval)def main(): try: print("Starting disco effect...") disco_effect(LIGHT_IDS, duration=60, interval=0.5) # 60秒的disco效果,每0.5秒變化一次 except KeyboardInterrupt: print("Disco effect interrupted by user.") finally: # 重設燈光狀態 for light_id in LIGHT_IDS: set_light_state(light_id, {"on": True, "bri": 254, "ct": 366}) print("Lights reset to original state.")if __name__ == '__main__': main()

這段程式也不復雜吧?

結果就是這樣的效果:

難嗎?真的是不難吧?是不是比青少年程式學習班的課程簡單?其實你和真正的利用程式控制家裏的智慧裝置只隔了一層窗戶紙,找到文件跨過那道門檻你會發現智慧家居並不是一個多神秘的東西,只要會寫程式,你會有上帝的感覺。