(N番煎じ)寒暖差疲労を阻止するために気温差がわかるLINEbotを作成してみた

### (N番煎じ)寒暖差疲労を阻止するために気温差がわかるLINEbotを作成してみた

#### 1.寒暖差疲労がつらい
寒暖差疲労をご存じでしょうか？
気温の変化が大きい季節の変わり目に、気温差が原因で自律神経の働きが乱れることで
疲労がたまることを「寒暖差疲労」というとのこと。
とくに秋～冬の気温差が激しいときにやられる人が多いようで、
私も10月から「寒暖差疲労」にやられ、頭痛と戦う毎日である。
 **つらい～～ 何とかしたい**
![sotomawari_samui_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885686/83b36b8a-21d6-a992-0d7f-2164877f373d.png)



#### 2.プッシュ通知（アプリ）見ない問題
そんなに寒暖差疲労がつらいなら、 **ちゃんと天気予報をみれば？** と言われそう。
事実、一定の気温差があると通知を送ってくれるアプリや表示するアプリはある。
ただし、ここで私の性格が問題になってくる。
私はアプリの **「プッシュ通知」が苦手**なのだ。
本当はOutlookやTeamsの通知も切りたいのだが、仕事にならないので通知をオンにしている。
その分、プライベートではできるだけ **プッシュ通知をオフにしたい**

https://about.yahoo.co.jp/pr/release/2022/09/22a
画面上に気温差を表示してくれるアプリは失念。

#### 3.ないなら作ってしまおう
プッシュ通知が苦手なら、必要な時に教えてくれるものがあればいい。
偶然にも？Node-REDを使用したLINE botの構築方法を教わったばかりである。
よい機会なので自分で作ってみることにした  **（超強引）**

#### 4.構築したLINE bot

 **1.LINE bot **
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">N番煎じにはなりますが、天気予報APIの情報をもとに気温差を教えてくれるLINE botを作ってみました <a href="https://t.co/0QzEkedfUw">pic.twitter.com/0QzEkedfUw</a></p>&mdash; きく (@AYE7WvdouqRwaNp) <a href="https://twitter.com/AYE7WvdouqRwaNp/status/1584124209273270272?ref_src=twsrc%5Etfw">October 23, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
 

 **2.Node-RED**
![1023_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885686/c3b1eb01-20b5-f89f-482e-e119c73cb1d7.png)


```
[{"id":"8f7e029e5ada42e2","type":"tab","label":"フロー 8","disabled":false,"info":"","env":[]},{"id":"db4de16f71489127","type":"http request","z":"8f7e029e5ada42e2","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://weather.tsukumijima.net/api/forecast/city/130010","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"x":470,"y":240,"wires":[["18356d221442d606"]]},{"id":"18356d221442d606","type":"function","z":"8f7e029e5ada42e2","name":"","func":"//今日の日付と最高気温・最低気温\nmsg.today = msg.payload.forecasts[0].date;\nmsg.todayMin = msg.payload.forecasts[0].temperature.min.celsius;\nmsg.todayMax = msg.payload.forecasts[0].temperature.max.celsius;\nmsg.todaySa = '';\n\n//明日のの日付と最高気温・最低気温\nmsg.tomorrow = msg.payload.forecasts[1].date;\nmsg.tomorrowMin = msg.payload.forecasts[1].temperature.min.celsius ;\nmsg.tomorrowMax = msg.payload.forecasts[1].temperature.max.celsius ;\nmsg.tomorrowSa = '';\n\n//明後日の日付と最高気温・最低気温\nmsg.datomorrow = msg.payload.forecasts[2].date ;\nmsg.datomorrowMin = msg.payload.forecasts[2].temperature.min.celsius ;\nmsg.datomorrowMax =  msg.payload.forecasts[2].temperature.max.celsius  ;\nmsg.datomorrowSa = '';\n\n//ステッカー用気温差\nmsg.kionsa = \"\";\n\n// 今日の最低気温がNullじゃなかったら気温差を取得\nif(msg.todayMin !== null){\n    msg.todaySa = msg.todayMax - msg.todayMin;\n    \n}\n\n// 明日の気温差を取得\nmsg.tomorrowSa = msg.tomorrowMax - msg.tomorrowMin,\n\n//明後日の気温差を取得\nmsg.datomorrowSa  = msg.datomorrowMax - msg.datomorrowMin;\n\n//日付間の気温を比較する\nif(msg.todayMin == null){\n    msg.kionsa =msg.datomorrowSada - msg.tomorrowSa \n}\n\n//メッセージ値作成\n//今日の最低気温がNullの場合、明日と明後日の情報を返す\nif(msg.todayMin == null){\nmsg.payload = msg.tomorrow\n+\"\\n明日の最低気温\" + msg.tomorrowMin + \"度\"\n+\"\\n明日の最高気温\"+ msg.tomorrowMax  + \"度\"\n+\"\\n気温差\" + msg.tomorrowSa  + \"度\"\n+\"\\n\"+msg.datomorrow\n+\"\\n明後日の最低気温\" + msg.datomorrowMin + \"度\"\n+\"\\n最高気温\" + msg.datomorrowMax  + \"度\"\n+\"\\n気温差\" + msg.datomorrowSa  + \"度\";\nmsg.kionsa = Math.abs(msg.tomorrowSa);\n}\n\n//今日の最低気温がNullじゃない場合、明日と明後日の情報を返す\nelse if(msg.todayMin !== null){\nmsg.payload = msg.today\n+ \"\\n今日の最低気温\"  + msg.todayMin + \"度\"\n+\"\\n今日の最高気温\"  +msg.todayMax +\"度\"\n+\"\\n気温差\" + msg.todaySa +\"度\" \n+\"\\n \" + msg.tomorrow\n+\"\\n明日の最低気温\" + msg.tomorrowMin + \"度\"\n+\"\\n明日の最高低気温\" + msg.tomorrowMax  + \"度\"\n+\"\\n気温差\" + msg.tomorrowSa + \"度\";\nmsg.kionsa = Math.abs(msg.todaySa);\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":640,"y":240,"wires":[["598be7e281d8279d","6a842aff27c4c22b"]]},{"id":"598be7e281d8279d","type":"delay","z":"8f7e029e5ada42e2","name":"","pauseType":"delay","timeout":"500","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":390,"y":360,"wires":[["bb44f08e740895d7"]]},{"id":"88cd2751dbf042fb","type":"http request","z":"8f7e029e5ada42e2","name":"","method":"use","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"x":730,"y":360,"wires":[["8d22f4542339a46b"]]},{"id":"8d22f4542339a46b","type":"debug","z":"8f7e029e5ada42e2","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":930,"y":360,"wires":[]},{"id":"1a639f5325dc8fad","type":"Webhook","z":"8f7e029e5ada42e2","name":"","url":"/webhook","x":280,"y":240,"wires":[["db4de16f71489127"]]},{"id":"6a842aff27c4c22b","type":"ReplyMessage","z":"8f7e029e5ada42e2","name":"","replyMessage":"","x":900,"y":240,"wires":[]},{"id":"bb44f08e740895d7","type":"function","z":"8f7e029e5ada42e2","name":"","func":"msg.type = \"sticker\";\nmsg.packageId = \"\";\nmsg.stickerId = \"\";\n//イメージをPUSH送信するためのパラメーター設定\nif(msg.kionsa > 5){\n    msg.packageId =\"789\";\n    msg.stickerId = \"10894\";\n}else{\n    msg.packageId =\"789\";\n    msg.stickerId = \"10858\";\n}\n\nmsg.url=`https://api.line.me/v2/bot/message/push`;\nmsg.method=`POST`;\nmsg.headers={\n   \"Authorization\":\"Bearer Token\",\n   \"Content-Type\":\"application/json\"\n};\n\nmsg.payload={ \n\t\"to\":\"userid\",\n\t\"messages\":[\n\t\t{\n            \"type\":\"sticker\",\n           \"packageId\":msg.packageId,\n           \"stickerId\":msg.stickerId\n           }\n\t]\n\n};\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":560,"y":360,"wires":[["88cd2751dbf042fb"]]}]
```
 LINE botは2段階構成で構築した
     **2-1.** API情報を呼び出し、気温と気温差を算出する。算出した結果を加工しをメッセージで送信する。
    気温差の計算とメッセージ作成はFunctionノードで実装した。
![1023_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885686/2f4c756b-23aa-11a4-d55f-23547f334ceb.png)
     **2-2.** 気温差をもとにスタンプを追加で送信する。
気温差は2-1のFunctionノードで計算している。その値を使用し送付するスタンプ情報を判定する。
![1023_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885686/b70901a8-9e69-3189-1dd2-b8ac8af77754.png)

**3.環境**
    ・Node-RED 
    ・JavaScript
    ・[LINE Massaging API](https://developers.line.biz/ja/services/messaging-api/)
    ・[天気予報API](https://weather.tsukumijima.net/)


#### 5.工夫した点
構築に使用したAPIはAPI実行日を含め3日分の天気情報が連携される。
しかし、API実行日当日の最低気温の値が 取得できない。
また、API実行時間によって当日の最高気温も取得不可である。
当日の最低気温が `null` の場合、明日と明後日の情報をメッセージに設定することにした。
また、テキストだけでは気温差に気を付けるべきか分かりにくいため、
気温差が5度以内の場合はOKのスタンプを表示し、5度以上ある場合厚着しているスタンプを表示した。
（こうでもしないと、外出時に上着を持っていくことを忘れてしまう。）
![LINEスタンプ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885686/c4fd0a1b-3728-1b83-fd71-50e3adb03b2e.png)

また、LINE botのリッチメニューはURLリンクを設定できる。
詳細な天気予報を見たい時のためにYahoo天気・災害のリンクを左に、
寒暖差疲労に関するセルフチェックができる頭痛ーるのリンクを右に配置した。
これで、天候に関する見たい情報を一か所にまとめることができた。

#### 6.余力があったらやりたかったこと
天気情報が「東京」で固定のため、地域名を入れたらその地域の天気情報をもとに
地域ごとの気温差情報をメッセージに表示する。