From 9e240c3b861a8ef7057c0cb14c237b40cc058b81 Mon Sep 17 00:00:00 2001 From: Arksine Date: Wed, 27 Jan 2021 06:31:29 -0500 Subject: [PATCH] power: add "klipper_restart_method" option When this option is set Mooraker will restart Klipper after the device has been powered on. An additional "restart_delay" option has been added to customize the delay in which the restart is executed. Signed-off-by: Eric Callahan --- moonraker/plugins/power.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/moonraker/plugins/power.py b/moonraker/plugins/power.py index 238c4e0..4854c53 100644 --- a/moonraker/plugins/power.py +++ b/moonraker/plugins/power.py @@ -104,6 +104,10 @@ class PrinterPower: async def _process_request(self, device, req): if req in ["on", "off"]: + cur_state = device.get_device_info()['status'] + if req == cur_state: + # device is already in requested state, do nothing + return cur_state printing = await self._check_klippy_printing() if device.get_locked_while_printing() and printing: raise self.server.error( @@ -114,6 +118,7 @@ class PrinterPower: await ret dev_info = device.get_device_info() self.server.send_event("gpio_power:power_changed", dev_info) + device.run_power_changed_action() elif req == "status": ret = device.refresh_status() if asyncio.iscoroutine(ret): @@ -164,11 +169,19 @@ class PowerDevice: name_parts = config.get_name().split(maxsplit=1) if len(name_parts) != 2: raise config.error(f"Invalid Section Name: {config.get_name()}") + self.server = config.get_server() self.name = name_parts[1] self.state = "init" self.locked_while_printing = config.getboolean( 'locked_while_printing', False) self.off_when_shutdown = config.getboolean('off_when_shutdown', False) + self.restart_delay = 1. + self.klipper_restart = config.getboolean( + 'restart_klipper_when_powered', False) + if self.klipper_restart: + self.restart_delay = config.getfloat('restart_delay', 1.) + if self.restart_delay < .000001: + raise config.error("Option 'restart_delay' must be above 0.0") def get_name(self): return self.name @@ -183,6 +196,13 @@ class PowerDevice: def get_locked_while_printing(self): return self.locked_while_printing + def run_power_changed_action(self): + if self.state == "on" and self.klipper_restart: + ioloop = IOLoop.current() + klippy_apis = self.server.lookup_plugin("klippy_apis") + ioloop.call_later(self.restart_delay, klippy_apis.do_restart, + "FIRMWARE_RESTART") + class GpioChipFactory: def __init__(self): self.chips = {}