Androidのメモとか

ポキオの日記です。今日も遅延してない。

Node-REDをつかってGoogle Home Miniに時報を喋らせる

テレワークに便利。

ポキオ Google Home Mini 時報 Node-RED

tl;dr

  • Google Homeの「ルーティーン」を使ってもできる
  • 今回はNode-REDから時報を喋らせる
  • 定期的にタスクを実行して、喋らせたい文字列をGoogle Home MiniにCastするだけ

テレワークのタイムマネジメント

いうほどできてないんですが。ついうっかりミーティングの存在を忘れたりしがちなので、以前から1時間おきにGoogle Home Miniに時報を喋らせてました。

support.google.com

ルーティーンという機能をつかって、設定した時間に「OK, google. 今何時?」という問いを内部的に投げて、その答えをGoogle Home Miniから発話させることで、時報として活用していました。ただ、最近設定した時間の±1分くらいに発火する謎の病にかかってしまい、代替手段を探していました。で、今回はその方法としてNode-REDからGoogle Home Miniに対して時報を喋らせてみようと思います。

フローは至ってシンプル

最初にフローから。

ポキオ Google Home Mini 時報 Node-RED

こんな感じ。

ポキオ Google Home Mini 時報 Node-RED

まずはInjectionノードで定期実行をトリガー。「おいおい、真夜中に発火させてどうした?」みたいなこと思うかもしれませんが、Node-REDが動作しているRaspberry PiタイムゾーンがUKのままなので、運用でカバーしています・・・(笑)良い子は真似しないでね。

次のFunctionノードで発話させるメッセージを作成しています。こちらでもタイムゾーンをゴニョゴニョしてます。

const date = new Date(Date.now() + ((new Date().getTimezoneOffset() + (9 * 60)) * 60 * 1000));
msg.message = "現在の時刻は、だいたい" + date.getHours() + "時です。";
return msg;

そして、実際の発話はnode-red-contrib-castノードで実行しています。

flows.nodered.org

文字通り、Castを行うノードですが、対象のIPアドレスGoogle Home MiniのIPアドレスにすると、msg.messageのStringを発話してくれます。

実際のフローはこちら

[
    {
        "id": "3e94927e.7c6d7e",
        "type": "cast-to-client",
        "z": "36b47ac9.340b66",
        "name": "",
        "url": "",
        "contentType": "",
        "message": "",
        "language": "ja",
        "ip": "192.168.1.31",
        "port": "",
        "volume": "50",
        "x": 630,
        "y": 120,
        "wires": [
            []
        ]
    },
    {
        "id": "fdae59a3.98caa8",
        "type": "inject",
        "z": "36b47ac9.340b66",
        "name": "22:00-00:00",
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "repeat": "",
        "crontab": "0 22-23 * * 1,2,3,4,5",
        "once": false,
        "onceDelay": 0.1,
        "x": 140,
        "y": 60,
        "wires": [
            [
                "88c5f7d4.a36758",
                "b569a844.e50c58"
            ]
        ]
    },
    {
        "id": "88c5f7d4.a36758",
        "type": "debug",
        "z": "36b47ac9.340b66",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "x": 370,
        "y": 60,
        "wires": []
    },
    {
        "id": "b569a844.e50c58",
        "type": "function",
        "z": "36b47ac9.340b66",
        "name": "メッセージ作成",
        "func": "const date = new Date(Date.now() + ((new Date().getTimezoneOffset() + (9 * 60)) * 60 * 1000));\nmsg.message = \"現在の時刻は、だいたい\" + date.getHours() + \"時です。\";\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 380,
        "y": 120,
        "wires": [
            [
                "3e94927e.7c6d7e"
            ]
        ]
    },
    {
        "id": "a93920ed.ddbc3",
        "type": "inject",
        "z": "36b47ac9.340b66",
        "name": "00:00-10:00",
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "repeat": "",
        "crontab": "0 0-9 * * 1,2,3,4,5",
        "once": false,
        "onceDelay": 0.1,
        "x": 140,
        "y": 120,
        "wires": [
            [
                "88c5f7d4.a36758",
                "b569a844.e50c58"
            ]
        ]
    }
]
「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。