【スマートホーム】SwitchBotのカーテン開閉機とラズパイを使用して自動化してみた

投稿者: | 2月 5, 2022

「朝日を浴びるために日が入ってくる時間にカーテンが開き、日が落ちたらカーテンが閉まる。」
朝日で目覚めたい日々ですが、目覚めたあとに「自分自身」でカーテンを開けているためできていないのが現実ではないでしょうか。

このカーテン開閉の自動化を行うためにカーテン開閉機を購入した人もいるかと思いますが、曜日や時間でカーテンの開閉をスケジュールすることしかできないため困っている人もいるかと思います。

実際に私もSwitchBotのカーテン開閉機を購入しましたが、日の出・日の入りの時間でカーテンの開閉ができないことに悩んでいました。

しかし、SwitchBotではAPI「Application Programming Interface」というものが公開されているため、プログラミングを少しできる人であれば、自分の思い通りにカーテンを開閉させるプログラムを作成することができます。

今回は、SwitchBotのカーテン開閉機とSwitchBotのAPI、さらにRaspberry Pi(ラズパイ)を用いて「日の出・日の入りシステム」の構築方法についてまとめます。

1.カーテン自動化システムの概要

カーテンの自動化をするには「カーテン開閉機」が必要なのはもちろんですが、「日の出・日の入り時間の情報源」、「その情報源を確認するサーバー」、さらに「カーテンを操作するサーバー(API)」の4つの要素が必要となってきます。

そのため、4つの要素を網羅するために下図の処理で動くシステムを構築していきます。

①外部サイトから日の出・日の入り時間を確認
②日の出・日の入りの時間と一致したらSwitchBotサーバーに開閉を要求
③SwitchBotサーバーが要求を受理したら、自宅のカーテンに命令する
④自宅に設置したSwitchBotカーテン装置が動く

2.用意するもの

用意するものはサーバー用途としてのRaspberry Pi(ラズパイ)、SwitchBotのカーテン開閉機の2点です。
※両サイドでカーテンを開閉する場合は2つ必要になります。

また、SwitchBotについては過去取り上げていますので、下記の記事を見れば大枠がつかめます。

3.サーバーのスペックと言語

サーバーのスペックと今回使用するプログラミング言語は下記となります。

・ハードウェア        Raspberry Pi3
・Distributor ID: Raspbian
・Description: Raspbian GNU/Linux 9.13 (stretch)
・Release: 9.13
・Codename: stretch
・プログラミング言語:  ruby 2.7.5p203

4.事前設定

4.1Ruby環境の導入

今回のカーテン自動開閉プログラムはプログラミング言語のRubyを使用するため、Rubyの環境を構築します。

Rubyは2.7.5を使用していますが、構築方法については下記の「ラズパイにRubyのバージョン管理を導入する」を参考にしてください。

4.2Rubyのライブラリインストール

今回はRubyの「switchbot」のライブラリ用いてプログラムを作成します。

そのため、まずはswitchbotをラズパイにインストールします。

$gem install switchbot

4.3 日の出・日の入り情報の取得

今回は日の出・日の入りの時間を元にカーテンが開閉するため、元となる情報が必要となります。
そのため、今回は「https://www.motohasi.net/」の情報を元にCSV形式で保存します。

今回はこちらのURLから「sunset_sunrize.csv」を作成しました。(一部抜粋)

date,sunrise,sunset
2022/01/01,6:50:33,16:38:05
2022/01/02,6:50:43,16:38:51
2022/01/03,6:50:51,16:39:38
2022/01/04,6:50:58,16:40:27
(省略)
2022/12/29,6:49:46,16:35:44
2022/12/30,6:50:02,16:36:26
2022/12/31,6:50:17,16:37:09

4.4 SwitchBotのコード取得

SwitchBotをサーバーで動かすには開発者コードとデバイスIDを用意する必要があります。

そのため、まずはスマホのSwitchBotアプリから設定を行い、開発者コードを取得する必要があります。

また、開発者コード取得後にサーバー側からデバイスIDを取得する必要もあります。

①SwitchBotアプリから開発者コードを取得する
②サーバーからカーテン開閉機のデバイスIDを確認する

上記の取得方法はHASUKE.COMさんの記事に詳しく記載されていますので、こちらをご確認ください。

https://chasuke.com/switchbotapi/

5.プログラム作成

次にプログラムを作成します。

今回のコンセプトは日の出・日の入りの時間にカーテンの開閉を行うため、「日時で開けるプログラム」と、「日時で閉じるプログラム」の2つを作成します。

このコンセプトを実現するには、「実行時間」と「4.3で作成したCSVファイルに記載されている日時」が一致するときに実行する必要があります。

そのため、「プログラムの実行間隔を1分間隔」と設定して、「スクリプトを実行した日時と、4.3で作成したCSVファイルが一致したタイミングでカーテンの開閉を行う」ようにプログラムを作成します。

#curtain_open.rb
require "csv"
require "date"
require 'switchbot'

client = Switchbot::Client.new('開発者コード')
day = Date.today

today = day.strftime("%Y/%m/%d")

#CSVファイルを一行づつ読み込んで比較
CSV.foreach("/home/pi/data/sunrise_sunset.csv") do |row|
                if row[1].include? Time.now.strftime("%H:%M").slice(1,4)
                        if today == row[0]
                                client.commands(device_id: 'デバイスID', command: 'turnOn')
                                client.commands(device_id: 'デバイスID', command: 'turnOn')
                         end
                end
end
#curtain_close.rb 
require "csv"
require "date"
require 'switchbot'

client = Switchbot::Client.new('開発者コード')
day = Date.today

today = day.strftime("%Y/%m/%d")

#CSVファイルを一行づつ読み込んで比較
CSV.foreach("/home/pi/data/sunrise_sunset.csv") do |row|
                if row[2].include? Time.now.strftime("%H:%M") 
                        if today == row[0]
                                client.commands(device_id: 'デバイスID', command: 'turnOff')
                                client.commands(device_id: 'デバイスID', command: 'turnOff')
                         end
                end
end

6.日時起動

5章のプログラムを1分間隔で動かすために、craotabの設定を行います。

crontabとは、日時などで作成したプログラムを動かすことができる機能です。

5章で作成したプログラムを定間隔1分で起動させるのもいいですが、日の出・日の入り時間はだいたい決まっているため、4~7時代の間に1分間隔で「カーテン開くプログラム」を実行、16~19時の間に1分間隔で「カーテンが閉じるプログラム」の実行を行うように設定します。

$craotab -e
0-59 4-7 * * * /home/pi/.rbenv/shims/ruby /home/pi/bin/curtain_open.rb
0-59 16-19 * * * /home/pi/.rbenv/shims/ruby /home/pi/bin/curtain_close.rb

7.さいごに

今回はカーテンの自動開閉について記載してみましたがいかがでしたでしょうか。

難しいところは色々あるとは思いますが、ぜひ参考にしてみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です