感受到Google Home以及Alexa的语音助手带来的便捷体验后,想到了使用拍手来开灯的想法,由于在家里已经部署了Home Assistant并且考虑到它的可二次开发的特性,使用Home Assistant API制作了这个程序。
拍两下手可判断开灯状态来进行开灯或关灯,支持设置拍手次数执行不同操作。
Home Assistant是一个开源智能家居管理平台:
Home Assistant is an open-source home automation platform running on Python 3. Track and control all devices at home and automate control. Perfect to run on a Raspberry Pi.
官网:https://www.home-assistant.io/
GitHub 详情页:https://github.com/KrunkZhou/PI-Clap
代码部分:
import pyaudio
import sys
import threading
import time
from time import sleep
from array import array
import KRUNKHOMEAPI as kapi
import homeassistant.remote as koapi #You will need to download homeassistant python api
def main():
kapi.api=koapi.API('sample.com', 'password','8123') # HA-API:domain, password, port
check=kapi.apicheck()
if check:
start()
kapi.endscript()
clap = 0
wait = 1
flag = 0
pin = 24
exitFlag = False
def toggleLight(c):
domain = 'light' #domain
switch_name = 'light.lamp' #switch name
print (str(kapi.get_state(switch_name)))
lamp=kapi.get_state(switch_name)
if (lamp.state=='off'):
kapi.turn_on(domain,switch_name)
else:
kapi.turn_off(domain,switch_name)
sleep(1)
print("Light toggled")
def waitForClaps(threadName):
global clap
global flag
global wait
global exitFlag
global pin
print ("Waiting for more claps")
sleep(wait)
if clap == 2:
print ("Two claps")
toggleLight(pin)
# elif clap == 3:
# print "Three claps"
#elif clap == 4:
# exitFlag = True
print ("Claping Ended")
clap = 0
flag = 0
def start():
global clap
global flag
global pin
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
threshold = 3000
max_value = 0
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
output=True,
frames_per_buffer=chunk)
try:
print ("Start")
while True:
data = stream.read(chunk)
as_ints = array('h', data)
max_value = max(as_ints)
if max_value > threshold:
clap += 1
print ("Clapped")
if clap == 1 and flag == 0:
t=threading.Thread( target=waitForClaps, args=("waitThread",) )
t.start()
flag = 1
if exitFlag:
sys.exit(0)
except (KeyboardInterrupt, SystemExit):
print ("\rExiting")
stream.stop_stream()
stream.close()
p.terminate()
if __name__ == '__main__':
main()
下载:
https://github.com/KrunkZhou/PI-Clap
退出登录?