Pepper for Bizに時報させる

Pepperさんに決まった時刻に決まったことを言わせたい
「12時になったから給食の時間だよー」とか（学校）
「18時になったので帰りましょー」とか（ホワイト）


#一般モデルの場合
behaviorの起動トリガーを使うっぽい

プロジェクトのプロパティのbehaviorをクリック

<img width="899" alt="プロジェクトのプロパティ_と_Untitled_-_Choregraphe__バーチャルロボットに接続_.png" src="https://qiita-image-store.s3.amazonaws.com/0/222559/00fdce51-627b-5374-cdfb-05ad6f826048.png">

起動トリガーの条件のところに入力
・性質はソリタリーにすると眼の前に人がいないときにだけ時報アプリが起動する

・入力する内容は例えばこれ
('Launchpad/Hour' == 12) && ('Launchpad/Minute' == 00) && ('Launchpad/NumPeopleZone1' == 0) && (('Launchpad/FocusedActivity' != "アプリケーションID/behavior") ~ 60)

それぞれ
'Launchpad/Hour'と'Launchpad/Minute'はPepper内部の時間
'Launchpad/NumPeopleZone1'は近くに人がいないとき(？)
('Launchpad/FocusedActivity' != "アプリケーションID/behavior") ~ 60　はアプリケーションが60秒間起動していないとき

つまりこの条件は 「12時で、00分で、眼の前に人がいなくて、この時報アプリが60秒間起動していないとき」となる
この時報アプリが60秒間起動していないときとつけることで連続して喋ってしまうことを防ぐ

<img width="900" alt="プロジェクトのプロパティ.png" src="https://qiita-image-store.s3.amazonaws.com/0/222559/3848edab-43d0-4ab7-bbb8-0c9abfa1986d.png">

#for Bizモデルの場合
ところがfor Bizモデルで同じことをしてもさっぱりうまく行かなかった
そもそもfor Bizモデルは起動トリガーが使えない様子

途方に暮れていたがアトリエ秋葉原の人達によると「サービス」という機能を使えばいけるらしい

サービスに関する日本語の情報はあまりないのでこの２つの記事を参考にした
[Pepper の自律モード（オートノマスライフ）のカスタマイズ（１）ーカスタムサービスを常駐させる](https://qiita.com/tkawata1025/items/a036e98e16ad1dbcad2e)
[Choregraphe プロジェクトの中にカスタムサービスを組み込む](https://qiita.com/tkawata1025/items/541f72074c80523c0848)

ここからは記事中にもある通り自己責任でお願いします

>『注意』 
公式にはカスタマイズ方法についてガイドがあるわけではないので、NAOqi の機能を使って「うまくいった方法」を紹介しています。試した環境は NAOqi 2.4.2 です。自律モードの機能は日々進化しており、将来的にここで紹介した方法がうまく動かないことも考えられます。ご自身で行う場合は、内容をよく理解したうえで、自己責任でお願いします。

まずはアプリケーションIDをわかりやすくjihouとしてみる
<img width="904" alt="プロジェクトのプロパティ_と_Untitled_-_Choregraphe__バーチャルロボットに接続_.png" src="https://qiita-image-store.s3.amazonaws.com/0/222559/969054d6-7247-5ba9-90c9-5357db1946c3.png">


##起動トリガーにやってもらっていた機能をサービスにさせたい
「12:00になったら、このbehabiorを起動する」
といった条件をpythonで書ければよさそうだ

大体上の記事を参考にしつつ書いてみた

```python:myservice.py
# -*- coding: utf-8 -*-

import qi
import sys

# クラス名は manifest.xml のサービス名と一定していること
class MyService:
    def __init__(self, session):
        self.session = session
        self.logEventName = "%s/log" % self.__class__.__name__
        self.memory = self.session.service("ALMemory")
        self.tts = self.session.service("ALTextToSpeech")
        #イベント登録 
        self.hour_signal = self.memory.subscriber("Launchpad/Hour").signal
        self.hour_signal.connect(self._hour)

    #hourが一致したら話す、minuteのsubscriberを開始
    def _hour(self,value):

        if int(value) ==12 :

            self.tts.say("hourはちゃんと認識してますよ")

            self.minute_signal = self.memory.subscriber("Launchpad/Minute").signal  
            self.minute_signal.connect(self._minute)

    #minute が一致したら話す、behaviorを起動
    def _minute(self,value):

        if int(value) == 5 :
            self.tts.say("minuteも確認できました")

             
            al = self.session.service("ALAutonomousLife")
            al.switchFocus("jihou/behavior_1")

    #ログ出力用 (Choregrahe クラス名/log でログメッセージを伝播)
    def _logger(self, msg):
        self.memory.raiseEvent(self.logEventName, msg)

if __name__ == "__main__":
    app = qi.Application(sys.argv)
    app.start()
    myservice = MyService(app.session)
    app.session.registerService(myservice.__class__.__name__, myservice) 

    app.run()   # will exit when the connection is over
```

動作確認のログのうまい方法がわからなかったので代わりにPepperに話させている
なので実際に使うときは以下の二行はコメントアウトする
self.tts.say("hourはちゃんと認識してますよ")
self.tts.say("minuteも確認できました")

イベント登録の部分で、"Launchpad/Hour"を監視をする

        #イベント登録 
        self.hour_signal = self.memory.subscriber("Launchpad/Hour").signal
        self.hour_signal.connect(self._hour)

12時になったら"Launchpad/Minute"の監視をする

    #hourが一致したら話す、minuteのsubscriberを開始
    def _hour(self,value):

        if int(value) ==12 :

            self.tts.say("hourはちゃんと認識してますよ")

            self.minute_signal = self.memory.subscriber("Launchpad/Minute").signal  
            self.minute_signal.connect(self._minute)

05分になったら"jihou/behavior_1"を起動する
(00分だとうまく行かなかった)

    #minute が一致したら話す、behaviorを起動
    def _minute(self,value):

        if int(value) == 5 :
            self.tts.say("minuteも確認できました")


            al = self.session.service("ALAutonomousLife")
            al.switchFocus("jihou/behavior_1")

##サービスをchoregrapheに入れる
myservice.pyはchoregrapheのプロジェクトのservicesフォルダにいれる
（こういう慣例になってるっぽい(?)）

<img width="254" alt="Untitled_-_Choregraphe__バーチャルロボットに接続__と_「Pepper_for_Bizに時報させる」を編集_-_Qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/222559/f64824bd-9442-b180-a692-dc90ecc02753.png">

##このサービスをPepper電源起動時から起動させるようにしたい

manifest.xmlをエディタで開いて編集
以下の３行を追加する
電源起動時から servicesフォルダの myservice.pyを起動して常駐してくれる

```manifest.xml
<services>
<service autorun="ture" name="MyService" execStart="/usr/bin/python2 services/myservice.py"/>
</services>
```

##喋らせる

時間になったら"jihou/behavior_1"が起動するので
喋らせたい内容を書く

<img width="905" alt="Untitled_-_Choregraphe__バーチャルロボットに接続_.png" src="https://qiita-image-store.s3.amazonaws.com/0/222559/e026764d-2a2c-d07c-7067-c36ffb36a3fd.png">

##注意点

この書き方だと12時になってから**分を見に行くので
例えば12時３分にPepperが起動したら、12時１０分の時報を言ってはくれない。
(11時59分までに起動させないといけない)

この点どなたかいい案があったら教えてください〜