ChoregrapheでつくるPepperアプリで自分自身のバージョンを取得する


事情というか経緯

今、Pepper for Biz向けの野良アプリを複数ユーザさんに使ってもらっています。
野良アプリなので、ロボアプリマーケット for Bizが使えません。
ユーザさんたちへの実行ファイル配布は、Choregrapheでパッケージファイルを作成し、各ユーザさんに送付し、各ユーザさんたちがChoregrapheでPepperにインストール、という作業フローになっています。

で、自分自身がユーザだったら、と思うととても良くわかるのですが、利用者さんたちにとって「どのバージョンをインストールしたか」なんてどうでもいいというか特に意識しないので(それが正しいです)、何かトラブルが起きたときとかに「どのバージョン使ってます?」と聞いてもわからないわけです。

…というような事情で困ってますー、という内容をFacebookのグループでつぶやいたところ、ナイスなやり方を教えていただいた上にサンプルコードまで頂いちゃいました。
公開グループではあるんですが、FacebookのグループってGoogle先生に拾ってもらえたっけ?というあたりが微妙なので、Qiitaに書いておこうと思った次第です。

ベースになるソース

ChoregrapheでPythonボックス作って、

    def onInput_onStart(self):
        #self.onStopped() #activate the output of the box
        pass

のところを下記のように書き換えたら、とりあえずログに出力されます。

    def onInput_onStart(self):
        import os
        import xml.etree.ElementTree as ET
        aPath = self.behaviorAbsolutePath()
        rPath = self.behaviorRelativePath()
        if rPath == ".":
            appFolder = aPath
        else:
            appFolder = aPath.replace(rPath, "")
        appPath = os.path.join(appFolder,"manifest.xml")
        tree = ET.parse(appPath)
        root = tree.getroot()
        myVersion = root.attrib["version"]
        self.logger.info(myVersion)
        self.onStopped()
        pass

やっていることは、自分自身のパスから manifest.xml の場所を生成して、そのファイルをXMLとして読み込んでバージョン情報を参照してログに書き出す、という流れとなります。

なお、manifest.xmlの中身はこんな感じになります。xxxxxのところにアプリ名、yyyyyのところにUIDが振られています。

<?xml version='1.0' encoding='UTF-8'?>
<package version="0.0.0" uuid="xxxxx-yyyyy">
 <names>
  <name lang="en_US">Untitled</name>
 </names>
 <supportedLanguages>
  <language>en_US</language>
 </supportedLanguages>
 <descriptionLanguages>
  <language>en_US</language>
 </descriptionLanguages>
 <contents>
  <behaviorContent path="hoge">
   <userRequestable/>
   <nature>interactive</nature>
   <permissions/>
  </behaviorContent>
 </contents>
</package>

Choregrapheの画面でいえばこの情報となります。

ロボットライブラリにアップしました

上記のソースをベースに、ちょっとだけ手を入れてボックスにしたものをロボットライブラリ にアップしました。

こちらは、プロジェクトに追加して、onStartに入力があると上記と同じ方法でバージョン番号を取得します。スパナアイコンをクリックしてメモリの名前を指定でき、取得したバージョン番号はこのメモリに保存されます。また、文字列として出力する口もつけてみたので、すぐに使うときはここから直接取り出すことも出来ます。

余談 (マイアプリ登録の罠)

「ロボアプリ配信管理」の「マイアプリ」のところ、野良アプリをアップロードして管理下にあるPepperに配信できる便利機能なのですが、同じロボアプリ名で複数のSBRアカウントからの登録ができません。

たとえば、Aというアカウントでマイアプリ登録したのと同じロボアプリは、Bというアカウントでアプリ登録しようとすると下記のように怒られます。

それこそ manifest.xml の内容をごにょごにょすれば回避できそうな気もしますがそれもねぇ…。

何の情報もなく「エラーが発生しました」としか出てこないので、この問題に気づくのに時間かかりました💦