本業で温度管理をする機会があり、アナログで管理していたので自動化させるためにSwitchbotの温度・湿度計プラスを購入して自動化させてみました!
SwitchbotのデータをGASにてGoogleスプレッドシートに入力してもらって、Looker Studioにてレポートを作成してスケジュール配信にてメールでレポート配信させたものをさらにLINEに通知させるというものです。
個人利用であればSwitchbotのアプリで十分事足りるのですが、会社で使うとなると情報共有を自動化させるほうが便利なのでこのように設定してみました!
はじめに
温度と湿度の管理は、多くの業界や日常生活において重要な役割を果たしています。アナログ方式での管理では、手間がかかり、人為的ミスや確認漏れなども避けられません。
IoT技術を活用した温湿度管理の自動化でこれらのアナログ監視ではネックになっていた大部分が解決します。
しかも、この記事を読んでいただければ機器の費用のみでランニングコストは少量の電気代と電池代だけで便利な環境構築が可能です。
この家電製品などの自動化がSwitchbotの登場によって簡単にできるようになってきました。
Switchbotとは、スマートホームデバイスを製造・販売する企業が提供するIoT製品ブランドです。様々な家電製品やセンサーをスマートフォンで操作・管理できるようにする製品を展開しています。
こちらの記事では、Switchbot(スイッチボット)の温度・湿度計プラスを使用して、Google サービスと連携し、さらにLINE通知まで自動化する方法を詳しく解説します。この方法を活用することで、以下のようなメリットが得られます!リアルタイムでの温湿度データの取得と記録
- データの自動集計と可視化
- 異常値の即時検知とアラート通知
- チーム内での情報共有の効率化
Switchbot APIを活用することで、これらの機能を比較的簡単に実現できます。本記事は、SwitchbotユーザーやAPI活用に興味がある方、そして複数人での利用を検討している方に特におすすめです。
それでは、Switchbotの基本的な使い方から、API連携、Googleサービスとの統合、そしてLINE通知の設定まで、順を追って説明していきましょう。この記事を読むことで、あなたも効率的な温湿度管理システムを構築できるようになります。
早速設定方法を解説していきます。
Switchbotとは?
スマートホームデバイスを製造・販売する企業が提供するIoT製品ブランドです。様々な家電製品やセンサーをスマートフォンで操作・管理できるようにする製品群を展開しています。
Switchbotは、既存の家電製品をスマート化する「スイッチボット」や、温度・湿度を測定する「温湿度計」など、日常生活をより便利にするスマートデバイスを提供しています。これらの製品は、スマートフォンアプリやAPI連携を通じて、遠隔操作や自動化が可能となっています。Switchbotの特徴は、既存の環境に簡単に導入でき、高度な技術知識がなくても利用できる点にあります。
温湿度管理の自動化の重要性 温度と湿度の管理は、さまざまな産業や日常生活において極めて重要です。例えば、食品業界では品質管理のため、医療分野では適切な保管環境の維持のため、オフィスでは快適な職場環境の創出のために、正確な温湿度管理が欠かせません。
アナログ方式による管理では、冒頭でも申し上げたように以下のような課題・問題がありました。
- 定期的な目視確認の手間
- 人為的ミスによるデータの不正確さ
- リアルタイムでの状況把握の困難さ
- データの長期的な分析や傾向把握の難しさ
これらの課題を解決するために、温湿度管理の自動化が注目されています。SwitchbotのようなスマートデバイスとAPIを活用することで、以下のようなメリットが得られます。
- 24時間365日の連続モニタリング
- 正確なデータの自動記録
- リアルタイムでのアラート通知
- 長期的なデータ分析と可視化の容易さ
- 複数地点の一元管理
Switchbotの温度・湿度計プラスを使用し、Googleのサービス(使うのは、Googleスプレッドシート、Google Apps Script、Looker Studio)とLINE通知を組み合わせた自動化システムの構築方法を順を追って解説していきます。効率的で正確な温湿度管理を実現し、業務効率の向上やコスト削減につなげることができます。
\公式サイトにてセール実施中!!/
Switchbot温度・湿度計プラスの設定
Switchbot温度・湿度計プラスは、IoT時代の温湿度管理を革新する優れたデバイスです。この章では、製品の特徴を詳しく解説し、アプリのインストールから初期設定までの手順を説明します。
Switchbotの使い方をマスターすることで、効率的な温湿度管理が可能になります。
スイッチボット製品の特徴
Switchbot温度・湿度計プラスは、安価で購入できるけど、以下のような特徴を持つ高性能で便利なIoTデバイスです。
- 高精度センサー:温度と湿度を±0.2℃、±2%RHの精度で測定
- スマートフォン連携:Bluetooth接続でリアルタイムデータ確認が可能
- 長時間バッテリー:最大1年半の電池寿命
- 大画面E Inkディスプレイ:省電力で見やすい表示
- データ履歴:最大30日間のデータをデバイス内に保存
- API対応:外部システムとの連携が可能
Switchbot温度・湿度計プラスは家庭用から業務用まで幅広い用途に対応できます。API対応によって、解説する自動化システムの構築が可能となります。
アプリのインストールと初期設定
Switchbotの使い方は非常にシンプルです。
以下の手順で、アプリのインストールと初期設定を行いましょう!
- App StoreまたはGoogle Playから「SwitchBot」アプリをダウンロード
- アプリを起動し、アカウントを作成
- アプリ内の「+」ボタンをタップし、「温度・湿度計プラス」を選択
- 画面の指示に従い、デバイスのペアリングを実行
- Wi-Fi設定を行い、デバイスをネットワークに接続
- デバイス名や設置場所などの基本情報を設定
- 測定間隔やアラート条件などの詳細設定を必要に応じて調整
上記の手順を完了すると、Switchbot温度・湿度計プラスがアプリと連携し、データの取得が開始されます。アプリ上では、リアルタイムの温湿度データやグラフ表示を確認できます。
さらに高度な活用法として、Switchbot APIの利用方法について解説します。APIを活用することで、より柔軟なデータ管理や他システムとの連携が可能になります。
Switchbot APIの活用
Switchbot APIを活用することで、温度・湿度計プラスのデータを外部システムと連携させ、より高度な自動化や分析が可能になります。ここでは、Switchbot API v1.1の使い方を詳しく解説します。このバージョンでは、温度や湿度に加えて電池残量も取得できるようになり、より包括的なデバイス管理が可能になりました。
SwitchBot API v1.1
https://github.com/OpenWonderLabs/SwitchBotAPI
APIトークンの取得方法
Switchbot APIを利用するには、まずAPIトークンを取得する必要があります。以下の手順で取得しましょう
- Switchbotアプリを開き、「プロフィール」タブをタップ
- 「設定」→「アプリバージョン」を10回タップし、開発者モードを有効化
- 「開発者オプション」が表示されるので、タップして開く
- 「トークン生成」をタップし、APIトークンを取得
- 取得したトークンは安全な場所に保管し、他人と共有しないよう注意
このAPIトークンは、Switchbot APIへのアクセスに必要な認証キーとなります。セキュリティ上重要なので、適切に管理しましょう。
APIの基本的な使い方
Switchbot API v1.1の基本的な使い方は以下の通りです。
- リクエストヘッダーの設定:
Authorization
: 取得したAPIトークンContent-Type
: application/json
- エンドポイントURL
https://api.switch-bot.com/v1.1/devices/{デバイスID}/status
- GETリクエストの送信:
curl等のツールやプログラミング言語のHTTPライブラリを使用してリクエストを送信 - レスポンスの解析:
JSON形式で返ってくるレスポンスを解析し、必要なデータを抽出
例えば、温度・湿度計プラスのデータを取得するPythonコードは以下のようになります。
import requests url = "https://api.switch-bot.com/v1.1/devices/{デバイスID}/status" headers = { "Authorization": "YOUR_API_TOKEN", "Content-Type": "application/json" } response = requests.get(url, headers=headers) data = response.json() temperature = data['body']['temperature'] humidity = data['body']['humidity'] battery = data['body']['battery'] print(f"温度: {temperature}℃, 湿度: {humidity}%, 電池残量: {battery}%")
このコードを実行することで、温度、湿度、そして新たに追加された電池残量を取得できます。
Switchbot APIを活用することで、温湿度データの自動取得や他のシステムとの連携が可能になり、より効率的な環境管理を実現できます。このAPIを使ってGoogle Apps Scriptと連携する方法を解説します。
Google Apps Script(GAS)との連携
Switchbot APIを活用して温湿度データを自動的に収集し、Google環境で管理するために、Google Apps Script(GAS)との連携が非常に効果的です。
GASプロジェクトの作成から、Switchbot APIを使用してデータを取得するスクリプトの作成まで、段階的に解説します。GASを活用することで、Switchbotの使い方をさらに拡張し、効率的なデータ管理システムを構築できます。
GASプロジェクトの作成
GASプロジェクトを作成するには、以下の手順を踏みます:
- Google Driveにアクセスし、「新規」→「その他」→「Google Apps Script」を選択
- 新しいプロジェクトが作成されるので、適切な名前を付ける(例:「Switchbot温湿度管理」)
- プロジェクト設定で、時間帯を正しく設定(例:「(GMT+09:00) 日本標準時」)
- 必要に応じて、プロジェクトの説明を追加
これで、Switchbot APIと連携するためのGASプロジェクトの基盤が整いました。
デバイス情報取得のためのGAS作成
Switchbotのデバイス情報を取得するためのGASスクリプトを作成します。
- GASエディタで新しいスクリプトファイルを作成
- 以下のようなコードを記述して、デバイス一覧を取得する関数を作成
https://script.google.com/home
新しいプロジェクトのボタンをクリック
// // SwichBotAPIのサービスURL、認証情報
const url = 'https://api.switch-bot.com'
const token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"//Swichbotのトークン(アプリの開発者オプションから取得)
const secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"//Swichbotのクライアントシークレット(アプリの開発者オプションから取得)
//SwitchBotに登録されているデバイスの一覧を表示する。
function getDeviceInfo() {
const path = '/v1.1/devices'
const nonce = Utilities.getUuid() // 任意の文字列で可
let timestamp = new Date()
timestamp = timestamp.getTime().toString()
let sign = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, token + timestamp + nonce, secret)
sign = Utilities.base64Encode(sign).toUpperCase()
headers = {
'Authorization': token,
'sign': sign,
't': timestamp,
'nonce': nonce
}
const options = {
'method': 'GET',
'headers': headers,
}
Logger.log(UrlFetchApp.fetch(url + path, options).getContentText())
}
上記のコードはSwitchbotから取得するデバイス一覧情報取得のためのコードとなります。
const tokenとconst secretのXXXXXXXXの部分にはご自身で取得した文字列に書き換えてください。
この記事でXXXXXXXXのものが何度か出現しますので覚えておいてください。
const token = “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”//Swichbotのトークン(アプリの開発者オプションから取得)
取得方法はスウィッチボット公式アプリを開いてプロフィール⇒設定⇒開発者向けオプションからトークンを取得
開発者権限を取得しました!あなたのトークンはの真下にある文字列がトークンです。
const secret = “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”//Swichbotのクライアントシークレット(アプリの開発者オプションから取得)
クライアントシークレットの文字列が上記にのXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXのところに上書きしてください。
その状態のコードをGASで保存して実行をしていただくとデバイス一覧を取得可能です。
ログに出力されたデバイス情報から、温度・湿度計プラスのデバイスIDを確認(複数端末でも取得可)
このステップにより、Switchbot APIを使用してデバイス情報を取得できます。
Switchbot APIからデータを取得するスクリプト作成
次に、特定の温度・湿度計プラスからデータを取得するスクリプトを作成します。
そのため、GASではさらに新しいプロジェクトを作成してください。
以下のようなコードを記述(あくまでも参考のコードです)。
取得するデータは’デバイス名’, ‘デバイスID’, ‘日付’, ‘時間’, ‘温度’, ‘湿度’, ‘絶対湿度’, ‘VPD’, ‘バッテリー残量’です。
function getSwitchBotData() {
const API_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const SECRET_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const SPREADSHEET_ID = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const SHEET_NAME = 'テスト取得';
// 既知のデバイス情報
const devices = [
{deviceId: "XXXXXXXXXXXX", deviceName: "温湿度計1"},
{deviceId: "XXXXXXXXXXXX", deviceName: "温湿度計2"},
{deviceId: "XXXXXXXXXXXX", deviceName: "温湿度計3"},
{deviceId: "XXXXXXXXXXXX", deviceName: "温湿度計4"},
{deviceId: "XXXXXXXXXXXX", deviceName: "温湿度計5"}
];
try {
const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(SHEET_NAME);
if (!sheet) {
throw new Error('指定されたシートが見つかりません。');
}
// ヘッダーの設定
const headers = ['デバイス名', 'デバイスID', '日付', '時間', '温度', '湿度', '絶対湿度', 'VPD', 'バッテリー残量'];
if (sheet.getLastRow() === 0) {
sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
}
Logger.log(`処理するデバイス数: ${devices.length}`);
devices.forEach((device, index) => {
try {
const status = getDeviceStatus(API_TOKEN, SECRET_TOKEN, device.deviceId);
if (status) {
const now = new Date();
const date = Utilities.formatDate(now, "Asia/Tokyo", "yyyy/MM/dd");
const time = Utilities.formatDate(now, "Asia/Tokyo", "HH:mm");
// 時間を数値として計算
const [hours, minutes] = time.split(':').map(Number);
const timeValue = (hours + minutes / 60) / 24; // スプレッドシートの時間表現(0-1の間の小数)
const temp = status.temperature;
const humidity = status.humidity;
const absoluteHumidity = calculateAbsoluteHumidity(temp, humidity);
const vpd = calculateVPD(temp, humidity);
const battery = status.battery;
const rowData = [
device.deviceName,
device.deviceId,
date,
time,
temp,
humidity,
absoluteHumidity.toFixed(2),
vpd.toFixed(2),
battery,
timeValue // 計算された時間値
];
const lastRow = sheet.getLastRow();
const range = sheet.getRange(lastRow + 1, 1, 1, rowData.length);
range.setValues([rowData]);
sheet.getRange(lastRow + 1, 3).setNumberFormat('yyyy/mm/dd');
sheet.getRange(lastRow + 1, 4).setNumberFormat('HH:mm');
sheet.getRange(lastRow + 1, 10).setNumberFormat('HH:mm'); // 新しい列の書式を設定
Logger.log(`デバイス ${index + 1}/${devices.length} のデータを追加しました: ${device.deviceName}`);
} else {
Logger.log(`デバイス ${index + 1}/${devices.length} のステータス取得に失敗しました: ${device.deviceName}`);
}
} catch (deviceError) {
Logger.log(`デバイス ${index + 1}/${devices.length} の処理中にエラーが発生しました: ${deviceError.message}`);
}
Utilities.sleep(1000);
});
Logger.log('すべてのデータの取得と記録が完了しました。');
} catch (error) {
Logger.log(`エラーが発生しました: ${error.message}`);
}
}
function getDeviceStatus(apiToken, secretToken, deviceId) {
const url = `https://api.switch-bot.com/v1.1/devices/${deviceId}/status`;
const headers = createHeaders(apiToken, secretToken);
try {
const response = UrlFetchApp.fetch(url, {
method: 'get',
headers: headers,
muteHttpExceptions: true
});
const responseData = JSON.parse(response.getContentText());
if (responseData.statusCode === 100) {
return responseData.body;
} else {
Logger.log(`デバイス ${deviceId} のステータス取得に失敗しました: ${responseData.message}. 完全なレスポンス: ${JSON.stringify(responseData)}`);
return null;
}
} catch (error) {
Logger.log(`デバイス ${deviceId} のステータス取得中にエラーが発生しました: ${error.message}`);
return null;
}
}
function createHeaders(apiToken, secretToken) {
const t = Date.now();
const nonce = Utilities.getUuid();
const data = apiToken + t + nonce;
const signTerm = Utilities.computeHmacSha256Signature(data, secretToken);
const sign = Utilities.base64Encode(signTerm);
return {
"Authorization": apiToken,
"sign": sign,
"t": t.toString(),
"nonce": nonce
};
}
function calculateAbsoluteHumidity(temp, relativeHumidity) {
const e = 6.11 * Math.pow(10, (7.5 * temp / (237.3 + temp)));
return 217 * e / (temp + 273.15) * (relativeHumidity / 100);
}
function calculateVPD(temp, relativeHumidity) {
const satVaporPressure = 610.7 * Math.pow(10, (7.5 * temp / (237.3 + temp)));
return (satVaporPressure * (1 - (relativeHumidity / 100))) / 1000;
}
APIトークンとデバイスIDを正しい値に置き換え
function getSwitchBotData() {
const API_TOKEN = ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’;
const SECRET_TOKEN = ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXX’;
const SPREADSHEET_ID = ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXX’;
const SHEET_NAME = ‘テスト取得’;
API_TOKENのXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXには、スイッチボットのデバイス取得した際のトークンを貼り付けます。
const SECRET_TOKEN = ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXX’;
こちらもクライアントシークレットを貼り付けます。
const SPREADSHEET_ID = ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXX’;
上記のSPREADSHEET_IDは、https://docs.google.com/spreadsheets/d/のあとにつづく文字列をコピペしてください。
- 保存して関数を実行して、温度、湿度、電池残量のデータが正しく取得できることを確認
このスクリプトにより、Switchbot APIを使用して定期的にデータを取得し、Google環境で管理する準備が整いました。この取得したデータをGoogleスプレッドシートに記録する方法を解説します。
- Googleスプレッドシートへのデータ入力
Switchbot APIを活用して取得したデータを効果的に管理するために、Googleスプレッドシートを利用します。
スプレッドシートの準備から、Google Apps Script (GAS) を使用してSwitchbotのデータを自動的に記録する方法まで、詳しく解説します。これにより、Switchbotの使い方をさらに進化させ、複数人での利用にも適した温湿度管理システムを構築できます。
\公式サイトにてセール実施中!!/
Googleスプレッドシートの準備
Switchbot APIから取得したデータを記録するためのスプレッドシートを以下の手順で準備します:
- Google Driveで新しいスプレッドシートを作成し、任意のシート名を付ける(例:「Switchbot各種データ」)
- シート1に以下のヘッダーを設定
‘デバイス名’, ‘デバイスID’, ‘日付’, ‘時間’, ‘温度’, ‘湿度’, ‘絶対湿度’, ‘VPD’, ‘バッテリー残量’ - 必要に応じて、フォーマットや条件付き書式を設定(例:温度が特定範囲を超えた場合に色を変える)
- スプレッドシートのURLをコピーし、後でGASスクリプトで使用するために保存
この準備により、Switchbotから取得したデータを整理して記録し、複数人で共有しやすい形式でデータを管理できます。
GASスクリプトでデータを記録する方法
次に、Switchbot APIから取得したデータをスプレッドシートに自動記録するGASスクリプトを作成します。
- 作成したGASプロジェクトに新しい関数を追加
YOUR_DEVICE_ID
とYOUR_SPREADSHEET_ID
を実際の値に置き換え- 必要に応じて、デバイス名やシート名を変更
- トリガーを設定して、定期的にこの関数を実行(例:1時間ごと)
このスクリプトにより、Switchbotの温湿度データが自動的にスプレッドシートに記録されます。複数のSwitchbotデバイスを使用している場合は、関数を拡張して複数のデバイスからのデータを一つのスプレッドシートに記録することも可能です。
以上の設定により、Switchbot APIを活用した自動データ収集システムが完成します。この方法を使えば、複数人での利用も容易になり、チーム全体で効率的な温湿度管理が可能になります。収集したデータを視覚化するためのLooker Studioの活用方法を解説します。
Looker Studioでのレポート作成
Switchbot APIを活用して収集したデータを視覚化し、効果的に分析するために、Looker Studioを使用したレポート作成が非常に有効です。
このようなレポートが素人でも簡単にできてしまいます。
Googleスプレッドシートに蓄積されたSwitchbotのデータをLooker Studioと連携させ、魅力的なダッシュボードを作成する方法を解説します。
Switchbotの使い方をさらに拡張し、複数人での利用や分析が容易になります。
データソースの設定
Looker Studioでレポートを作成するには、まずデータソースを適切に設定する必要があります。
- Looker Studio(https://lookerstudio.google.com/)にアクセスし、新しいレポートを作成
- データソースの追加画面で「Google スプレッドシート」を選択
- 先ほど作成したSwitchbotデータを含むスプレッドシートを選択
- 必要に応じて、データ範囲やフィールドの設定を調整
- タイムスタンプ: 日付型に変更
- 温度、湿度、電池残量: 数値型に設定
- 「接続」をクリックしてデータソースを確定
この設定により、Switchbot APIから取得したデータをLooker Studioで活用する準備が整います。
ダッシュボードの作成とカスタマイズ
データソースの設定が完了したら、以下の手順でダッシュボードを作成します:
- 新しいページを追加し、適切なレイアウトを選択
- 以下のようなチャートやウィジェットを追加:
- 時系列グラフ: 温度と湿度の推移を表示
- ゲージ: 現在の温度、湿度、電池残量を表示
- スコアカード: 平均値や最大/最小値を表示
- フィルター: デバイス名や日付範囲で絞り込み可能に
- 各チャートのデザインやカラーをカスタマイズし、見やすさを向上
- コントロールを追加して、ユーザーが対話的にデータを探索できるように設定
- 必要に応じて、複数のページを作成し、異なる視点からのデータ分析を可能に
このようなダッシュボードを作成することで、Switchbotから収集したデータを視覚的に理解しやすくなり、複数人での利用や分析が容易になります。例えば、温湿度の異常値をすぐに発見したり、長期的なトレンドを把握したりすることができます。
Looker Studioを活用することで、Switchbot APIのデータをより価値のある情報に変換し、効果的な温湿度管理を実現できます。次章では、このレポートを定期的に配信する方法について解説します。
- スケジュール配信の設定
Switchbot APIを活用して収集したデータとLooker Studioで作成したレポートを、定期的に関係者に共有することで、温湿度管理の効率が大幅に向上します。
Switchbotの使い方をさらに発展させ、自動化されたレポート配信システムの構築方法を解説します。これにより、複数人での利用がより簡単になり、チーム全体でリアルタイムな情報共有が可能になります。
メール配信の設定方法
Looker Studioでのレポートをメールで配信するには、以下の手順で設定を行います。
- Looker Studioのレポート画面で、右上の「共有」ボタンをクリック
- 「スケジュールされた電子メール」タブを選択
- 「新しいスケジュール」をクリックし、以下の項目を設定
- 受信者:レポートを受け取るメールアドレスを入力
- 頻度:日次、週次、月次などから選択
- 時間:レポートを送信する時間を指定
- タイムゾーン:適切なタイムゾーンを選択
- 「スケジュールの保存」をクリックして設定を完了
この設定により、Switchbotのデータを含むレポートが定期的にメールで配信されるようになります。
定期的なレポート送信の自動化
より高度な自動化を実現するために、Google Apps Script(GAS)を使用してレポート送信を制御する方法もあります。
- GASプロジェクトに新しい関数を追加
function sendSwitchbotReport() { var reportUrl = 'YOUR_LOOKER_STUDIO_REPORT_URL'; var recipients = ['email1@example.com', 'email2@example.com']; var subject = 'Switchbot温湿度レポート - ' + new Date().toLocaleDateString(); var body = '添付のリンクから最新のSwitchbot温湿度レポートをご確認ください。\n\n' + reportUrl; MailApp.sendEmail({ to: recipients.join(','), subject: subject, body: body }); }
YOUR_LOOKER_STUDIO_REPORT_URL
を実際のレポートURLに置き換え- 受信者のメールアドレスを適切に設定
- GASのトリガーを設定して、この関数を定期的に実行(例:毎日午前9時)
このスクリプトを使用することで、Switchbotのデータレポートを柔軟にカスタマイズして送信できます。例えば、特定の条件(温度が一定値を超えた場合など)でのみレポートを送信するなど、より高度な自動化が可能になります。
スケジュール配信を設定することで、Switchbotの使い方がさらに効率的になり、チーム全体で常に最新の温湿度情報を共有できるようになります。次章では、より即時性の高い通知方法としてLINEへの通知設定について解説します。
LINEへの通知設定
Switchbot APIを活用した温湿度管理システムをさらに強化するため、LINEへの通知機能を追加します。
これにより、Switchbotの使い方がさらに便利になり、即時性の高い情報共有が可能になります。
LINE Notify APIを利用してGAS(Google Apps Script)からLINEへ通知を送る方法を詳しく解説します。この設定により、複数人での利用がさらに便利になり、チームメンバーがリアルタイムで温湿度の変化を把握できるようになります。
LINE Notify APIの利用
LINE Notify APIを使用するには、以下の手順でセットアップを行います。
- LINE Notifyのウェブサイト(https://notify-bot.line.me/)にアクセスし、ログイン
- 「マイページ」から「トークンを発行する」を選択
- トークン名を入力し、通知を送信するLINEグループまたは個人チャットを選択
- 発行されたトークンを安全な場所に保存(このトークンは一度しか表示されないので注意)
この設定により、Switchbot APIから取得したデータをLINE Notify APIを通じて送信する準備が整います。LINE Notify APIを利用することで、Switchbotの情報をより即時的に共有できるようになります。
GASからLINEへ通知を送る方法
次に、Google Apps Script (GAS) を使用してSwitchbotのデータをLINEに通知する方法を説明します。
Gamil内でラベル作成
ここでは温度・湿度管理レポートというラベルを作成します。
メールの自動振り分けの設定でFromに【looker-studio-noreply@google.com】
件名に温度・湿度管理レポートを入力してフィルタを作成のボタンをクリックします。
次にラベルを付けるにチェックを入れて、温度・湿度管理レポートのラベルを選択してフィルタを更新ボタンをクリック。
これでラベル設定は完了となります。
次はこのラベルにメールが届いたら、LINEに通知されるように設定していきます。
Apps Scriptにて設定
新しいプロジェクト作成でここでは【温度・湿度管理レポートLINEグループ通知】とします。
function notifyLabeledEmails() {
var labelName = "温度・湿度管理レポート";
var label = GmailApp.getUserLabelByName(labelName);
var targetEmail = "自分のメールアドレス@ドメイン";
console.log("ラベル名: " + labelName);
console.log("ラベルが見つかりました: " + (label !== null));
if (!label) {
console.error("ラベル '" + labelName + "' が見つかりません。");
return;
}
var threads = label.getThreads();
var lineToken = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';発行したLINEトークンを入力
console.log("処理するスレッド数: " + threads.length);
for (var i = 0; i < threads.length; i++) {
console.log("スレッド " + (i+1) + " を処理中");
var messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++) {
var message = messages[j];
if (!message.isStarred() && message.getTo().indexOf(targetEmail) !== -1) {
console.log("未通知のメッセージを処理中: " + message.getSubject());
var subject = message.getSubject();
var attachments = message.getAttachments();
try {
var jpgAttachments = attachments.filter(function(attachment) {
return attachment.getContentType() === "image/jpeg";
});
var notificationBody = `件名: ${subject}`;
if (jpgAttachments.length > 0) {
notificationBody += `\n\n${jpgAttachments.length}個のJPG画像が添付されています。`;
}
console.log("LINE Notifyに通知を送信中");
sendLongLineNotify(notificationBody, lineToken);
for (var k = 0; k < jpgAttachments.length; k++) {
sendLineNotifyWithImage(jpgAttachments[k], lineToken);
}
message.star();
console.log("メッセージを通知済みとしてマーク");
} catch (error) {
console.error('Error sending notification:', error);
}
} else {
console.log("対象外または既に通知済みのメッセージをスキップ: " + message.getSubject());
}
}
}
console.log("全てのスレッドの処理が完了しました");
}
function sendLongLineNotify(message, token) {
const maxLength = 1000;
const url = 'https://notify-api.line.me/api/notify';
var parts = [];
for (let i = 0; i < message.length; i += maxLength) {
parts.push(message.substr(i, maxLength));
}
console.log("メッセージを " + parts.length + " 部分に分割しました");
for (let i = 0; i < parts.length; i++) {
let chunk = parts[i];
if (parts.length > 1) {
chunk = `(${i+1}/${parts.length}) ${chunk}`;
}
console.log("部分 " + (i+1) + " を送信中");
sendLineNotify(chunk, token);
Utilities.sleep(1000);
}
}
function sendLineNotify(message, token) {
const url = 'https://notify-api.line.me/api/notify';
var options = {
'method': 'post',
'headers': {
'Authorization': 'Bearer ' + token,
},
'payload': {
'message': message
},
'muteHttpExceptions': true
};
console.log("LINE Notify APIにリクエストを送信中");
var response = UrlFetchApp.fetch(url, options);
console.log('Response Code: ' + response.getResponseCode());
console.log('Response Content: ' + response.getContentText());
if (response.getResponseCode() !== 200) {
throw new Error('LINE Notify API request failed: ' + response.getContentText());
}
}
function sendLineNotifyWithImage(imageBlob, token) {
const url = 'https://notify-api.line.me/api/notify';
var boundary = Utilities.getUuid();
var data = Utilities.newBlob(
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="message"\r\n\r\n' +
'画像を送信します\r\n' +
'--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="imageFile"; filename="image.jpg"\r\n' +
'Content-Type: ' + imageBlob.getContentType() + '\r\n\r\n'
).getBytes();
data = data.concat(imageBlob.getBytes());
data = data.concat(Utilities.newBlob('\r\n--' + boundary + '--\r\n').getBytes());
var options = {
'method': 'post',
'headers': {
'Authorization': 'Bearer ' + token,
'Content-Type': 'multipart/form-data; boundary=' + boundary
},
'payload': data,
'muteHttpExceptions': true
};
console.log("LINE Notify APIに画像を送信中");
var response = UrlFetchApp.fetch(url, options);
console.log('Response Code: ' + response.getResponseCode());
console.log('Response Content: ' + response.getContentText());
if (response.getResponseCode() !== 200) {
throw new Error('LINE Notify API request failed: ' + response.getContentText());
}
}
このスクリプトにより、Switchbotから取得した最新の温湿度データがLINEに定期的に通知されます。さらに、特定の条件(例:温度が設定値を超えた場合)でのみ通知を送るようにカスタマイズすることも可能です。
LINEへの通知設定を行うことで、Switchbotの使い方がより実用的になり、温湿度管理の即時性と利便性が大幅に向上します。
チームメンバーは、スマートフォンでリアルタイムに情報を受け取ることができ、迅速な対応が可能になります。次章では、このシステムを複数人で効果的に利用するための方法について解説します。
複数人での利用方法
Switchbotを活用した温湿度管理システムは、個人利用だけでなく、チームや組織での利用にも適しています。
Switchbot APIを使用したシステムを複数人で効率的に利用するための方法を解説します。適切なアクセス権限の設定やデータ共有の仕方を学ぶことで、Switchbotの使い方をさらに拡張し、チーム全体で効果的な温湿度管理を実現できます。
アクセス権限の設定
複数人でSwitchbotのデータを共有する際は、適切なアクセス権限の設定が重要です。
Googleスプレッドシートの共有設定
- スプレッドシートを開き、右上の「共有」ボタンをクリック
- チームメンバーのメールアドレスを追加し、適切な権限(編集者、閲覧者など)を設定
- 必要に応じて、特定のセルやシートを保護し、編集権限を制限
Looker Studioレポートの共有設定
- レポート画面で「共有」ボタンをクリック
- チームメンバーのメールアドレスを追加し、適切な権限を設定
- 必要に応じて、「リンクを知っている人全員」に公開し、組織内での共有を容易に
Google Apps Script(GAS)プロジェクトの共有
- GASエディタで「共有」をクリック
- チームメンバーのメールアドレスを追加し、編集権限を付与(必要な場合のみ)
これらの設定により、チームメンバー間でのSwitchbotデータの安全な共有が可能になります。
チーム内でのデータ共有の仕方
効果的なチーム内でのデータ共有には、以下のような方法があります。
定期的なレポート共有
- Looker Studioのスケジュール配信機能を使用し、チームメンバー全員にレポートを定期的に送信
- 重要なデータや分析結果をハイライトし、チーム全体で情報を共有
リアルタイム通知の活用
- LINE Notifyを使用して、重要なイベント(温度異常など)をチームLINEグループに通知
- 緊急時の迅速な対応が可能に
ダッシュボードの共同利用
- Looker Studioで作成したダッシュボードをチーム全体で共有
- 各メンバーが必要に応じてデータを参照し、意思決定に活用
権限に基づく役割分担
- データ入力担当、分析担当、管理者など、役割に応じた権限を設定
- チーム内での責任分担を明確化し、効率的な運用を実現
これらの方法を組み合わせることで、Switchbot APIを活用したシステムをチーム全体で効果的に利用できます。複数人での利用により、データの信頼性が向上し、より包括的な温湿度管理が可能になります。次章では、これまでの内容を総括し、Switchbot APIを活用した自動化システムの今後の展望について考察します。
これまで説明したGoogle Apps Script (GAS) のコードを一つにまとめることができます。以下に、統合されたスクリプトの例を示します。
// Switchbot APIの設定 const SWITCHBOT_API_TOKEN = 'YOUR_SWITCHBOT_API_TOKEN'; const DEVICE_ID = 'YOUR_DEVICE_ID'; // スプレッドシートの設定 const SPREADSHEET_ID = 'YOUR_SPREADSHEET_ID'; const SHEET_NAME = 'シート1'; // LINE Notifyの設定 const LINE_NOTIFY_TOKEN = 'YOUR_LINE_NOTIFY_TOKEN'; // Switchbotデバイスの情報を取得 function getSwitchbotDevices() { const url = 'https://api.switch-bot.com/v1.1/devices'; const options = { 'method': 'get', 'headers': { 'Authorization': SWITCHBOT_API_TOKEN, 'Content-Type': 'application/json' } }; const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); Logger.log(JSON.stringify(json, null, 2)); } // センサーデータを取得 function getSwitchbotSensorData(deviceId) { const url = `https://api.switch-bot.com/v1.1/devices/${deviceId}/status`; const options = { 'method': 'get', 'headers': { 'Authorization': SWITCHBOT_API_TOKEN, 'Content-Type': 'application/json' } }; const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); return { temperature: json.body.temperature, humidity: json.body.humidity, battery: json.body.battery }; } // スプレッドシートにデータを記録 function recordSwitchbotData() { const data = getSwitchbotSensorData(DEVICE_ID); const timestamp = new Date(); const deviceName = 'リビング温湿度計'; // デバイス名を適宜変更 const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(SHEET_NAME); sheet.appendRow([ timestamp, deviceName, data.temperature, data.humidity, data.battery ]); } // LINEに通知を送信 function sendSwitchbotDataToLine() { const data = getSwitchbotSensorData(DEVICE_ID); const message = `現在の温度: ${data.temperature}℃\n湿度: ${data.humidity}%\n電池残量: ${data.battery}%`; const options = { 'method': 'post', 'headers': {'Authorization': 'Bearer ' + LINE_NOTIFY_TOKEN}, 'payload': {'message': message} }; UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options); } // メインの実行関数 function main() { recordSwitchbotData(); sendSwitchbotDataToLine(); } // Switchbotレポートをメールで送信 function sendSwitchbotReport() { const reportUrl = 'YOUR_LOOKER_STUDIO_REPORT_URL'; const recipients = ['email1@example.com', 'email2@example.com']; const subject = 'Switchbot温湿度レポート - ' + new Date().toLocaleDateString(); const body = '添付のリンクから最新のSwitchbot温湿度レポートをご確認ください。\n\n' + reportUrl; MailApp.sendEmail({ to: recipients.join(','), subject: subject, body: body }); }
// Switchbot APIの設定
const SWITCHBOT_API_TOKEN = 'YOUR_SWITCHBOT_API_TOKEN';
const DEVICE_ID = 'YOUR_DEVICE_ID'; // スプレッドシートの設定
const SPREADSHEET_ID = 'YOUR_SPREADSHEET_ID';
const SHEET_NAME = 'シート1'; // LINE Notifyの設定
const LINE_NOTIFY_TOKEN = 'YOUR_LINE_NOTIFY_TOKEN'; // Switchbotデバイスの情報を取得
function getSwitchbotDevices() { const url = 'https://api.switch-bot.com/v1.1/devices';
const options = { 'method': 'get', 'headers': { 'Authorization': SWITCHBOT_API_TOKEN, 'Content-Type': 'application/json' } };
const response = UrlFetchApp.fetch(url, options);
const json = JSON.parse(response.getContentText()); Logger.log(JSON.stringify(json, null, 2)); } // センサーデータを取得
function getSwitchbotSensorData(deviceId) { const url = `https://api.switch-bot.com/v1.1/devices/${deviceId}/status`;
const options = { 'method': 'get', 'headers': { 'Authorization': SWITCHBOT_API_TOKEN, 'Content-Type': 'application/json' } };
const response = UrlFetchApp.fetch(url, options);
const json = JSON.parse(response.getContentText());
return { temperature: json.body.temperature, humidity: json.body.humidity, battery: json.body.battery }; } // スプレッドシートにデータを記録
function recordSwitchbotData() { const data = getSwitchbotSensorData(DEVICE_ID); const timestamp = new Date();
const deviceName = 'リビング温湿度計'; // デバイス名を適宜変更
const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(SHEET_NAME);
sheet.appendRow([ timestamp, deviceName, data.temperature, data.humidity, data.battery ]); } // LINEに通知を送信
function sendSwitchbotDataToLine() { const data = getSwitchbotSensorData(DEVICE_ID);
const message = `現在の温度: ${data.temperature}℃\n湿度: ${data.humidity}%\n電池残量: ${data.battery}%`;
const options = { 'method': 'post', 'headers': {'Authorization': 'Bearer ' + LINE_NOTIFY_TOKEN}, 'payload': {'message': message} };
UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options); } // メインの実行関数
function main() { recordSwitchbotData(); sendSwitchbotDataToLine(); } // Switchbotレポートをメールで送信
function sendSwitchbotReport() { const reportUrl = 'YOUR_LOOKER_STUDIO_REPORT_URL';
const recipients = ['email1@example.com', 'email2@example.com'];
const subject = 'Switchbot温湿度レポート - ' + new Date().toLocaleDateString(); const body = '添付のリンクから最新のSwitchbot温湿度レポートをご確認ください。\n\n' +
reportUrl; MailApp.sendEmail({ to: recipients.join(','), subject: subject, body: body }); }
このスクリプトでは、以下の機能が統合されています。
- Switchbotデバイスの情報取得
- センサーデータの取得
- スプレッドシートへのデータ記録
- LINEへの通知送信
- レポートのメール送信
使用する際は、以下の点に注意してください:
- スクリプトの先頭にある定数(
SWITCHBOT_API_TOKEN
,DEVICE_ID
,SPREADSHEET_ID
,LINE_NOTIFY_TOKEN
)を実際の値に置き換えてください。 main()
関数を定期的に実行するようにトリガーを設定してください。sendSwitchbotReport()
関数は必要に応じて別途トリガーを設定してください。
このスクリプトを使用することで、Switchbot APIを活用した温湿度管理システムの主要な機能を一元的に管理できます。必要に応じて、機能の追加や修正を行ってください。
\公式サイトにてセール実施中!!/
まとめ
Switchbot温度・湿度計プラスとSwitchbot APIを活用した自動化システムの構築方法を詳しく解説しました。
Google Apps Script、Googleスプレッドシート、Looker Studio、そしてLINE通知を組み合わせることで、効率的で柔軟な温湿度管理システムを実現できることを示しました。
ここでは、これまでの内容を総括し、自動化によるメリットとSwitchbot APIの今後の可能性について考察します。
自動化による業務効率化のメリット
Switchbot APIを活用した温湿度管理の自動化には、以下のような大きなメリットがあります:
- 作業時間の大幅な削減
手動でのデータ収集や記録が不要になり、スタッフの作業時間を他の重要なタスクに充てることができます。 - データの正確性向上
人為的ミスを排除し、常に正確なデータを収集・記録できます。 - リアルタイムモニタリング
LINEなどを通じて即時に異常を検知し、迅速な対応が可能になります。 - データの可視化と分析の容易さ
Looker Studioを使用することで、複雑なデータも簡単に可視化し、傾向分析が可能になります。 - 複数拠点の一元管理
複数のSwitchbotデバイスを同時に管理し、異なる場所の温湿度を効率的に監視できます。 - コスト削減
長期的には人件費の削減や、温湿度管理の最適化によるエネルギーコストの削減につながります。
これらのメリットにより、Switchbotの使い方を最大限に活用し、業務プロセスを大幅に改善することができます。
Switchbot APIの可能性と今後の展望
Switchbot APIは、温湿度管理にとどまらず、さまざまな可能性を秘めています。
- IoTデバイスとの連携拡大
他のスマートホームデバイスとの連携により、より包括的な環境制御システムの構築が可能になります。 - AI・機械学習との統合
蓄積されたデータをAIで分析することで、予測型の温湿度管理や異常検知の精度向上が期待できます。 - ビジネスプロセスの最適化
温湿度データと業務データを組み合わせることで、生産性や品質管理の向上につながる洞察を得られる可能性があります。 - エネルギー管理との連携
温湿度データを活用して空調システムを最適化し、エネルギー効率の向上やコスト削減を図ることができます。 - ヘルスケア分野への応用
居住環境の温湿度管理を通じて、健康管理や快適性向上に貢献できる可能性があります。 - スマートシティへの貢献
都市規模での温湿度データ収集と分析により、気候変動対策や都市計画に活用できる可能性があります。
Switchbot APIの活用は、単なる温湿度管理の自動化にとどまらず、ビジネスや社会全体の効率化、最適化に大きく貢献する可能性を秘めています。今後も技術の進化とともに、さらなる可能性が広がっていくことでしょう。
スウィッチボットの温度・湿度計プラスでスケジュール管理
LINE Notify
https://notify-bot.line.me/ja
<code>function getSwitchBotData() { const API_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; const SECRET_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; const SPREADSHEET_ID = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; const SHEET_NAME = 'XXXXXXXXXXXX'; // 既知のデバイス情報 const devices = [ {deviceId: "XXXXXXXXXXXX", deviceName: "XXXXXXXXXXXX"}, {deviceId: "XXXXXXXXXXXX", deviceName: "XXXXXXXXXXXX"}, {deviceId: "XXXXXXXXXXXX", deviceName: "XXXXXXXXXXXX"} ]; try { const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(SHEET_NAME); if (!sheet) { throw new Error('指定されたシートが見つかりません。'); } // ヘッダーの設定 const headers = ['デバイス名', 'デバイスID', '日付', '時間', '温度', '湿度', '絶対湿度', 'VPD', 'バッテリー残量']; if (sheet.getLastRow() === 0) { sheet.getRange(1, 1, 1, headers.length).setValues([headers]); } Logger.log(`処理するデバイス数: ${devices.length}`); devices.forEach((device, index) => { try { const status = getDeviceStatus(API_TOKEN, SECRET_TOKEN, device.deviceId); if (status) { const now = new Date(); const date = Utilities.formatDate(now, "Asia/Tokyo", "yyyy/MM/dd"); const time = Utilities.formatDate(now, "Asia/Tokyo", "HH:mm:ss"); const temp = status.temperature; const humidity = status.humidity; const absoluteHumidity = calculateAbsoluteHumidity(temp, humidity); const vpd = calculateVPD(temp, humidity); const battery = status.battery; const rowData = [ device.deviceName, device.deviceId, date, time, temp, humidity, absoluteHumidity.toFixed(2), vpd.toFixed(2), battery ]; sheet.appendRow(rowData); Logger.log(`デバイス ${index + 1}/${devices.length} のデータを追加しました: ${device.deviceName}`); } else { Logger.log(`デバイス ${index + 1}/${devices.length} のステータス取得に失敗しました: ${device.deviceName}`); } } catch (deviceError) { Logger.log(`デバイス ${index + 1}/${devices.length} の処理中にエラーが発生しました: ${deviceError.message}`); } // 各リクエストの間に1秒の遅延を入れる Utilities.sleep(1000); }); Logger.log('すべてのデータの取得と記録が完了しました。'); } catch (error) { Logger.log(`エラーが発生しました: ${error.message}`); } } function getDeviceStatus(apiToken, secretToken, deviceId) { const url = `https://api.switch-bot.com/v1.1/devices/${deviceId}/status`; const headers = createHeaders(apiToken, secretToken); try { const response = UrlFetchApp.fetch(url, { method: 'get', headers: headers, muteHttpExceptions: true }); const responseData = JSON.parse(response.getContentText()); if (responseData.statusCode === 100) { return responseData.body; } else { Logger.log(`デバイス ${deviceId} のステータス取得に失敗しました: ${responseData.message}. 完全なレスポンス: ${JSON.stringify(responseData)}`); return null; } } catch (error) { Logger.log(`デバイス ${deviceId} のステータス取得中にエラーが発生しました: ${error.message}`); return null; } } function createHeaders(apiToken, secretToken) { const t = Date.now(); const nonce = Utilities.getUuid(); const data = apiToken + t + nonce; const signTerm = Utilities.computeHmacSha256Signature(data, secretToken); const sign = Utilities.base64Encode(signTerm); return { "Authorization": apiToken, "sign": sign, "t": t.toString(), "nonce": nonce }; } function calculateAbsoluteHumidity(temp, relativeHumidity) { const e = 6.11 * Math.pow(10, (7.5 * temp / (237.3 + temp))); return 217 * e / (temp + 273.15) * (relativeHumidity / 100); } function calculateVPD(temp, relativeHumidity) { const satVaporPressure = 610.7 * Math.pow(10, (7.5 * temp / (237.3 + temp))); return (satVaporPressure * (1 - (relativeHumidity / 100))) / 1000; }</code>