2019年7月8日月曜日

OctoPrint の API で Python で 3D プリンターの位置情報を取得

はじめに

OctoPrint の API を使って Python で 3D プリンターの現在位置を取得したいのですが、素直には取得できませんでした。

現在位置を取得する G-code M114 を OctoPrint の API から 3D プリンターの Marlin ファームウェアに送っても結果は API には返ってこず、OctoPrint の Terminal に以下のような位置情報が表示されるだけでした。

Recv: X:-10.00 Y:-15.00 Z:0.00 E:0.00 Count X:-1000 Y:-1500 Z:0

そこで、OctoPrint の PositionUpdate イベントを使って OctoPrint が M114 の結果を受け取った時に位置情報をファイルに書き出すようにしてみました。

環境

  • Raspberry Pi 3 model B
  • Raspbian GNU/Linux 9.4 (stretch)
  • Python 3.5.3
  • OctoPrint 1.3.9
  • 3D プリンター Alunar M508
  • Marlin 1.1.1

現在位置をファイルに書き出すスクリプト準備

以下の内容の /some/where/get-3dp-pos.py を設置しました。

#!/usr/bin/env python3

import argparse
import json

POS_FILE = '/tmp/3dp-pos'

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--now'  , type=str)
    parser.add_argument('--data' , type=str)
    parser.add_argument('-x'     , type=str)
    parser.add_argument('-y'     , type=str)
    parser.add_argument('-z'     , type=str)
    parser.add_argument('-e'     , type=str)
    parser.add_argument('-t'     , type=str)
    parser.add_argument('-f'     , type=str)
    args = parser.parse_args()

    with open(POS_FILE, 'w') as f:
        f.write('{}\n'.format(json.dumps(vars(args), sort_keys=True, indent=4)))

if __name__ == '__main__':
    main()

ファイルに実行権限を付けました。

$ sudo chmod +x /some/where/get-3dp-pos.py

OctPrint にイベントを登録

OctoPrint の設定ファイル config.yaml に PositionUpdate イベントを登録しました。

$ diff -U 0 config.yaml{.org,}
--- config.yaml.org     2019-07-08 17:33:42.532568347 +0900
+++ config.yaml 2019-07-08 17:33:42.512568302 +0900
@@ -58,0 +59,7 @@
+events:
+  enabled: true
+  subscriptions:
+  - event: PositionUpdate
+    command: /some/where/get-3dp-pos.py --now '{__now}' --data '{__data}' -x {x} -y {y} -z {z} -e {e} -t {t} -f {f}
+    type: system
+

動作確認

config.yaml を変更したので、まずは OctoPrint を再起動しました。

位置情報を取得する G-code M114 を 3D プリンターに送ると以下のようにファイルに位置情報が書き込まれました。

$ cat /tmp/3dp-pos
{
    "data": "{reason: None, e: 0.0, t: 0, f: 200.0, y: 45.0, x: 30.0, z: 0.0}",
    "e": "0.0",
    "f": "200.0",
    "now": "2019-07-08T19:26:16.670214",
    "t": "0",
    "x": "30.0",
    "y": "45.0",
    "z": "0.0"
}

なお、ヘッドが移動中に M114 を送った場合は OctoPrint のターミナルに

Recv: echo:busy: processing

と表示され、ヘッドの移動が完了した時に位置情報がファイルに書き込まれました。