工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

IFTTTが有料化するので、Webhooks/LINE Notify連携レシピの代替をAWSで検討する

概要


IFTTTのWebhook+LINE Notify連携の代替として、AWS API Gateway + Lambdaの動作を確認した。



背景と目的


IFTTTが2020年10月6日に有料化するらしい。無料枠が少しだけあるのだが、私の場合そこに収まり切らないので、代替が難しそうなレシピを無料枠に充て、他のものはIFTTTより安く実現できる代替手段を検討している。

最近作成した自動水やり器では、

Webhookチャンネルでデータを受けて、LINEチャンネルでLINEのトークルームに結果通知するレシピ

を使っているが、AWSAPI Gateway+Lambdaに変更できそうに思えるので、ちょっと試しにやってみる。この組み合わせだと、使用規模次第で無料枠に収まる。Microsoft Flowも当然候補だが、すでにAWS使っちゃってるので優先で。


詳細


1. LINE NotifyのAPI

ちょっと調べただけで、

qiita.com

など、たくさんの情報が出てきた。Notifyでトークルームに送信できるAPIが用意されているらしい。とりあえず、上記の例はNode.jsだが、ここではPythonスクリプトを書いて試す。

1.1 トークンの取得

LINE NotifyのAPIをたたくには、LINE NotifyのWebサイトにログインして、トークンの取得が必要。トークルームごとにトークンを取得する必要があるようだ。というわけで、以下のボタンを押して表示されたものをメモ。なお、トークンごとに識別名を任意に与えられるらしく、送信時にメッセージの先頭につくらしい。


2 試しに送信

以下を作成。tokenとmessageは外から与える想定。下の方に、試しに動かすコード。

# coding: utf-8

import requests
import json

def post_LINE_Notify(token, params):

    URL = "https://notify-api.line.me/api/notify"
    headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        "Authorization": "Bearer %s" % token
    }
    response = requests.post(URL, data=params, headers=headers)
    ret = {
        "response": json.loads(response.text)
    }
    
    return ret


if __name__ == "__main__":

    token = "取得したトークン"
    params = {
        "message": "これはテストです。" # paramsの中身は、https://notify-bot.line.me/doc/ja/ 参照
    }
    ret = post_LINE_Notify(token, params)
    print(ret)

printした結果は、以下の通り。ステータスコード200が返ってきた。

{'response': {'status': 200, 'message': 'ok'}}

一方、LINEの画面は以下の通り。ちゃんと受信している。 園芸IoTという部分は、トークンを取得する際に、識別名として与えたもの。(自動水やり器の通知用トークルームに送信するのでこんな名前)


3. APIGateway + Lambda

3.1 APIGateway

IFTTTと同じ感じにするため、APIのリソースに、{event}というパスパラメータを用意。 リクエスト統合のapplication/jsonマッピングテンプレートでメソッドリクエストのパススルーを使った場合、Lambdaのevent引数のevent.path.eventに入ってくれる。 (AWSでやるなら、別に互換性持たせずむしろもっといろいろできる仕様にした方がいいかもしれないが)


3.2 Lambda

IFTTTでは、本文のJSONでvalue1,2,3を受け取り、パスパラメータでevent名を受け取って、LINE Notify本文を構成する。ここではテストなので、とりあえずパラメータを全部流す。

def lambda_handler(event, context):
    
    token = "取得したトークン"
    params = {
        "message": "event=%s\nvalue1=%s\nvalue2=%s\nvalue3=%s" % \
            (event["params"]["path"]["event"], 
            event["body-json"]["value1"],
            event["body-json"]["value2"],
            event["body-json"]["value3"])
    }
    # 送信
    ret = post_LINE_Notify(token, params)
    
    return ret


3.3 試し実行

LINEの方も、正しく受信できた。

というわけで、一応、API GatewayとLambdaで置き換えできそう。ノンプログラミング環境からの乗り換えにはなるが、発展性があるのでよしとする。


まとめと今後の課題


IFTTTのWebhook+LINE Notify連携の代替として、AWS API Gateway + Lambdaの動作を確認できた。こちらに置き換えようと思う。


リモート水位センサシステム ver2(4) 筐体内温度の上昇を抑えるカバーの効果を検証、2年目稼働状況のまとめ

概要

リモート水位センサ筐体内温度の上昇を抑えるカバーの効果を検証し、期待通りの効果があったことを確認できた。


背景と目的

今年もいよいよ稲刈りの時期が来て、田んぼに水がなくなったため、リモート水位センサも出番が終わった。2年目のシーズンも故障なく無事稼働してくれた。そこで、今年のまとめとして、真夏の筐体内温度上昇を抑えるためのカバー装着効果を検証しておく。


詳細

1. 条件

  • 筐体内温度
    • リモート水位センサシステム内蔵温度計
    • 2019年のデータ
      • 2019/06/28~2019/09/05
    • 2020年のデータ
      • 2020/06/28~2020/09/05
  • 筐体内温度と気温を比較(気象庁データのうち、水位センサ所在地から最も近い地点の温度を使用)


2. 結果

以下の通り、2019年に比べて2020年は温度上昇が抑えられている。特に、日照時間割合が高い、つまり日が照っている状態での温度上昇が抑えられている。なお、日照時間割合が1の場合の平均的な温度は、

  • 2019年: 48℃
  • 2020年: 43℃

と5℃の差となった。事前検証で5~10℃くらいが期待できると書いたが、ほぼその通りになった。

2019年

50℃を頻繁に超えている。

f:id:dekuo-03:20200909233332p:plain

2020年

50℃を超えたのは1度だけ。

f:id:dekuo-03:20200909233336p:plain

比較

すべての日照時間割合のパターンで比較。特に、気温が高いときに、温度上昇が抑えられている。

f:id:dekuo-03:20200909233339p:plain


3. 2年目のまとめ

こちらで、今シーズン開始前にメンテナンスをした内容に沿って書く。

  • 電池容量アップ
    • 使用したエネループが別件でダメージを受けていたらしく、今シーズン開始後早々にくたばってしまった。そのため、通常の乾電池を使用したのだが、その乾電池も怪しいメーカーのものだったらしくあまり持たなかった。再度交換した乾電池は、問題ない。ソーラー発電+リチウムイオン電池蓄電も稼働実績が上がってきているので、来年はソーラーで駆動したい。
  • 水位の分解能調整
    • これは、あまりメリットがなかった。まあ、水位の変化が頻繁に起こるので、わかりやすいといえばわかりやすいが、干上がるか、そうでないかというレベルの判断にはいらなかった。もし、次のモデルを作るようなら、大雑把でいいと思う。
  • 温度上昇を防ぐカバーの装着
    • 上記の通り。十分効果があった。来年もカバー装着する。


まとめと今後の課題

平均的に5℃程度上昇を抑えられ、ほぼ狙い通りの効果が得られたと思う。来年も、装着することにする。


気づいたら、LINEの通話呼び出し(音またはバイブレーション)がされなくなっていたので直した

概要

LINEの通話呼び出しがされなくなっていたので直した。


背景と目的

最近、自分や周りの人のスマホで、LINEの通話がかかってきたときに音もバイブレーションもなく気づけないというトラブルが起きていた。メッセージよりも即時性が求められる通話の呼び出しがされないのは不便なので、ちゃんと呼び出しされるように直す。


詳細

1. 環境

f:id:dekuo-03:20200906214919p:plain


2. 調べる

Web上に何かしら情報はあるだろうと探してみた。以下を見てどうにかなりそうなので、参考にした。

appllio.com


3. 直す

結論から言うと、LINEアプリ内の通知に関する設定を直せばOKだった。 LINEのホーム > 設定 > 通知 と進むと、下の方に通話に関する通知設定がある。私の場合、以下のように音声なしとなっていた。

f:id:dekuo-03:20200906214938p:plain

なので、

  • "アラートを受け取る"を選ぶ
  • "ポップアップ"を有効にする

という2つを行った。

f:id:dekuo-03:20200906215125p:plain

試しに、通話呼び出しをしてみたところ、ちゃんと呼び出されるようになった。(私の場合、呼び出し音はなくしているのでバイブレーションのみ)AQUOSフォン(私のモデルとは違う)を使っている周りの人も同じ設定変更で、ちゃんと呼び出しされるようになった。


4. 呼び出しされなくなった原因

はっきり言って、よくわからない。とはいえ、自分でいじった記憶もないし、周りの人も同じ反応であることを考えると、機種固有機能やソフトウェアアップデートによって、何らかの影響を受けているのではないかという気がしてならない。2であげた参考サイトに、AQUOSフォンでは高度なマナーモードという機能があって、それの影響をほのめかす記述があるのも気になる。とはいえ、LINE内の設定自体が影響を受けるのも考えにくいので、こちらはLINEのアップデートのせいかも?いずれにしろ、原因ははっきりしない。


まとめと今後の課題

LINEの通話呼び出しがされるようになった。とはいえ、もともと設定を変えた記憶がないので、もし本当に勝手に変わっていたとすると、納得がいかないなあ。