Line Notifyのサービス終了に伴う代替手段としてのDiscord導入について
Line Notifyは、IoTデバイスや各種サービスから通知を受け取る手軽な手段として利用されてきました。しかし、サービス終了により、新たな通知手段の確立が求められる状況となりました。この状況に対応するため、本コードでは、Line Notifyの代替サービスとしてDiscordのWebHook機能を利用し、通知メッセージを送信する仕組みを実装しました。
Discordを選んだ理由
- 無料で利用可能
Discordは基本的な利用が無料で提供されており、通知機能を含む多くの機能をコストゼロで利用できます。 - WebHook機能の柔軟性
DiscordのWebHook機能は、HTTPリクエストを通じて簡単にメッセージを送信できるため、既存のIoTデバイスやプログラムとの統合が容易です。 - リッチな通知
Discordでは、単なるテキストメッセージだけでなく、埋め込みメッセージやファイル添付も可能なため、通知内容を柔軟に拡張できます。 - 信頼性とサポート
世界中で広く利用されているプラットフォームであるため、安定した通知サービスとして期待できます。
本コードの概要
このコードでは、温度センサー(DS18B20)を使用して取得したデータをDiscordのWebHookを通じて通知します。また、データはAmbientにも送信されるため、履歴管理や可視化も可能です。
具体的な機能は以下の通りです:
- 温度データの取得
- DS18B20センサーを使用して温度データを読み取ります。
- センサーの省電力運用のため、必要なタイミングでセンサーの電源をオン・オフします。
- 異常値検知
- 温度が特定の閾値(例: 28°C以上またはエラー値)を超える場合に、通知を送信します。
- 通知の送信
- DiscordのWebHookを使用して、温度データやアラートをテキストメッセージとして送信します。
- 通知内容には、デバイスIDや具体的な測定値が含まれます。
- 省電力設計
- 温度測定後、デバイスを一定時間ディープスリープ状態にすることで、電力消費を最小限に抑えます。
DiscordのWebHook機能の仕組み
DiscordのWebHookは、特定のチャネルにデータを投稿するためのエンドポイント(URL)を提供します。このエンドポイントに対してHTTPリクエストを送信するだけで、メッセージを簡単に投稿できます。本コードでは、この仕組みを利用して、温度センサーから取得したデータや警告メッセージをリアルタイムで送信します。
実装のポイント
- WebHookの設定
- DiscordでWebHookを作成し、エンドポイントURLを取得します。このURLは本コード内で
DISCORD_WEBHOOK
として指定します。
- DiscordでWebHookを作成し、エンドポイントURLを取得します。このURLは本コード内で
- センサーの省電力制御
- センサーの電源を操作するピンを設定し、必要なときだけセンサーを有効化します。
- エラーハンドリング
- センサーのデータ読み取りが失敗した場合や、通信が失敗した場合にも、適切にエラーメッセージを送信します。
- ディープスリープの活用
- デバイスを測定後にスリープさせることで、バッテリー駆動時の運用効率を向上させています。
動作概要
このプログラムは、DS18B20温度センサーを使用して温度データを読み取り、それをDiscordとAmbientに送信します。電源効率のため、センサーの電源は必要な時のみオンにし、使用後にオフにします。また、デバイスはデータ送信後にディープスリープ状態に入り、5分後に再起動します。
/*
DS18B20センサーの値をDiscordおよびAmbientにWebHookを使用して送信します。
OneWire、DallasTemperature、Ambientライブラリが必要です。
*/
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Discord_WebHook.h>
#include <Ambient.h>
#include <WiFiClient.h>
#include <esp_sleep.h>
Discord_Webhook discord;
Ambient ambient;
WiFiClient client;
// デバイス個体ごとのID設定
const char* kotaiID = "1";
// How to get the Webhook URL
// https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks
String DISCORD_WEBHOOK = "https://discord.com/api/webhooks/id/token";
// Define the pin to control power to the DS18B20 sensor
const int SENSOR_POWER_PIN = 3;
// Define the OneWire pin
const int ONE_WIRE_PIN = 4;
OneWire oneWire(ONE_WIRE_PIN);
DallasTemperature sensors(&oneWire);
// Ambient settings
const char* userKey = "ユーザーキー";
char devKey[20];
unsigned int channelId;
char writeKey[20];
void setup() {
Serial.begin(115200);
uint8_t mac[6];
esp_read_mac(mac, ESP_MAC_WIFI_STA); // Wi-FiのMACアドレスを取得する
sprintf(devKey, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
Serial.println(devKey);
// Set the power pin as output and turn off the sensor initially
pinMode(SENSOR_POWER_PIN, OUTPUT);
digitalWrite(SENSOR_POWER_PIN, LOW);
discord.begin(DISCORD_WEBHOOK); // Initialize the Discord_Webhook object
discord.addWiFi("SSID", "PASSWORD"); // Add WiFi credentials (you can add multiple WiFi SSIDs)
discord.connectWiFi(); // Connect to WiFi
if (ambient.getchannel(userKey, devKey, channelId, writeKey, sizeof(writeKey), &client) == false) {
Serial.printf("Cannot get channelId. Please set DeviceKey (%s) to Ambient.\r\n", devKey);
while (true) {
delay(0);
}
}
Serial.printf("channelId: %d, writeKey: %s\r\n", channelId, writeKey);
// Initialize Ambient
ambient.begin(channelId, writeKey, &client);
// Initialize the DS18B20 sensor
sensors.begin();
}
void loop() {
// Turn on the sensor
digitalWrite(SENSOR_POWER_PIN, HIGH);
delay(500); // Wait for the sensor to power up
sensors.requestTemperatures(); // Request temperature readings
delay(750);
float temperature = sensors.getTempCByIndex(0); // Get temperature in Celsius
Serial.println("");
Serial.println("TEMP:" + String(temperature));
delay(10);
if (temperature != DEVICE_DISCONNECTED_C) {
Serial.println("DS18B20 read success");
// Send data to Discord if temperature is above 28°C or equals -127°C
if (temperature > 28.0 || temperature == -127.0) {
discord.send("Alert! Temp: " + String(temperature) + "°C detected." + " ID: " + String(kotaiID));
}
// Send data to Ambient
ambient.set(1, temperature); // Set the first data field to the temperature value
if (ambient.send()) {
Serial.println("Ambient data sent successfully");
} else {
Serial.println("Failed to send data to Ambient");
}
} else {
Serial.println("DS18B20 read failed");
discord.send("Error: DS18B20 sensor read failed. Check sensor connection.");
}
// Turn off the sensor
digitalWrite(SENSOR_POWER_PIN, LOW);
// Enter deep sleep for 5 minutes
esp_sleep_enable_timer_wakeup(5 * 60 * 1000000); // 5 minutes in microseconds
esp_deep_sleep_start();
}
コードの詳細な説明:
- ライブラリのインクルード
以下のライブラリを使用しています:OneWire
: センサーとの通信をサポート。DallasTemperature
: DS18B20センサーの温度読み取りに使用。Discord_WebHook
: Discord WebHookでデータを送信。Ambient
: Ambientプラットフォームにデータを送信。WiFiClient
: Wi-Fi通信のため。
- 設定項目
kotaiID
: デバイスの個体識別用ID。DISCORD_WEBHOOK
: Discord WebHookのURL(設定方法はリンク参照)。SENSOR_POWER_PIN
: センサーの電源制御ピン(ピン番号7)。ONE_WIRE_PIN
: OneWire通信用ピン(ピン番号6)。userKey
: Ambientユーザキー。
setup()
関数- デバイスの初期化を行います:
- シリアル通信の開始。
- デバイスのWi-Fi MACアドレスを取得し、
devKey
に保存。 - センサーの電源制御ピンを出力モードに設定し、初期状態で電源オフ。
- Discord WebHookとWi-Fiに接続。
- Ambientのチャンネル情報を取得し、設定。
- DS18B20センサーの初期化。
- デバイスの初期化を行います:
loop()
関数
メイン処理:- センサーの電源をオンにし、温度読み取り。
- 温度をDiscordおよびAmbientに送信:
- 温度が28°Cを超える場合、または-127°Cの場合はDiscordにアラート送信。
- Ambientには常に温度を送信。
- センサーの電源をオフ。
- デバイスを5分間のディープスリープに入る。
専用基板
DS18B20を2本実装可能 その他BME280搭載 温湿度・気圧センサモジュール用ピン、バッテリー電圧監視用ピンを取り出した。
Discordの画面
今後の展望
DiscordのWebHook機能を使用した通知システムは柔軟性が高いため、将来的には以下のような拡張も可能です:
- 複数のデータフィールドやセンサーを統合して、より詳細な通知を実現。
- データの可視化や分析のために、他のクラウドサービスと連携。
- 通知内容の多言語化やカスタマイズ。
Line Notifyからの移行に伴い、今回のコードは代替手段として適切な機能を提供するものです。Discordを活用することで、今後も信頼性の高い通知システムを維持することが期待されます。
- 参考URL
- Discordでメッセージを送信
- https://projecthub.arduino.cc/usini/send-a-message-on-discord-9d87d3
- 複数台のIoT端末を同一プログラムで動かす
- https://ambidata.io/docs/getchannel/
コメント
この記事へのトラックバックはありません。
この記事へのコメントはありません。