NFCタグで、家の照明を消す(Lambda経由)

先日、AWS IoTボタンでRemoを動かすという記事を書きました。

AWS IoTボタンで電気を消す

しかし、このIoTボタンはすでに販売中止。。。代替品も値段が高くて手が出しづらいので、NFCタグで動かすようにしました。

NFCタグとは?

超ざっくりいうと、スマホでデータがやり取りできる、すごく容量の小さいメモリーカードみたいなものです。NFCタグにURLを書き込んでおいて、スマホでタッチしたらそのURLを読み取ってそこに行く、みたいな使い方です。

名前などのテキスト情報なんかも書き込めるので、名刺代わりに使えたりもするそうです。

ちなみに、おサイフケータイが入っているスマホだったら大体対応しているようです。iPhoneだとSEの第二世代くらいから使えるみたい(嫁のiPhoneSEで実証済み)。

NFCタグを使えばタスクの自動化などいろいろなことができます。https://goworkship.com/magazine/smartphone-nfc-tag/

もっと詳しく知りたい方は、「NFCタグ」でググってみてください。

どのNFCタグを買うか?

NFCタグには、Ntag213とか215とかの種類があります。容量が違うだけのようです。
https://www.asiarfid.com/ja/difference-ntag213-ntag215-ntag216.html

今回紹介するやり方は、NFCタグにURLを書き込むだけなので、215で十分です。(213だとちょっと不安)。

ちなみに、タスク実行機能を使って、直接RemoのAPIを叩くやり方だと、215でも足りませんでした。もうちょっと容量の大きいNtag216を買いましょう。Switchbotが出しているNFCタグは、こいつです。NFCタグはSwitchbot製でも、ちゃんとRemoも動きますよ。ただ3枚で1,000円弱と、ちょっとお高め。

今回の仕組み

上の記事にあるようなタスク実行機能を使って、RemoのAPIを直接実行させることもできます。このやり方であれば、Lambdaを使う必要もありません。

がしかし!それだと自分のスマホだけでしか動かせないんです。。。今回したいことは家の電気を消すこと、すなわち嫁のiPhoneでも動いてくれないといけない。でも、タスク実行機能だと、嫁のスマホでは動かない。。。(実際試してダメでした)

ということで、以下のようなやり方にしました。

  NFCタグに、電気を消すためのLambdaを動かすURLを書き込む
  ↓
  スマホでNFCタグにタッチしたら、そのURLを読み込んで、そこへ行く
  ↓
  Lambdaが動いて、「電気消せ」とRemoに指示を出す
  ↓
  Remoが電気を消す

Lambdaを動かすURLを作る

いわゆるAPI化ってやつです。電気を消すためのLambda関数をAPI化し、特定のURLを開いたらこの関数が動き出すようにします。

電気を消すためのLambda関数を作る

AWS IoTボタンで電気を消すときに作ったものがそのまま流用できます。
以下の記事を参考にしてください。

AWS IoTボタンで電気を消す

一番最後に書いてある「おまけ:実際に使っているコード」を使ってみてください。

Lambdaを動かすURLを作る

画面の上のほうに、「関数の概要」というところがあり、その近くに「トリガーを追加」というボタンがあるので、それをクリック。

トリガーの種類で「API Gateway」を選ぶ。

その他の設定は以下の通り。入力したら、右下の「追加」ボタンをクリック。

すると、画面下に「トリガー」欄がでてきているはずです。赤で囲った部分が、Lambda関数を動かすためのURLです。そのURLへ行くだけで、この関数が動き出します。

このURLをこぴって、ブラウザのURL欄に貼り付けて、実際にそのURLに行ってみてください。それで電気が消えれば、成功です。

ちなみに、このURLに行ければ、だれでも動かせます。セキュリティもへったくれもありません♪

URLをNFCタグに書き込む

スマホアプリを使います。僕はNFC Toolsというアプリを使いました。「書く」タブから「レコードを追加」を選択し、「URL」→上記のURLをペースト。

あとは「書く」ボタンを押し、NFCタグにかざすだけでOKです。

ちなみに、NFCタグは何回でも書き換えられるので、安心して書き込みテストしてもらってOKです。

これで設定完了!

NFCタグで電気を消す

スマホの画面ロックを解除し、NFCタグにスマホをかざしてください。画面ロック状態だと動かないのでご注意を。

NFCタグにタッチしたサイン音がピロッとなり、数秒後にRemoが動き出したら成功です。

AWS IoTボタンで電気を消す

リビング照明にはリモコンがついていて、Nature Remoでつけたり消したりしているんですが(実際はアレクサがやってくれている)、寝るときは壁スイッチで消すことが多いです。そっちのほうが動線的に自然だし。

ただ、これだと主電源が切られたようなもんで、もう一回その壁スイッチを押して主電源をOnにしないとリビング照明がつきません。「アレクサ、電気つけて」といってNature Remoがピッて言っても、電気がつきません。

ということで、壁スイッチの横にAWSボタンを置いて、壁スイッチを押さずにAWSボタンを押すことで電気を消すようにしました。以下の図の、右下のボタンです。(左上のSwitchbotのボタンは今回は関係ないです)

ちなみに、これ、正式名称は「AWS IoT Enterprise Button」というみたいですが、2022/5月時点で販売中止になってました。安くてよかったのに。。代替品はめちゃ高いので買う気がしません。。。

https://aws.amazon.com/jp/iot-1-click/devices/

なので、ボタンはこの1個だけで、今後の増設はNFCタグで行います。詳しくは以下で!

仕組み = ボタン → Lambda → Nature Remo → 電気消す

ボタンを押したら、Lambdaが動いてNatureRemoに指示を出し、NatureRemoがその指示に従って電気を消す という流れです。

以前はIFTTTを使っていましたが、IFTTTが有料になったため、IFTTTを使わずにLambdaだけで行います。

Lambdaとは、AWSが提供しているサービスの一つで、自分でPythonなどのプログラムを書いて、SwitchbotやNature Remoなどを動かすことができます。ちなみに、AWSのサービスは有料で、クレカの登録が必要になります。が、今回のような「単にボタンを押したらRemoを動かす」だけだったら、月に100円程度です♪

事前準備

AWS IoTボタンのセットアップ

スマホを使って登録します。AWS IoT 1-Clickというアプリをスマホにインストールしてください。登録までの流れはアプリがわかりやすくリードしてくれます。

ちなみに登録にはDSN番号なるものが必要です。ボタンの背面に記載されているので、ボタンを壁に貼り付ける前にメモっておく必要があります!
(箱にも書かれているので、箱があれば大丈夫ですが)

AWSアカウントの作成

まずはAWSアカウントを作りましょう。利用料金がかかるしクレジットカードの登録も必要ですが、臆さず登録しましょう!

https://aws.amazon.com/jp/register-flow/

すさまじくいろいろなサービスがありますが、このなかの「Lambda(ラムダ)」を使います。

Nature RemoのTOKENを取得

以下のサイトへ行って、TOKENを発行しましょう。画面に一度そのTOKENが出てくるだけで、あとから再表示はできないようなので、しっかりTOKENをメモっておきましょう。

https://home.nature.global/

僕は以下のサイトを参考にしました。
https://blog-and-destroy.com/12297

これで準備は完了です!次はいよいよLambdaでプログラムを書いて、自分のNature Remoとやり取りします。

Nature Remoに登録されている家電IDを調べる

Lambda関数の新規作成(空)

AWSで作業をします。AWSコンソールに行ったら、まずはリージョンのチェック!画面の右上でリージョンを変更できます。「東京」になっていればOK。「バージニア北部」とかになっていれば、「東京」に変更してください。これ、すごく重要です!

次に、画面上部にサービスの検索窓があるので、そこに「Lambda」と入れて、出てきたサービス欄からLambdaをクリック。

右上の「関数の作成」をクリック。
  関数名 = 「NatureRemo_GetDevieID」
  ランタイム = 「Python3.9」
(2022/5時点。その時の最新のを選べばOKです)
と入れて、あとはデフォルト設定のままで、右下の「関数の作成」ボタンをクリック。

以下のブログが参考になりました。
https://zenn.dev/nakam_aws/articles/46fcc003855aef

環境変数の設定(TOKEN)

環境変数へ、TOKEN情報を書き込みます。(プログラム内に直書きでもOKですが、環境変数に書いたほうがすっきりします)

「設定」タブ→「環境変数」→「編集」と押し、

「環境変数の追加」で、キー欄に「TOKEN」と、値欄に先ほどメモしたRemoのTOKEN番号を貼り付けましょう。
  キー 「TOKEN」
  値  RemoのTOKEN番号

入力したら、保存してください。

Remoの家電ID(ApplianceID)を取得するプログラムを書く①

まずは、以下のコードを貼り付けてください。ちなみに、はまったところは、「認証が通らない」「Requestsライブラリが使えない」といった点でした。

import json
import os
import urllib.request

def lambda_handler(event, context):

    #--- TOKEN ---------------#
    TOKEN = os.environ.get('TOKEN')

    #--- ヘッダ --------------#
    headers = {
        'accept': 'application/json',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': 'Bearer ' + TOKEN,
    }

    #-- 家電ID取得用のURL --#
    url = 'https://api.nature.global/1/appliances'

    #--- 取得 
    req = urllib.request.Request(url=url,headers=headers, method='GET')

    #--- 取得 ----------------#
    res = urllib.request.urlopen(req)
    jjj = json.loads(res.read())

    #--- ログに出力(全部)---#
    print('-----------------')
    print(json.dumps( jjj, indent=4, ensure_ascii=False ))
    print('-----------------')

このコードを貼り付けたら、上のほうにある「Deploy」ボタンを押してください。これでプログラムが実行できる状態になりました。

Deployボタンを押した後、テストタブを開いて

テストタブ

右側にあるオレンジの「テスト」ボタンを押してください。

以下のような画面がでて、テストが成功したら、もう一回「コード」タブに戻ってください。

成功したら、このような緑の枠組みが出てきます。

「Execution Result」が表示されていると思います。そこにログが出力されています。

ただ、ログがぐちゃっとなって見づらいと思います。

Remoの家電ID(ApplianceID)を取得するプログラムを書く②

ID/名前/ボタン情報 だけを出力するようにします。上記のコードの最後に以下のプログラムを追加してください。

    #--- ログに出力(IDだけ)---#
    for j in jjj:
        print('-----------------')
        print('id=' + j['id'])
        print('name=' + j['nickname'])
        print('signal=' + json.dumps(j['signals'], ensure_ascii=False))

Deployを忘れずに!Deployしたら、テストタブに行って、テスト実行して、コードに戻って、ログを見てみてください。

以下のようなのがログに出てきていると思います。idが「家電ID」で、ついでに後で必要になるシグナルIDも取得できました。

Remoに登録されているリビング照明の家電IDは「xxxxx」で、照明をつけるオンボタンのシグナルIDは「yyyyy」、オフボタンのシグナルIDは「zzzzz」という感じです。

-----------------
id=xxxxx
name=電気
signal=[{"id": "yyyyy", "name": "オン", "image": "ico_on"}, {"id": "zzzzz", "name": "オフ", "image": "ico_off"}]
-----------------

ちなみに、シグナルIDに何も出ていないことがあります。これは、リモコンのボタン1つひとつを登録するのではなく、リモコンをマルっと登録したものになります。TVとかエアコンとかに多く起こります。この場合、ちょっとやり方が変わります(後述)。

※ シグナルに何も出てこないパターン
-----------------
id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
name=テレビ
signal=[]
-----------------

LambdaでRemoを動かす!

シグナルIDがあるケース

うちのRemoに登録されている家電「電気」は、シグナルIDがあったので、このケースです。

新たにLambda関数を新規作成しましょう。名前は、「NatureRemo_LightOn」とか。
そして、環境変数にTOKEN情報を書き込んでください。

そしたら、デフォルトで入っているコードを消して、以下のコードを貼り付けてください。
また、「yyyyy」の部分(url_lightのところ)を、上記で取得したシグナルIDに書き換えてください。

import json
import os
import urllib.request

def lambda_handler(event, context):

    #--- TOKEN ---------------#
    TOKEN = os.environ.get('TOKEN')

    #--- ヘッダ --------------#
    headers = {
        'accept': 'application/json',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': 'Bearer ' + TOKEN,
    }

    #--- 電気用のURL    ------#
    url_light = 'https://api.nature.global/1/signals/yyyyy/send' #←要修正!yyyyy

    #--- 電気を消す -------------------------#
    req = urllib.request.Request(url=url_light, headers=headers, method='POST')
    urllib.request.urlopen(req)

そうです。家電IDは使いません♪ シグナルIDだけで動きます!

Deployし、テストタブに行き、テストを実行してください。これで電気がつけば、成功です!

僕は、初めて成功したときは結構感動しました^^

シグナルIDがないケース

TVやエアコンなど、リモコンをマルっと登録した家電にはシグナルIDがつきません。そんな時は、以下のような感じで動かします。

関数を新規作成し、環境変数にTOKEN情報を入れ、コード欄に以下のコードを貼り付けてください。

こちらのケースでは、家電IDを使うことになります。
urlのところにあるxxxxx・・・を、家電IDに書き換えてください。

import json
import os
import urllib.request


def lambda_handler(event, context):

    TOKEN = os.environ.get('TOKEN')
    url = 'https://api.nature.global/1/appliances/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/tv'

    headers = {
        'accept': 'application/json',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': 'Bearer ' + TOKEN,
    }

    data = b'button=power'

    req = urllib.request.Request(url=url, data=data, headers=headers, method='POST')
    urllib.request.urlopen(req)

ポイントは、「data = b’button=power’」のところ。”power”が、電源ボタンを指します。すなわち、これを動かすと、TVリモコンの電源ボタンを押した動きになります。

このように、どのボタンを押すかをデータで渡す必要があるのですが、その渡し方にはまった。。。
以下のブログに解決策が書かれており、非常に助かりました。
https://qiita.com/souring001/items/68b5397c1750c325f61a

TVボタン名の調べ方

ボタン名(name)を調べるには、以下のコードを新規作成して回してみてください(TOKEN情報を環境変数に入れるのを忘れずに)。

import json
import os
import urllib.request

def lambda_handler(event, context):

    #--- TOKEN ---------------#
    TOKEN = os.environ.get('TOKEN')

    #--- ヘッダ --------------#
    headers = {
        'accept': 'application/json',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': 'Bearer ' + TOKEN,
    }

    #-- DeviceID取得用のURL --#
    url = 'https://api.nature.global/1/appliances'

    req = urllib.request.Request(url=url,headers=headers, method='GET')

    #--- 取得 ----------------#
    res = urllib.request.urlopen(req)
    jjj = json.loads(res.read())

    #--- ログに出力(IDだけ)---#
    for j in jjj:
        print('-----------------')
        print('id=' + j['id'])
        print('name=' + j['nickname'])
        print('signal=' + json.dumps(j['signals'], ensure_ascii=False))
        if('tv' in j.keys()):
            print('TV=' + json.dumps(j['tv']['buttons'], ensure_ascii=False))
        if('aircon' in j.keys()):
            print('aircon=' + json.dumps(j['aircon'], ensure_ascii=False))

ログに、以下のような情報が出ているはずです。ここから、どのボタンがどんな名前か勘を働かせて特定します。

TVのボタン名一覧

これで、「Lambda→Remo」の部分が組みあがりました!一番面倒なLambdaはこれでおしまいです。

あともう少しです!「ボタン→Lambda」の部分を組み込めば完成です!!

ボタンを押したらLambdaを動かす

こちらは、ボタンを登録したときに使ったAWS IoT 1-Clickスマホアプリを使います。

「プロジェクト」タブから新規作成し、「デバイステンプレート」で、先ほど作ったLambda関数(NatureRemo_LightOn)を選択し、「プレイスメント」で冒頭に登録したIoTボタンを指定してあげるといった流れです。

僕はスマホアプリでトラブルなく作成できましたが、他の人はWebのAWSサービス(IoT 1-Click)で設定されてる人が多いみたいです。
https://qiita.com/hayao_k/items/d36d4b2579d0bbbe21a9
などがとても分かりやすかったです。

これで完成!ボタンをぽちっとして、ちゃんと電気が消えるか試してみましょう♪

おまけ:実際に使っているコード

実際には、電気を消すと同時にTVも消したいですよね。また、このAWS IoTボタンは、ダブルクリックなどにも対応してます。なので、ダブルクリックしたときは、電気をつけるようにしています。

テレビのボタンって、「On/Offボタン」が独立してそれぞれあるわけじゃなく、「電源ボタン」がひとつしかない。。でも、「電源がついてなければ電源ボタン押すのスルーして」なんてことはできない。なので、ちょっとした工夫が必要です。

いったん「入力切替」ボタンを押しています。もしテレビが消えていたら、これでいったんテレビがOnになります。もしテレビがついていたら、ついたままです。その後、電源ボタンを押しています。電源ボタンを押す前に「必ずついてる状態」にしている感じです。

加えて、NFCタグからも実行させているので、その部分も書き加えています。

なお、環境設定に、TOKEN / 照明OnのボタンシグナルID / 照明OffボタンのシグナルIDの3つを登録しています。

import json
import os
import urllib.request
import time

def lambda_handler(event, context):

    #--- ID情報を環境設定から取得 ---#
    ID_TV = os.environ.get('ID_TV')
    ID_LIGHTOFF = os.environ.get('ID_LIGHTOFF')
    ID_LIGHTON  = os.environ.get('ID_LIGHTON')

    #--- TOKEN ---------------#
    TOKEN = os.environ.get('TOKEN')

    #--- ヘッダ --------------#
    headers = {
        'accept': 'application/json',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': 'Bearer ' + TOKEN,
    }

    #--- AWSボタンとNFCタグの両方からくる-> NFCタグから来たら、シングルクリックにする
    if(json.dumps(event).find('deviceEvent') == -1):
        clicktype = 'SINGLE'
    else:
        clicktype = event['deviceEvent']['buttonClicked']['clickType']
        

    #----------------------------------------------------------------#
    #--- ダブルクリックなら電気をつけて、それ以外は電気を消す -------#
    #----------------------------------------------------------------#

    #--- 電気用のURL    ------#
    if (clicktype == "SINGLE"):
        url_light = 'https://api.nature.global/1/signals/' + ID_LIGHTOFF + '/send'
    elif (clicktype == "DOUBLE"):
        url_light = 'https://api.nature.global/1/signals/' + ID_LIGHTON  + '/send'
    elif (clicktype == "LONG"):
        #ボタン長押し
        url_light = 'https://api.nature.global/1/signals/' + ID_LIGHTOFF + '/send'
    else:
        url_light = 'https://api.nature.global/1/signals/' + ID_LIGHTOFF + '/send'

    #--- 電気を消す or つける -------------------------#
    req = urllib.request.Request(url=url_light, headers=headers, method='POST')
    urllib.request.urlopen(req)




    #--- TV用のURL  ---------#
    url_TV = 'https://api.nature.global/1/appliances/' + ID_TV + '/tv'

    #----------------------------------------------------#
    #--- ダブルクリックじゃなければ、TVを消す   ---------#
    #----------------------------------------------------#
    #いったんつける
    if (clicktype == "SINGLE"):
        data = b'button=select-input-src' #電源ボタンじゃないのがミソ
        req = urllib.request.Request(url=url_TV, data=data, headers=headers, method='POST')
        urllib.request.urlopen(req)

        time.sleep(5) #ちょっと待つ

        #--- 消す
        data = b'button=power'
        req = urllib.request.Request(url=url_TV, data=data, headers=headers, method='POST')
        urllib.request.urlopen(req)

以上、参考になれば幸いです。ありがとうございました。

アレクサTips : 電話番号を調べる

コロナ禍でお店の営業時間が短縮になっていますが、豊洲のコーナンの営業時間が知りたくって、電話番号を調べようと。

ふとアレクサに話しかけたら、ちゃんと電話番号を教えてくれました。

「アレクサ、豊洲にあるコーナンの電話番号教えて」・・・〇
「アレクサ、豊洲のコーナンの電話番後う教えて」・・・×

場所を指定するときは、「〇〇にある」と言わなきゃダメ見たい。

けっこうベタな内容ですが、こうやって使うことがなかった。。。

アレクサTips 自分の携帯を探す

自分の携帯が迷子になったとき、携帯を鳴らしてくれます。

「携帯ファインダー」というスキルを使います。そのスキルの説明書き(Alexaへの話し方の例)にある文章は長ったらしいですが、「アレクサ、携帯どこ?」で反応してくれます!「アレクサ、電話どこ?」でもOK

これは便利♪

アレクサのスキルを有効にする

「携帯ファインダー」というスキルを有効にしましょう。

  • 左上の三本線→スキル・ゲーム
  • 検索窓から「携帯ファインダー」
  • 携帯ファインダーをタップ
  • 「有効にして使用する」をタップ

アレクサに話しかけて、設定を進める

私の場合、ここでトラブルに! 電話をかけても、プチッと切れる。つながらない。。。

アレクサがしゃべってるときじゃないと、電話がつながらない?みたいでした。

ということで、「03‐4540-2801」をメモっておき、携帯片手にアレクサにしゃべりかけましょう。

  • 一度電話番号「03-4540-2801」にTELしておく。(後で発信履歴からTELするため)
  • 携帯を片手に持っておく。電話をすぐにかけれるように。
  • アレクサに話しかける・・・「アレクサ、携帯どこ?」
  • アレクサがもごもご話し出す。しばらくして「スタートと言ってください」とアレクサが言うので、「スタート」と言う。
  • アレクサが電話番号を話し出す。が、この電話番号を聞いた後に電話してもつながらないので、電話番号を言い出したらすぐに発信履歴から「03-4540-2801」にTELする。
  • アレクサもしゃべりつつ、電話先でもごにょごにょ言い出す。ちょっと聞き取りづらくなる。アレクサのほうが黙るまでしばらく待つ。
  • アレクサが黙ったら、「アレクサ、携帯ファインダーのピンコードを教えて」と話しかける。
  • 4桁のピンコードを言うので、携帯にその番号を入力する。
  • 携帯のほうがごにょごにょ言って、自然にTELが切れる。これで設定完了!

接続テスト:アレクサに「携帯どこ?」「電話どこ?」

アレクサに向かって、「アレクサ、携帯どこ?」もしくは「電話どこ?」と言ってみましょう。それで自分の携帯が鳴ったらOK。

アマゾンエンタープライズボタンを照明のスイッチに!

我が家ではアレクサから照明をOn/Offしています。
でも、イラッとする時があります。それは”主電源問題”。
夕方になったりうたた寝明けとかに「アレクサ、照明つけて」って言っても動いてくれない。なぜなら、壁のスイッチが切られているから!

みんなが壁スイッチを押さずに照明を消せばいいんですが、寝るときなどアレクサに話しかけるより壁スイッチをポチっと押したほうが手っ取り早い。

ということで、壁スイッチを”押させない”方法として、壁スイッチの近くにボタンを置き、壁スイッチを押す代わりにこれを押すようにしました。(下にあるほうです。上はSwitchbotで、今回の話とは関係ないやつです)

私はアマゾンのエンタープライズボタンを選びましたが、IoTボタンはいくつか出ています。それぞれ主観で紹介しますね。

IoTボタンを選ぶ

Flic

非常に面白そうな製品で好奇心をとっても刺激されますが、単なる照明ボタンにするにはちょっと値段が高いのと、日本に販売代理店がなさそうというので、避けました。別の使い方を考えてみようと思います。

MESH

こちらも同様に、かなりお値段がお高いので、敬遠です。

Qmote S

お値段はお手頃なのですが、こいつが動くにはスマホが近くにあってQmoteSがBluetoothでスマホにつながってないとだめで、”家の照明ボタン”として使うにはちょっと厳しいです。

実はすでに1個持っていて、私はこれを家の鍵として使っています。スマホとセットで動くこいつは、鍵として使うのが一番いい使い方かも。

ちなみにAmazonではめっぽう評価が低い。。多分IFTTTが(直接は)使えなくなったからかな?WebhooksというサービスをかませばIFTTTを使えますし、私自身はそれほど不自由なく使えてます。

Amazon IoT エンタープライズボタン(ダッシュボタン)

結局こいつにしました。こいつ単体でWifiにつながって機能するし、なんせ安い!
アマゾンページ

昔は(?今も?)ダッシュボタンと呼ばれていました。このボタンは「アマゾンでこのボタン1プッシュで特定の商品を再購入するもの」と思っていました。

今は、IoTボタンとしていろいろなことができるようです。

でも、こいつを使うにはAWSというちょっと変態チックなサービスを使う必要があります。そこのハードルが越えられそうな人は、こいつがベストかと思います。

注意!! ブツがやってきたら、箱は捨てないでください!AWSへ登録する際「DSN番号」が登録に必要なためです。私はそそくさとゴミ箱に捨ててしまってゴミあさりするハメにあいました。。。

このバーコード部分は捨てないように!!

全体像

ダッシュボタン(こっちのほうが言いやすい♪) を押して照明を消すまでの流れは、以下の図のとおりです。

ダッシュボタン

AWS IoT 1-Click

AWS Lambda

Webhooks

IFTTT

Nature Remo

照明リモコンのOn/Off信号が送られる

照明オフ

後半の「Webhooks→IFTTT→Nature Remo→照明を消す」というところは参考ページがたくさんあるのですが、AWS→IFTTTへの信号の送り方がむずかしかった。。。

なので、そこを重点的に書きます。具体的には、

  • AWSにアカウント作成
  • AWSにダッシュボタンを登録する
  • AWSにlambdaというプログラムを作る。こいつがWebhooksに信号を送ります。
  • AWSに「ボタンを押したらlambdaのプログラムを動かす」というアプレット(?)を作る。

Webhooksから先はすでに設定済みという前提で話してます。Webhooks→IFTTT→Nature Remo→アクション(照明を消すとか)は、以下のページなどを参考にしてみてください。

IFTTT→Nature Remo: https://qiita.com/fkooo/items/f2ae1af3f51976275654

Webhooks→IFTTT: https://ifttt-japan.club/apply-webhooks

AWSのアカウント作成

こいつをIoTボタンとして使うには、AWSというサービスを利用しないといけません。が、登録してから使えるようになるまでちょっと時間がかかるようです(最大24時間)。なので、ダッシュボタンをアマゾンでポチったら、そいつが家にやってくるまでにAWSへ登録しておきましょう。
https://aws.amazon.com/jp/register-flow/

ちなみに、クレジットカードを登録させられたりと、ちょっとハードルは高いです。「1年間無料」だそうですが、1年後どうなるんだろう。。。

登録時にちょっとトラブったこと
登録は、すべて半角英数字

 住所とかも、全部半角英数字で入れます。
「次へ」ボタンが押せない
 住所を登録して次に行こうとしても、ボタンが押せない状態になりました。一度ページを戻って入力しなおして・・・を3回繰り返したらなぜか押せるように。。
クレジットカードの登録が終わらない
 最初JCBのカードを登録したら、「入力に不備があります」とでて、その先に進めなくなりました。VISAカードを登録したらそれはすんなり登録でき、デフォルトをそのカードにし、再度デフォルトカードをJCBに戻したら、なぜかJCBも使えるようになってました。

ダッシュボタンをAWSに登録

スマホを使って登録します。AWS IoT 1-Clickというアプリをスマホにインストールしてください。登録までの流れはアプリがわかりやすくリードしてくれます。DSN番号の登録でもバーコードリーダーが使えるのでとっても楽ちんでした。
一点、箱にあるバーコードを読み取った後、どうやったら次に進めるのかで迷いました。次に進むには、「スキャンの停止」を押してください。

画面下にあるこのボタンを押せば、次に進めます。キャンセルっぽいけど。。

AWSでプログラム登録 (lambda)

ここだけパソコンでの作業となります。

まずはリージョンを「東京」に!!

これがわからずにはまりました。。。

画面の右上にリージョン(地域)が表示されています。私は最初「オハイオ」になってました。これを、東京に変えてください。

lambdaプログラムの作成

AWSマネジメントコンソールというトップ画面に行ったら、「lambda」というサービスを検索してください。検索窓を使うと便利です。

次に、「関数の作成」をクリック。

一から作成、関数名は任意(日本語はNG。半角英数字のみ)、ランタイムはPython3.8を選択して、右下の「関数の作成」をクリック。

すると中段に以下のようなデフォルトのプログラムが出てきますので、そこを全部消して、以下のプログラムをまるっと貼りつけます。

↓↓貼りつけるプログラム↓↓

import json
import urllib.request

def lambda_handler(event, context):
    url = 'Webhooksのアドレスを置き換える'
    req = urllib.request.Request(url)
    urllib.request.urlopen(req)

↓コード貼り替え後。こんな感じになります。

コード貼り替え後、こんな感じになります。

「url」の’’で囲まれた部分 は、Webhooksのアドレスに貼り替えてください。

[このページ]の真ん中くらいにWebhooksのアドレスについてまとめてくれています。

続いて、画面上段にある「アクション」→「新しいバージョンを発行」をクリック

説明書きには、例えば以下のような感じで入力。

これでlambdaプログラムの登録終了!今度はまたスマホで作業です。

ボタンとlambdaとの紐づけ

パソコンでも作業ができますが、スマホでやったほうが楽だったので、そちらでの作業方法を書きます。

先ほど使った「AWS 1-Click」を起動してください。

以下のような画面が出てくるので、「プロジェクト」をタップ。

右下の「+」ボタンをタップ→「開始」をタップ

プロジェクト名と説明を適当に入力。

デバイステンプレートの定義をタップ

デバイステンプレート名を適当に入れて、デバイスタイプをボタンに、アクションには「Lambda」を選択、右下の「選択」ボタンで先ほど作ったLambda関数を選択。

いっこ前の画面に戻るので、プレイスメントの属性欄の「属性の追加」をタップし、名前を適当に入力、デフォルト値はなんでもOKですがとりあえず0と入力。

プレイスメントの作成から、

名前を適当に入れてデバイスで登録しているダッシュボタンを選択。

これで完成!!!

ダッシュボタンを押して、照明が消えるか試してみてください。

別の部屋のアレクサの音楽を止める方法

リビングにいるとき、別の部屋からうっすらとアレクサ音楽が聞こえてきた。

止めようとしてリビングにあるアレクサに「音楽止めて」と語りかけても別の部屋のアレクサは歌いっぱなし。

スマホのアレクサアプリで止めるのも面倒くさい。

こんな時にどうするかって話です。

定型アクションを作る

  • 左下のホームボタン→左上の3本線→定型アクションをタップ
    →定型アクション一覧画面が出てくる
  • 右上の「+」ボタンをタップ
    →新規作成の設定画面が出てくる
  • 実行条件を設定→開始フレーズを設定→「(アレクサ、)音楽止めて」と入力し、
    右上の「次へ」をタップ
  • アクションを追加→デバイスの設定→オーディオを停止→すべてのデバイス をタップ
  • 右上の「保存」をタップ

これで、「アレクサ、音楽止めて」というとすべてのアレクサが歌うのをやめてくれました。(すべてのアレクサが歌うのをやめます。その点ご注意ください。)

アレクサの定型アクションはどんどん進化してるようです。

GMailからLINEへ転送する② 特定のメール

以下の記事で、GMailをLINEへ転送する方法を書きました。

が、これでは、全件(もしくは固定キーワードでタイトル検索)転送されてしまいます。ウザいですよね。

というわけで、GMailの分類機能(ラベル)を使って特定のメールだけ転送するようにします。

準備1 GMailで「フィルタ」「ラベル」を作成

まずは仕分けのルールを作りましょう。「フィルタ」にひっかかったメールに「ラベル」を付ける作業です。ちなみにラベルとは、分類みたいなものです。

https://support.google.com/mail/answer/6579?hl=ja を参考に、LINEに転送したい条件でフィルタを作ってください。

その際、ラベルを設定するのを忘れずに!
僕は、LINE転送用の「toLINE」というラベルを作成しました。

準備2 GMail→LINEの転送機能を組み込む

以下の記事のように、GMail→LINEの転送機能を組み込みます。

準備3 プログラムの変更

Google Apps Scriptのプログラムを、1箇所だけ書き換えます。
(書き換えた後、保存ボタンを押すのを忘れずに)

24行目にある「検索条件指定」の部分に、「label:ラベル名」を付け加えます。
以下の例では、「toLINE」というラベルがつくメールをLINEへ転送するようになります。

<変更前>

<変更後> 「toLINE」の箇所を自分で作ったラベル名に置き換えてください。

そして保存ボタンを押せば、それで完成!!

これで、好きな条件でLINEへ転送できるようになりました。(条件を変えたい場合はGMAILのフィルタ/ラベルをいじればOk)

GMailからLINEへ転送する

GMailからLINEへ転送するやり方をまとめました。IFTTTがあれば簡単にできたのですが、IFTTTなき今、「Google Apps Script」を使います。

プログラムを使いますが、コピペして1行変えるだけですので安心して読んでください!

準備その1 LINEとの接続キーをもらう

LINE Notifyというところから通知がくるようになります。
まずはそれを使うためのキー(アクセストークン)をゲットしましょう。

ページ数が多くなるので、別記事にしました。以下をご覧ください。

準備その2 Google Apps Script

次はプログラミングです。
作業をしていると、プログラム画面とかが出てきてビビります。が、、、ビビらないでください!LINEのアクセストークンを1箇所貼り付けるだけです! それ以外は一切変更不要です♪

以下のページを参考にさせていただきました。yuuさんのおかげでビビらずにこのフェーズを乗り越えることができました♪
https://note.com/yuut6/n/nb3528b53ddfa

  • デフォルトで記入されているもの(function myFunction(){})をすべて消し、以下のプログラムをコピペ
var lineToken = "xxxxx"; //LINE notify token
var words = ""; //検索したい文字をスペースで区切って入れてください (例)あああ いいい ううう
var f_body = 0; //0:通知に本文を表示させない、1:通知に本文を表示させる
var interval = 1; //何分前からの新着メールを確認する?


function send_line(Me){
 var payload = {'message' :   Me};
 var options ={
   "method"  : "post",
   "payload" : payload,
   "headers" : {"Authorization" : "Bearer "+ lineToken}  
 };
 UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}


function fetchContactMail() {
 //取得間隔
 var now_time= Math.floor(new Date().getTime() / 1000) ;//現在時刻を変換
 var time_term = now_time - ((60 * interval) + 3); //秒にして+3秒しておく
 
 //検索条件指定
  var strTerms = '(subject:{' + words + '} is:unread after:'+ time_term + ')';
 
 //取得
 var myThreads = GmailApp.search(strTerms);
 var myMsgs = GmailApp.getMessagesForThreads(myThreads);
 var valMsgs = [];
 for(var i = 0; i < myMsgs.length;i++){
   valMsgs[i] = " " + myMsgs[i].slice(-1)[0].getDate().getMonth() + "/"+ myMsgs[i].slice(-1)[0].getDate().getDate() 
    + " " + myMsgs[i].slice(-1)[0].getDate().getHours() + ":" + myMsgs[i].slice(-1)[0].getDate().getMinutes() 
    + "\n[from]" + myMsgs[i].slice(-1)[0].getFrom()
    + "\n" + myMsgs[i].slice(-1)[0].getSubject()
   
   if(f_body == 1){
     valMsgs[i] = valMsgs[i] + "\n\n[Message]\n"+ myMsgs[i].slice(-1)[0].getPlainBody();
   }
 }
 
 return valMsgs;
}


function main() {
 new_Me = fetchContactMail()
 if(new_Me.length > 0){
   for(var i = new_Me.length-1; i >= 0; i--){
     send_line(new_Me[i])
   }
 }
}
  • プログラムを書き換える
    1. 1行目の「lineToken=”xxxxxx”の xxxxx を、LINEのアクセストークンに書き換える
      ~2行目以降は変更不要です。お好みで♪~
    2. 2行目はそのままでもOKです。(全部の未読メールがLINEに来ます)
      もしタイトル(subject)に検索をかけたい場合は、 2行目の””の中に、にそのワードをスペースで区切って入力(or条件で検索をかけます)
    3. 3行目もそのままでもOK。もしLINE通知に本文の内容まで載せたい場合は、「0」を「1」に変更してください。
    4. 4行目もそのままでOK。「何分前の未読メールをチェックするか」を指定します。この後の「トリガー設定」にも影響するので、そのままが無難です。
書き換える場所は、ここだけです。
  • プログラムを保存する(Ctrl+Sか、ファイル→保存)
  • 保存ボタンを押すとプロジェクトの名前を聞いてくるので、任意の名前を入力する。(なんでもいいです。以下の画像の「GMAILtoLINE」のところ)

次はテスト実行です!

準備その3 テスト実行

  • まずは自分あてにメールを送信する。
  • 実行→関数を実行→「main」を実行する(1分以内に実行してください)

最初に実行する場合、googleアカウントへの接続承認画面が出てきます。
進めていくと、以下のような画面が出てきてビビりました。

焦らず「詳細」をクリックすると、以下の文章が出てきますので、そこにあるリンク(以下の例では「GMAILtoLINE(安全ではないページ)に移動」)をクリックすればOKです。

  • すでに1分以上経過していると思うので、再度メール送信
  • 実行→関数を実行→「main」を実行する

どうですか?届きましたか?届けば成功です!!

準備その4 トリガーの設定

準備2で作ったプログラムを、1分ごとに実行するための準備です。

  • 編集→「現在のプロジェクトのトリガー」をクリック
  • 右下にある「トリガーを追加」をクリック(見落としがち!)
  • 以下のような設定にする

これで準備はすべて完了!

自分で自分にメールを送って、試してみてください♪1分以内にLINEに通知が届くはず!!

が、これでは、全件(もしくは固定キーワードでタイトル検索)転送されてしまいます。ウザいですよね。

というわけで、特定のメールだけ転送するようにしましょう。(以下の記事にまとめました)

LINE Notifyを使ってみる

~GMailからLINEへ転送するための準備~

以下のサイトを参考にさせていただきました。

https://qiita.com/iitenkida7/items/576a8226ba6584864d95

手順

使うためのキー(アクセストークン)をもらう

  • アクセストークンを発行する
  • トークンをコピーし、メモ帳などに貼りつけておく

これでGMAILからLINEへ転送する準備その1が完了です!
次のステップに進んでください。以下をクリック!!