docs: add button documentation

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
Eric Callahan 2022-01-12 06:25:37 -05:00
parent 4c087612d8
commit 59fd35827e
2 changed files with 204 additions and 1 deletions

View File

@ -740,7 +740,7 @@ command_payload:
# all changes in state to the state topic. # all changes in state to the state topic.
retain_command_state: False retain_command_state: False
# To query a tasmota device we send the command topic without a payload. # To query a tasmota device we send the command topic without a payload.
# Otpionally we could send a "?" as the payload. # Optionally we could send a "?" as the payload.
query_topic: cmnd/tasmota_switch/POWER query_topic: cmnd/tasmota_switch/POWER
# query_payload: ? # query_payload: ?
state_topic: stat/tasmota_switch/POWER state_topic: stat/tasmota_switch/POWER
@ -1194,6 +1194,133 @@ easily detect and use Moonraker instances.
[zeroconf] [zeroconf]
``` ```
### `[button]`
Enables support for handling `button` events.
```ini
# moonraker.conf
[button my_button]
type: gpio
# Reserved for future use. Currently the only button type availble is
# 'gpio', which is the default.
pin: gpiochip0/gpio26
# The gpio pin to watch for button events. The chip is optional, if
# omitted then the module will default to gpiochip0. The pin may be
# inverted by specifying a "!" may be prefix. Valid examples:
# gpiochip0/gpio26
# gpio26
# !gpiochip0/gpio26
# !gpio26
# Systems with libgpiod 1.5 or greater installed also support pullup and
# pulldown modes. Prefix a "^" to enable the internal pullup and a "~" to
# enable the internal pulldown:
# ^gpiochip0/gpio26
# ^gpio26
# ~gpiochip0/gpio26
# ~gpio26
# # Its also possible to invert a pin with the pullup/pulldown enabled
# ^!gpiochip0/gpio26
# ~!gpiochip0/gpio26
# This parameter must be provided
min_event_time: .05
# The mimimum time (in seconds) between events to trigger a response. This is
# is used to debounce buttons. This value must be at least .01 seconds.
# The default is .05 seconds (50 milliseconds).
on_press:
on_release:
# Jinja2 templates to be executed when a button event is detected. At least one
# must be provided.
```
#### Button Templates
Both the `on_press` and `on_release` templates are provided a context with the
with two methods that may be called in addition to Jinja2's default filters
adn methods:
- `call_method`: Calls an internal API method. See the
[API documentation](web_api.md#jinja2-template-api-calls) for details.
- `send_notification`: Emits a websocket notification. This is useful if you
wish to use buttons to notify attached clients of some action. This
method takes an optional argument that can contain any JSON encodable
type. If provided, this value will be sent as part of the payload with
the notification.
Additionally, the following context variables are available:
- `event`: This is a dictionary with details about the event:
- `elapsed_time`: The time elapsed (in seconds) since the last detected
button event
- `received_time`: The time the event was detected according to asyncio's
monotonic clock. Note that this is not in "unix time".
- `render_time`: The time the template was rendered (began execution)
according to asyncio's montonic clock. It is possible execution of
an event may be delayed well beyond the `received_time`.
- `pressed`: A boolean value to indicate if the button is currently pressed.
- `user_data`: This is a dictionary in which templates can store information
that will persist across events. This may be useful to track the number of
events, specific timing of events, return values from previous API calls,
etc. Note that the data in this field does not persist across Moonraker
restarts.
!!! Warning
It is recommended to avoid API calls that may block (ie: the `update` APIs).
Only one event may be rendered at a time, subsequent events received will be
delayed. Calling a blocking API would effectively make the button
non-responsive until the API call returns.
Button Template Examples:
```ini
# moonraker.conf
# Emergency Stop Example
[button estop]
type: gpio
pin: gpio26
on_press:
# Executes immediately after a press is detected
{% do call_method("priner.emergency_stop") %}
# Reboot Long Press Example
[button reboot]
type: gpio
pin: gpio26
on_release:
# Only call reboot if the button was held for more than 1 second.
# Note that this won't execute until the button has been released.
{% if event.elapsed_time > 1.0 %}
{% do call_method("machine.reboot") %}
{% endif %}
# Double Click Notificaion Example
[button notify_btn]
type: gpio
pin: gpio26
on_press:
# Use the "user_data" context variable to track a single click
{% set clicked = user_data.clicked|default(false) %}
# It isn't possible to assign a value to a context variable in Jinja2,
# however since user_data is a dict we can call its methods. The
# call to __setitem__ below is equivalent to:
# user_data["clicked"] = true
{% do user_data.__setitem__("clicked", true) %}
{% if event.elapsed_time < 0.5 and clicked %}
# We will consider this a double click if the second click occurs
# within .5 seconds of releasing the first
{% do user_data.__setitem__("clicked", false) %}
{% do user_data.__setitem__("double_clicked", true) %}
{% endif %}
on_release:
{% set double_clicked = user_data.double_clicked|default(false) %}
{% if double_clicked %}
{% do user_data.__setitem__("double_clicked", false) %}
{% do send_notification("Double Clicked!") %}
{% endif %}
```
### `[secrets]` ### `[secrets]`
Retrieves credentials and other information from a "secrets" file Retrieves credentials and other information from a "secrets" file

View File

@ -134,6 +134,38 @@ The `test/client` folder includes a basic test interface with example usage for
most of the requests below. It also includes a basic JSON-RPC implementation most of the requests below. It also includes a basic JSON-RPC implementation
that uses promises to return responses and errors (see json-rpc.js). that uses promises to return responses and errors (see json-rpc.js).
### Jinja2 Template API Calls
Some template options in Moonraker's configuration, such as those in the
[button](configuration.md#button) component, may call Moonraker APIs through
the `call_method(method_name, kwargs)` context function. The `call_method`
function takes the API's JSON-RPC method name as its first parameter, followed
by a set of keyword arguments as per the method's requirements.
```ini
# moonraker.conf
# Query Printer Objects example
[button check_status]
pin: gpio26
on_press:
{% set query_objs = {"toolhead": ["position"], "print_stats": None} %}
# JSON-RPC method is "printer.objects.query", which takes a single "objects"
# argument
{% set status = call_method("printer.objects.query", objects=query_objs) %}
# do something with the value returned from the object query, perhaps
# send a websocket notification or publish a mqtt topic
# Publish button event to MQTT Topic
[button check_status]
pin: gpio26
on_release:
# JSON-RPC method is "server.mqtt.publish"
{% do call_method("server.mqtt.publish",
topic="moonraker/mybutton",
payload="Button Released") %}
```
### Printer Administration ### Printer Administration
#### Get Klippy host information #### Get Klippy host information
@ -3788,6 +3820,50 @@ The object sent with the notification contains the following fields:
be `null`. be `null`.
- `queue_state`: The current queue state - `queue_state`: The current queue state
#### Button Event
Moonraker `[button]` components may be configured to emit websocket
notifications.
```json
{
"jsonrpc": "2.0",
"method": "notify_button_event",
"params": [
{
"name": "my_button",
"type": "gpio",
"event": {
"elapsed_time": 0.09323832602240145,
"received_time": 698614.214597004,
"render_time": 698614.214728513,
"pressed": false
},
"aux": null
}
]
}
```
The `params` array will always contain a single object with the following
fields:
- `name`: The name of the configured button
- `type`: The button type, currently this will always be `gpio`
- `event`: An object with details about the button event, containing the
following fields:
- `elapsed_time`: The time elapsed (in seconds) since the last detected
button event
- `received_time`: The time the event was detected according to asyncio's
monotonic clock. Note that this is not in "unix time".
- `render_time`: The time the template was rendered (began execution)
according to asyncio's montonic clock. It is possible execution of
an event may be delayed well beyond the `received_time`.
- `pressed`: A boolean value to indicate if the button is currently pressed.
- `aux`: This is an optional field where the button may specify any json
encodable value. Clients may suggest a specific button configuration
that includes details about the event. If no aux parameter is specified
in the configuration this will be a `null` value.
### Appendix ### Appendix
#### Websocket setup #### Websocket setup