初めに
3DプリンタをZabbixで監視できたらうれしいんじゃないかと思い監視用テンプレートを作成しました。Moonraker APIを利用することで思ったよりも簡単に作成できました。
3DプリンタをZabbixで監視したいという物好きがどれだけいるか分かりませんが公開しておきます。
構成
弊宅の構成です。
バージョンが古いですが基本的に新しいバージョンであれば同様に利用可能かと思います。
Zabbix
- version : 6.0
Printer
検証に利用したプリンターは下記の2台です。
- Creality K2 Plus
- Creality K1
API検証
まず初めにMoonraker APIが仕様通りに使えるか確認しました。
以下、確認用にGeminiくんが作成したPowershellスクリプトです。
Moonraker APIを利用しプリンタにアクセスし、結果をjson形式で取得します。
# MoonrakerのIPアドレスとポートを指定してください(デフォルトは7125)
$moonraker_ip = "<<プリンタのIPアドレス>>"
$port = 7125
# 1. プリンタオブジェクト(前回+追加項目)のテスト
# 追加項目: gcode_move(現在位置/速度), fan(冷却ファン), mcu(基板負荷)
$query_objects = "webhooks&print_stats&extruder=target,temperature&heater_bed=target,temperature&virtual_sdcard=progress&gcode_move&fan&mcu"
$endpoint_objects = "http://${moonraker_ip}:${port}/printer/objects/query?${query_objects}"
# 2. ホストOSリソース(ラズパイ等)のテスト
$endpoint_machine = "http://${moonraker_ip}:${port}/machine/stats"
try {
Write-Host "【テスト1】プリンタ詳細オブジェクトを取得中..." -ForegroundColor Cyan
$response_objects = Invoke-RestMethod -Uri $endpoint_objects -Method Get -TimeoutSec 10
Write-Host "取得成功!追加したオブジェクトのデータを表示します:`n" -ForegroundColor Green
# ログが長くなりすぎるのを防ぐため、今回追加した項目だけを抽出してJSON化
$response_objects.result.status | Select-Object gcode_move, fan, mcu | ConvertTo-Json -Depth 5
Write-Host "`n=================================================`n"
Write-Host "【テスト2】ホストOS(ラズパイ等)のリソースを取得中..." -ForegroundColor Cyan
$response_machine = Invoke-RestMethod -Uri $endpoint_machine -Method Get -TimeoutSec 10
Write-Host "取得成功!ホストOSのデータを表示します:`n" -ForegroundColor Green
# 取得したシステムリソース情報をJSON化
$response_machine.result | ConvertTo-Json -Depth 5
} catch {
Write-Host "接続エラー: APIにアクセスできませんでした。" -ForegroundColor Red
Write-Host $_.Exception.Message
}
実際に実行した結果は下記のようになりました。テスト2の部分でエラーが出ていますが欲しい情報は取れているので問題ありません。
基本的なプリンタの状態や、MCUの状態が取得できています。
PS > .\apitest.ps1
【テスト1】プリンタ詳細オブジェクトを取得中...
取得成功!追加したオブジェクトのデータを表示します:
{
"gcode_move": {
"speed_factor": 1.0,
"speed": 600.0,
"extrude_factor": 1.0,
"absolute_coordinates": true,
"absolute_extrude": false,
"homing_origin": [
0.0,
0.0,
0.0,
0.0
],
"position": [
225.0,
345.0,
173.18,
257726.88620271155
],
"gcode_position": [
225.0,
345.0,
173.18,
-76.95999999996275
]
},
"fan": {},
"mcu": {
"mcu_version": "1.1.0.48-293-g493f9a0f-dirty-20241220_140327-ubuntu1804",
"mcu_build_versions": "gcc: (GNU Tools for Arm Embedded Processors 9-2019-q4-major) 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599] binutils: (GNU Tools for Arm Embedded Processors 9-2019-q4-major) 2.33.1.20191025",
"mcu_constants": {
"ADC_MAX": 4095,
"CLOCK_FREQ": 120000000,
"INITIAL_PINS": "!PB1,!PB2,!PB3,!PB4,!PA0,PB0,PA12,!PC8,!PC12",
"MCU": "gd32f303xe",
"RECEIVE_WINDOW": 192,
"RESERVE_PINS_serial": "PA2,PA3",
"SERIAL_BAUD": 230400,
"STATS_SUMSQ_BASE": 256,
"STEPPER_BOTH_EDGE": 1,
"build_machine_uid": "Dec 20 202414:03:23"
},
"last_stats": {
"mcu_awake": 0.005,
"mcu_task_avg": 9E-06,
"mcu_task_stddev": 4E-06,
"bytes_write": 601010141,
"bytes_read": 389410432,
"bytes_retransmit": 191,
"bytes_invalid": 0,
"send_seq": 11511110,
"receive_seq": 11511110,
"retransmit_seq": 6312088,
"srtt": 0.001,
"rttvar": 0.001,
"rto": 0.025,
"ready_bytes": 0,
"stalled_bytes": 0,
"freq": 119998387
}
}
}
=================================================
【テスト2】ホストOS(ラズパイ等)のリソースを取得中...
接続エラー: APIにアクセスできませんでした。
Response status code does not indicate success: 404 (Not Found).
作成したテンプレート
テンプレートは下記リポジトリにアップロードしました。
マスターアイテムでMoonraker APIを叩きjsonで情報を取得、それをもとに依存アイテムで各パラメータを抽出しています。
なおレイヤー関連のアイテムは一部のスライサーでは情報が取得できません。適宜無効化するなどする必要があります。実際Creality Printで生成したGコードではレイヤーのパラメータが更新されませんでした。
1. マスターアイテム
| アイテム名 | キー | データ型 | 監視間隔 | 取得URL |
|---|---|---|---|---|
| Moonraker API Master | moonraker.api.master | TEXT | 30s | http://{HOST.CONN}:7125/printer/objects/query?webhooks&print_stats&extruder=target,temperature&heater_bed=target,temperature&virtual_sdcard=progress&gcode_move |
2. 監視アイテム(依存アイテム)
すべて「Moonraker API Master」を親として構成されています。
| アイテム名 | キー | 単位 | 保存前処理 (JSONPath / JS) |
|---|---|---|---|
| Nozzle target temperature | moonraker.extruder.target | ℃ | $.result.status.extruder.target |
| Nozzle temperature | moonraker.extruder.temp | ℃ | $.result.status.extruder.temperature |
| Bed target temperature | moonraker.heater_bed.target | ℃ | $.result.status.heater_bed.target |
| Bed temperature | moonraker.heater_bed.temp | ℃ | $.result.status.heater_bed.temperature |
| Z Position | moonraker.position.z | mm | $.result.status.gcode_move.gcode_position[2] |
| Current layer | moonraker.print.current_layer | layer | $.result.status.print_stats.info.current_layer |
| Total layer | moonraker.print.total_layer | layer | $.result.status.print_stats.info.total_layer |
| Print progress | moonraker.print.progress | % | $.result.status.virtual_sdcard.progress (※ JSで Math.round(value * 100) の処理あり) |
| Print File Name | moonraker.print.filename | - | $.result.status.print_stats.filename |
| Print state | moonraker.print.state | - | $.result.status.print_stats.state |
| Printer state | moonraker.webhooks.state | - | $.result.status.webhooks.state |
| Print Message | moonraker.print.message | - | $.result.status.print_stats.message |
| System Status Message | moonraker.webhooks.message | - | $.result.status.webhooks.state_message |
3. トリガー
| トリガー名 | 深刻度 | 障害条件式 | 運用データ (Opdata) / 備考 |
|---|---|---|---|
| Start printing : {?last(//moonraker.print.filename)} | INFO | last(/.../moonraker.print.state)="printing" and last(/.../moonraker.print.state,#2)<>"printing" | 復旧条件: last()<>"printing" |
| Cancel Printing : {?last(//moonraker.print.filename)} | WARNING | last(/.../moonraker.print.state)="cancelled" | 復旧条件: last()<>"cancelled" |
| 3D Printing Error | AVERAGE | last(/.../moonraker.webhooks.state)="error" | 運用データ: {?last(//moonraker.print.message)} |
| Klipper system error | AVERAGE | last(/.../moonraker.webhooks.state)="error" | 運用データ: {?last(//moonraker.webhooks.message)} 復旧条件: last()<>"error" |
4. グラフ
| グラフ名 | 描画アイテム | 概要 / 設定 |
|---|---|---|
| Temperature | moonraker.heater_bed.temp moonraker.heater_bed.target moonraker.extruder.temp moonraker.extruder.target | 現在温度は実線、目標温度は点線(DOTTED_LINE)で描画されます。 |
| Print progress | moonraker.print.progress moonraker.position.z | Z軸位置(moonraker.position.z)は右側のY軸(RIGHT)を使用して表示されます。 |
| Layer Progress | moonraker.print.current_layer moonraker.print.total_layer | 現在のレイヤーは塗りつぶし領域(FILLED_REGION)として描画されます。 |
実際の動作
レイヤー関連のパラメータは取得できていないのでグラフは表示されていませんがその他の情報は問題なく表示できています。
