自宅用通知マシン」タグアーカイブ

自宅用通知マシン作成(5)

前回の続き

スタックチャンがしゃべれるようになったので、次は外部からしゃべる指令を出す端末のバージョンアップ。呼び出しは予約確認のための自宅用通知マシンと兼用。

エッジ検出処理&疑似的な並列処理はこちらに大体まとめた感じ。

メインのループ(Arduinoのloop関数)は並行処理するループ(yoyakuCheckLoop,yobidashiCheckLoop)をそれぞれ呼び出しyobidashiCheckLoopの中でボタンが押されている判定をして押されていたらネットワーク越しにスタックチャンがしゃべるURLをたたいてしゃべらせる。

最初はPOSTで叩こうとしたけどPOSTの引数違うぞみたいなエラーメッセージが出たのでとりいそぎGETメソッド(5秒も調べていない)

メインのループの中でyobidashiCheckLoopを呼び出し。下に張った中のyobidashiCheckLoopでやっていることはこちらに大体まとめた感じ。で、execYobidashi(開発環境ならexecDevYobidashi)で、httpsのリクエストを投げているだけ。セキュリティ的なものはつけていないのでそのまま叩ける。

一応全体

続けてネットワーク回り

自宅用通知マシン作成(4)

音声関連クラス化

見通しが悪くなりそうなので音声周りは別クラスに。多分まだ予想してない改造をしそなのでパラメーター渡すとか考えずに単純な別ファイル化だけ。(StackSpeaker.h)

呼び出しは

しておいて使いたいところで

通信

次に外部から呼び出せるようにserver機能を持たせる。店の外から呼び出す計画のでまずはhttpでそのまま外からつなげられるようする。そのうちリバースプロキシの後ろに隠すかもしれないけどとりあえずルーターにNAPTでさばかせておく。

wifi周り

スマートコンフィグ使おうかと考えたけど、ip指定で起動するときにデフォゲとサブネット与えないといけなかった。そいつらをしっかりと渡すとなると外から与えてスマートコンフィグの意味なくなるか、一回目の接続で取れた値を使用と面倒になりそう。というわけでおとなしく明示的に指定することにした。

と、サンプルにありそうなやつそのまま

server周り

これもよくありそうなやつ。

WebServer.hつかって、呼び出し処理があったら音声を流す処理を行う。

handleYobidashiの中で、speaker#stopVoice/speaker#startVoiceを直接呼んでいるので同期処理になっている。音声が流れ終わってから呼び出し側にはレスポンス返る。使うケース次第では非同期呼び出しにするためにさらにスレッドを呼ぶ形にする方が良い場合は多そう。

続き 呼び出し側の自宅端末バージョンアップ

自宅用通知マシン作成(3)

スタックチャン風呼び出しマシン作製の続き。(これから書く)

音声の出し方はこちらでしらべて手を付けられそうになった。

まずは出し方で調べた音声用のAudioOutputM5Speakerを別ファイルに切り出し。サンプルソースほぼそのまんま。ただ、他の人とクラス名かぶりそうなのでネームスペースだけ切っておいた。

ファイル名指定したらファイル流す、止める関数追加

void stopVoice() {
  if (mp3.isRunning()) mp3.stop();
}

void startVoice(const char *filename) {
  file.open(filename);
  mp3.begin(&file, &out);
}

セットアップの中でavater.initしてループの中でボタン押されたらストップ&スタートでとりあえず音楽は流れる。が、途切れがち。CPUコア1にだいぶ頑張らせているからかな?

avater.initの中から呼ばれる描画タスクはどちらもcore1で動いている。音声もcore1。今のところ使ってないけどcore0はwifiで結構使うみたいなので開けておきたい。

CPU負荷が原因ならmp3からcpuに優しいwavにしたらいいじゃないと試してみたけど状況は悪化。ファイル形式変更の道もつらそうなのでやはりmp3で頑張ってみる。

試しにスピーカーで使うCPUをcore0に変えても状況は変わらず。もしかしてCPUのせいじゃない??

タカヲさんからサンプルを教えてもらったので一旦こちらを試す。

このあとは調べ中。タカヲさんの調べながら(おわったら?)書き足す->試したときのメモこちら

続きはこちら

EpeaAudioOutputM5Speaker.h)

自宅用通知マシン作成(2)

自宅用通知マシン作成(1)で自宅用の予約通知端末がとりあえずできたので、次は家から店に呼び出しできる機能を作る。

今は携帯で呼び出しているけど、ゆるふわろぼっとに呼び出された方が雰囲気的にも店を一時抜け出しやすそうなのでスタックチャンぽいやつで作ることにする。

書いている途中でみつけた。こちらのイメージなやつ

ハードは息子がしばらく使っていないM5Stack Basicがあったのでそいつを使用。同じ時期に買ったやつの紙にCore1.0と書いてあるので1.0なのかな。いずれにせよだいぶ古いバージョン。

開発環境構築

Arduino IDE2.3.2を使用しているけどかど開発環境出来ていなかったのでインストール。

File->Prefarence->Additional boards manager urlsに公式のURLを追記

https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json

tools->boods:hogeを選びboards managerからm5stack by m5stack officialをインストール

tools->boods:hogeからM5stack->m5coreを選択

file->examples->m5stack->Basics->FactoryTestを選びUploadを実行。なんとなく動いて要るっぽいことを確認する。

とりあえず顔をだす(M5avatar準備)

顔がないと始まらないので準備。こちらを参考にライブラリインストール。(と思ったら古いのがすでにいたので新しいものに上書き)

最近は、M5Stack.hみたいに機種ごとのライブラリをインクルードするのではなく、大体の機種をカバーしているM5Unified.hをインクルードして作るらしい。今のM5Avatarもそれを使っているということだろう。

M5Unifiedはライブラリマネージャーから入れられるとのことなのでインストール。#include <M5Stack.h>#include <M5Unified.h>に変更しコンパイル&アップロードで動いた。

ずいぶんコンパイルが重い。と思ったら、二度目から軽くなった。IDE1系の時と違い設定しなくてもコンパイル結果キャッシュするようになったのかな?普段重いものコンパイルしないから気づかなかった。

とりあえず声を出す

M5UnifiedのExampleに音声再生があったのでそれで試す。

File->Example->M5Unified->Advanced->Speaker_SD_wav_fileを選択。

MP3_with_ESP8266Audio.inoというのが開いた。中身もmp3用っぽいけど細かいことは気にしない。

/// need ESP8266Audio library. ( URL : https://github.com/earlephilhower/ESP8266Audio/ )

サンプルソースに上のコメントがある。昔入れたと思われるのが入っていたのでそれを使う。はいっていたのは下のlibrary.propertiesで今日時点で最新ぽい。ただコミットに合わせてバージョン上げてはいなそう。

name=ESP8266Audio
version=1.9.7
/// set your mp3 filename
static constexpr const char* filename[] =
{
  "/mp3/file01.mp3",
  "/mp3/file02.mp3",
  "/mp3/file03.mp3",
  "/mp3/file04.mp3",
};

mp3ファイル4つ(手元にたまたまあったやつ)をサンプルソースに書いてある上記のファイル名にリネームしてをSDカードに放り込み実行。

とりあえず音は割れまくりだが動いたっぽい。試しに他のM5Stackに入れたら音は(比較すると)ほぼ割れなかった。その後、音が変なM5Stackのアンプに直接、代わりのスピーカーを繋げたらそっちはきちんと聞こえた。スピーカー自体がお亡くなりっぽい。

サンプルソースの中身を理解する作業メモはこちらに置いておいた。

この先はこちら

自宅用通知マシン作成(1)

店の予約が入ったときすぐ気づきたいとか、店から自宅に呼び出しかけたりとか細々としたとこ改善したいので自宅用通知マシンを作成開始する。

第一段階としては、店に予約が入ったときにすぐ気づけるように予約が入ったら通知としてLEDを光らせる機能をつくる。

予約が入ったらじゃらんとかアソビューから通知メールが飛んでくる。数分以内に気づけたら十分なので、自宅側の通知マシンから定期的に通知メールがあるか確認する方式にする。

ちなみにメールサーバは自前(VPS)でpostfix&dovecotなのでそっちで一部処理しておく。自宅側の端末はESP8266(ESP-WROOM-02)で作成する。秋月で現在420円するので今ならESP-WROOM-32とほとんど値段変わらないのでそっち使ってもよい。(200円台の時に買ったのが数10個余っているので消費もかねて)

全体構成

  1. VPS上メールサーバのdovecotに予約メールが入ったときに、表題をみてメールを指定フォルダに振り分け。使用ツールはseive
  2. メールサーバ上にpythonで立てた未読予約メールカウント返却APIを準備。(最前面はnginx)
  3. espからAPIを定期的に呼び出し、未読の予約メールがあったらLEDを光らせて通知する。(既読にするのはPC上のメーラーで)

メールサーバサイド

seiveの設定

seiveで予約メールが届いた際に指定フォルダ(今回はINBOX.ジム.予約)に振り分け。(seiveのインストールは手順まとめていない。)

予約メールはとりあえず件名で判断。設定ファイルは以下。件名がXXだったらYYフォルダに振り分ける。

APIの準備

以前書いていた。こちら

APIのサービス化

/etc/systemd/system/mailapi.service作成

※ ~/apiをベースパスにしていたけどgit cloneの時のパスがずれたので後ほど~/yobidashi/server/apiに変更

一応メールアカウントとパスワードは外部から読み出しに(/home/yoshitake/api/mailapi.conf)

サービスに登録