# Sending GCODE commands from within a plugin

**URL:** <https://klipper.discourse.group/t/sending-gcode-commands-from-within-a-plugin/7907>\
**Category:** Developers\
**Created:** [April 18, 2023, 5:53pm UTC](https://klipper.discourse.group/t/sending-gcode-commands-from-within-a-plugin/7907 "2023-04-18T17:53:36Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![ericpskl](https://yyz2.discourse-cdn.com/free1/user_avatar/klipper.discourse.group/ericpskl/32/4479_2.png) [@ericpskl](https://klipper.discourse.group/u/ericpskl)\
**Post date:** [April 18, 2023, 5:53pm UTC](https://klipper.discourse.group/t/sending-gcode-commands-from-within-a-plugin/7907/1 "2023-04-18T17:53:36Z")

</div>

What’s the preferred method for sending a gcode command (such as “M117 Hello World”) from Python from within a Klipper plug-in? I could shell out and write to /tmp/printer, but that doesn’t seem very elegant.

Thanks 🙂

---

<div class="post-metadata">

**Author:** ![Sineos](https://yyz2.discourse-cdn.com/free1/user_avatar/klipper.discourse.group/sineos/32/18_2.png) [@Sineos](https://klipper.discourse.group/u/Sineos)\
**Post date:** [April 18, 2023, 7:06pm UTC](https://klipper.discourse.group/t/sending-gcode-commands-from-within-a-plugin/7907/2 "2023-04-18T19:06:07Z")

</div>

> <https://github.com/Klipper3d/klipper/blob/master/klippy/extras/firmware_retraction.py>

---

<div class="post-metadata">

**Author:** ![ericpskl](https://yyz2.discourse-cdn.com/free1/user_avatar/klipper.discourse.group/ericpskl/32/4479_2.png) [@ericpskl](https://klipper.discourse.group/u/ericpskl)\
**Post date:** [April 18, 2023, 7:36pm UTC](https://klipper.discourse.group/t/sending-gcode-commands-from-within-a-plugin/7907/3 "2023-04-18T19:36:37Z")

</div>

That code is the opposite of what I need – this shows how to use gcode commands to interact w/the plugin.

How do I use the plugin to issue gcode commands back to Klipper? e.g. change the display text with M117?

---

<div class="post-metadata">

**Author:** ![flowerysong](https://yyz2.discourse-cdn.com/free1/user_avatar/klipper.discourse.group/flowerysong/32/10214_2.png) [@flowerysong](https://klipper.discourse.group/u/flowerysong)\
**Post date:** [April 19, 2023, 6:10am UTC](https://klipper.discourse.group/t/sending-gcode-commands-from-within-a-plugin/7907/4 "2023-04-19T06:10:26Z")

</div>

I think they meant to point to later in the file, where `run_script_from_command()` is used:

```python
    def cmd_G11(self, gcmd):
        if self.is_retracted:
            self.gcode.run_script_from_command(
                "SAVE_GCODE_STATE NAME=_retract_state\n"
                "G91\n"
                "G1 E%.5f F%d\n"
                "RESTORE_GCODE_STATE NAME=_retract_state"
                % (self.unretract_length, self.unretract_speed*60))
            self.is_retracted = False

```

([klipper/pause\_resume.py at master · Klipper3d/klipper · GitHub](https://github.com/Klipper3d/klipper/blob/master/klippy/extras/pause_resume.py) is a better example, since it also demonstrates `run_script()`)

---

<div class="post-metadata">

**Author:** ![ericpskl](https://yyz2.discourse-cdn.com/free1/user_avatar/klipper.discourse.group/ericpskl/32/4479_2.png) [@ericpskl](https://klipper.discourse.group/u/ericpskl)\
**Post date:** [April 19, 2023, 10:40am UTC](https://klipper.discourse.group/t/sending-gcode-commands-from-within-a-plugin/7907/5 "2023-04-19T10:40:24Z")

</div>

Thanks @flowerysong – that worked perfectly.

 ![2023-04-19 06_39_58-Photo - Google Photos](https://global.discourse-cdn.com/free1/uploads/klipper/original/2X/5/5d5984b4306ab958519c56c4da91c8fe38f71aad.jpeg)
