NatureRemoとSynologyNAS DS216jを利用して、1時間に1回センサーデータ(温度・湿度・照度・人感)をグーグルのスプレッドシートに保存する仕組みを構築しました。この記事では、その方法を紹介します。
スマートリモコンのNature Remoは、家電をweb経由でコントロールできるだけではなく、温度・湿度・照度・人感センサーを利用してそれらの値に基づいた家電操作もできます。そして、これらのセンサーの値は、Nature Remo Cloud API経由で取得することもできます。
また、SynologyNASは単なるNASではなく、LinuxベースのOSであるDSMが動いていることもあり、webサーバやdockerやプログラムの実行など様々なことができます。今回は、NatureRemoのセンサーデータを取得してグーグルスプレッドシートに値を記録するpythonプログラムをSynologNASで定期実行します。
構築手順は下記の通りです。それぞれの項目についてまとめていきます。
- GoogleSheetsAPIの有効化
- プログラムの作成
- Synology NASでプログラムの定期実行の設定
Google Sheets APIの有効化
GoogleCloudPlatformにアクセスし、GoogleDriveAPIとGoogleSheetsAPIを有効化し、アクセスキー等が記述されたJSONファイルをダウンロードします。ここで取得したJSONファイルは後に作成するプログラムで利用します。また、JSONファイル内のメールアドレスは、センサーデータの出力先のスプレッドシートとの共有設定にも利用します。
具体的な設定方法ですが、公式ドキュメントや他のサイトで画像付きで説明されています。そちらの方がわかりやすいので、ここでは省略します。ここが一番面倒で複雑です。また、CloudPlatformはUIが時折変わるので注意してください。
センサーデータ取得プログラムの作成
NatureRemoからセンサーデータを取得し、スプレッドシートに書き出すプログラムを作成していきます。使用する言語はpythonです。仮想環境の作成、センサーデータの取得、スプレッドシートへの書き込みの順に説明していきます。
Pipenv環境の作成
まずはpythonの仮想環境を作成します。後にSynology NASでプログラムを実行することを考慮して、仮想環境を作成しておいた方が良いと思います。自分はpipenvで仮想環境を作成しました。(pipenvの使い方はこちらにまとめています。)
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
requests = "*"
gspread = "*"
oauth2client = "*"
[dev-packages]
ipykernel = "*"
autopep8 = "*"
flake8 = "*"
[requires]
python_version = "3.8"
[scripts]
main = "python main.py"
ちなみに、これ以降のプログラムで必要になるパッケージは下記です。
import gspread
import json
from oauth2client.service_account import ServiceAccountCredentials
from datetime import datetime
import requests
NatureRemoからセンサーデータを取得
データの取得APIの詳細は公式のswaggerを参考にしてください。下記では/1/devicesへのGETリクエストを行っています。
def get_nature_remo_sensor(token):
""" NatureRemoのセンサーデータを取得する """
headers = {
'accept': 'application/json',
'Authorization': 'Bearer {}'.format(token),
}
response = requests.get(
'https://api.nature.global/1/devices',
headers=headers)
response_status = response.status_code
if response_status != 200:
print("GET error")
print(response.json())
import sys
sys.exit(1)
return response.json()[0]['newest_events']
NATURE_REMO_ACCESS_TOKEN = "your token"
sensor_data = get_nature_remo_sensor(NATURE_REMO_ACCESS_TOKEN)
temperature = sensor_data['te'] # "te" = temperature
humidity = sensor_data['hu'] # "hu" = humidity
illumination = sensor_data['il'] # "il" = illumination
movement = sensor_data['mo'] # "mo" = movement
スプレッドシートへの書き込み
取得したセンサーデータをスプレッドシートへ書き出します。事前にスプレッドシートの共有設定をしておく必要があるので、気をつけてください。
下のプログラムでは下記のような表を作成していきます。最新のデータは一番下の行に追加されていきます。事前にカラムの項目名は自分で入力しておきます。
yyyymmdd | hh | te | hu | il | mo |
20210307 | 13 | 18..8 | 48 | 58 | 1 |
def connect_gspread(jsonfile, key):
""" google spread sheetに接続して、worksheetを返す """
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name(
jsonfile, scope)
gc = gspread.authorize(credentials)
SPREADSHEET_KEY = key
worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1
return worksheet
def get_insert_data():
""" SpreadSheetに保存するデータを返す """
ctime = datetime.now()
yyyymmdd = int(ctime.strftime('%Y%m%d'))
hh = int(ctime.strftime('%H'))
return [[yyyymmdd, hh,
temperature["val"],
humidity["val"],
illumination["val"],
movement["val"]]]
GOOGLE_API_KEY='your google api key'
SPREAD_SHEET_KEY='your spread sheet key'
ws = connect_gspread(GOOGLE_API_KEY, SPREAD_SHEET_KEY)
latest_row = len(ws.col_values(1)) + 1 # 一番下の行数を取得
insert_data = get_insert_data()
ws.update("A{}:F{}".format(latest_row, latest_row), insert_data)
以上でプログラムの説明は終了です。プログラムを実行すると、出力先のスプレッドシートに値が出力されているはずです。
次にプログラムを定期実行する設定を、SynologyNASのDSMで行っていきます。
SynologyNASでプログラムを定期実行
SynologyNASで、上記で作成したプログラムを1時間に1度実行するようにします。手順は下記です。
- DSMからpython3パッケージをインストール
- sshでNASに接続し、pipコマンドとpipenvをインストール
- タスクスケジューラでプログラムを定期実行するように設定する
DSMからpython3のパッケージをインストール
単純に、DSMにアクセスしてパッケージセンターからpython3をインストールしてください。特別な操作はありません。
sshでNASに接続して、pipとpipenvをインストール
DSM上からだとpipコマンドのインストールができないので、sshでNASに接続し、ターミナル上からコマンドのインストールを行います。
まず、sshでNASに接続できるように設定を変更します。DSMの「コントロールパネル」→「端末とSNMP」へ移動します。SSHサービスを有効化するにチェックを入れて、下部の適用ボタンをクリックしてください。これで、ssh接続が可能になります。
次に、pipコマンドとpipenvのインストールです。
# sshでSynologyNASに接続。
# IPアドレスはDSMの「コントロールパネル」→「情報センター」→「ネットワーク」から調べられます。
$ ssh user_name@ip_address
# pipコマンドのインストールとPATHを通す
$ sudo curl -k https://bootstrap.pypa.io/get-pip.py | sudo python3
$ export PATH="$PATH:/volume1/@appstore/py3k/usr/local/bin"
# pipenvのインストール
$ sudo pip3 install pipenv
これで、SynologyNASでpipenvを利用することが可能になりました。sudoでパッケージのインストールを行っていますが、ユーザ単位でパッケージの管理を行いたい方は、ユーザ単位でインストールしてください。その場合、配置するpythonプログラムの実行権限に気を付けてください。
タスクスケジューラでプログラムを定期実行
DSMのコントロールパネルにタスクスケジューラーというアプリケーションがあります。これは事前に決めた時間にスクリプトやサービスを動かすことができるアプリケーションです。先ほど作成したプログラムをSynologyNASにコピーし、そのプログラムを実行するようにします。
SynologyNASへのプログラムのコピーは、DSMを利用して上げて良いですし、scp, rsyncで送っても良いです。GoogleCloudPlatformでダウンロードしたJSONファイルも忘れずにNASに送ってください。
# プログラムを転送
$ scp /path/to/program user_name@ip_address:/path/to/nas/dir
# NASに接続
$ ssh user_name@ip_address
# pipenv環境を作成
$ cd /path/to/nas/dir
$ pipenv install
上記で作成したpythonプログラムをNAS上で動かすためには、パスを通す必要があります。プログラムを動かすための一連の操作をまとめたシェルスクリプトを作成し、そのシェルスクリプトを定期実行することとします。
作成するシェルスクリプトは下記です。
#!/bin/bash
cd /path/to/nas/dir
export PATH="$PATH:/volume1/@appstore/py3k/usr/local/bin"
pipenv run main
このシェルスクリプトをタスクスケジューラーに登録します。
「コントロールパネル」→「タスクスケジューラ」→「作成」→「ユーザ指定のスクリプト」に進みます。スケジュールタブから、好きな条件を指定します。下記はタスクスケジューラで毎時15分にcron_remo.shを動かす設定です。
黒塗りしている部分は、cron_remo.shの絶対パスを指定します。
これで、定期的にプログラムが実行されるようになりました。スプレッドシートに毎時出力されていることを確認してください。
まとめ
NatureRemoとSynologyNASを利用して、温度・湿度・照度・人感センサーの値をスプレッドシートに毎時記録する仕組みを構築し、その方法を説明しました。プログラムは単純ですし、SynologyNASの設定も簡単です。
GoogleCloudPlatformでのSheetsAPIの有効化がすこし手間ですが、画像付きで説明しているサイトが多数あるので、そちらを参考に設定してみてください。
NatureRemoはスマートリモコンに加えてスマートセンサーとしても使えるので大変良い製品だと思います。我が家では犬を飼っているので、犬が寒すぎ/暑すぎないかを外から確認できますし、状況に応じてエアコンもつけることが可能です。ペットを飼っている方にはおすすめの商品かなと思います。
関連記事
SynologyNAS DS216jについては他の記事も書いています。非常に優秀なNASなので、こちらもおすすめです。