obnizを使用して、ドアセンサーを作った[開閉時音声再生クライアント編]

今回は、作ったドアセンサーの通知音声クライアントの話
ドアセンサー関連の記事も最後になりました。

音声クライアントの動作は次の動画みたいな感じです。

ドアが開いて、「お帰りなさい」ドアが閉じて「これからなにする?」って言ってくれます。

目次

コード

今回は、音声の再生にnode-wav-playerを使用しました。

node-wav-player を使用してobnizsound.jsを作成しました。
node obnizsound.jsで実行します。
本番運用は、foreverを使用して実行しています。

それではコードです。
コードはすべてセキュリティにかかわるものはマスクしてあります。

obnizsound.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
const mqtt = require("mqtt");
const player = require("node-wav-player");

//wavファイル再生関数定義
const play = async (sound) => {
await player
.play({
path: `${sound}.wav`,
sync: true,
})
.then(() => {
console.log(`played ${sound}.wav.`);
})
.catch((error) => {
console.error(error);
});
};

//mqttサーバー接続
var client = Mqtt.connect("ws://[サーバーアドレス]:[ポート]", {
clientId: "[クライアントID]",
username: "[クライアント名]",
password: "[パスワード]",
});
//接続時処理
client.on("connect", function () {
client.subscribe("[トピック名]", function (err) {
if (!err) {
console.log(`OK Subscribe`);
}
});
});

//ドアステータス
let state = "CLOSE";

//多重再生回避フラグ
let processing = false;

//メッセージ受信時処理
client.on("message", async (topic, message) => {
if (!processing) {
processing = true;

let temp = JSON.parse(message.toString()).data.door;
if (temp != state && temp == "OPEN") {
await play("okaeri");
}
if (temp != state && temp == "CLOSE") {
await play("korekara");
}
state = temp;
processing = false;
}
});

音を鳴らすって結構面倒なことなのかもしれないと思った

今回音を鳴らすにあたって、プランはいくつかあって

  • スマートスピーカー
    =>スマートスピーカーの操作について知見がないので今回見送り
  • 音声再生する web サイトを作成して、開きっぱなし
    =>ブラウザ開きっぱなしは面倒過ぎる。
  • PC でサービスとして起動
    =>とりあえずこれならできそう。音鳴らす以外なら実績ある。これだ!

それで、mp3をキーワードにnpmでパッケージを
探して安直に音を鳴らそうと思ってたらうまくいかない。
windows 環境で音声再生パッケージはあるんだけど、うまく扱える windows 向け mp3 再生パッケージが見当たらない。
node-wav-playerが見つかって助かったって話。

最後に

今回一通りの作成して、自宅でドアセンサーが稼働してるんですが、
外出するためにドアを開けても「おかえりなさい」、宅配が来ても「お帰りなさい」、
これはさすがに・・・と思ったので、人感センサーとタッチセンサーで「帰宅判定」と「通知一時停止」機能を追加で作ってます。

宅配でドア開けて、「おかえりなさい」はちょっとね・・・。

ではでは。