SwitchBotの人感センサーの動体検出記録をテキストファイルにしたい
1日分を1ページにしたい。
しかし、
- アプリの履歴画面に表示されている内容はどうやってもコピペできそうにない。
- アプリの「オートメーション」機能を使ってもテキストファイルに出力できる方法は無さそう。
可能性がありそうなのが「クラウドサービス」。人感センサーとIFTTTを連携できる。
試しにIFTTTのアプレットを作ってみた。
しかし、時刻が「June 7, 2023 at 09:54PM」のようなRFC2822形式に近い形式で出力されてしまう。( 少なくとも、ISO8601(「2023-06-07T09:54:00Z」)の様な形式であったならなぁ)
これまでなら「June 7, 2023 at 09:54PM」のような形式で我慢するしかなかったが、IFTTTはProユーザなのでスクリプトを走らせることができる「フィルターコード」機能が利用可能。
これを使ってみることにする。
たしかRFC2822形式からISO8601形式への変換はDateオブジェクトのメソッドでできたような記憶がある。
コードを例示してくれるChatGPTに尋ねてみた。
やはり、できるみたいだ。
ただ、ChatGPTの例示したコードのままではエラーになって上手く変換してくれなかった。そこで、12時間制を24時間制に変えて「at」を削るようにしてみた。
また、世界標準時となって9時間前の時刻になってしまうので、最後の部分に「 +0000」を追加した。
そして
- ノートのタイトルは日付だけ
- 本文は時刻を1行ずつ
になるようにした。
完成後、放置しておいたらデータが溜まっていた。
だが、一件ごとに1ノートが作られてしまう。
OneNoteはCreateアクションがあるだけで、追記アクションが無さそうだからだろう。
仕方がないので保存先をEvernoteに変えてみた。
こちらはappendToNoteアクションがあるから大丈夫だろう。
目論見通りに1日分が1ページになった。
少々問題点があった。
不思議なことに、iPadのEvernoteアプリだと一行ごとに一時刻が表示されるのに、iPhoneのEvernoteアプリだと改行されない。全部が一行に続けて表示されてしまう(空白で区切られてはいるが)。
また、
午前0:01が12:01と記録されてしまった。
「PMと書かれていたら12を足す」というだけ処理では午前12時の処理で失敗してしまう。
そこで、12時の処理に手を加え、<br/>
での行区切りを<p> 〜 </p>
での区切りに変えてみた。これで行区切りが直れば良いが。
const date = Switchbot.motionTriggerJa.CreatedAt; const dtA = date.split(" "); const tA = dtA[4].match(/(\d+):(\d+)/); dtA[4] = parseInt(tA[1] == "12" ? "0" : tA[1]) + (/PM/.test(date) ? 12 : 0) + ":" + tA[2]; const dateObj = new Date(dtA[0] + " " + dtA[1] + " " + dtA[2] + " " + dtA[4] + " +0000"); const fd = dateObj.toISOString(); Evernote.appendToNote.setTitle(fd.slice(0,10)); Evernote.appendToNote.setBody("<p>" + fd.slice(11,16) + "</p>");
しかし、Evernoteアプリの同期が遅すぎる。
「最近使用したノート」一覧のサムネイルには8つ以上の時刻が表示されるのに、そのノートを開くと6つしか書かれていない。
そのノートの「ノートの情報」を見ても最後にIFTTTで追記した時刻が更新日の欄に書かれているというのに。
サムネイルやノート情報の同期は早いのに、ノート本体の同期は遅い。半日経っても同期が完了しない。
Evernote Webなら追記が直ぐに反映されていた。ただ、ノートを開くのに時間がかかる。表示ノートを切り替えると酷い時には20秒ほどクルクル回って待たされる。
IFTTTのView activityを見たら、Applet failedになっていた。
Evernoteで失敗しているようで、「Unable to append to note. Problem parsing ENML.」となっている。
そこで、改行の仕方を変えた。
const date = Switchbot.motionTriggerJa.CreatedAt; const dtA = date.split(" "); const tA = dtA[4].match(/(\d+):(\d+)/); dtA[4] = parseInt(tA[1] == "12" ? "0" : tA[1]) + (/PM/.test(date) ? 12 : 0) + ":" + tA[2]; const dateObj = new Date(dtA[0] + " " + dtA[1] + " " + dtA[2] + " " + dtA[4] + " +0000"); const fd = dateObj.toISOString(); Evernote.appendToNote.setTitle(fd.slice(0,10)); Evernote.appendToNote.setBody(`${fd.slice(11,16)} `);