Home Assistant Unofficial Reference 2024.12.1
button.py
Go to the documentation of this file.
1 """Support for Octoprint buttons."""
2 
3 from pyoctoprintapi import OctoprintClient, OctoprintPrinterInfo
4 
5 from homeassistant.components.button import ButtonDeviceClass, ButtonEntity
6 from homeassistant.config_entries import ConfigEntry
7 from homeassistant.core import HomeAssistant
8 from homeassistant.exceptions import HomeAssistantError
9 from homeassistant.helpers.entity_platform import AddEntitiesCallback
10 from homeassistant.helpers.update_coordinator import CoordinatorEntity
11 
12 from . import OctoprintDataUpdateCoordinator
13 from .const import DOMAIN
14 
15 
17  hass: HomeAssistant,
18  config_entry: ConfigEntry,
19  async_add_entities: AddEntitiesCallback,
20 ) -> None:
21  """Set up Octoprint control buttons."""
22  coordinator: OctoprintDataUpdateCoordinator = hass.data[DOMAIN][
23  config_entry.entry_id
24  ]["coordinator"]
25  client: OctoprintClient = hass.data[DOMAIN][config_entry.entry_id]["client"]
26  device_id = config_entry.unique_id
27  assert device_id is not None
28 
30  [
31  OctoprintResumeJobButton(coordinator, device_id, client),
32  OctoprintPauseJobButton(coordinator, device_id, client),
33  OctoprintStopJobButton(coordinator, device_id, client),
34  OctoprintShutdownSystemButton(coordinator, device_id, client),
35  OctoprintRebootSystemButton(coordinator, device_id, client),
36  OctoprintRestartOctoprintButton(coordinator, device_id, client),
37  ]
38  )
39 
40 
42  CoordinatorEntity[OctoprintDataUpdateCoordinator], ButtonEntity
43 ):
44  """Represent an OctoPrint binary sensor."""
45 
46  client: OctoprintClient
47 
48  def __init__(
49  self,
50  coordinator: OctoprintDataUpdateCoordinator,
51  button_type: str,
52  device_id: str,
53  client: OctoprintClient,
54  ) -> None:
55  """Initialize a new OctoPrint button."""
56  super().__init__(coordinator)
57  self.clientclient = client
58  self._device_id_device_id = device_id
59  self._attr_name_attr_name = f"OctoPrint {button_type}"
60  self._attr_unique_id_attr_unique_id = f"{button_type}-{device_id}"
61  self._attr_device_info_attr_device_info = coordinator.device_info
62 
63  @property
64  def available(self) -> bool:
65  """Return if entity is available."""
66  return self.coordinator.last_update_success and self.coordinator.data["printer"]
67 
68 
70  CoordinatorEntity[OctoprintDataUpdateCoordinator], ButtonEntity
71 ):
72  """Represent an OctoPrint binary sensor."""
73 
74  client: OctoprintClient
75 
76  def __init__(
77  self,
78  coordinator: OctoprintDataUpdateCoordinator,
79  button_type: str,
80  device_id: str,
81  client: OctoprintClient,
82  ) -> None:
83  """Initialize a new OctoPrint button."""
84  super().__init__(coordinator)
85  self.clientclient = client
86  self._device_id_device_id = device_id
87  self._attr_name_attr_name = f"OctoPrint {button_type}"
88  self._attr_unique_id_attr_unique_id = f"{button_type}-{device_id}"
89  self._attr_device_info_attr_device_info = coordinator.device_info
90 
91  @property
92  def available(self) -> bool:
93  """Return if entity is available."""
94  return self.coordinator.last_update_success
95 
96 
98  """Pause the active job."""
99 
100  def __init__(
101  self,
102  coordinator: OctoprintDataUpdateCoordinator,
103  device_id: str,
104  client: OctoprintClient,
105  ) -> None:
106  """Initialize a new OctoPrint button."""
107  super().__init__(coordinator, "Pause Job", device_id, client)
108 
109  async def async_press(self) -> None:
110  """Handle the button press."""
111  printer: OctoprintPrinterInfo = self.coordinator.data["printer"]
112 
113  if printer.state.flags.printing:
114  await self.clientclient.pause_job()
115  elif not printer.state.flags.paused and not printer.state.flags.pausing:
116  raise InvalidPrinterState("Printer is not printing")
117 
118 
120  """Resume the active job."""
121 
122  def __init__(
123  self,
124  coordinator: OctoprintDataUpdateCoordinator,
125  device_id: str,
126  client: OctoprintClient,
127  ) -> None:
128  """Initialize a new OctoPrint button."""
129  super().__init__(coordinator, "Resume Job", device_id, client)
130 
131  async def async_press(self) -> None:
132  """Handle the button press."""
133  printer: OctoprintPrinterInfo = self.coordinator.data["printer"]
134 
135  if printer.state.flags.paused:
136  await self.clientclient.resume_job()
137  elif not printer.state.flags.printing and not printer.state.flags.resuming:
138  raise InvalidPrinterState("Printer is not currently paused")
139 
140 
142  """Resume the active job."""
143 
144  def __init__(
145  self,
146  coordinator: OctoprintDataUpdateCoordinator,
147  device_id: str,
148  client: OctoprintClient,
149  ) -> None:
150  """Initialize a new OctoPrint button."""
151  super().__init__(coordinator, "Stop Job", device_id, client)
152 
153  async def async_press(self) -> None:
154  """Handle the button press."""
155  printer: OctoprintPrinterInfo = self.coordinator.data["printer"]
156 
157  if printer.state.flags.printing or printer.state.flags.paused:
158  await self.clientclient.cancel_job()
159 
160 
162  """Shutdown the system."""
163 
164  def __init__(
165  self,
166  coordinator: OctoprintDataUpdateCoordinator,
167  device_id: str,
168  client: OctoprintClient,
169  ) -> None:
170  """Initialize a new OctoPrint button."""
171  super().__init__(coordinator, "Shutdown System", device_id, client)
172 
173  async def async_press(self) -> None:
174  """Handle the button press."""
175  await self.clientclient.shutdown()
176 
177 
179  """Reboot the system."""
180 
181  _attr_device_class = ButtonDeviceClass.RESTART
182 
183  def __init__(
184  self,
185  coordinator: OctoprintDataUpdateCoordinator,
186  device_id: str,
187  client: OctoprintClient,
188  ) -> None:
189  """Initialize a new OctoPrint button."""
190  super().__init__(coordinator, "Reboot System", device_id, client)
191 
192  async def async_press(self) -> None:
193  """Handle the button press."""
194  await self.clientclient.reboot_system()
195 
196 
198  """Restart Octoprint."""
199 
200  _attr_device_class = ButtonDeviceClass.RESTART
201 
202  def __init__(
203  self,
204  coordinator: OctoprintDataUpdateCoordinator,
205  device_id: str,
206  client: OctoprintClient,
207  ) -> None:
208  """Initialize a new OctoPrint button."""
209  super().__init__(coordinator, "Restart Octoprint", device_id, client)
210 
211  async def async_press(self) -> None:
212  """Handle the button press."""
213  await self.clientclient.restart()
214 
215 
217  """Service attempted in invalid state."""
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str device_id, OctoprintClient client)
Definition: button.py:105
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str button_type, str device_id, OctoprintClient client)
Definition: button.py:54
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str device_id, OctoprintClient client)
Definition: button.py:188
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str device_id, OctoprintClient client)
Definition: button.py:207
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str device_id, OctoprintClient client)
Definition: button.py:127
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str device_id, OctoprintClient client)
Definition: button.py:169
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str device_id, OctoprintClient client)
Definition: button.py:149
None __init__(self, OctoprintDataUpdateCoordinator coordinator, str button_type, str device_id, OctoprintClient client)
Definition: button.py:82
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: button.py:20