見出し画像

KlipperからiPhoneに通知を送ってみる その2(完結)

前回の記事の中で有料記事にしてみようと書きましたが、

あまりの反響の少なさ(というか反響なし)に普通の記事にすることにしました。
そもそもKlipperを使ってて、かつnoteを見てる人がどんだけいるんだよって話なわけで。

どこぞで見かけた情報なんですが、noteの収益がある上位x人の平均額はy円であるって書いてありました。記憶がゆるいので具体的な数字は伏せますが数百万円ぐらいだったと思います。
個人的には金額よりもどんなジャンルの記事を書いたのかが気になります。
情報商材や男女交際的なネタなんだろうなぁと予想します。
それって見る側がそこにお金を払う価値を感じているってことだよね。
だとするとつまらん世の中だなぁ。

さて、本編を開始します。

3Dプリンタの通知機能の用途

有益な使い道がないと意味がないので整理してみました。
多色刷りのフィラメント交換タイミングを通知
 プリンタの待機時間なしにすぐに交換したいので通知が欲しい。
印刷終了の通知
 次の印刷が控えてるときに通知が必要なときがあります。
 できれば異常終了時の通知もあるといいですね。
印刷開始の通知
 ベッドとホットエンドの過熱が終わって、さぁ開始というタイミングにZ軸の微調整をやりたいので通知が届けばタイミングを逃さなくていいかも。
たまにZ軸がマイナスになってベッドをガリガリやってしまうのを防ぐ効果もある。

IFTTTの準備

IFTTTというWebサービスを利用すれば、iPhoneへのPush通知を利用することができます。他にもいろ~んなITサービスを連携することができるみたいですが、サービス名を見ても知らないものばかりでした。gmailやLINEは使えるけど、用途的には通知なのでnotificationと似たり寄ったりですなぁ。
今回はプリンタからの通知が目的なのでiPhoneへの通知ができればOKです。IFTTTを主体として考えると、通知で終わるのはあまり面白みがないと思います。
例えば、テニスコートに到着したら、「ロッキーのテーマ」再生するみたいなものを仕込めたら気持ちが上がるかもしれん。
こんな感じで本来は 「~したら、~する」をやるものです。
お寺の前を通ったら、お賽銭を入れる(口座に振り込む)とか、あったらやだな。

まずはIFTTTのサイトでアカウントを作成します。ぐぐってもサイトがなかなか出てこないので、ここを開いてちょうだい。アカウントを作ってしまったら/exploreを開いたほうが面倒がないです。

https://ifttt.com/explore

プロフィールを適宜設定したら、アカウント名が無作為なものが初期設定されているのでこのタイミングで変えておこう。

さっそく、 Create !

If This がイベントハンドラーの役割を果たすみたい。まずはこれを設定します。

If This Then That の略がIFTTTなんすね。

Webhooksを選ぶ。hook というのはIT用語というかプログラミングの用語でよくでてきます。でも、知らない業界人も多いと思います。
語源は「引っ掛け」フックですけど。ここでは「ある条件を満たしたら」と考えてちょーだい。

検索文字を入れると選択肢が絞り込まれる。

Webhooksの設定を行います。
プリンター側から値を送り込みたいので、JSON payload を選ぶ。
payload という単語がピンとこないので調べたところ、搭載物だそうです。
要は、JSON形式のデータを付帯して送り込めますよってことです。
HTTP POSTの中身にJSONを突っ込んで送るということですね。
(わかってる風なことを書いてますが、おれはWEBアプリ開発をやったことないので上っ面の理解しかできていません)

Event Name は実用上はあんまり関係ない。
呼び出し時のURLの一部になるので半角にしたほうがよいです。
イベントハンドラーの意味合いなので、名詞_過去分詞 にしたほうがよいと思います。
先頭に固有識別子をつけたほうがよいかもしれません。
今回の場合は「3Dプリンタが何らかの通知を発した」という定義です。
ということで、boyon_3dp_notified にしてみます。
おれはネーミングルールにうるさいのです。

次に、Then That の設定。通知を送りたいので、notificationsを選ぶ。
これを選ぶとiPhoneにインストールしたIFTTTアプリが通知してくれます。
単に通知するだけの簡単なお仕事です。

単なるテキスト通知ならどっちでもいいはず。rich なほうを選ぶ。

通知のタイトルです。ちょっと悩む。あえて日本語を混ぜておきたい。

通知内容の編集です。
好きにやってよいのですが、以下のようにいくつかの変数が使えます。
他にもあるかもしれないけどよくわからん。
OccurredAt はイベント発生時のタイムスタンプです。
Value1 とValue3は外部からJSONで送り込む値です。
通知内容の詳細をセットしたい。

設定後、再度この編集画面を開く。画面構成がわかりづらいので迷う。
テスト通知をするために左側のアイコンを選ぶ。

するとこの画面がでる。右側のDocumentationを開く。慣れないとここにたどり着くのが難しい。だめなUIだと思います。

すると、テスト用のURLが表示される。
このURLの末尾に自分のアカウント専用のKeyがくっついてくる。
これを控えておかないと自分のiPhoneに通知がこない。
※このKeyは何度でも再発行できます。画像内のKeyはすでに無効な値です。

event のところに自分で作ったイベント名を入力する

Test it をクリックすると、うまくいけば自分のスマホに通知が届く。
この状態だとValue値はそのまんまでてくる。

通知がとどいたら、次にPOTS with JSON Payloadを確認する。
ページの下のほうの欄に値をセットしてTest it

すると、今度は変数の中身も通知に含まれてくる。

これが実運用上の通知イメージです。
あとは、これが3Dプリンターから送信されるようにつなげていく。

Klipperの設定

Klipperの標準機能では外部機能の実行はできないらしい。wget や curlコマンドが実行できないとWebhookを利用できません。
自分で外部機能の実行機能を追加しないといけないようです。
多分、セキュリティ的な配慮なんじゃないかなぁと思います。
やりたい人は自己責任でプラグインを追加して実現しなさいよってことです。

klipperのセットアップはここでは省略します。
過去記事を読んでがんばってセットアップしてください。
IFTTTと連携するためにインターネットに出れるようなネットワーク環境とFirewall設定をやってください。(デフォルトでOKだと思うけど)

外部プログラムの呼び出し機能の追加するには、有志が作ったスクリプトをここからGetします。

gcode_shell_command.py をKlipperのフォルダにコピーします。
うちの場合はタブレットPC上のdebian なのでここです。
/home/boyon/klipper/klippy/extras
Linuxで動作させてることが多いはずなので、みんなこんな感じのパスになるはずです。macは使ったことないけど、linuxもどきなので多分同じはず。

次に、printer.cfg に以下の2つのセクションを追加します。

[gcode_shell_command curl_notify_change_filament]
command: curl -X POST -H "Content-Type: application/json" -d '{"value1":"X5SA","value2":"info","value3":"次のフィラメントに交換してください"}' https://maker.ifttt.com/trigger/boyon_3dp_notified/with/key/clmSBhfhQXoznkUDkNWohZ
timeout: 5.
verbose: False

[gcode_macro NOTIFY_CHANGE_FILAMENT]
gcode:
    RUN_SHELL_COMMAND CMD=curl_notify_change_filament

少し説明をしておくと、
curl_notify_change_filament ってのが独自の関数名です。この関数を呼び出すと、gcode_shell_command.pyが実行されます。スクリプトの中身はよく見てないけど、ローカルコマンドを実行してくれてるのだと思います。ここにウイルスコードが含まれていると、あなたのPCはぶっ壊れたり、スキミングされるかもしれない。心配性な人はしっかり解析してください。
command: のところが実行したいコマンドです。curl コマンドを実行しています。引数を見ると、JSON形式でPOSTしていることがわかります。
ここは好きに書いてよいのですが、value1はプリンタの名前、value2は使ってないけど通知の種別、value3はメッセージを書きました。NOTIFY_CHANGE_FILAMENT はgcodeマクロです。上記のcurl_notify_change_filamentは直接呼び出すことはできなさそうなので、gcodeマクロを経由して呼び出します。

printer.cfg を保存したら Klipperを再起動して動作を確認しよう。
mainsailのConsoleに自分で作ったgcodeを入力する。

すると、こうなった。

タイムスタンプのフォーマットが気に入らないんだけど、変更方法がよくわかりません。できるのかな?
英語圏ではこのような表記が普通です。システム内のログですらこの表記です。使いにくくてしょうがない。これをOSのデフォルトに指定してるやつらはほんとに頭おかしいと思います。
ちなみにISOなんとかで規定されている形式は yyyy-mm-dd hh:mm:ss です。
これを使えや!

とにかく、これでKlipperのコンソールから通知することができるようになりました。

ずっといじってると、動作しなくなることがありました。
FAQに対応方法がありました。keyを作り直すとよいみたいです。

ここでkeyを作り直す

当然ながら、アクセスするためのURLが変わるのでprinter.cfgの設定を修正しなくてはなりません。

印刷時の呼び出し

ここまでの作業では、mainsailなどのconsoleで実行できるのみで印刷操作との連動はできていません。
このgcode macroをgcodeファイルに埋め込むこともできますが、その場合はスライサー側の設定を変更する必要があります。Klipperの方言をスライサーに入れたくないので、既存のgcodeをOverrideして使うのがスマートなんだろうな。

以前作ったM600のgcodeマクロに埋め込んでみることにしました。

[gcode_macro M600]
gcode:
    {% set X = params.X|default(10)|float %}
    {% set Y = params.Y|default(10)|float %}
    {% set Z = params.Z|default(50)|float %}
    SAVE_GCODE_STATE NAME=M600_state
    NOTIFY_CHANGE_FILAMENT
    PAUSE
    G91
    G1 E-.8 F2700
    G1 Z{Z}
    G90
    G1 X{X} Y{Y} F3000
    G91
    G1 E-50 F1000
    RESTORE_GCODE_STATE NAME=M600_state

PAUSE はKlipper特有のgcodeです。PAUSEの前にNOTIFY_CHANGE_FILAMENTを追加します。当然のことながらPAUSEより上に記載しないと通知が届きません。

これで設定は以上です。

実は最後の印刷時の通知を試していません。
とりあえず記事を完結させたかったんです。
間違ってたら、すんません。
稼働確認はまた今度やります。


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