前回、Raspberry Pi(以後、ラズパイ)に、OpenClawクローンの「ZeroClaw」をインストールする方法を紹介しました。その後、筆者はしばらくZeroClawを動かして活用していました。そこで、改めて、ZeroClawの活用方法や設定例を紹介します。

  • ZeroClawをしばらく使ってみた件について

    ZeroClawをしばらく使ってみた件について

ZeroClawをバージョンアップしよう

前回の連載の掲載時点からZeroClawもバージョンアップしています。Homebrewを使ってインストールしている方は、次のコマンドを実行して、ZeroClawを最新バージョンにアップデートしましょう。

# ZeroClawをバージョンアップする
brew upgrade zeroclaw

執筆時点でバージョン0.7.4が最新版でした。こちらに修正内容が列挙されているのですが、このバージョンアップで多くの不具合が修正されました。具体的には、ZeroClawの設定画面、Matrix再実装、Webダッシュボード改善、PostgreSQLへの対応、Docker/Windowsまわりの改善など、積極的に開発が進んでいる様子を確認できます。

メッセージアプリ連携はDiscordに変更した

なお、簡単に設定できるからと、前回、ZeroClawを操作するメッセージアプリとして、Telegramの設定方法を紹介しました。ところが、普段Telegramを使っていないので、わざわざZeroClawを使うためだけに、普段使わないTelegramを使うのが億劫になってしまいました。

そこで、普段から使っているDiscordを使うように設定し直しました。やはり普段使っているメッセージアプリを使う方が良いですね。また、Discordであれば、複数チャンネルに対応しているので、用途に応じて会話を切り替えています。

ZeroClawの設定をやり直してみよう

ZeroClawの設定をやり直すのは簡単です。ラズパイのターミナルを起動して、下記のコマンドを実行するだけです。

zeroclaw onboard

最新バージョンでは、全部をやり直すのではなく、修正したい部分だけを選んで修正できるようになっています。設定を抜ける場合は、[Esc]キーを押すか、[Ctrl]+[C]キーを押せば途中で終了できます。

  • ZeroClawではターミナルから簡単に設定をやり直せる

    ZeroClawではターミナルから簡単に設定をやり直せる

ZeroClawの設定をやり直し - Discordの設定方法

ZeroClawでDiscordを設定するには、「Channels」の項目を変更します。そこで、何度か[Enter]キーを押して、「Channels」の設定になったら[Y]キーを押して設定を変更し、「Discord」を選択します。すると、設定方法が箇条書きで表示されます。

最初に、ブラウザでこちらのDiscordの開発者ポータルにアクセスします。Discordのアカウントがなければ最初にこちらでDiscordのアカウントを作成してからアクセスしましょう。

開発者ポータルを開いたら「新しいアプリケーション」ボタンを押して、Discordボットを作成します。ボットの名前やアプリアイコンを設定したら、画面右下の「変更を保存」ボタンを押します。

  • Discordのボットを作成しているところ

    Discordのボットを作成しているところ

そして、画面左側から[Bot]のメニューを選択します。すると「トークンをリセット」というボタンがあるので、クリックして「ボットトークン(Bot Token)」を生成してコピーします。また、ボットがアプリを受信するために、「Message Content Intent」をオンに設定します。設定を保存したら、ラズパイのターミナルに戻りましょう。ターミナルで「Bot token:」と聞かれるので、ここにコピーしたトークンを貼り付けて[Enter]キーを押します。

  • Botの設定でトークンを取得しよう

    Botの設定でトークンを取得しよう

次に、ブラウザでこちらからDiscordを開いたら、画面一番左の縦バー上にある「+」ボタン(サーバーを追加)をクリックして、新規サーバーを作成しましょう。適当に「オリジナルの作成>自分と友達のため」とクリックしていって、サーバー名を入力します。サーバーが作成できたら、画面上部にあるサーバー名をクリックして「サーバーIDをコピー」をクリックします。そして、ターミナルに戻って、サーバーID(Server (guild) ID)にサーバーIDを貼り付けて[Enter]キーを押します。

  • Discordサーバーを作成して、サーバーIDを取得しよう

    Discordサーバーを作成して、サーバーIDを取得しよう

続いて、ラズパイのターミナルでは「Allowed Discord user IDs:」(許可するユーザーID)を尋ねられます。画面左下にあるプロフィールアイコンをクリックして、「プロフィールを編集」をクリック、画面左下にある「開発者 > 開発者モード」をオンにします。そして、一度設定画面を閉じて、改めてプロフィーリルアイコンをクリックして、メニューから「ユーザーIDをコピー」をクリックして、『["ユーザーID"]』の形式でターミナルに貼り付けます。

ここで、改めてブラウザのDiscordの開発者ポータルにアクセスし、画面左側のメニューから「OAuth2」をクリックします。

そして、「OAuth2 URLジェネレーター」から「bot」を選択して、Botの権限に「メッセージを送る」「リアクションを付ける」などにチェックして、画面下部の「生成されたURL」をコピーして、ブラウザで開きます。すると、どのサーバーにBotを参加させるのか尋ねられます。そこで、先ほど作成したDiscordサーバーを選択して認証します。

  • OAuth2のURLからDiscordボットをサーバーに参加させよう

    OAuth2のURLからDiscordボットをサーバーに参加させよう

以上で、Discordの設定は完了です。既存のZeroClawが起動したままであれば、[Ctrl]+[C]で停止して改めて「zeroclaw daemon」コマンドを実行しましょう。

ラズパイのターミナルに戻って、続く設定を行いましょう。先ほど作成したDiscordサーバーにアクセスするとZeroClawと会話を楽しむことができます。

  • DiscordサーバーでZeroClawと会話ができる

    DiscordサーバーでZeroClawと会話ができる

ZeroClawのセキュリティについて

最近、OpenClawに関するニュースで話題になるのが、セキュリティに関するものです。実際に、スキルストアで悪意をもった多くのスキルが見つかったというニュースもありました。それで、セキュリティ面からOpenClawを試すのをためらっている人も多いことでしょう。その点、ZeroClawを使う場合も同じで、セキュリティに注意する必要があります。

とは言え、ZeroClawのデフォルト設定では、セキュリティが厳しく制限されており、OSのシェルコマンドを実行できません。それで、何かを依頼すると「コマンドがセキュリティポリシーでブロックされています」と表示されます。これを緩和するためには、設定ファイル「~/.zeroclaw/config.toml」を修正します。

前回も紹介しましたが、設定ファイルを次のように修正する必要があります。

[autonomy]
allowed_commands = [
    # 実行を許可するコマンドをここに追加
    "vcgencmd", # ← 例えばラズパイのCPU温度を確認するコマンド
    # ...省略...
]
auto_approve = [
    "shell",  # ← シェル実行を許可するならここに追加
    # ...省略 ...
]

なお、原稿執筆時点のZeroClawでは、上記のように「shell」ツールの実行を許可したとしても、実行がブロックされてしまうことがありました。成功するときもあれば、失敗することもありました。その理由が分からなくて、ログを探っていたのですが、「(コマンド) && (コマンド)」のようにマルチステートメントでコマンド実行したときに、実行をブロックしてしまうようです。

そのため、ワークスペースの「TOOLS.md」や「AGENTS.md」を編集して、「シェルコマンドを実行するときは、シングルステートメントで実行するように」と追記しておくと良いでしょう。

設定ファイルが正しいか確認しよう

ZeroClawには、設定が間違っているかどうかを確認するdoctorコマンドが用意されています。以下のコマンドを実行して、問題がないか確認してみましょう。これは本家OpenClawにも用意されていたコマンドで、間違っている設定があれば自動修正もしてくれます。

zeroclaw doctor

筆者の環境で「zeroclaw doctor」を実行したのが次の通りです。一つだけ問題が報告されていますが問題なく動いています。全ての設定がOKでなくても大丈夫のようです。

  • 設定の問題点を洗い出すdoctorコマンドが用意されている

    設定の問題点を洗い出すdoctorコマンドが用意されている

セキュリティのテストをしてみよう

次に、セキュリティ設定がうまく変更できたか試してみましょう。前回も紹介しましたが、上記の設定ファイル「config.toml」の項目「allowed_commands」に「vcgencmd」を追加して、ZeroClawを再起動しましょう。ZeroClawの再起動は、[Ctrl]+[C]で停止して改めて「zeroclaw daemon」コマンドを実行します。

そして、Discordのチャットで「vcgencmdコマンドでラズパイでCPU温度を確認して」と依頼してみましょう。うまくいけば、次の画像のようにラズパイのCPU温度が表示されます。

  • CPU温度を確認したところ

    CPU温度を確認したところ

プログラムを作らせて自動実行させてみよう

続いて、ZeroClawにプログラムを作成させて、実行してみましょう。例えば、サイコロ2つを振るプログラムを作らせて、ワークスペースに保存するように依頼しましょう。

六角形のサイコロ2つを振るコマンドを作成して、
ワークスペースの`dice2.py`に保存してください。
そして、`dice2.py`を実行して。

すると、次のように表示されます。必要なプログラムを作らせて、保存しておいて、後から実行できるのでとても便利です。

  • サイコロを2つ振るプログラムを作らせて実行したところ

    サイコロを2つ振るプログラムを作らせて実行したところ

なお、初めてプログラムの作成などを指示したときには、「APPROVAL REQUIRED」という許可を求めるメッセージが表示されることがあります。その際、「Reply: "zjlpy1 yes", "zjlpy1 no", or "zjlpy1 always"」のような選択肢のメッセージが表示されます。

以後、確認なしに常に実行したいときには、「zjlpy1 always」のようなメッセージを送信します。これは「(確認コード) always」のような形式となっており、確認コードと許可操作を指定します。

  • 許可を求めるメッセージの例

    許可を求めるメッセージの例

写真を撮影してDiscordに送信するプログラムを作ろう

ところで、前回、ラズパイに接続したUSBカメラの映像を、Telegramのチャットに送信するプログラムを作ってみました。不在のときに家の中の様子が見られるのが便利だったので、Discord版も作ってみました。こちらにアップロードしています。

このプログラムを、ワークスペースに「camera.py」という名前で保存します。ちなみに、ワークスペースは、「/home/<ユーザー名>/.zeroclaw/workspace」です。

そして、Discordで写真を送信したいチャンネルを選択して、チャンネルのウェブフックを取得します。ウェブフックを取得するには、Discordを開いて、チャンネル名の横にあるアイコン「チャンネルの編集」をクリックします。そして、「連携サービス>ウェブフック」から新しいウェブフックをクリックして、ウェブフックURLをコピーします。

それから、「camera.py」と同じフォルダに、「.env」というファイルを作成して、このファイルにウェブフックURLを貼り付けます。

# .envの内容
DISCORD_WEBHOOK_ZERO="ここにウェブフックURLを貼り付け"

その上で、下記のコマンドを実行して、必要なライブラリをインストールしましょう。

# ライブラリのインストール
sudo apt update
sudo apt install -y fswebcam
# Pythonパッケージのインストール
pip install dotenv requests
# 実行権限をつける
chmod 744 camera.py

なお、利用しているPythonによっては、「--break-system-packages」オプションをつける必要があると表示される可能性があります。その場合、「pip install dotenv requests --break-system-packages」を実行するか、pyenvを利用してPythonをインストールしましょう。

また、このコマンドを実行できるように、先ほど確認した設定ファイル「~/.zeroclaw/config.toml」の実行許可リストに、「camera.py」を追加します。

allowed_commands = [
    # 実行を許可するコマンドをここに追加
    "camera.py",
]

その上で、ZeroClawを再起動して、「ワークスペースの『camera.py』を実行して」などと依頼すると、スクリプトを実行してくれます。なお、うまく実行できない時には「ワークスペース以下にあるスクリプト一覧を列挙して」などと尋ねて、スクリプトのパスを確認すると、実行できました。

  • ラズパイに接続したカメラで撮影したところ

    ラズパイに接続したカメラで撮影したところ

筆者がZeroClawで使って重宝している機能

筆者は、他にもいろいろなプログラムをZeroClawで実行しています。自宅ネットワークに、温度・湿度・明度センサー付きのSwitch Botをつなげているので、Switch Bot APIを使って、外出先から自宅の様子を確認できるようにしています。

また、先日、こちらの姉妹連載で紹介したDropboxからファイルをダウンロードしてメールするというプログラムも、ZeroClawから実行してもらうことができています。

ほかにも、定期的にネットから情報を取得して、Discordに送信するというプログラムをいくつか作っています。このように、必要が生じたときに、すぐにプログラムを作ってもらって、Discordなどのメッセージアプリから実行できるというのは、本当に便利です。

原稿執筆時点でうまくいかなかったこと

ちなみに、ZeroClawをOSのサービスとして動かすこともできます。その場合、ターミナルでコマンド「zeroclaw service start」を実行するだけで設定できるので便利です。

ただし、筆者が試したところ、サービスとして動かすと、シェルコマンドが実行できなくなり、なぜか登録したMCPサーバーも認識しなくなってしまいました。いろいろ試したものの結局動かすことができなかったので、ZeroClawのバグなのかもしれません。

そのため、筆者はターミナルから直接動かしています。それでも、長時間動かしていると、時々、ZeroClawのプロセスが途中で落ちてしまいます。そこで、プロセスが落ちたら自動的に再起動するようにこのスクリプトを利用して実行しています。

まとめ

以上、ZeroClawをしばらく使ってみて、活用方法や設定例を紹介しました。ZeroClawはラズパイ上で快適に動かすことができるのが魅力です。それほど、重たい処理は動かないものの、それなりの処理は動かすことができます。これからも、しばらくZeroClawを活用しようと思っています。またノウハウが貯まったら、本連載で紹介します。お楽しみに。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。これまで50冊以上の技術書を執筆した。直近では、「大規模言語モデルを使いこなすためのプロンプトエンジニアリングの教科書(マイナビ出版)」「Pythonでつくるデスクトップアプリ(ソシム)」「実践力を身につける Pythonの教科書 第2版」「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」など。