- 投稿日:2021-01-12T18:38:16+09:00
ラズパイを使ってSwitchBotをWebUIから操作する
1. やったこと
SwitchBotを買いました。
スマホアプリから物理スイッチを押してくれる、Home IoTには欠かせないパーツです!
Hubを買ってもいいけど、ラズパイがあるのならばせっかくならラズパイから操作したい。
そして、WebUIを出して家の中からスマホで操作できるようにした。
というわけで、やってみました。2. 必要なもの
- SwitchBot Amazonで購入。キャンペーン期間中でちょっと安くなっていました(3,150円)
- Raspberry Pi。我が家のは3
- Python3 (インストールしておいてください)
3. 手順
3-1. ラズパイのコマンドラインからSwitchBotを操作する
公式のライブラリがあるので、ほぼそれを使うだけです。
自分は以下のページを参考にさせていただきました。Raspberry Pi + SwitchBotで風呂を沸かす
軽く手順を書いておきます
3-1-1. Pythonの確認
※この通りのバージョンでなくても大丈夫
$ python --version Python 2.7.16 $ python3 --version Python 3.7.33-1-2. OpenWonderLabs/python-hostのクローン
$ mkdir switchbot $ cd switchbot $ git clone https://github.com/OpenWonderLabs/python-host.git3-1-3. 各種ツールのインストール
gattlibのインストールで躓くことがあるようです。
風呂を沸かすのページに解決方法も書いてあります。
自分は大丈夫、友人は引っかかった。$ sudo apt-get install python3-pip libboost-python-dev libboost-thread-dev $ sudo apt-get install libbluetooth-dev # READMEにはないがこれも必要 $ sudo pip3 install pybluez $ sudo pip3 install gattlib3-1-4. SwitchBotを探す
python-host付属のツールで探します
XX:XX:XX:XX:XX:XX
の部分にあなたのSwitchBotのBLE MACが入ります。メモしておきましょう。$ sudo python3 switchbot_py3.py --scan Scanning for bluetooth low-energy devices Discovering Switchbot services * Found Switchbot service on device XX:XX:XX:XX:XX:XX handle 22 Found 1 devices: ['XX:XX:XX:XX:XX:XX'] Enter the number of the device you want to control: 0 XX:XX:XX:XX:XX:XX 0 Connected! Command execution successful3-1-5. SwitchBotでボタンを押す
XX:XX:XX:XX:XX:XX
の部分にメモったBLE MACを入れましょう。$ sudo python3 switchbot_py3.py --device XX:XX:XX:XX:XX:XX Press Connected! Command execution successfulお、動いた!
3-2. WebUIを作る
node.js + express でさくっと作ります。
まずは Hello World を出してみましょう。3-2-1. node.js/npmのインストール
すでにインストールしてあればこの作業は不要です
sudo apt-get update sudo apt-get install -y nodejs npm sudo npm cache clean sudo npm install n -g sudo -E n stable sudo ln -sf /usr/local/bin/node /usr/bin/node sudo apt-get purge -y nodejs npm sudo apt -y autoremove sudo npm install require3-2-2. フロントエンドを作る
コマンド一発
pi@raspberrypi:~/switchbot/frontend $ npm init -y Wrote to /home/pi/switchbot/frontend/package.json: { "name": "frontend", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" } pi@raspberrypi:~/switchbot/frontend $ ls package.json3-2-3. npmモジュールのインストール
expressをインストールします
$ npm install express --save npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN frontend@1.0.0 No description npm WARN frontend@1.0.0 No repository field. + express@4.17.1 added 50 packages from 37 contributors and audited 50 packages in 48.932s found 0 vulnerabilities3-2-4. app.jsとindex.htmlでHello World (静的ルーティング)
ここのページを参考にしました。
Node.jsとExpressでローカルサーバーを構築する(2) ―Expressでルーティング―$ mkdir public $ cd public $ vi index.html※index.htmlの内容です
<!DOCTYPE html> <html> <head> <title>test</title> </head> <body> <h1>Hello World!</h1> </body> </html>$ cd .. $ vi app.js/** * /app.js */ const express = require('express') const app = express(); const path = require('path') const port = 10888; app.listen(port, () => { console.log('Running at ' + port + '...'); }); app.use(express.static(path.join(__dirname, 'public'))); app.use((req, res) => { res.sendStatus(404); });3-2-5. サーバー起動 (Hello World)
$ node app.jsブラウザから localhost:8889 にアクセス
スマホを家のLANにWi-Fi接続して、スマホのブラウザから接続できればOK!※恒久的起動
$ nohup node app.js &殺し方
$ ps aux | grep node pi 1105 0.0 3.9 150324 35644 ? Sl 12:43 0:01 node app.js $ kill 11053-3. SwitchBotとつなぐ
これはもう
app.js
とindex.html
を見てもらったほうが早いかと
execで 3-1-5 のコマンドを実行しているだけです。/** * /app.js */ const express = require('express'); const app = express(); const path = require('path'); + const exec = require('child_process').exec; app.listen(8889, () => { console.log('Running at 8889...'); }); // static page (top page) app.use('/', express.static(path.join(__dirname, 'public'))); // press (これを追加) app.get('/press', (req, res) => { exec('sudo python3 /home/pi/switchbot/python-host/switchbot_py3.py --device XX:XX:XX:XX:XX:XX Press', (err, stdout, stderr) => { if (err) { res.write(err); } res.end(stdout); }); }); // not found app.use((req, res) => { res.sendStatus(404); });<!DOCTYPE html> <html> <head> <title>Switchbot</title> </head> <body> <h1>Switchbot</h1> <a href='press'>スイッチを押す</a><br> </body> </html>これでラズパイからSwitchBotを動かせました!
これで何でもできるぞ~
Home IoTの第一歩です。EOF
- 投稿日:2021-01-12T18:38:16+09:00
ラズパイを使ってWebUIからSwitchBotを操作する
1. やったこと
SwitchBotを買いました。
スマホアプリから物理スイッチを押してくれる、Home IoTには欠かせないパーツです!
Hubを買ってもいいけど、ラズパイがあるのだからせっかくならラズパイから操作したい。
そして、WebUIを出して家の中からスマホで操作できるようにしたい。
というわけで、やってみました。2. 必要なもの
- SwitchBot Amazonで購入。キャンペーン期間中でちょっと安くなっていました(3,180円)
- Raspberry Pi。我が家のは3B
- Python3 (もし入っていなかったらインストールしておいてください。参考)
3. 手順
3-1. ラズパイのコマンドラインからSwitchBotを操作する
公式のライブラリがあるので、それを使うだけです。
自分は以下のページを参考にさせていただきました。Raspberry Pi + SwitchBotで風呂を沸かす
軽く手順を書いておきます
3-1-1. Pythonの確認
※この通りのバージョンでなくても大丈夫
$ python --version Python 2.7.16 $ python3 --version Python 3.7.33-1-2. OpenWonderLabs/python-hostのクローン
$ mkdir switchbot $ cd switchbot $ git clone https://github.com/OpenWonderLabs/python-host.git3-1-3. 各種ツールのインストール
gattlibのインストールで躓くことがあるようです。
風呂を沸かすのページに解決方法も書いてあります。
自分は大丈夫、友人は引っかかった。$ sudo apt-get install python3-pip libboost-python-dev libboost-thread-dev $ sudo apt-get install libbluetooth-dev # READMEにはないがこれも必要 $ sudo pip3 install pybluez $ sudo pip3 install gattlib3-1-4. SwitchBotを探す
python-host付属のツール
switchbot_py3.py
で探します
XX:XX:XX:XX:XX:XX
の部分にあなたのSwitchBotのBLE MACが入ります。メモしておきましょう。$ sudo python3 switchbot_py3.py --scan Scanning for bluetooth low-energy devices Discovering Switchbot services * Found Switchbot service on device XX:XX:XX:XX:XX:XX handle 22 Found 1 devices: ['XX:XX:XX:XX:XX:XX'] Enter the number of the device you want to control: 0 XX:XX:XX:XX:XX:XX 0 Connected! Command execution successful3-1-5. SwitchBotでボタンを押す
XX:XX:XX:XX:XX:XX
の部分にメモったBLE MACを入れましょう。$ sudo python3 switchbot_py3.py --device XX:XX:XX:XX:XX:XX Press Connected! Command execution successfulお、動いた!
3-2. WebUIを作る
node.js + express でさくっと作ります。
まずは Hello World を出してみましょう。3-2-1. node.js/npmのインストール
すでにインストールしてあればこの作業は不要です
sudo apt-get update sudo apt-get install -y nodejs npm sudo npm cache clean sudo npm install n -g sudo -E n stable sudo ln -sf /usr/local/bin/node /usr/bin/node sudo apt-get purge -y nodejs npm sudo apt -y autoremove sudo npm install require3-2-2. フロントエンドを作る
コマンド一発
pi@raspberrypi:~/switchbot/frontend $ npm init -y Wrote to /home/pi/switchbot/frontend/package.json: { "name": "frontend", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" } pi@raspberrypi:~/switchbot/frontend $ ls package.json3-2-3. npmモジュールのインストール
expressをインストールします
$ npm install express --save npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN frontend@1.0.0 No description npm WARN frontend@1.0.0 No repository field. + express@4.17.1 added 50 packages from 37 contributors and audited 50 packages in 48.932s found 0 vulnerabilities3-2-4. app.jsとindex.htmlでHello World (静的ルーティング)
ここのページを参考にしました。
Node.jsとExpressでローカルサーバーを構築する(2) ―Expressでルーティング―$ mkdir public $ cd public $ vi index.html※index.htmlの内容です
<!DOCTYPE html> <html> <head> <title>test</title> </head> <body> <h1>Hello World!</h1> </body> </html>$ cd .. $ vi app.js※app.jsの内容です
/** * /app.js */ const express = require('express') const app = express(); const path = require('path') const port = 8889; app.listen(port, () => { console.log('Running at ' + port + '...'); }); app.use(express.static(path.join(__dirname, 'public'))); app.use((req, res) => { res.sendStatus(404); });3-2-5. サーバー起動 (Hello World)
$ node app.jsブラウザから localhost:8889 にアクセス
スマホを家のLANにWi-Fi接続して、スマホのブラウザから接続できればOK!恒久的に起動するときは
nohup
を利用します。$ nohup node app.js &止めたいときは
ps
でプロセスを探してkill
で止めます$ ps aux | grep node pi 1105 0.0 3.9 150324 35644 ? Sl 12:43 0:01 node app.js $ kill 11053-3. SwitchBotとつなぐ
これはもう
app.js
とindex.html
を見てもらったほうが早いかと
execで 3-1-5 のコマンドを実行しているだけです。/** * /app.js */ const express = require('express'); const app = express(); const path = require('path'); const exec = require('child_process').exec; const port = 8889; app.listen(port, () => { console.log('Running at ' + port + '...'); }); // static page (top page) app.use('/', express.static(path.join(__dirname, 'public'))); // press (これを追加) app.get('/press', (req, res) => { exec('sudo python3 /home/pi/switchbot/python-host/switchbot_py3.py --device XX:XX:XX:XX:XX:XX Press', (err, stdout, stderr) => { if (err) { res.write(err); } res.end(stdout); }); }); // not found app.use((req, res) => { res.sendStatus(404); });<!DOCTYPE html> <html> <head> <title>Switchbot</title> </head> <body> <h1>Switchbot</h1> <a href='press'>スイッチを押す</a><br> </body> </html>ラズパイからSwitchBotを動かせました!
これで何でもできるぞ~
Home IoTの第一歩です。EOF
- 投稿日:2021-01-12T16:43:30+09:00
Node.jsをインストールする
何?Node.jsって?
Node.js はスケーラブルなネットワークアプリケーションを構築するために設計された非同期型のイベント駆動の JavaScript 環境です。
Node.js とは | Node.jsWindowsにインストールする
- 環境 : Windows10 Pro バージョン1909
- Node.jsのダウンロードページを表示してインストーラをダウンロードする
- 古めのバージョンは、リリース一覧 | Node.jsから探してダウンロード
- 今回は古めの
node-v10.23.1-x64.msi
をダウンロード- インストーラを起動して[Next]ボタンでどんどん進んで[Install]ボタンでインストールする
- バージョンを確認する
バージョンを確認する# インストーラが自動でパスを通してくれているのでnodeやnpmコマンドが使えるようになっている $ printenv PATH | sed -e 's/:/:\n/g' | grep -i node /c/apps/nodejs: $ node -v v10.23.1 $ npm -v 6.14.10 $ npm bin -g C:\Users\ponsuke\AppData\Roaming\npm
- 投稿日:2021-01-12T12:22:29+09:00
Raspberry pi4へNode.jsのインストール手順
npm init -yでエラーが出る、、、
LINEBOTを作成してみようと思い、常時稼働させられるラズパイにNode.jsのインストールを試みた。
その中で初歩的な内容だが、インストール時にまとまってあれば嬉しかったなぁと思う気持ちで備忘録として残す。そもそものNode.jsのインストールしようと思った流れは、
npmはインストールされていたが、npm init -yでエラーが出る、、、
Node.jsが適切にインストールされていないようだな、うん。では、手順の説明です。
npmのアップデート
npmが入っていないときは以下のコードをターミナルにて実行。
$ sudo apt-get npm次に、アップデート後に変化を確認するためにnpmのバージョンを確認。
以下のようにバージョンが出力されるのを確認する。$ npm -v 6.14.10さいごに、npmのアップデートを行う。
$ sudo npm update npmこれでnpmのアップデートは完了する。
次にNode.jsのインストールに移る。
Node.jsをインストールするためのバージョン管理ツールnを使った方法もあるようだが、自分はここで詰まって面倒になり諦めた。詰まった内容としては、
- そもそもnがなかった(入れはしました)
- Node.js と npmに決まった対応があり、その設定がnでは死ぬほど面倒だった(決定的理由)
実際のバージョンの対応はNode.jsとnpmの対応表を参考にしてください。
なので、Node.jsのインストールとnpmとのバージョン対応を同時に行ってくれるnodebrewを使用する。
nodebrewのインストール
nodebrewのインストールには以下のコードを実行してください。
$ curl -L git.io/nodebrew | perl – setupここで、私のラズパイではあるローカルフォルダへアクセス許可がありませんとエラーが出てしまいました。
同じような場合には、#777は「所有者」「所有グループ」「その他」に読み書き実行を許可します $ chmod 777 エラーが起きている箇所で解決できます。
その他にまで読み書き実行を許可しているので気をつけてください。
権限付与に関してはこちらの記事で確認できます。次にPATHを通します。
#パスを通す、任意のエディタで開きます(ここではvi) $ vi ~/.bash_profile任意のエディタで開いたら
export PATH=$HOME/.nodebrew/current/bin:$PATH
と入力して保存してください。
viの操作コマンドはこちらを参考にされると良いかと思います。ちゃんとインストールできたかを確認します。
nodebrew -vいろいろ出ますが、nodebrew 1.0.1 のように出ればOKです。
Node.jsインストールとnpmとのバージョン対応付け
最後に、Node.jsをインストールし、対応付けます。
#バージョンは偶数番目が安定しているようです。 nodebrew install 任意のバージョン #使用するNode.jsバージョンを選択。同時にnpmの対応も行われる。 nodebrew use 任意のバージョンInstalled successfullyと出れば終了です。
ここまで設定することで、npm init -y もエラーなく動作しました。