見出し画像

ようやくDark SkyからOpenWeatherMapへ移行できました

Dark Skyサービス終了で天気予報が使えなくなった!

先日、Appleに買収されたDark Skyサービスを終了し、以前、苦労してつくったM5Stackの天気予報表示機が使えなくなりました。しばらくは「無くてもいいかな」と思っていたのですが、どうにも不便で我慢できなくなり、別な天気予報サービスを探して作り直すことにしました。

ChatGPT君「Arduioで使える天気予報サービスを教えて!」

もう作り直すのは、うんざりなので有料でもいいから永続的に使えそうな天気予報サービスをChatGPTで聞いてみました。

ChatGPTへお尋ね

完璧じゃん!。というわけでOpenWeatherMapに決定しました。

OpenWeatherMapでつまづいたところ

文章すると長くなるので箇条書きにします。

  • トークンが取得できても、すぐに使えない。
    数時間後くらいに使えるようになる。

  • バージョンがv2.5とv3.0の2種類ある
    1時間ごとの予報が必要ならv3.0一択

  • v3.0はクレカ登録が必要
    アクセス頻度が低ければ、無料で使える

  • ArduioJsonだと不安定かも
    後記参照

  • 無料のつもりだったが、なんか請求きた
    1日1000コールまで無料なのだが、60円くらいの請求が来た。やっぱりリミッターはかけておくべき。

基本プランの上限設定が可能

ArduinoJsonで嵌る

さて、この記事で書きたかったのは、ここからです。ネット上ではAruduino+OpenWeatherMapの記事も掲載されています。ただ、これらの記事では、たいてい、ArduinoJsonでデシリアライズを行っています。

私も、最初まるパクで動いたので「簡単じゃん!」と思ったのですが、ここからが試練の場でした。結論からいうと、ArduinoJsonを使うと、メモリーを消費しすぎて、動作が不安定になります。ArduinoJsonの場合…

  1. 送られてくる全データを一旦、文字列として格納する

  2. その文字列を確保したバッファを使いデシリアライズする

という手順を踏みます。この両方に数十KBを消費します。サンプル程度なら動作するのですが、プログラムサイズが大きくなると、サーバーに接続できないや、格納やデシリアライズに失敗するなど、頻繁に不具合が発生します。

要求するときに、いらないデータとかの除外設定すれば、サイズダウンさせることもできるのですが、実際のところ、その程度では追いつきません。万策尽きたところで、ArduinoJsonを捨て、JsonListenerに救いを求めることになりました。

結局JsonListenerに救われる

JsonListenerライブラリは、文字ごと(キーワード)にパースし、ほとんどメモリー使いません。このライブラリの使いかたを説明すると長くなるので、要点だけ箇条書きにします。

  • JsonListenerは純粋仮想クラスです
    派生先で仮想メソッドをオーバーライドして使います。

  • 仮想メソッドはstartObjectやKeyなど、構文の要素ごとで呼び出されます
    複雑なJsonだと、どのオブジェクト中のキーなのか判別できません。これらの判別は、自分で判別ロジックを組む必要があります。

  • 配列の個数取得も困難です
    startArrayメソッド内でカウントしていけば良そうな気がしますが、配列のネクスティングがあったりすると無理だと理解できると思います。ネクスティングの深度も考慮しつつコーディングする必要があります。

  • parser.reset()
    繰り返しパースする場合は、はじめにresetメソッドを呼び出してくだい。私は、これに気づかず、かなり時間をロスしました。

Drakskyライブラリで、JsonListenerが使われていますので、参考になると思います。




この記事が気に入ったらサポートをしてみませんか?