RaspberryPiホームオートメーションを設定する

Set Up Raspberry Pi Home Automation



ホームオートメーションにとって最も重要なことの1つは、低電圧DCを使用して高電圧ACを制御することです。 Raspberry Piからの高電圧ACを制御するには、5Vリレースイッチが必要です。 RaspberryPiのGPIOピンを使用してリレースイッチを制御できます。リレースイッチは、RaspberryPiを介してAC家電を制御できます。

この記事では、Raspberry Piと5Vリレースイッチを使用して、モバイルデバイスから電球をオンまたはオフにする方法を説明します。この記事には、ネットワーク上の任意のデバイスからアクセスして、自宅のAC家電をワイヤレスで制御できるWebアプリが含まれています。それでは、簡単なRaspberryPiホームオートメーション実験を始めましょう。







必要なもの

Raspberry Piをヘッドレスで(SSHまたはVNC経由で)使用する場合は、次のものが必要になります。



1)Raspberry Pi3またはRaspberryPi4。
2)5Vリレースイッチ。
3)電線。
4)3本のメス-メス接続線。
5)AC電球。
6)AC電球ホルダー。
7)ACプラグ。
8)ワイヤーカッターとストリッパーツール。
9)CR-V3ドライバー。
10)Micro-USB(Raspberry Pi 3)またはUSB Type-C(Raspberry Pi 4)電源アダプター。
11)Raspberry PiOSがフラッシュされた16GBまたは32GBのmicroSDカード。
12)RaspberryPiのネットワーク接続。
13)RaspberryPiへのVNCリモートデスクトップアクセスまたはSSHアクセス用のラップトップまたはデスクトップコンピューター。



SSHまたはVNCを介してリモートでRaspberryPiにアクセスしたくない場合は、以下も必要になります。





14)モニター。
15)HDMIまたはマイクロHDMIケーブル。
16)キーボード。
17)マウス。

Raspberry Pi OSイメージをmicroSDカードにフラッシュする方法についてサポートが必要な場合は、Raspberry PiImagerをインストールして使用する方法の記事を確認してください。



Raspberry Piの初心者で、RaspberryPiにRaspberryPi OSをインストールする際のサポートが必要な場合は、記事を確認してください。 Raspberry Pi4にRaspberryPiOSをインストールする方法。

また、Raspberry Piのヘッドレスセットアップについてサポートが必要な場合は、外部モニターなしでRaspberry Pi4にRaspberryPiOSをインストールして構成する方法の記事を確認してください。

必要なすべてのツールの画像を以下に示します。

ラズベリーパイの電源を入れる

次に、電源ケーブルをRaspberry Piに接続し、RaspberryPiの電源を入れます。

Raspberry Piの電源がオンになると、VNCまたはSSHを介してRaspberryPiに接続できます。または、キーボード、マウス、モニターをRaspberry Piに接続して、直接アクセスすることもできます。

5Vリレーのピン配列

リレーは基本的にスイッチです。ただし、従来のスイッチとは異なり、リレーは少量のDC電圧で制御できます。

5Vリレーは非常に使いやすいです。リレーの状態に応じて、一方の側は低電圧DC(Raspberry Piから)を介してリレーを制御するために使用され、もう一方の側は高電圧AC(つまり電球)を制御するために使用されます。 。


片側には、リレーに2つのLED(1つは赤と1つは緑)と3つのピン(1つは赤と1つは緑)があります。 IN、GND、VCC )。これらの3つのピンは、RaspberryPiからのリレーを制御するために使用されます。

反対側の最初の2つのピンは、AC家電を制御するために使用されます。

5VリレーをRaspberryPiに接続する

5VリレーをRaspberryPiに接続するには、3本のメス間接続ワイヤが必要です。

接続線の片側をに接続します (黄色のワイヤー)、 GND (黒線)、および VCC 以下に示すように、5Vリレーの(赤い線)ピン。


下の画像に示すように、ワイヤーの反対側はRaspberryPiのGPIOヘッダーピンに入ります。

赤いワイヤーはに入る必要があります PIN 2(VCC) ラズベリーパイの。
黒いワイヤーは ピン6(GND) ラズベリーパイの。
黄色のワイヤーは PIN 7(GPIO 4) ラズベリーパイの。


5VリレーをRaspberryPiに接続すると、次の画像のようになります。

ログインユーザーへのGPIOアクセスの許可

GPIOピンへのアクセスを許可するために、Raspberry PiOSのデフォルトのログインユーザー 円周率 に追加する必要があります gpio グループ。

あなたは追加することができます 円周率 ユーザーに gpio 次のコマンドでグループ化します。

$sudousermod-aGgpio $((私は誰)。


変更を有効にするには、次のコマンドを使用してRaspberryPiを再起動します。

$sudoリブート

プロジェクトディレクトリの作成

すべてのプロジェクトファイルを整理しておくこともお勧めします。

プロジェクトファイルを整理するには、プロジェクトディレクトリを作成します 〜/ www 次のコマンドを使用して、必要なサブディレクトリを作成します。

$mkdir -pv/www/{{テンプレート、静的}


プロジェクトディレクトリが作成されたら、次のようにプロジェクトディレクトリに移動します。

$CD/www

RaspberryPiから5Vリレーを切り替える

5VリレーをRaspberryPiに接続したので、Pythonプログラミング言語を使用してリレーをRaspberryPiから切り替えます。

注:切り替え エレクトロニクスで使用される用語です。切り替えとは、特定の電子機器を制御(つまり、電源のオン/オフ)することを意味します。

Pythonプログラミング言語を使用してリレーを切り替える実験を行うには、次のようにプロジェクトディレクトリに新しいPythonスクリプトtest.pyを作成します。

$ナノtest.py


test.pyPythonスクリプトに次のコード行を入力します。

からgpiozero輸入導いた
から 時間 輸入寝る

その間 NS
リレー=導いた((4)。
印刷((「リレー:オン」)。
寝る((5)。

リレー。選ぶ(()。
印刷((「リレー:オフ」)。
寝る((5)。

完了したら、を押します + X に続く 保存するには test.py Pythonスクリプト。


ここで、1行目はインポートします 導いた から gpiozero ライブラリ、および2行目は 寝る からの機能 時間 図書館。


6〜14行目は無限ループ内にあります。


6行目はLEDを初期化します GPIO 4 に接続されているラズベリーパイの リレーのピン。


ライン8は、を使用してリレーをオンにします。 オン() 方法。

9行目は、を使用してコンソールにメッセージを出力します。 print() 関数。

10行目では、次のコード行の実行を5秒間遅らせます。 寝る() 関数。


ライン12は、を使用してリレーをオフにします。 選ぶ() 方法。

同様に、9行目では、 print() 関数と10行目は、次のコード行の実行を5秒間遅らせます。 寝る() 関数。


次に、を実行します test.py 次のようなPythonスクリプト:

$python3 test.py


NS test.py Pythonスクリプトは、5Vリレーの切り替えを開始する必要があります。 5秒ごとにカチッという音が聞こえます。リレーが状態を切り替えると(オンからオフ、またはオフからオン)、カチッという音がします。これは、リレーが正しく機能していることを意味します。


リレーがオフ状態(通常動作– AC負荷が切断されている)の場合、 ネット 下の画像にあるように、LEDが点灯するはずです。


リレーがオン状態(AC負荷が接続されている)の場合、 LEDと NS ネット 下の画像にあるように、LEDが点灯するはずです。


テストが完了したら、を押します + C を終了するには test.py 脚本。

AC電球を5Vリレーに接続する

これで、5Vリレーが正しく機能するはずです。次に、AC家電(この場合は電球)を5Vリレーに接続します。

まず、電球に接続されている黒い電線をワイヤーカッターで切断します。


電球に接続されている黒い電線をワイヤーカッターで切断すると、下の画像のようになります。


次に、下の画像に示すように、外層を剥がして電線の約½インチを露出させます。


次に、下の画像に示すように、露出したワイヤーを折ります。


CV-3ドライバーでリレーのマークされたネジを緩めます。


前に剥がして折りたたんだ露出したワイヤを2つのネジ留め式端子に挿入し、CV-3ドライバーでネジを締めます。

AC負荷を接続した後のリレースイッチングのテスト

AC負荷が5Vリレーに接続されたら、電球プラグを壁のコンセントに接続します。


を実行します test.py 次のようにプロジェクトディレクトリからのPythonスクリプト:

$python3 test.py


NS test.py Pythonスクリプトは5Vリレーの切り替えを開始する必要があります。これにより、高電圧AC電球が5秒間隔で切り替えられます。 AC電球は、5秒間オンのままにしてから、5秒間オフのままにする必要があります。

下の画像では電球がオフになっています。


下の画像では電球が点灯しています。


ご覧のとおり、Pythonプログラミング言語を使用して、リレーを切り替え、高電圧AC電球を制御できます。だから、を押します + C を終了するには test.py 脚本。

次のセクションに移りましょう。

ホームオートメーションWebアプリの作成

このセクションでは、Pythonプログラミング言語を使用してAPIベースのWebアプリを作成する方法を紹介します。 Webアプリを使用して、Webブラウザーからリレーおよびリレーに接続されているAC家電製品または電気機器を制御できます。

ノート: このセクションに示されているすべてのコードは、私のGitHubリポジトリで入手できます。 shovon8 /ラズベリー-pi-ホームオートメーション 。必要に応じて、GitHubリポジトリのクローンを作成し、すべてのコードをスキップできます。

次のように、プロジェクトディレクトリにserver.pyPythonスクリプトを作成します。

$ナノserver.py


次のコード行を server.py Pythonスクリプト。

からフラスコ輸入フラスコjsonifyurl_forrender_template
からgpiozero輸入導いた
からuuid輸入uuid4
部屋= {{}
部屋[「ルーム1」] = [{{
'id':uuid4(()。
'名前'「ライト1」
'アイコン'「fafa-lightbulb」
'状態'NS
'relayPin'4
'relayInstance'NS
} {{
'id':uuid4(()。
'名前'「ファン1」
'アイコン'「ファファファン」
'状態'NS
'relayPin'6
'relayInstance'NS
}]
部屋[「バスルーム1」] = [{{
'id':uuid4(()。
'名前'「ライト1」
'アイコン'「fafa-lightbulb」
'状態'NS
'relayPin'5
'relayInstance'NS
}]
アプリ=フラスコ((__名前__)。
アプリ。設定['SEND_FILE_MAX_AGE_DEFAULT'] = 0
@アプリ。ルート(('/')。
def(()。
戻るrender_template(('./index.html'部屋=部屋)。
deftoken_appliance_status((id)。
にとって部屋部屋:
にとってアプライアンス部屋[部屋]
もしも NS((アプライアンス['id'])。 == id
もしもアプライアンス['relayInstance']
アプライアンス['relayInstance']選ぶ(()。
アプライアンス['relayInstance'] = NS
そうしないと
アプライアンス['relayInstance'] =導いた((アプライアンス['relayPin'])。
アプライアンス['relayInstance']オン(()。
アプライアンス['状態'] = いいえアプライアンス['状態']
戻る NS
戻る NS
@アプリ。ルート((「/アプライアンス/トグル/」)。
defAppliance_toggle((id)。
戻るjsonify(({{'状態':toggle_appliance_status((id)。})。

完了したら、を押します + X に続く 保存するには server.py Pythonスクリプト。


ここで、1〜3行目は、それぞれのライブラリから必要なすべてのコンポーネントをインポートします。


5行目は空を作成します 部屋 辞書。この辞書には、Webアプリから制御するすべてのACアプライアンスの詳細が格納されます。


NS 部屋 詳細は7〜29行目に保存されています。


ある部屋のデータ構造について説明しましょう。

ここでは、部屋の名前は 部屋1。 そう、 ルーム1 の鍵は 部屋 辞書。


NS ルーム1 キーは値として配列を保持します。配列要素の数は、その部屋にあるAC家電の数と同じであり、Webアプリからも制御する必要があります。この場合、制御したい2つのAC家電があります。 ライト1ファン1


各家電製品の定義には、 id 。 NS id ランダムに生成されたUUIDです。これは、APIを使用して制御する部屋を識別するために使用されます。

家電製品には、次のすべてがあります。

  • 名前(ライト1 この場合)
  • アイコン (アイコンにFont Awesomeを使用するため、Font Awesomeアイコンクラス)
  • ステータス(True もしも オンNS もしも オフ )。
  • リレーピン (AC家電に接続されたリレーを制御するために使用されるGPIOピン番号)
  • RelayInstance (初期化された 導いた のオブジェクト gpiozero それぞれのGPIOピンの制御を担当するライブラリ– リレーピン )。


31行目は、flask PythonWebサーバーを初期化します。

行32は、フラスコWebサーバーを構成します。


34〜36行目は index.html からのファイル テンプレート/ ホームオートメーションWebアプリにアクセスしたときのディレクトリ。

フラスコの用途 Jinja2 をレンダリングするためのテンプレート言語 index.html ファイル。だから、私は合格しました 部屋 辞書に index.html ファイル。 Jinja2 を使用してホームページをレンダリングします 部屋 データ。


関数 token_appliance_status() 39〜52行目は、家電製品がオフの場合はオンにし、オンの場合はアプライアンスのを使用してオフにするために使用されます。 id

戻ります NS トグル操作が成功した場合。エラーがある場合は、 NS


55〜57行目は、 /アプライアンス/トグル/ WebサーバーのAPIエンドポイント。ここ、 id は家電のIDです。


を作成します index.html のファイル テンプレート/ 次のようにプロジェクトのディレクトリ:

$ナノテンプレート/index.html

次のコード行を index.html 脚本。


< html lang='オン'>>
< >>
< メタ 文字コード=「UTF-8」>>
< メタ 名前=「ビューポート」 コンテンツ='width = device-width、initial-scale = 1.0'>>
< リンク rel=「スタイルシート」 href='{{url_for(' static '、filename =' fontawesome / css / all.min.css ')}}'>>
< リンク rel=「スタイルシート」 href='{{url_for(' static '、filename =' style.css ')}}'>>
< 題名 >>RaspberryPiによるホームオートメーション</ 題名 >>
</ >>
< >>
< div id='コンテンツ'>>
< h1 >>ラズベリーパイホームオートメーション</ h1 >>

{部屋の部屋の%%}
< div クラス='部屋'>>
< h2 >>{{ 部屋 }}</ h2 >>
< div クラス=「アプライアンス」>>
{部屋の電化製品の%[部屋]%}
< div クラス=「アプライアンス」 id='{{アプライアンス[' id ']}}'> ='アクティブ'>>
< クラス='{{アプライアンス['アイコン ']}}'>></ >>
< スパン >>{{アプライアンス['名前']}}</ スパン >>
</ div >>
{%endfor%}
</ div >>
</ div >>
{%endfor%}

</ div >>

< 脚本 src='{{url_for(' static '、filename =' app.js ')}}' タイプ='text / javascript'>></ 脚本 >>
</ >>
</ html >>

完了したら、を押します + X に続く 保存するには index.html ファイル。


を作成します style.css のファイル 静的/ 次のようにプロジェクトのディレクトリ:

$ナノ静的/style.css


次のコード行を style.css ファイル。

@輸入 URL(('https://fonts.googleapis.com/css2?family=BenchNine:[メール保護]; 400; 700&display = swap')。;

* {{
マージン 0;
パディング 0;
フォントファミリー 「ベンチナイン」 サンセリフ;
}

コンテンツ >>h1{{
バックグラウンド線形グラデーション(( rgb((112 24 163)。 rgb((86 127 240)。)。;
#fff;
text-align 中心;
パディング .5em 0;
}

div。部屋 {{
マージン .5em;
国境 2px 個体 rgb((112 24 163)。;
ボーダー半径 5px;
}

div。部屋h2{{
/ *背景:rgb(9、76、121); * /
バックグラウンド線形グラデーション(( rgb((112 24 163)。 rgb((86 127 240)。)。;
パディング 0 0 0 .5em;
#fff;
}

div.appliances {{
マージン .5em .5em 0 0;
画面フレックス;
フレックスラップ包む;
}

div.appliance {{
国境 2px 個体 rgb((112 24 163)。;
ボーダー半径 5px;
110px;
身長 120px;
text-align 中心;
マージン 0 0 .5em .5em;
画面フレックス;
フレックス方向;
}

div.appliance.fa {{
フォントサイズ 4em;
フレックスグロー 1;
パディングトップ 0.3em;
rgb((204 50 50)。;
}

div.appliance[データアクティブ='アクティブ'].fa {{
rgb((32 177 51)。;
}

div.applianceスパン{{
画面 ブロック;
フォントの太さ 大胆な;
バックグラウンド rgb((112 24 163)。;
#fff;
}

完了したら、を押します + X に続く 保存するには style.css ファイル。


を作成します app.js のファイル 静的/ 次のようにプロジェクトのディレクトリ:

$ナノ静的/app.js


次のコード行を app.js ファイル。

窓。addEventListener(('ロード'主要)。;

関数主要(()。 {{
関数tokenApplianceState(()。 {{
どこid=と。[1]id;

どこhttp= 新着XMLHttpRequest(()。;

http。onreadystatechange = 関数(()。 {{
もしも((これreadyState === 4 && これ状態 === 200)。 {{
もしも((JSON。解析する((これresponseText)。状態 === NS)。 {{
もしも((と。[1]hasAttribute((「データアクティブ」)。)。 {{
と。[1]removeAttribute((「データアクティブ」)。
} そうしないと {{
と。[1]setAttribute((「データアクティブ」 'アクティブ')。
}
}
}
}

http。開いた(('得る'/アプライアンス/トグル/${{id} NS)。;
http。送信(()。;
}


どこ電化製品=資料。getElementsByClassName((「アプライアンス」)。;
にとって((=0;<電化製品。長さ;++)。 {{
電化製品[]addEventListener(('クリック'tokenApplianceState)。;
}
}

完了したら、を押します + X に続く と保存するには app.js ファイル。


ここで、1行目は 主要() Webページの読み込みが完了すると機能します。

の中に index.html ファイル、各家電製品はで囲まれています アプライアンス クラス。 26〜29行目は、Webページから各家電製品を選択して添付するために使用されます。 クリック アプライアンスへのイベント。誰かがウェブページから家電製品をクリックすると、 tokenApplianceState() 関数が実行されます。


4〜23行目では、 tokenApplianceState() 関数は、を要求するために使用されます /アプライアンス/トグル/ クリックされた家電製品の状態を変更するためのWebサーバーのエンドポイント。リクエストはAJAXを介してバックグラウンドで行われます。応答を受信すると、それに応じてWebページが更新されます。


に移動します 静的/ 次のようにプロジェクトディレクトリ内のディレクトリ:

$CD静的/


次のコマンドでFontAwesomeをダウンロードします。

$wgethttps://use.fontawesome.com/リリース/v5.15.1/fontawesome-free-5.15.1-web.zip


Font Awesomeがダウンロードされると、新しいzipファイルが見つかります。 fontawesome-free-5.15.1-web.zip の中に 静的/ ディレクトリ。

$ls -lh


解凍します fontawesome-free-5.15.1-web.zip 次のコマンドでファイルします。

$解凍fontawesome-free-5.15.1-web.zip


NS fontawesome-free-5.15.1-web.zip これでファイルが解凍されます。


新しいディレクトリ fontawesome-free-5.15.1-web / 以下のスクリーンショットにあるように、static /ディレクトリに作成する必要があります。

$ls -lh

ディレクトリの名前を変更します fontawesome-free-5.15.1-web /fontawesome / 次のコマンドを使用します。

$mv -vfontawesome-無料-5.15.1-webfontawesome


今、あなたはもう必要ありません fontawesome-free-5.15.1-web.zip ファイル。だから、削除します fontawesome-free-5.15.1-web.zip 次のコマンドでファイルします。

$rm -vfontawesome-free-5.15.1-web.zip


NS 静的/ ディレクトリ構造は、以下のスクリーンショットに示すようになります。

$ls -lh


プロジェクトディレクトリに戻ります 〜/ www 次のように:

$CD..

ホームオートメーションWebアプリのテスト

ホームオートメーションWebアプリをテストするには、プロジェクトディレクトリで次のコマンドを実行します。

$FLASK_APP= server.pyフラスコ実行


Webアプリは、RaspberryPiのポート5000で利用できるはずです。


Chromium Webブラウザーから、次のWebサイトにアクセスします。 http:// localhost:5000 。ホームオートメーションWebアプリが読み込まれるはずです。

下の画像に示されている電球アイコンをクリックします。


これで、AC電球がオンになります。アイコンの色も緑色に変わり、電球がオンになっていることを示します。


そのため、ホームオートメーションWebアプリは機能しています。押す + C Webサーバーを終了します。

ホームオートメーションWebアプリのSystemdサービスの作成

このセクションでは、ホームオートメーションWebアプリのsystemdサービスファイルを作成して、起動時に自動的に起動するようにする方法を説明します。

まず、を作成します raspi-home-automation.service 次のようにプロジェクトディレクトリにファイルします。

$ナノraspi-home-automation.service

raspi-home-automation.serviceファイルに次の行を入力します。

[単位]
説明=ラズベリーパイホームオートメーションWebサービス
= network.target
[サービス]
WorkingDirectory=//円周率/www
環境=FLASK_APP= server.py
環境=FLASK_ENV=生産
ExecStart=/usr/午前/フラスコラン - ホスト= 0.0.0.0
StandardOutput=継承
StandardError=継承
再起動=常に
ユーザー=円周率
[インストール]
WantedBy= multi-user.target

完了したら、を押します + X に続く と保存するには raspi-home-automation.service ファイル。


をコピーします raspi-home-automation.service ファイルに / etc / systemd / system / 次のコマンドを使用してディレクトリを作成します。

$sudo cp -vraspi-home-automation.service/NS/システム/システム/


次のように変更を有効にするために、systemdデーモンをリロードします。

$sudosystemctlデーモン-リロード


追加します raspi-ホームオートメーション 次のコマンドを使用して、Raspberry PiOSのシステム起動にサービスを提供します。

$sudosystemctl有効raspi-home-automation.service


次のコマンドでRaspberryPiを再起動します。

$sudoリブート


Raspberry Piが起動すると、 raspi-ホームオートメーション 以下のスクリーンショットに示されているように、サービスはアクティブ/実行中である必要があります。

$sudosystemctl status raspi-home-automation.service

他のデバイスからホームオートメーションWebアプリにアクセスする

ホームネットワーク内の他のデバイスからホームオートメーションWebアプリにアクセスするには、RaspberryPiデバイスのIPアドレスを知っている必要があります。

Raspberry Pi 4デバイスのIPアドレスは、ホームルーターのWeb管理インターフェイスから見つけることができます。私の場合、IPアドレスは192.168.0.103です。これはあなたにとって異なります。ですから、これからは必ず私のIPをあなたのIPに置き換えてください。


Raspberry Piコンソールにアクセスできる場合は、次のコマンドを実行してIPアドレスを見つけることもできます。

$ホスト名 -私


Raspberry PiデバイスのIPアドレスがわかれば、ホームネットワーク内の任意のデバイスからアクセスできます。

下のスクリーンショットでわかるように、AndroidスマートフォンからホームオートメーションWebアプリにアクセスしました。


電球のプラグは必ず壁の電源コンセントに差し込んでください。


電球はデフォルトでオフになっているはずです。


ホームオートメーションWebアプリから電球アイコンをタップすると、電球アイコンの色が緑色に変わり、電球がオンになっていることを示します。


下の画像でわかるように、電球がオンになっています。

結論

この記事では、5Vリレーを使用して、Pythonプログラミング言語を使用してRaspberryPiから高電圧AC電気機器を制御する方法を説明しました。この記事では、APIベースのPythonフラスコWebアプリを作成して、Webブラウザーからリレーを制御する方法も示しました。この記事は、RaspberryPiを使用したホームオートメーションの開始に役立つはずです。