前两天发了个小品类的文章
没想到还有人回复认为文章内有内容。
那么今天咱们就来展开讲讲吧。
提前得说一下,可以想象得到,发这种文章会有很多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()这段程序也不复杂吧?
结果就是这样的效果:
难吗?真的是不难吧?是不是比青少年程序学习班的课程简单?其实你和真正的利用程序控制家里的智能设备只隔了一层窗户纸,找到文档跨过那道门槛你会发现智能家居并不是一个多神秘的东西,只要会写程序,你会有上帝的感觉。