ようやくDark SkyからOpenWeatherMapへ移行できました
Dark Skyサービス終了で天気予報が使えなくなった!
先日、Appleに買収されたDark Skyサービスを終了し、以前、苦労してつくったM5Stackの天気予報表示機が使えなくなりました。しばらくは「無くてもいいかな」と思っていたのですが、どうにも不便で我慢できなくなり、別な天気予報サービスを探して作り直すことにしました。
ChatGPT君「Arduioで使える天気予報サービスを教えて!」
もう作り直すのは、うんざりなので有料でもいいから永続的に使えそうな天気予報サービスをChatGPTで聞いてみました。
完璧じゃん!。というわけでOpenWeatherMapに決定しました。
OpenWeatherMapでつまづいたところ
文章すると長くなるので箇条書きにします。
トークンが取得できても、すぐに使えない。
数時間後くらいに使えるようになる。バージョンがv2.5とv3.0の2種類ある
1時間ごとの予報が必要ならv3.0一択v3.0はクレカ登録が必要
アクセス頻度が低ければ、無料で使えるArduioJsonだと不安定かも
後記参照無料のつもりだったが、なんか請求きた
1日1000コールまで無料なのだが、60円くらいの請求が来た。やっぱりリミッターはかけておくべき。
ArduinoJsonで嵌る
さて、この記事で書きたかったのは、ここからです。ネット上ではAruduino+OpenWeatherMapの記事も掲載されています。ただ、これらの記事では、たいてい、ArduinoJsonでデシリアライズを行っています。
私も、最初まるパクで動いたので「簡単じゃん!」と思ったのですが、ここからが試練の場でした。結論からいうと、ArduinoJsonを使うと、メモリーを消費しすぎて、動作が不安定になります。ArduinoJsonの場合…
送られてくる全データを一旦、文字列として格納する
その文字列を確保したバッファを使いデシリアライズする
という手順を踏みます。この両方に数十KBを消費します。サンプル程度なら動作するのですが、プログラムサイズが大きくなると、サーバーに接続できないや、格納やデシリアライズに失敗するなど、頻繁に不具合が発生します。
要求するときに、いらないデータとかの除外設定すれば、サイズダウンさせることもできるのですが、実際のところ、その程度では追いつきません。万策尽きたところで、ArduinoJsonを捨て、JsonListenerに救いを求めることになりました。
結局JsonListenerに救われる
JsonListenerライブラリは、文字ごと(キーワード)にパースし、ほとんどメモリー使いません。このライブラリの使いかたを説明すると長くなるので、要点だけ箇条書きにします。
JsonListenerは純粋仮想クラスです
派生先で仮想メソッドをオーバーライドして使います。仮想メソッドはstartObjectやKeyなど、構文の要素ごとで呼び出されます
複雑なJsonだと、どのオブジェクト中のキーなのか判別できません。これらの判別は、自分で判別ロジックを組む必要があります。配列の個数取得も困難です
startArrayメソッド内でカウントしていけば良そうな気がしますが、配列のネクスティングがあったりすると無理だと理解できると思います。ネクスティングの深度も考慮しつつコーディングする必要があります。parser.reset()
繰り返しパースする場合は、はじめにresetメソッドを呼び出してくだい。私は、これに気づかず、かなり時間をロスしました。
Drakskyライブラリで、JsonListenerが使われていますので、参考になると思います。
この記事が気に入ったらサポートをしてみませんか?