dsvvpxgcseldie
@dsvvpxgcseldie (陽介)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【obnizで格闘中】LINEBotとobniz連携について教えて下さいませ!

目標(ゴール)

LINEBotに通知がきたら、obnizと連携したLEDが光る。
また、スピーカーから好きな曲が流れる仕組みを制作したいと考えております。

解決したいこと

現在悩んでいるところが、obnizを活用し、音とLEDを連携させるところまで実施出来ているのですがLINEBotと連携させる所で悩んでおります。
(好きな曲は、後回しにしております。音階周波数で制作します)

開発環境

obniz公式ドキュメント(起動とWi-Fi設定)
obniz公式ドキュメント(Speaker)
・Visual Studio Code
LINEBot参考ページ

該当するソースコード

LINEとobnizを連携させるところで躓いております。

サンプルコード (クリックで表示)


const Obniz = require('obniz');
const { exit } = require('process');
const obniz = new Obniz('obniz_ID'); // Obniz_IDに自分のIDを入れます

const express = require('express');
const line = require('@line/bot-sdk');
const PORT = process.env.PORT || 3000;

// Messaging APIで利用するクレデンシャル(秘匿情報)です。
const config = {
  channelSecret: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
  channelAccessToken: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
};

const app = express();

const app = express();

// HTTP POSTによって '/webhook' のパスにアクセスがあったら、POSTされた内容に応じて様々な処理をします
app.post('/webhook', line.middleware(config), (req, res) => {

  // 検証ボタンをクリックしたときに飛んできたWebhookを受信したときのみ以下のif文内を実行
  if (req.body.events.length === 0) {
    res.send('Hello LINE BOT! (HTTP POST)'); // LINEサーバーに返答します(なくてもよい)
    console.log('検証イベントを受信しました!'); // ターミナルに表示します
    return; // これより下は実行されません
  } else {
    // 通常のメッセージなど … Webhookの中身を確認用にターミナルに表示します
    console.log('受信しました:', req.body.events);
  }

  // あらかじめ宣言しておいた "handleEvent" 関数にWebhookの中身を渡して処理してもらい、
  // 関数から戻ってきたデータをそのままLINEサーバーに「レスポンス」として返します
  Promise.all(req.body.events.map(handleEvent)).then((result) => res.json(result));
});

const client = new line.Client(config);

// obniz接続
obniz.onconnect = async function () {
  obniz.display.clear();
  obniz.display.print("obniz meets LINE Bot!");
}

function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

  let mes = ''
  if(event.message.text === '帰るね!'){
    mes = 'すこしまってね';  //メッセージだけ先に処理
    getAskObnizSpeaker(event.source.userId);  //スクレイピング処理が終わったらプッシュメッセージ
  }else{
    mes = event.message.text;
  }

  return client.replyMessage(event.replyToken, {
    type: 'text',
    text: mes
  });
}

const getAskObnizSpeaker = async (userId) => {
 // スピーカーを呼び出す
 const speaker = obniz.wired("Speaker", {signal:0, gnd:1});
 console.log("Speaker")
 await client.pushMessage(userId, {
  type: 'text',
  text: "了解!気を付けて!",
});

// 任意の秒数待つことができる関数
// 参考: https://qiita.com/suin/items/99aa8641d06b5f819656
const sleep = (msec) => new Promise(res => setTimeout(res, msec));

// obnizが接続済み
obniz.onconnect = async function () {
    var led = obniz.wired("LED", {anode:0, cathode:1});
    led.blink(); // 100msec
    var led = obniz.wired("LED", {anode:2, cathode:3});
led.blink(); // 200msec
var led = obniz.wired("LED", {anode:4, cathode:5});
led.on();

    // スピーカーを利用
    const speaker = obniz.wired('Speaker', { signal: 10, gnd: 11 });

    // ポッ↓
    speaker.play(500); await sleep(300); speaker.stop(); await sleep(700);
    // ポッ↓
    speaker.play(500); await sleep(300); speaker.stop(); await sleep(700);
    // ポッ↓
    speaker.play(500); await sleep(300); speaker.stop(); await sleep(700);
    // ポ~~~ン↑
    speaker.play(1000); await sleep(1000); speaker.stop();
    // Ctrl+C を打たなくても自動で終了します
    exit();

}

サンプルコード (クリックで表示)



```

エラー発生場所

 if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

自分で試したこと

機材を準備
image.png
・LEDは、obniz0~5番繋ぐ。
・スピーカーを10番~11番に繋ぐ。
・Visual Studio Codeで、LINEBotとobnizを連携させる。
image.png
・LINEBot準備
 Botアカウントの準備は、前回と同様に、こちらの記事
image.png

ご教授頂きたいこと

LINEBotとobnizの連携方法
・LINE通知が来て、一定の時間を経過するとLED光が変化する方法。

今後取り組みたい課題

チャレンジしたいこと

今後赤外線距離センサー赤外線距離センサーを活用し、自宅のポストに投函されたら、LINEの通知が来るようなシステムも制作していきたい思っております。
image.png

0

2Answer

Google App Scripts(GAS)とかが便利ですね。

たとえばGASのトリガー機能を使えば、、、

ポストのobniz(赤外線センサ)→ GAS → スプレッドシートX
スプレッドシートX → GAS → LineBot
スプレッドシートX → GAS → 室内のobniz(音と光による通知)

みたいなことができるはず(たぶん)


参考になりそうなサイト

0Like

Your answer might help someone💌