LINE WORKSとObnizで遊ぼ

## LINE WORKS と Obnizで遊ぼ

LINE WORKS の API と Obniz と Node-RED で遊んでみたいと思います。
* 本記事は完全にお遊びです。


## なにをするか

Obniz に接続したボタンの押下を Node-RED で検知し、 LINE WORKS のカレンダーに自動で予定を入れます。

急な作業や MTG で自分の予定をブロックしたい時や予定表に予定を登録し忘れた際に使えるかもと無理くりユースケースを考えました。
( Obniz 使ってみたいだけだったり。。。)

## 使用する API , IoT 機器
LINE WORKS の API は以下を利用します。

サービス API カレンダー - 予定作成 API

https://developers.worksmobile.com/jp/document/1007012?lang=ja


Obniz には、添付のようなボタンを使用します。
(BICライターと比較するととても小さいことが分かりますね)
![IMG_1261.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430353/35a815a0-427d-75be-7485-b272fe81cf22.jpeg)


## 動かしてみる

今回は、Obniz でボタンを押すと、その時間から1時間の予定を自動で挿入するようにします。
LINE WORKS に予定を入れる際には, iCalendar 形式で入れる必要があります。

動作の様子は添付から見れます。

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/elwBky5INS">pic.twitter.com/elwBky5INS</a></p>&mdash; Kazuma Shirai (@ShiraiKazuma) <a href="https://twitter.com/ShiraiKazuma/status/1340160142088630273?ref_src=twsrc%5Etfw">December 19, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 



## 構成

ざっくりしたものですが、構成は以下です。

![スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430353/e4e76f73-7de1-834f-7beb-03af59a0b68f.png)

また、Node-RED上でのコードはこちらです。
ご自身の情報を入れればすぐ動かせるようになると思います。
<details>
<summary>コード</summary>
<div>
[{"id":"5f07fdf3.a94c54","type":"function","z":"af6ade02.80f53","name":"create request","func":"let cid = `${ msg.payload }@kazuma.com`;\nmsg.api_id = \"LINE WORKSのAPI_IDを入力\";\nmsg.service_consumer_key = \"LINE WORKSのコンシューマーキーを入力\";\nmsg.url = `https://apis.worksmobile.com/r/${ msg.api_id }/calendar/v2/users/me/calendars/defaultCalendarId/events`;\nmsg.method = \"post\";\nmsg.headers = {\n    \"consumerKey\" : `${ msg.service_consumer_key }`,\n    \"Authorization\" : `Bearer  ${　\"LINE WORKSのアクセストークンを入力\" }`\n}\n\nlet kizyun = new Date();\n\nlet year = kizyun.getFullYear();\nlet month = kizyun.getMonth()+1;\nlet date = kizyun.getDate();\nlet hour = kizyun.getHours();\nlet minute = kizyun.getMinutes();\n\nlet start_day = `${ year }${ month }${ date }T${ hour }${ minute }00`;\n\nkizyun.setHours( kizyun.getHours() + 1 );\n\nyear = kizyun.getFullYear();\nmonth = kizyun.getMonth()+1;\ndate = kizyun.getDate();\nhour = kizyun.getHours();\nminute = kizyun.getMinutes();\n\nlet end_day = `${ year }${ month }${ date }T${ hour }${ minute }00`;\n\n\nmsg.payload ={\n    \"ical\": \n`BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:LW Calendar\nCALSCALE:GREGORIAN\nBEGIN:VTIMEZONE\nTZID:Asia/Tokyo\nBEGIN:STANDARD\nDTSTART:19700101T000000\nTZNAME:GMT+09:00\nTZOFFSETFROM:+0900\nTZOFFSETTO:+0900\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nSEQUENCE:0\nCLASS:PUBLIC\nTRANSP:OPAQUE\nUID:${ cid }\nDTSTART;TZID=Asia/Tokyo:${ start_day }\nDTEND;TZID=Asia/Tokyo:${ end_day }\nSUMMARY:作業\nDESCRIPTION:声かけないで\nLOCATION:家\nEND:VEVENT\nEND:VCALENDAR`\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":740,"y":1040,"wires":[["baa19c83.f81ce"]]},{"id":"baa19c83.f81ce","type":"http request","z":"af6ade02.80f53","name":"->LW","method":"use","ret":"obj","paytoqs":false,"url":"","tls":"","persist":false,"proxy":"","authType":"","x":910,"y":1040,"wires":[["536365b5.6d7f24"]]},{"id":"536365b5.6d7f24","type":"debug","z":"af6ade02.80f53","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1030,"y":1040,"wires":[]},{"id":"d7e35259.7d032","type":"uuid","z":"af6ade02.80f53","uuidVersion":"v4","namespaceType":"","namespace":"","namespaceCustom":"","name":"CalendarID生成","field":"payload","fieldType":"msg","x":540,"y":1040,"wires":[["5f07fdf3.a94c54"]]},{"id":"c0022311.7d937","type":"obniz-function","z":"af6ade02.80f53","obniz":"","name":"","code":"  const button = obniz.wired(\"Keyestudio_Button\",{signal:0,vcc:1,gnd:2})\n  button.onchange = (state) =>{\n      if( !state ){\n          node.send( msg )\n      }\n  }","x":340,"y":1040,"wires":[["d7e35259.7d032"]]},{"id":"61d1d91e.bfce4","type":"inject","z":"af6ade02.80f53","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":1040,"wires":[["c0022311.7d937"]]}]
</div>
</details>

## 最後に

今回は、LINE WORKS , Node-RED , Obniz を使って遊んでみました。
興味がある人がいれば幸いです。