11
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

IoTLTAdvent Calendar 2020

Day 2

お猫様に振り向いてもらうピヨピヨマシンを作った〜

Last updated at Posted at 2020-12-01

はじめに

こんばんわ!IoTLTアドベントカレンダー2日目です!!!

ねこIoTLT主催の3yakaと申します、フワッとしたフロントエンジニアです。
猫のために頑張って仕事をして猫のために。。。という猫中心の生活をしています。
猫との生活を充実させるためにねこIoTを楽しんでます〜

クリスマスプレゼント的なお猫様に振り向いてもらうピヨピヨマシンを作った

おネコ様と暮らしていると、おそらくみなさんがやったことがあるであろう行為
「アレクサ! 鳥の鳴き声を教えて」みたいな、鳥の鳴き声を流すアレ。
若いネコさんは鳥のピヨピヨに反応して、興奮気味に鳥を探してくれます。(窓際にリアルに鳥さんが来るときと同じ反応をしてくれます)
しかし、「アレクサ! 〇〇・・・」的なことを言ってから鳥さんが鳴き始めると賢いお猫様はそのうちに相手にしてくれなくなります。

いかに、人間がやっていないかのようにピヨピヨ言わせてお猫様を喜ばすかが重要になってきます。

やりたいこと

  1. ピヨピヨマシーンと離れたところでスイッチを入れたい → 遠隔操作
  2. 人間が近くでやるときは、人間の動作の直後ではなくてちょっとしてから鳴いて欲しい(自然を装いたい) → Queueを使えば良い?
  3. 外出時に猫カメラに映らない猫を呼び寄せたい → カメラの死角から出てきて欲しい
  4. アプリを増やしたくない → LINEBotだー

概要

LINEBotに「ピヨピヨ」と入れたら、
Azure Queue storageに登録して
数十秒後にラズパイから鳥の鳴き声を出す

LINEBotを作る

LINEBotはこちらの記事を参考に
LINEBotからRaspberryPiで写真を撮ってLINEにおくる! - Qiita
こちらを追加

node.js
    if (event.message.text.match("ピヨピヨ")) {
      piyo = await bird(event.source.userId);
      await client.replyMessage(event.replyToken, {
        type: "text",
        text: "鳥さん待機!",
      });
    }


const bird = async (userId) => {
  const {
    QueueClient
  } = require("@azure/storage-queue");
  
 let torisan = ownerName;

  async function main() {
    const queueName = torisan;
    console.log("\nCreating queue...");
    console.log("\t", queueName);

    const queueClient = new QueueClient(connectionString, queueName);

    // Create the queue
    const createQueueResponse = await queueClient.create();
    console.log("Queue created, requestId:", createQueueResponse.requestId);
    const sendMessageResponse = await queueClient.sendMessage(torisan);

    console.log("Messages added, requestId:", sendMessageResponse.requestId);

    // Get messages from the queue
    const receivedMessagesResponse = await queueClient.receiveMessages({
      numberOfMessages: 5,
    });

    console.log(
      "Messages received, requestId:",
      receivedMessagesResponse.requestId
    );
  }

  main()
    .then(() => console.log("\nDone"))
    .catch((ex) => console.log(ex.message));
};

RaspberryPiの準備

こちらから好きな鳥の鳴き声をもらってきます
自然・動物[1]|効果音ラボ
私はスズメの鳴き声にしました

ラズパイの構成はこんな感じ
node.jsは最新で挑んだ!

/home/torisan
    |- tori
         |ーnode.modules
         |ーpackage.json
         |ーraspi_tori.js
         |ーaudiofile
             |ー suzume.mp3

使用機材は イヤホンマイク
スピーカーを設置したらにゃんこに怪しまれてしまったので、ラズパイからイヤホンの線を伸ばすとまぁまぁ距離を取れるので、引っ張ってイヤホン部分は隠しましょう

raspi_tori.js
"use strict";
const player = require("play-sound")();
// Azureとの連携用モジュール
const azure = require("azure-storage");

// Azure上のBLOBストレージとの接続用サービスオブジェクト
// 引数にBLOBストレージのConnectionStringを設定
var blobSvc = azure.createBlobService("***");

// Azure Storage の接続文字列を環境変数から取得
const connectionString = process.env.AZURE_STORAGE_CONNECTION_STRING;
const { QueueClient } = require("@azure/storage-queue");

//Quereにかきこんでおとをだす
const bird = "suzume";
async function main() {
  const AZURE_STORAGE_CONNECTION_STRING =
    process.env.AZURE_STORAGE_CONNECTION_STRING;

  const queueName = bird;
  console.log("\t", queueName);

  // Instantiate a QueueClient which will be used to create and manipulate a queue
  const queueClient = new QueueClient(
    AZURE_STORAGE_CONNECTION_STRING,
    queueName
  );

  // Get messages from the queue
  const receivedMessagesResponse = await queueClient.receiveMessages({
    numberOfMessages: 5,
  });

  if (receivedMessagesResponse.receivedMessageItems.length > 0) {
    console.log("とりがなきます");
    player.play("/home/pi/handson/audiofile/suzume.mp3", (err) => {
      if (err) throw err;
    });

    let receivedMessage = receivedMessagesResponse.receivedMessageItems[0];

    // 'Process' the message
    console.log("\tProcessing:", receivedMessage.messageText);

    // Delete the message
    const deleteMessageResponse = await queueClient.deleteMessage(
      receivedMessage.messageId,
      receivedMessage.popReceipt,
      receivedMessage.messageText
    );
    console.log(
      "\tMessage deleted, requestId:",
      deleteMessageResponse.requestId
    );
  }
}

main()
  .then(() => console.log("\nDone"))
  .catch((ex) => console.log(ex.message));

おわりに

Twitterにあげた通り、実験をしすぎて相手にされなくなりました。
スズメの鳴き声を違う音声ファイルにしたらきっと探してくれるはず。。。

Queueの記事は少なくて辛かったですが公式のドキュメントが完璧だったので読み解けてないけど動いてるからよし。

参考

クイック スタート:Azure Queue storage ライブラリ v12 - JavaScript | Microsoft Docs

11
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?