空メッセージを送れない MQTT アプリからカスタムアプリを削除する
MQTT を使って Awtrix を制御することができるが、コマンド一覧は API のページに列挙されている。
この中で、カスタムアプリを削除するには空のペイロード・本文をトピックに送ればよいと書かれている(To remove a custom app, dispatch an empty payload/body to the associated topic or URL.)。
ところが、 MQTT アプリの中には空のメッセージを送れないものがある(Android の MyMQTT や MQTT Clientなど)。
かといって "" などを送っても空と解釈はされない。
Awtrix の JSON の解釈はわりと厳密で、末尾に余分な改行があっても動作しない。
試行錯誤してみたが、
{}
のように空のオブジェクトを送ったところ、無事アプリの削除ができた。
カスタムアプリの削除は前方一致
MQTT によるカスタムアプリの送信では、複数のオブジェクトを配列化することで複数のカスタムアプリを一度に作ることができる。この時、各アプリ名はトピック名の末尾に0からの連番が付加される。
このような管理をすることで、連番を除いたトピック名に空の本文を送ることにより配列全部のカスタムアプリを削除することができる。
この一括削除は配列による複数自動生成に限った仕様ではないため、他のカスタムアプリの先頭部分に同じ文字列が入っていた場合、それらも削除されてしまう。
例えば、 tokyotemp というアプリ名でアメダス気温を表示させつつ、 tokyo というトピック名で予報の配列を送った場合(それぞれ tokyo0・tokyo1 のようになる)を考える。
予報のみを削除しようとして tokyo に空の本文を送ると、 tokyo0・tokyo1だけでなく、 tokyotemp も消えてしまう。
tokyotemp を削除しないためには、面倒でも tokyo0・tokyo1 それぞれに空の本文を送る必要がある(もちろんトピック名を tokyoforecast のように指定すればよい話なのだが)。
他のアプリ削除時に意図せぬ削除が生じないよう、アプリ名(トピック名)を設定する時は注意が必要である。