PR

Tp-Link [Tapo P105]をKlipper/Mainsailで制御し印刷完了時に電源を落とす方法

3Dプリンターを使用していて、「印刷終了時にノズル温度が一定値まで下がったら自動で電源を落とす」という制御ができると便利だと思いませんか?

本記事ではKlipper/Mainsailを使って上記印刷終了時に電源OFFを実現した方法をお知らせします。

Tp-Linkのスマートプラグはmoonraker.confに[power]を追加する方法でKlipperから制御できることがが知られています。

が、国内で手に入るスマートプラグ、Tp-Linkの「Tapo P105」はこのmoonraker.confに[power]を追加する方法方法では動作しませんでした。替わりの方法を見つけたので紹介します。

(めっちゃニッチな内容ですが、誰かの役に立つといいなぁ・・・。)

※本記事はこちらのブログの情報をもとにKlipperで制御できるようにしたものです。

記事内の一部に広告を含みます。

概略:Tp-Link [Tapo P105]をKlipper/Mainsailで制御する方法

やり方は下記の通りです。少々煩雑に見えますが、順を追って説明しますので、ご確認ください。

概略:Tp-Link [Tapo P105]をKlipper/Mainsailで制御する方法
  1. Pythonライブラリを導入し、Tapo P105を制御できるPythonスクリプトを作る
  2. Pythonスクリプトを動作させるシェルスクリプトを作る
  3. KIAUHで[G-Code Shell Command]をKlipperに追加する
  4. Printer.cfgにgcode_macroをいくつか追加する
  5. 印刷終了時にノズル温度が下がったら電源を切るコマンドを追加する

Tapo P105をKlipperで制御する:ハードの準備

3Dプリンターの電源制御に使用するスマートプラグはTP-LinkのTapo P105です。
Amazonで技適取得済みのデバイスを購入できます。

Amazonリンク:TP-Link WiFi スマートプラグ Tapo P105/A

なお延長タップにTapo P105をつなぐ場合、タップはN側が広いタイプが必要です。
必要ならこちらも用意しておきましょう。

Amazonリンク:サンワサプライ 電源タップ 3個口・2P (5m) TAP-3W5N

Tapo P105をKlipperで制御する:ソフトの準備

それでは、ソフト側の設定方法を順にお知らせします。

Pythonライブラリを導入し、Tapo P105を制御できるPythonスクリプトを作る

まずはPython環境を準備しましょう。SSHでRaspberry piに接続し、下記で順番にインストールします。

sudo pip3 install requests -t /usr/lib/python3.9
sudo pip3 install pkcs7 -t /usr/lib/python3.9
sudo pip3 install pycryptodomex -t /usr/lib/python3.9
sudo pip3 install pycryptodome -t /usr/lib/python3.9

続けて、下記をDLします。

GitHub - 2729-gumi/TapoP100: A module for controlling the TP-Link Tapo P100 Plugs
A module for controlling the TP-Link Tapo P100 Plugs - GitHub - 2729-gumi/TapoP100: A module for controlling the TP-Link...

続けて、Pythonスクリプトを入れるディレクトリを用意します。
なんでも良いのですが、私は~/P105_Power_Plugというディレクトリを用意しました。

cd ~
mkdir P105_Power_Plug

先ほどgithubからDLしたzipファイルを展開し、PyP100ディレクトリをそのまま作成し~/P105_Power_Plugディレクトリの中に入れておきます。

作成した~/P105_Power_Plugディレクトリの中に下記2つのPythonスクリプトを入れます。
なお、5行目はご自身のTapo P105のIPアドレスと、TP-Link IDのメールアドレスとパスワードに変えてください。

# -*- coding: utf-8 -*-
import time
from PyP100 import PyP100

p105 = PyP100.P100('192.168.X.X', 'email@gmail.com', 'Password123') # Creating a P105 plug object

p105.handshake() # Creates the cookies required for further methods 
p105.login() # Sends credentials to the plug and creates AES Key and IV for further methods
p105.getMacAddress() # Get MacAddress and Set terminalUUID

p105.turnOn() # Sends the turn ON request
# -*- coding: utf-8 -*-
import time
from PyP100 import PyP100

p105 = PyP100.P100('192.168.X.X', 'email@gmail.com', 'Password123') # Creating a P105 plug object

p105.handshake() # Creates the cookies required for further methods 
p105.login() # Sends credentials to the plug and creates AES Key and IV for further methods
p105.getMacAddress() # Get MacAddress and Set terminalUUID

p105.turnOff() # Sends the turn OFF request

下記で実行権限を与えておきます。

chmod 755 ~/P105_Power_Plug/*
chmod 755 ~/P105_Power_Plug/PyP100/*

ここまでできたら、試してみましょう。
下記でTapo P105が動作すれば今のところOKです。

python3 ~/P105_Power_Plug/POWER_OFF_P105.py 
python3 ~/P105_Power_Plug/POWER_ON_P105.py 

Pythonスクリプトを動作させるシェルスクリプトを作る

Klipperから直接Pythonスクリプトを実行することはできないので、先ほど作ったPythonスクリプトを実行するためだけのShellスクリプトを作成します。

ファイル名は POWER_ON_P105.sh と POWER_OFF_P105.sh にしました。
同じディレクトリ ~/P105_Power_Plug に入れておきます。

#!/bin/sh

python3 ~/P105_Power_Plug/POWER_ON_P105.py
#!/bin/sh

python3 ~/P105_Power_Plug/POWER_OFF_P105.py

これらも chmod しておきましょう。

お試しで実行して無事にPythonスクリプトを叩いて電源ON/OFFできればOKです。

sh ~/P105_Power_Plug/POWER_OFF_P105.sh
sh ~/P105_Power_Plug/POWER_ON_P105.sh 

KIAUHで[G-Code Shell Command]をKlipperに追加する

今度はKlipperがShellコマンドを呼べるようにします。
KIAUHを使いますので、もしKIAUHをインストールしていない場合は下記で入れておいてください。

KIAUHのインストール

下記を順番に実行します。

git clone https://github.com/th33xitus/kiauh.git
cd kiauh
chmod +x kiauh.sh scripts/*
./kiauh.sh

KIAUHの画面が出れば成功です。

[G-Code Shell Command]をKlipperに追加する

KIAUHが立ち上がった画面で 4 エンターを押下します。
下記画面になりますので、今度は 8 エンター

下記画面で Y エンター すれば完了です。

Printer.cfgにgcode_macroをいくつか追加する

ここまで来たら、ほぼ大詰めです。
Mainsailの画面で MACHINE > Printer.cfgを開き、下記を追記しましょう。

[gcode_shell_command turn_on_p105]
command: sh /home/pi/P105_Power_Plug/POWER_ON_P105.sh
timeout: 2.
verbose: True

[gcode_shell_command turn_off_p105]
command: sh /home/pi/P105_Power_Plug/POWER_OFF_P105.sh
timeout: 2.
verbose: True

[gcode_macro POWER_ON_PLUG]
gcode:
    RUN_SHELL_COMMAND CMD=turn_on_p105

[gcode_macro POWER_OFF_PLUG]
gcode:
    RUN_SHELL_COMMAND CMD=turn_off_p105

ここまでできたら、また動作確認です。

DASHBOARDのMacros に移動し、POWER_OFF_PLUG 、 POWER_ON_PLUG をそれぞれ試してみましょう。(Consoleに直接コマンドを打っても動きます)

印刷終了時にノズル温度が下がったら電源を切るコマンドを追加する

最後のステップです。
印刷終了時にノズル温度が一定値以下になったら電源を切る、というコマンドをPrinter.cfgに追加します。私の場合、下記のようにしています。(こちらをベースに作りました)

######################################################################
# Power plug Control
######################################################################

[respond]
default_type: echo
#   Sets the default prefix of the "M118" and "RESPOND" output to one
#   of the following:
#       echo: "echo: " (This is the default)
#       command: "// "
#       error: "!! "
default_prefix: 
#   Directly sets the default prefix. If present, this value will
#   override the "default_type".

[idle_timeout]
gcode:
  RESPOND MSG='in idle_timeout'
  {% if printer["gcode_macro TURNOFF_CHANGE"].turnoff|int > 0  %}
        RESPOND MSG='WAIT edtruder temp'
        TEMPERATURE_WAIT SENSOR=extruder MAXIMUM=49      #Don't switch off when hot
        RESPOND MSG='edtruder temp OK'
        POWER_OFF_PLUG
        #SHUTDOWN_RASPBERRYPI
  {% else %}
  RESPOND MSG='CONTINUE PLUG POWER ON'
  {% endif %}
        M84   #switch off motors in any case

[gcode_macro TURNOFF_CHANGE]
variable_turnoff=0
gcode:
    SET_GCODE_VARIABLE MACRO=TURNOFF_CHANGE VARIABLE=turnoff VALUE={params.S|default(1)|int}
    RESPOND MSG='TURNOFF_CHANGE DONE'


[gcode_macro POWER_OFF_PRINTER]
gcode:
  #TURNOFF_CHANGE S=1
  SET_IDLE_TIMEOUT timeout=2    #call idle_timeout after 10 seconds
  G28 X

[gcode_macro SHUTDOWN_RASPBERRYPI]
gcode:
   {action_call_remote_method("shutdown_machine")}

これで本当の最後。
印刷するG-Codeの終わりに今追加した、[POWER_OFF_PRINTER]を入れましょう。
私は、下記をPrinter.cfgに入れて、Cura/PrusaSlicerから呼び出すようにしています。
(Ender-3 S1 Pro用なので、他の機体の場合やG1のコード修正してください)

######################################################################
# Start Print and End Print
######################################################################

# Replace the slicer's custom start and end g-code scripts with
# START_PRINT and END_PRINT.

[gcode_macro START_PRINT]
gcode:
    {% set BED_TEMP = params.BED_TEMP|default(60)|float %}
    {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(220)|float %}
    M104 S150 # set temporary nozzle temp to prevent oozing during homing
    M140 S{BED_TEMP} # set final bed temp
    G4 S30 # allow partial nozzle warmup
    G28 # home all axis and restore leveling
    G90  # use absolute coordinates
    G1 Z50 F240
    G1 X2.0 Y10 F3000
    M104 S{EXTRUDER_TEMP} # set final nozzle temp
    M190 S{BED_TEMP} # wait for bed temp to stabilize
    M109 S{EXTRUDER_TEMP} # wait for nozzle temp to stabilize
    G1 Z0.28 F240
    G92 E0
    G1 X2.0 Y140 E10 F1500 # prime the nozzle
    G1 X2.3 Y140 F5000
    G92 E0
    G1 X2.3 Y10 E10 F1200 # prime the nozzle
    G92 E0


[gcode_macro END_PRINT]
gcode:
    G91 #Relative positioning
    G1 E-2 F2700 #Retract a bit
    G1 E-2 Z0.2 F2400 #Retract and raise Z
    G1 X5 Y5 F3000 #Wipe out
#    G1 Z10 #Raise Z more
    G90 #Absolute positioning
    G1 X0 Y220 #Present print
    G91
    G1 Z50
    G90
    M106 S0 #Turn-off fan
    M104 S0 #Turn-off hotend
    M140 S0 #Turn-off bed
    M84 X Y E #Disable all steppers but Z
    G4 P10
    G4 P10
    G4 P10
    G4 P10
    G4 P10
    RESPOND MSG='POWER_OFF_PRINTER_check'
    {% if printer["gcode_macro TURNOFF_CHANGE"].turnoff|int > 0  %}
        RESPOND MSG='POWER_OFF_PRINTER executed'
        POWER_OFF_PRINTER
    {% endif %}

以上で設定は完了です。

使い方:Tp-Link [Tapo P105]をKlipper/Mainsailで制御する方法

最後に使い方を紹介します。

出力完了時にPrinterの電源を切りたくなったら、DASHBOARDで[TURNOFF_CHANGE]マクロを実行します。
印刷開始前、途中どちらでも構いません。

(やっぱり、電源ON継続に戻そう、と思ったらTURN_OFF_CHANGEの引数を0で再実行すればOKです)

まとめ:Tp-Link [Tapo P105]をKlipper/Mainsailで制御する方法

「Tp-Link [Tapo P105]をKlipper/Mainsailで制御し印刷完了時に電源を落とす方法」の説明は以上です。

あと、obicoからもKlipper tunnelでMainsailのUIにアクセスできるので、外出先からTURNOFF_CHANGEを実行すれば印刷終了時に電源OFFにする設定も可能ですね。

たまにうまく動かないことがあるので、100%信頼して使える訳ではないのですが、結構便利なんじゃないでしょうか。

ぜひ、お試しを。それでは〜。