見出し画像

ラズパイをスマートホーム的運用②

こちらの記事の続きです。結論から言うとラズパイをスマートリモコン的運用するのに成功しました!

最初はラズパイ自体に音声認識機能をつけようかと思っていたのですが、beebotte、IFTTTという二つの外部サービスを利用することで、
Googlehomeに「OK、Google。電気つけて(消して)」ということで、ラズパイから部屋の照明のオンオフを操作できるようになりました。
以下は自分が実際使っているコードです。
まずは部屋の電気をオンオフするコード。
前回の記事で「/home/pi/google-home-player/Wake-up_Check.py」というコードを公開しましたが、それは没にしてこちらと統合してしまいました。
(よって『crontab -r』をして自動実行の設定も消してあります)

/home/pi/google-home-player/Light_Ctl.py

import subprocess
import cgsensor
import time
from datetime import datetime
from zoneinfo import ZoneInfo
import cgir

#-------------------------------------------
# 何時から
StartTime = 5
# 何時まで
EndTime = 10
#照明の切り替わり時間(秒数)
ONOFFtime = 3

#-------------------------------------------
tsl2572 = cgsensor.TSL2572()  # TSL2572制御クラスのインスタンス

#照明のON/OFF信号を送る
subprocess.run(['cgir', 'send', 'Lite'])

#照明の切り替わり時間分待機
time.sleep(ONOFFtime)

#もしStartTime~EndTimeの時間帯であれば
if (datetime.now(ZoneInfo("Asia/Tokyo")).hour in range(StartTime, EndTime, 1)):
	#部屋の明るさを測る
	tsl2572.single_auto_measure()
	#部屋が明るければ
	if(tsl2572.illuminance > 80):
		#GoogleHomeが朝の挨拶をする
		subprocess.Popen(['/usr/local/bin/node' , '/home/pi/google-home-player/GoogleCalendar.js']) .wait()

上記のスクリプトは実行することで
・電源をオンオフする
・朝5-10時の間にこのコードが実行され部屋の照明がついていると、今日の日付と予定を教えてくれる。
スクリプトです。
今回はさらに『OKGoogle、電気つけて(消して)』というと、このスクリプトが実行される仕組みを作っていきます。
それが以下のコード

/home/pi/google-home-player/homeauto.py

import paho.mqtt.client as mqtt
import json
import subprocess

TOKEN = "token_XXXXXXXXXX"
HOSTNAME = "mqtt.beebotte.com"
PORT = 8883
TOPIC = "RaspberryPi/SmartRemocon"
CACERT = "/home/pi/google-home-player/mqtt.beebotte.com.pem"

def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))
    client.subscribe(TOPIC)

def on_message(client, userdata, msg):
    data = json.loads(msg.payload.decode("utf-8"))["data"][0]
    print(data["comand"])
    cmd = data["comand"]
    subprocess.Popen(cmd.split())

client = mqtt.Client()
client.username_pw_set("token:%s"%TOKEN)
client.on_connect = on_connect
client.on_message = on_message
client.tls_set(CACERT)
client.connect(HOSTNAME, port=PORT, keepalive=60)
client.loop_forever()

このコードの運用方法は以下の二つの記事を参照すればわかると思います(ぶん投げ)

自分が苦しんだところは『mqtt.beebotte.com.pem』というサーバにアクセスする証明書をダウンロードしておくのを忘れていたことです。
適当な場所にDLして(上記のコードだと"/home/pi/google-home-player/mqtt.beebotte.com.pem")スクリプト内で指定しておいてください。
苦しかった……。
https://beebotte.com/certs/mqtt.beebotte.com.pem
あと上記のhomeauto.pyを使う時はIFTTTの設定画面のBody部分は以下のように書く必要があります。

{"data":[{"comand":"python3 /home/pi/google-home-player/Light_Ctl.py"}]}

さて、上記の方法で設定が終わって完成!と言いたいのですが、まだこの段階だと、
「OK、Google。『照明(IFTTTで有効にしたキーワード)』を有効にして」
と言わないと動いてくれないので若干ダルいです『有効にして』を省略したいですよね。
というわけで省略する方法を紹介。詳しくは以下のリンクをどうぞ(また丸投げ)

こちらの『2.スマホのグーグルホームアプリとIFTTTを連携させる』以降の記事が参考になります。
こちらの通り設定していくと、「OKGoogle。電気つけて(消して)」が「OK、Google。『照明(IFTTTで有効にしたキーワード)』を有効にして」代わりになるのです。若干楽ちんになった!

というわけで上記の/home/pi/google-home-player/homeauto.pyというコードを常につけっぱなしにしておけば、ラズパイがいい感じにはからってくれる環境ができました!
やったー!!!!!!!!!ひとまずやりたいことができたのでこれにてこの記事はおしまいです。
またネタができたら続きかきます。あでゅー!

この記事が気に入ったらサポートをしてみませんか?