config.yaml
· 43 KiB · YAML
Raw
################################################################################
# Sample Platypush configuration file.
#
# Edit it and:
# - Copy it to /etc/platypush/config.yaml for system installation.
# - Copy it to ~/.config/platypush/config.yaml for user installation.
# - Start the application with `-c <path-to-this-file>`.
#
# Since the configuration file also includes the custom integrations, you can
# create a Platypush custom installation, with all the extra dependencies
# required by the configured integrations, using the `platydock` or `platyvenv`
# commands and passing this file as an argument. These commands will build a
# Docker image or a Python virtual environment respectively, with all the
# required extra dependencies inferred from your configuration file.
#
# A `scripts` directory with an empty `__init__.py` script will also be created
# under the same directory as the configuration file. This directory can be
# used to add custom scripts containing procedures, hooks and crons if you want
# a full Python interface to define your logic rather than a YAML file.
#
# Please refer to the `scripts` directory provided under this file's directory
# for some examples that use the Python API.
################################################################################
### ------------------
### Include directives
### ------------------
###
# # You can split your configuration over multiple files and use the include
# # directive to import other files into your configuration.
#
# # Files referenced via relative paths will be searched in the directory of
# # the configuration file that references them. Symbolic links are also
# # supported.
#
# include:
# - logging.yaml
# - media.yaml
# - sensors.yaml
###
### -----------------
### Working directory
### -----------------
###
# # Working directory of the application. This is where the main database will be
# # stored by default (if the default SQLite configuration is used), and it's
# # where the integrations will store their state.
#
# # Note that the working directory can also be specified at runtime using the
# # -w/--workdir option.
# #
# # If not specified, then one of the following will be used:
# #
# # - $XDG_DATA_HOME/platypush if the XDG_DATA_HOME environment variable is set.
# # - /var/lib/platypush if the user is root.
# # - $HOME/.local/share/platypush otherwise.
#
# workdir: ~/.local/share/platypush
###
### -----------------
### Cache directory
### -----------------
###
# # Note that the cache directory can also be specified at runtime using the
# # --cachedir option.
# #
# # If not specified, then one of the following will be used:
# #
# # - $XDG_CACHE_DIR/platypush if the XDG_CACHE_DIR environment variable is set.
# # - /var/cache/platypush if the user is root.
# # - $HOME/.cache/platypush otherwise.
#
# cachedir: ~/.cache/platypush
###
### ----------------------
### Database configuration
### ----------------------
###
# # By default Platypush will use a SQLite database named `main.db` under the
# # `workdir`. You can specify any other engine string here - the application has
# # been tested against SQLite, Postgres and MariaDB/MySQL >= 8.
# #
# # You can also specify a custom database engine at runtime (SQLAlchemy syntax
# # supported) through the `--db` argument otherwise.
# #
# # NOTE: If you want to use a DBMS other than SQLite, then you will also need to
# # ensure that a compatible Python driver is installed on the system where
# # Platypush is running. For example, Postgres will require the Python pg8000,
# # psycopg or another compatible driver.
#
# main.db:
# engine: sqlite:////home/user/.local/share/platypush/main.db
# # OR, if you want to use e.g. Postgres with the pg8000 driver:
# engine: postgresql+pg8000://dbuser:dbpass@dbhost/dbname
#
# # NOTE: The short syntax `main.db: <engine_string>` is also supported.
###
### ---------------------
### Logging configuration
### ---------------------
###
# # Platypush logs on stdout by default. You can use the logging section to
# # specify an alternative file or change the logging level.
#
# # Note that a custom logging directory can also be specified at runtime using
# # the -l/--logsdir option.
#
# logging:
# filename: ~/.local/log/platypush/platypush.log
# level: INFO
###
### -----------------------
### device_id configuration
### -----------------------
###
# # The device_id is used by many components of Platypush and it should uniquely
# # identify a device in your network. If nothing is specified then the hostname
# # will be used.
#
# # Note that a custom device ID can also be specified at runtime using the
# # -d/--device-id option.
#
# device_id: my_device
###
### -------------------
### Redis configuration
### -------------------
###
# # Platypush needs a Redis instance for inter-process communication.
# #
# # By default, the application will try and connect to a Redis server listening
# # on localhost:6379.
# #
# # Platypush can also start the service on the fly if instructed to do so
# # through the `--start-redis` option. You can also specify a custom port
# # through the `--redis-port` option.
# #
# # If you are running Platypush in a Docker image built through Platydock, then
# # `--start-redis` is the default behaviour and you won't need any extra
# # documentation here.
#
# redis:
# host: localhost
# port: 6379
# username: user
# password: secret
###
### ------------------------
### Web server configuration
### ------------------------
###
# Platypush comes with a versatile Web server that is used to:
#
# - Serve the main UI and the UIs for the plugins that provide one.
# - Serve custom user-configured dashboards.
# - Expose the `/execute` RPC endpoint to send synchronous requests.
# - Expose the `/ws/events` and `/ws/requests` Websocket paths, which can be
# respectively by other clients to subscribe to the application's events or
# send asynchronous requests.
# - Stream media files provided by other plugins, as well as camera and audio
# feeds.
# - Serve custom directories of static files that can be accessed by other
# clients.
# - Provide a versatile API for hooks - the user can easily create custom HTTP
# hooks by creating a hook with their custom logic that reacts when a
# `platypush.message.event.http.hook.WebhookEvent` is received. The `hook`
# parameter of the event specifies which URL will be served by the hook.
#
# The Web server is enabled by default, but you can disable it simply by
# commenting/removing the `backend.http` section. The default listen port is
# 8008.
#
# After starting the application, you can access the UI at
# http://localhost:8008, set up your username and password, and also create an
# access or session token from the configuration panel.
#
# This token can be used to authenticate calls to the available APIs.
# For example, to turn on the lights using the /execute endpoint:
#
# curl -XPOST -H "Authorization: Bearer $TOKEN" \
# -H "Content-Type: application/json" \
# -d '
# {
# "type": "request",
# "action": "light.hue.on",
# "args": {
# "lights": ["Bedroom"]
# }
# }' http://localhost:8008/execute
#
# If you want to serve the Web server behind a reverse proxy, you can copy the
# reference configuration available at
# https://git.platypush.tech/platypush/platypush/src/branch/master/examples/nginx/nginx.sample.conf
backend.http:
# # Bind address (default: 0.0.0.0)
# bind_address: 0.0.0.0
# # Listen port (default: 8008)
port: 8008
# # resource_dirs can be used to specify directories on the host system that
# # you want to expose through the Web server. For example, you may want to
# # expose directories that contain photos or images if you want to make a
# # carousel dashboard, or a directory containing some files that you want to
# # share with someone (or other systems) using a simple Web server.
# #
# # In the following example, we're exposing a directory with photos on an
# # external hard drive other the `/photos` URL. An image like e.g.
# # `/mnt/hd/photos/IMG_1234.jpg` will be served over e.g.
# # `http://localhost:8008/photos/IMG_1234.jpg` in this case.
# resource_dirs:
# photos: /mnt/hd/photos
# # Number of WSGI workers. Default: (#cpus * 2) + 1
# num_workers: 4
### -----------------------------
### Plugin configuration examples
### -----------------------------
###
# # The configuration of a plugin matches one-to-one the parameters required by
# # its constructor.
# #
# # Plugin classes are documented at https://docs.platypush.tech/en/latest/plugins.html
# #
# # For example, there is a `light.hue` plugin
# # (https://docs.platypush.tech/platypush/plugins/light.hue.html) whose
# # constructor takes the following parameters: `bridge`, `lights` (default
# # target lights for the commands), `groups` (default target groups for the
# # commands) and `poll_interval` (how often the plugin should poll for updates).
# #
# # This means that the `light.hue` plugin can be configured here as:
#
# light.hue:
# # IP address or hostname of the Hue bridge
# # NOTE: The first run will require you to register the application with
# # your bridge - that's usually done by pressing a physical button on your
# # bridge while the application is pairing.
# bridge: 192.168.1.3
# # Groups that will be handled by default if nothing is specified on the request
# groups:
# - Living Room
#
# # How often we should poll for updates (default: 20 seconds)
# poll_interval: 20
###
###
# # Example configuration of the MQTT plugin.
# # This plugin allows you to subscribe to MQTT topics and trigger `platypush.message.event.mqtt.MQTTMessageEvent`
# # events that you can hook on when new messages are received.
# # You can also publish messages to MQTT topics through the `mqtt.publish` action.
#
# mqtt:
# # Host and port of the MQTT broker
# host: my-mqtt-broker
# port: 1883
# # Topic to subscribe to. Messages received on these topics will trigger `MQTTMessageEvent` events.
# topics:
# - platypush/sensors
#
# # Extra listeners. You can use them to subscribe to multiple brokers at the same time.
# listeners:
# - host: another-mqtt-broker
# port: 1883
# username: user
# password: secret
# topics:
# - platypush/tests
###
###
# # Example configuration of a voice assistant.
# # Several voice assistant plugins and engines are available - Google
# # Assistant, Alexa, DeepSpeech, Picovoice etc.
# #
# # The Google Assistant is probably the most straightforward to configure and
# # the richest in terms of features provided out-of-the-box and speech
# # detection quality, while others may require further tinkering, may perform
# # worse than the Google model, and/or may run models on-device which could not
# # be within reach for some machines.
# #
# # Check the documentation of the `assistant.google` plugin for instructions on
# # how to get a credentials file that you can use with a custom assistant
# # installation.
# #
# # Note however that the Google Assistant plugin leverages the
# # `google-assistant-library`, which has been deprecated a while ago by Google
# # and it's unlikely to receive updates (although it still works and I'd still
# # expect it to work).
#
# assistant.google:
# # Path to your credentials file (by default it will look either under
# # ~/.config/google-oauthlib-tool/credentials.json or
# # <WORKDIR>/credentials/google/assistant.json
# # credentials_file: ~/credentials/assistant.json
# # If specified, then this sound will be played when a conversation starts
# # conversation_start_sound: ~/sounds/assistant-start.mp3
###
###
# # Example configuration of music.mpd plugin, a plugin to interact with MPD and
# # Mopidy music server instances. See
# # https://docs.platypush.tech/en/latest/platypush/plugins/music.mpd.html
# # You can easily install the dependencies through pip install 'platypush[mpd]'
#
# music.mpd:
# host: localhost
# port: 6600
###
###
# # Example last.fm scrobbler configuration, to synchronize your music
# # activities to your Last.fm profile. You'll need to register an application
# # with your account at https://www.last.fm/api.
#
# lastfm:
# api_key: <API_KEY>
# api_secret: <API_SECRET>
# username: <USERNAME>
# password: <PASSWORD>
###
###
# # Plugins with empty configuration can also be explicitly enabled by specifying
# # `enabled: true` or `disabled: false`. An integration with no items will be
# # enabled with no configuration.
#
# clipboard:
###
###
# # Enable the system plugin if you want your device to periodically report
# # system statistics (CPU load, disk usage, memory usage etc.)
# #
# # When new data is gathered, an `EntityUpdateEvent` with `plugin='system'` will
# # be triggered with the new data, and you can subscribe a hook to these events
# # to run your custom logic.
#
# system:
# # How often we should poll for new data
# poll_interval: 60
###
###
# # Example configuration for the calendar plugin. In this case, we have
# # registered a Google calendar that uses the `google.calendar` integration, and
# # a Facebook plugin and a NextCloud (WebDAV) plugin exposed over iCal format.
# # Installing the dependencies: pip install 'platypush[ical,google]'
# calendar:
# calendars:
# - type: google.calendar
# - type: calendar.ical
# url: https://www.facebook.com/events/ical/upcoming/?uid=your_user_id&key=your_key
# - type: calendar.ical
# url: https://my.nextcloud.org/remote.php/dav/public-calendars/id?export
###
###
# # Example configuration for the alarm plugin. It is possible to define alarms
# # both statically, i.e. through configuration snippets under the `alarm`
# # section, and dynamically, i.e. with an `alarm.add` request with the
# # configuration of the desired alarm.
#
# alarm:
# # Media plugin that will be used to play the alarm audio.
# # If not specified, the first available configured media plugin
# # will be used.
# media_plugin: media.vlc
#
# alarms:
# morning_alarm:
# # Cron expression format: run every weekday at 7 AM
# when: '0 7 * * 1-5'
# media: ~/path/your_ringtone.mp3
# audio_volume: 10 # 10%
#
# # Repeat the played media resource until the alarm is
# # snoozed/dismissed (default: true)
# media_repeat: true
#
# # Wait 5 minutes between a snooze and another run
# snooze_interval: 300
#
# # After 10 minutes with no manual snooze/dismiss,
# # stop the alarm
# dismiss_interval: 600
#
# # Actions to be executed when the alarm goes on
# actions:
# - action: tts.say
# args:
# text: Good morning
#
# - action: light.hue.bri
# args:
# value: 1
#
# - action: light.hue.bri
# args:
# value: 140
# transitiontime: 150
#
# one_shot_alarm:
# # One-shot execution, with timestamp in ISO format
# when: '2020-02-18T07:00:00.000000'
# media: ~/path/your_ringtone.mp3
# actions:
# - action: light.hue.on
#
# timer:
# # This alarm will execute the specified number of seconds
# # after being initialized (5 minutes after the plugin has
# # been initialized in this case)
# when: 300
# media: ~/path/your_ringtone.mp3
# actions:
# - action: light.hue.on
###
###
# # Torrent plugin configuration, with the default directory that should be used
# # to store downloaded files.
#
# torrent:
# download_dir: ~/Downloads
###
###
# # List of RSS/Atom subscriptions. These feeds will be monitored for changes and
# # a `platypush.message.event.rss.NewFeedEntryEvent`
# # (https://docs.platypush.tech/platypush/events/rss.html#platypush.message.event.rss.NewFeedEntryEvent)
# # will be triggered when one of these feeds has new entries - you can subscribe
# # the event to run your custom logic.
#
# rss:
# # How often we should check for updates (default: 5 minutes)
# poll_seconds: 300
# # List of feeds to monitor
# subscriptions:
# - https://www.theguardian.com/rss/world
# - https://phys.org/rss-feed/
# - https://news.ycombinator.com/rss
# - https://www.technologyreview.com/stories.rss
# - https://api.quantamagazine.org/feed/
###
###
# # The file monitor plugin can be used to track modifications to the
# # filesystem - for example, when a file or a directory is modified, created
# # or removed.
#
# file.monitor:
# paths:
# # Recursively monitor changes on the
# # ~/my-images folder that include all the files
# # matching a JPEG extension in case-insensitive
# # mode, excluding those whose name starts with
# # tmp_ and all the files contained in the
# # __MACOSX folders
# - path: ~/my-images
# recursive: true
# case_sensitive: false
# regexes:
# - '.*\\.jpe?g$'
# ignore_patterns:
# - '^tmp_.*'
# ignore_directories:
# - '__MACOSX'
###
###
# # Example configuration of a weather plugin
#
# weather.openweathermap:
# token: secret
# lat: lat
# long: long
###
###
# # You can add IFTTT integrations to your routines quite easily.
# #
# # Register an API key for IFTTT, paste it here, and you can run an
# # `ifttt.trigger_event` action to fire an event on IFTTT.
# #
# # You can also create IFTTT routines that call your Platypush instance, by
# # using Web hooks (i.e. event hooks that subscribe to
# # `platypush.message.event.http.hook.WebhookEvent` events), provided that the
# # Web server is listening on a publicly accessible address.
#
# ifttt:
# ifttt_key: SECRET
###
###
# # The `http.webpage` integration comes with the mercury-parser JavaScript
# # library. It allows you to "distill" the content of a Web page and export it
# # in readable format (in simplified HTML, Markdown or PDF).
#
# http.webpage:
###
###
# # The Bluetooth integration allows you to scan Bluetooth devices, hook events
# # when Bluetooth devices are detected/lost, and it natively supports several
# # device types that can be controlled or monitored via API or UI.
#
# bluetooth:
# poll_interval: 30
###
###
# # Example configuration of the zigbee.mqtt integration.
# # This integration listens for the events pushed by zigbee2mqtt service to an
# # MQTT broker. It can forward those events to native Platypush events (see
# # https://docs.platypush.tech/platypush/events/zigbee.mqtt.html) that you can
# # build automation routines on. You can also use Platypush to control your
# # Zigbee devices, either through the Web interface or programmatically through
# # the available plugin actions.
#
# zigbee.mqtt:
# # Host of the MQTT broker
# host: my-mqtt-broker
# # Listen port of the MQTT broker
# port: 1883
# # Base topic, as specified in `<zigbee2mqtt_dir>/data/configuration.yaml`
# topic_prefix: zigbee2mqtt
###
###
# # Example configuration of the zwave.mqtt integration.
# # This integration listens for the events pushed by ZWaveJS service to an MQTT
# # broker. It can forward those events to native Platypush events (see
# # https://docs.platypush.tech/platypush/events/zwave.html) that you can build
# # automation routines on.
# # You can also use Platypush to control your Z-Wave devices, either through the
# # Web interface or programmatically through the available plugin actions.
#
# zwave.mqtt:
# # Host of the MQTT broker
# host: my-mqtt-broker
# # Listen port of the MQTT broker
# port: 1883
# # Gateway name, usually configured in the ZWaveJS-UI through `Settings ->
# # MQTT -> Name`
# name: zwavejs2mqtt
# # The prefix of the published topics, usually configured in the ZWaveJS-UI
# # through `Settings -> MQTT -> Prefix`.
# topic_prefix: zwave
###
### --------------------
### Camera configuration
### --------------------
###
# # There are several providers for the camera integration - you can choose
# # between ffmpeg, gstreamer, PiCamera etc., and they all expose the same
# # interface/configuration options.
# #
# # It is advised to use the ffmpeg integration, as it's the one that provides
# # the highest degree of features and supported hardware.
# #
# # If the plugin is correctly configured, you can access your camera feed from
# # the Platypush Web panel, programmatically start/stop recording sessions, take
# # photos, get a feed stream URL etc.
#
# # The camera feed will be available at `/camera/<plugin>/video[.extension]`,
# # for example `/camera/ffmpeg/video.mjpeg` for MJPEG (usually faster), or
# # `camera/ffmpeg/video.mp4` for MP4.
#
# # You can also capture images by connecting to the
# # `/camera/<plugin>/photo[.extension]`, for example `/camera/ffmpeg/photo.jpg`.
#
# camera.ffmpeg:
# # Default video device to use
# device: /dev/video0
# # Default resolution
# resolution:
# - 640
# - 480
# # The directory that will be used to store captured frames/images
# frames_dir: ~/Camera/Photos
# # Default image scaling factors (default: 1, no scaling)
# scale_x: 1.5
# scale_y: 1.5
# # Default rotation of the image, in degrees (default: 0, no rotation)
# rotate: 90
# # Grayscale mode (default: False):
# grayscale: false
# # Default frames per second (default: 16)
# fps: 16
# # Whether to flip the image along the horizontal axis (default: False)
# horizontal_flip: false
# # Whether to flip the image along the horizontal axis (default: False)
# vertical_flip: false
#
# # -- Streaming options
# # If `stream_on_start` is set to true, then camera streaming will start as
# # soon as the application/plugin is started. Otherwise, only when the
# # `camera.<plugin>.start_streaming` action is run. The camera will be
# # streamed on the specified `bind_address` and `listen_port` in the
# # specified `stream_format`. If `stream_format` is a video format (e.g.
# # h264 or mkv) then you can play the raw camera stream through e.g.
# # `vlc tcp://<address>:<listen_port>`.
# # Alternatively, you can access the camera stream over HTTP at
# # `http(s)://<address>:<http-port>/camera/<plugin>/video.<format>`.
# # For example, for MJPEG stream (usually the fastest option over HTTP):
# # `http://localhost:8008/camera/ffmpeg/video.mjpeg`.
# # An HTTP stream is the safest option, as it has to go through the standard
# # HTTP authentication process, while direct TCP access may expose your
# # camera to unauthenticated access. If you decide to directly stream over
# # TCP, make sure to carefully select the `bind_address`, add a firewall
# # rule for the streaming port, and/or ensure that the device's port is only
# # accessible from a safe network.
# # stream_on_start: false
# # bind_address: 0.0.0.0
# # listen_port: 5000
# # stream_format: h264
###
### -----------------
### Sound integration
### -----------------
###
# # The sound plugin allows you to stream from an audio source connected to the
# # machine, play audio files or synthetic audio waves or MIDI sounds.
#
# # After enabling the plugin, you can access the audio stream at
# # `/sound/stream[.extension]` (e.g. `/sound/stream.mp3`) if you want to get a
# # live recording of the captured sound from the configured audio
# # `input_device`.
#
# sound:
# enabled: true
###
### -----------------------------------
### Some examples of media integrations
### -----------------------------------
###
# # Example configuration for the media.vlc plugin. You can replace `vlc` with
# # `mpv`, `mplayer`, `omxplayer` or `gstreamer` if you want to use another
# # player - the supported configuration option are the same across all these
# # players.
#
# media.vlc:
# # Volume level, between 0 and 100
# volume: 50
# # Where to store downloaded files
# download_dir: ~/Downloads
# # Play videos in fullscreen by default
# fullscreen: True
# # If youtube-dl or any compatible application is installed, play requested
# # videos in this format by default. Default: `best`.
# youtube_format: 'mp4[height<=?480]'
# # Extra arguments to pass to the executable. --play-and-exit may be a good
# # idea with VLC, so the player terminates upon stop instead of lingering in
# # the background.
# args:
# - --play-and-exit
# # List of directories to search for media files. The media files in these
# # folders can be searched through the `media.<player>.search` command, or
# # through the Web interface.
# media_dirs:
# - /mnt/hd/media/movies
# - /mnt/hd/media/series
# - /mnt/hd/media/videos
# - ~/Downloads
###
###
# # Example configuration for the media.chromecast plugin, see
# # https://docs.platypush.tech/en/latest/platypush/plugins/media.chromecast.html
# # You can easily install the dependencies through pip install 'platypush[chromecast]'
#
# media.chromecast:
# chromecast: Living Room TV
###
###
# # Example Kodi configuration. This makes it possible to control and query a
# # Kodi instance, from your automation hooks, from the Platypush APIs or from
# # the Platypush Web interface. It requires you to enable the JSON API service
# # from Kodi's settings.
#
# media.kodi:
# host: localhost
# http_port: 8080
# username: kodi
# password: secret
###
###
# # Example configuration for a Plex media server. This integration makes it
# # possible to navigate and search media items from your Plex library in the
# # media UI.
#
# media.plex:
# server: localhost
# username: plex
# password: secret
###
###
# # Jellyfin media server configuration.
#
# media.jellyfin:
# server: https://media.example.com
# api_key: secret
###
### ---------------------
### Sensors configuration
### ---------------------
###
# # The serial plugin can be used to read sensor data from a device connected
# # over serial/USB interface.
# #
# # It can be used, for example, to connect to an Arduino or ESP device over
# # serial port, where the remote microcontroller periodically sends sensor data
# # over the serial interface.
# #
# # The data can be sent on the wire either as raw string-encoded numbers (one
# # per line), or (better) in JSON format. For example, you can program your
# # microcontroller to periodically send JSON strings like these when you get new
# # readings from your sensors:
# #
# # {"temperature": 25.0, "humidity": 20.0, "smoke": 0.01, "luminosity": 45}
# #
# # The JSON will be automatically unpacked by the application, and the relevant
# # `platypush.message.event.sensor.SensorDataChangeEvent` events will be
# # triggered when the data changes - you can subscribe to them in your custom
# # hooks.
#
# serial:
# # The path to the USB interface with e.g. an Arduino or ESP microcontroller
# # connected.
# # A way to get a deterministic path name on Linux, instead of
# # `/dev/ttyUSB<n>`, can be the following:
# #
# # - Get the vendor and product ID of your device via e.g. `lsusb`. For
# # example, for an Arduino-compatible microcontroller:
# #
# # Bus 001 Device 008: ID 1a86:7523 QinHeng Electronics CH340 serial converter
# #
# # - In the case above, `1a86` is the vendor ID and `7523` is the product
# # ID. Create a new udev rule for it, so every time the device is
# # connected it will also be symlinked to e.g. `/dev/arduino`:
# #
# # echo 'SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="arduino"' | \
# # sudo tee /etc/udev/rules.d/98-usb-serial.rules
# device: /dev/ttyUSB0
# # How often the interface should be polled for updates, in seconds
# poll_interval: 1
# # The tolerance argument can be used to tune when you want to be notified
# # of data changes through `SensorDataChangeEvent` events. In the case
# # below, if the microcontroller sends two consecutive temperature reads,
# # one for 22.0 and one for 22.2, then only one `SensorDataChangeEvent` will
# # be triggered (for the first read), since the absolute value of the
# # difference between the two events is less than the configured tolerance.
# # However, if the device sends two temperature reads, one for 22.0 and one
# # for 22.7, then two `SensorDataChangeEvent` events will be triggered.
# # The tolerance for all the metrics is set to a value close to zero by
# # default - i.e. any read, unless it's exactly the same as the previous
# # one, will trigger a new event.
# tolerance:
# temperature: 0.5
# humidity: 0.75
# luminosity: 5
#
# # If a threshold is defined for a sensor, and the value of that sensor goes
# # below/above that temperature between two reads, then a
# # `SensorDataBelowThresholdEvent` or a `SensorDataAboveThresholdEvent` will
# # be triggered respectively.
# thresholds:
# temperature: 25.0
###
###
# # Alternatively to the serial plugin, you can also use the arduino plugin if
# # you want to specifically interface with Arduino.
# #
# # This plugin won't require you to write any logic for your microcontroller.
# # However, it requires your microcontroller to be flash with the Firmata
# # firmware, which allows programmatic external control.
# #
# # Note that the interface of this plugin is basically the same as the serial
# # plugin, and any other plugin that extends `SensorPlugin` in general.
# # Therefore, poll_interval, tolerance and thresholds are supported here too.
#
# arduino:
# board: /dev/ttyUSB0
# # name -> PIN number mapping (similar for digital_pins).
# # It allows you to pick a common name for your PINs that will be used in
# # the forwarded events.
# analog_pins:
# temperature: 7
#
# tolerance:
# temperature: 0.5
#
# thresholds:
# temperature: 25.0
###
###
# # Another example: the LTR559 is a common sensor for proximity and luminosity
# # that can be wired to a Raspberry Pi or similar devices over SPI or I2C
# # interface. It exposes the same base interface as all other sensor plugins.
#
# sensor.ltr559:
# poll_interval: 1.0
# tolerance:
# light: 7.0
# proximity: 5.0
#
# thresholds:
# proximity: 10.0
###
### -----------------------------------------
### Example configuration of the mail plugin.
### -----------------------------------------
#
# mail:
# # Display name to be used for outgoing emails. Default:
# # the `from` parameter will be used from :meth:`.send`,
# # and, if missing, the username from the account configuration
# # will be used.
# display_name: My Name
#
# # How often we should poll for updates (default: 60 seconds)
# poll_interval: 60
#
# # Connection timeout (default: 20 seconds)
# # Can be overridden on a per-account basis
# timeout: 20
#
# accounts:
# - name: "My Local Account"
# username: me@mydomain.com
# password: my-password
#
# # The default flag sets this account as the default one
# # for mail retrieval and sending if no account is
# # specified on an action. If multiple accounts are set
# # and none is set as default, and no account is specified
# # on an action, then the first configured account will be
# # used.
# default: true
# # Domain to be used for outgoing emails. Default: inferred
# # from the account configuration
# domain: example.com
#
#
# # Alternatively, you can run an external command
# # to get the password
# # password_cmd: "pass show mail/example.com"
#
# # Path to a custom certfile if the mail server uses a
# # self-signed certificate
# # certfile: /path/to/certfile
#
# # Path to a custom keyfile if the mail server requires
# # client authentication. It requires certfile to be set
# # too
# # keyfile: /path/to/keyfile
#
# incoming:
# # Supported protocols: imap, imaps
# server: imaps://mail.example.com:993
#
# outgoing:
# # The `incoming` and `outgoing` configurations can
# # override the global `username` and `password` and
# # other authentication parameters of the account
# username: me
# password: my-smtp-password
#
# # Supported protocols: smtp, smtps, smtp+starttls,
# server: smtps://mail.example.com:465
#
# # These folders will be monitored for new messages
# monitor_folders:
# - All Mail
###
### --------------------------------
### Some text-to-speech integrations
### --------------------------------
###
# # `tts` is the simplest TTS integration. It leverages the Google Translate open
# # "say" endpoint to render text as audio speech.
#
# tts:
# # The media plugin that should be used to play the audio response
# # The default language of the voice
# language: en-gb
###
###
# # `tts.google` leverages Google's official text-to-speech API to render audio
# # speech from text.
# #
# # Install its dependencies via 'pip install "platypush[google-tts]"'.
# #
# # Like all other Google integrations, it requires you to register an app on the
# # Google developers console, create an API key, and follow the instruction
# # logged on the next restart to give your app the required permissions to your
# # account.
#
# tts.google:
# # The default language of the voice
# language: en-US
# # The gender of the voice (MALE or FEMALE)
# gender: FEMALE
# # The path to the JSON file containing your Google API credentials
# credentials_file: '~/.credentials/platypush/google/platypush-tts.json'
###
###
# # This TTS integration leverages mimic3, an open-source TTS Web server
# # developed by Mycroft (RIP).
# #
# # Follow the instructions at
# # https://docs.platypush.tech/platypush/plugins/tts.mimic3.html to quickly
# # bootstrap a mimic3 server.
#
# tts.mimic3:
# # The base URL of the mimic3 server
# server_url: http://127.0.0.1:59125
# # Path of the default voice that should be used
# voice: 'en_US/vctk_low'
###
## ----------
## Procedures
## ----------
# Procedures are lists of actions that are executed sequentially.
#
# This section shows how to define procedures directly in your YAML
# configuration file(s). However, you can also put your procedures into Python
# scripts inside of the `<config-dir>/scripts` directory if you want access to
# a full-blown Python syntax. They will be automatically discovered at startup
# and available to the application.
#
# You can also access Python variables and evaluate Python expressions by using
# `${}` context expressions.
#
# The `context` special variable is a name->value dictionary containing the
# items returned from previous actions. For example, if an action returned
# `{"status": "ok", "temperature": 21.5}`, then the following actions can access
# those variables through `${context["status"]}` or
# `${context["temperature"]}`, or simply `${status}` and `${temperature}`,
# respectively.
#
# You can also add statements like `- if ${temperature > 20.0}` or
# `- for ${temp in temperature_values}` in your procedures.
#
# Besides the `context` variables, the following special variables are also
# available to the `${}` constructs when running a procedure:
#
# - `output`: It contains the parsed output of the previous action.
# - `errors`: It contains the errors of the previous action
# - `event`: If the procedure is an event hook (or it is executed within an
# event hook), it contains the event that triggered the hook
###
# # An example procedure that can be called when you arrive home.
# #
# # You can run this procedure from the Platypush `execute` Web panel, or
# # programmatically by sending a JSON request to your Web server (or to the
# # `/ws/requests` Websocket route, or to the TCP backend)
# #
# # curl -XPOST \
# # -H "Authorization: Bearer $YOUR_TOKEN" \
# # -d '{"type": "request", "action": "procedure.at_home"}'
# #
# # A use-case can be the one where you have a Tasker automation running on your
# # Android device that detects when your phone enters or exits a certain area,
# # and sends the appropriate request to your Platypush server.
#
# procedure.at_home:
# # Set the db variable AT_HOME to 1.
# # Variables are flexible entities with a name and a value that will be
# # stored on the database and persisted across sessions.
# # You can access them in other procedures, scripts or hooks and run
# # custom logic on the basis of their value.
# - action: variable.set
# args:
# AT_HOME: 1
#
# # Check the luminosity level from e.g. a connected LTR559 sensor.
# # It could also be a Bluetooth, Zigbee, Z-Wave, serial etc. sensor.
# - action: sensor.ltr559.get_measurement
#
# # If it's below a certain threshold, turn on the lights.
# # In this case, `light` is a parameter returned by the previous response,
# # so we can directly access it here through the `${}` context operator.
# # ${light} in this case is equivalent to ${context["light"]} or
# # ${output["light"]}.
# - if ${int(light or 0) < 110}:
# - action: light.hue.on
#
# # Say a welcome home message
# - action: tts.mimic3.say
# args:
# text: Welcome home
#
# # Start the music
# - action: music.mpd.play
###
###
# # Procedure that will be execute when you walk outside your home.
#
# procedure.outside_home:
# # Unset the db variable AT_HOME
# - action: variable.unset
# args:
# name: AT_HOME
#
# # Stop the music
# - action: music.mpd.stop
#
# # Turn off the lights
# - action: light.hue.off
###
###
# # Procedures can also take optional arguments. The example below shows a
# # generic procedure that broadcasts measurements from a sensor through an
# MQTT broker.
#
# # A listener on this topic can react to an `MQTTMessageEvent` and, for
# # example, store the event on a centralized storage.
# #
# # See the event hook section below for a sample hook that listens for messages
# # sent by other clients using this procedure.
#
# procedure.send_sensor_data(name, value):
# - action: mqtt.send_message
# args:
# topic: platypush/sensors
# host: my-mqtt-broker
# port: 1883
# msg:
# name: ${name}
# value: ${value}
# source: ${Config.get("device_id")}
###
## -------------------
## Event hook examples
## -------------------
# Event hooks are procedures that are run when a certain condition is met.
#
# Check the documentation of your configured backends and plugins to see which
# events they can trigger, and check https://docs.platypush.tech/events.html
# for the full list of available events with their schemas.
#
# Just like procedures, event hooks can be defined either using the YAML
# syntax, or in Python snippets in your `scripts` folder.
#
# A YAML event hook consists of two parts: an `if` field that specifies on
# which event the hook will be triggered (type and attribute values), and a
# `then` field that uses the same syntax as procedures to specify a list of
# actions to execute when the event is matched.
###
# # This example is a hook that reacts when an `MQTTMessageEvent` is received on
# # a topic named `platypush/sensor` (see `send_sensor_data` example from the
# # procedures section).
# #
# # It will store the event on a centralized Postgres database.
# #
# # Note that, for this event to be triggered, the application must first
# # subscribe to the `platypush/sensor` topic - e.g. by adding `platypush/sensor`
# # to the active subscriptions in the `mqtt` configurations.
#
# event.hook.OnSensorDataReceived:
# if:
# type: platypush.message.event.mqtt.MQTTMessageEvent
# topic: platypush/sensor
# then:
# - action: db.insert
# args:
# engine: postgresql+pg8000://dbuser:dbpass@dbhost/dbname
# table: sensor_data
# records:
# - name: ${msg["name"]}
# value: ${msg["value"]}
# source: ${msg["source"]}
###
###
# # The example below is a hook that reacts when a `NewPlayingTrackEvent` event
# # is received and synchronize the listening activity to the users' Last.fm
# # profile (it requires the `lastfm` plugin and at least a music plugin
# # enabled, like `music.mpd`).
#
# event.hook.OnNewMusicActivity:
# if:
# type: platypush.message.event.music.NewPlayingTrackEvent
# then:
# - if ${track.get('artist') and track.get('title')}:
# - action: lastfm.scrobble
# args:
# artist: ${track['artist']}
# title: ${track['title']}
##
###
# # The example below plays the music on mpd/mopidy when your voice assistant
# # triggers a speech recognized event with "play the music" content.
#
# event.hook.PlayMusicAssistantCommand:
# if:
# type: platypush.message.event.assistant.SpeechRecognizedEvent
# # Note that basic regexes are supported for `SpeechRecognizedEvent`,
# # so the hook will be triggered both if you say "play the music" and
# # "play music"
# phrase: "play (the)? music"
# then:
# - action: music.mpd.play
###
###
# # This will turn on the lights when you say "turn on the lights"
#
# event.hook.TurnOnLightsCommand:
# if:
# type: platypush.message.event.assistant.SpeechRecognizedEvent
# phrase: "turn on (the)? lights?"
# then:
# - action: light.hue.on
###
###
# # The WebhookEvent is a special type of event. It allows you to dynamically
# # register a Web hook that can be invoked by other clients, if the HTTP backend
# # is active.
# #
# # In this case, we are registering a hook under `/hook/test-hook` that accepts
# # POST requests, gets the body of the requests and logs it.
# #
# # NOTE: Since Web hooks are supposed to be called by external (and potentially
# # untrusted) parties, they aren't designed to use the standard authentication
# # mechanism used by all other routes.
# #
# # By default they don't have an authentication layer at all. You are however
# # advised to create your custom passphrase and checks the request's headers or
# # query string for it - preferably one passphrase per endpoint.
#
# event.hook.WebhookExample:
# if:
# type: platypush.message.event.http.hook.WebhookEvent
# hook: test-hook
# method: POST
# then:
# # Check the token/passphrase
# - if ${args.get('headers', {}).get('X-Token') == 'SECRET':
# - action: logger.info
# args:
# msg: ${data}
###
### -------------
### Cron examples
### -------------
###
# # Cronjobs allow you to execute procedures at periodic intervals.
# # Standard UNIX cron syntax is supported, plus an optional 6th indicator
# # at the end of the expression to run jobs with second granularity.
# # The example below executes a script at intervals of 1 minute.
#
# cron.TestCron:
# cron_expression: '* * * * *'
# actions:
# - action: shell.exec
# args:
# cmd: ~/bin/myscript.sh
###
| 1 | ################################################################################ |
| 2 | # Sample Platypush configuration file. |
| 3 | # |
| 4 | # Edit it and: |
| 5 | # - Copy it to /etc/platypush/config.yaml for system installation. |
| 6 | # - Copy it to ~/.config/platypush/config.yaml for user installation. |
| 7 | # - Start the application with `-c <path-to-this-file>`. |
| 8 | # |
| 9 | # Since the configuration file also includes the custom integrations, you can |
| 10 | # create a Platypush custom installation, with all the extra dependencies |
| 11 | # required by the configured integrations, using the `platydock` or `platyvenv` |
| 12 | # commands and passing this file as an argument. These commands will build a |
| 13 | # Docker image or a Python virtual environment respectively, with all the |
| 14 | # required extra dependencies inferred from your configuration file. |
| 15 | # |
| 16 | # A `scripts` directory with an empty `__init__.py` script will also be created |
| 17 | # under the same directory as the configuration file. This directory can be |
| 18 | # used to add custom scripts containing procedures, hooks and crons if you want |
| 19 | # a full Python interface to define your logic rather than a YAML file. |
| 20 | # |
| 21 | # Please refer to the `scripts` directory provided under this file's directory |
| 22 | # for some examples that use the Python API. |
| 23 | ################################################################################ |
| 24 | |
| 25 | ### ------------------ |
| 26 | ### Include directives |
| 27 | ### ------------------ |
| 28 | |
| 29 | ### |
| 30 | # # You can split your configuration over multiple files and use the include |
| 31 | # # directive to import other files into your configuration. |
| 32 | # |
| 33 | # # Files referenced via relative paths will be searched in the directory of |
| 34 | # # the configuration file that references them. Symbolic links are also |
| 35 | # # supported. |
| 36 | # |
| 37 | # include: |
| 38 | # - logging.yaml |
| 39 | # - media.yaml |
| 40 | # - sensors.yaml |
| 41 | ### |
| 42 | |
| 43 | ### ----------------- |
| 44 | ### Working directory |
| 45 | ### ----------------- |
| 46 | |
| 47 | ### |
| 48 | # # Working directory of the application. This is where the main database will be |
| 49 | # # stored by default (if the default SQLite configuration is used), and it's |
| 50 | # # where the integrations will store their state. |
| 51 | # |
| 52 | # # Note that the working directory can also be specified at runtime using the |
| 53 | # # -w/--workdir option. |
| 54 | # # |
| 55 | # # If not specified, then one of the following will be used: |
| 56 | # # |
| 57 | # # - $XDG_DATA_HOME/platypush if the XDG_DATA_HOME environment variable is set. |
| 58 | # # - /var/lib/platypush if the user is root. |
| 59 | # # - $HOME/.local/share/platypush otherwise. |
| 60 | # |
| 61 | # workdir: ~/.local/share/platypush |
| 62 | ### |
| 63 | |
| 64 | ### ----------------- |
| 65 | ### Cache directory |
| 66 | ### ----------------- |
| 67 | |
| 68 | ### |
| 69 | # # Note that the cache directory can also be specified at runtime using the |
| 70 | # # --cachedir option. |
| 71 | # # |
| 72 | # # If not specified, then one of the following will be used: |
| 73 | # # |
| 74 | # # - $XDG_CACHE_DIR/platypush if the XDG_CACHE_DIR environment variable is set. |
| 75 | # # - /var/cache/platypush if the user is root. |
| 76 | # # - $HOME/.cache/platypush otherwise. |
| 77 | # |
| 78 | # cachedir: ~/.cache/platypush |
| 79 | ### |
| 80 | |
| 81 | ### ---------------------- |
| 82 | ### Database configuration |
| 83 | ### ---------------------- |
| 84 | |
| 85 | ### |
| 86 | # # By default Platypush will use a SQLite database named `main.db` under the |
| 87 | # # `workdir`. You can specify any other engine string here - the application has |
| 88 | # # been tested against SQLite, Postgres and MariaDB/MySQL >= 8. |
| 89 | # # |
| 90 | # # You can also specify a custom database engine at runtime (SQLAlchemy syntax |
| 91 | # # supported) through the `--db` argument otherwise. |
| 92 | # # |
| 93 | # # NOTE: If you want to use a DBMS other than SQLite, then you will also need to |
| 94 | # # ensure that a compatible Python driver is installed on the system where |
| 95 | # # Platypush is running. For example, Postgres will require the Python pg8000, |
| 96 | # # psycopg or another compatible driver. |
| 97 | # |
| 98 | # main.db: |
| 99 | # engine: sqlite:////home/user/.local/share/platypush/main.db |
| 100 | # # OR, if you want to use e.g. Postgres with the pg8000 driver: |
| 101 | # engine: postgresql+pg8000://dbuser:dbpass@dbhost/dbname |
| 102 | # |
| 103 | # # NOTE: The short syntax `main.db: <engine_string>` is also supported. |
| 104 | ### |
| 105 | |
| 106 | ### --------------------- |
| 107 | ### Logging configuration |
| 108 | ### --------------------- |
| 109 | |
| 110 | ### |
| 111 | # # Platypush logs on stdout by default. You can use the logging section to |
| 112 | # # specify an alternative file or change the logging level. |
| 113 | # |
| 114 | # # Note that a custom logging directory can also be specified at runtime using |
| 115 | # # the -l/--logsdir option. |
| 116 | # |
| 117 | # logging: |
| 118 | # filename: ~/.local/log/platypush/platypush.log |
| 119 | # level: INFO |
| 120 | ### |
| 121 | |
| 122 | ### ----------------------- |
| 123 | ### device_id configuration |
| 124 | ### ----------------------- |
| 125 | |
| 126 | ### |
| 127 | # # The device_id is used by many components of Platypush and it should uniquely |
| 128 | # # identify a device in your network. If nothing is specified then the hostname |
| 129 | # # will be used. |
| 130 | # |
| 131 | # # Note that a custom device ID can also be specified at runtime using the |
| 132 | # # -d/--device-id option. |
| 133 | # |
| 134 | # device_id: my_device |
| 135 | ### |
| 136 | |
| 137 | ### ------------------- |
| 138 | ### Redis configuration |
| 139 | ### ------------------- |
| 140 | |
| 141 | ### |
| 142 | # # Platypush needs a Redis instance for inter-process communication. |
| 143 | # # |
| 144 | # # By default, the application will try and connect to a Redis server listening |
| 145 | # # on localhost:6379. |
| 146 | # # |
| 147 | # # Platypush can also start the service on the fly if instructed to do so |
| 148 | # # through the `--start-redis` option. You can also specify a custom port |
| 149 | # # through the `--redis-port` option. |
| 150 | # # |
| 151 | # # If you are running Platypush in a Docker image built through Platydock, then |
| 152 | # # `--start-redis` is the default behaviour and you won't need any extra |
| 153 | # # documentation here. |
| 154 | # |
| 155 | # redis: |
| 156 | # host: localhost |
| 157 | # port: 6379 |
| 158 | # username: user |
| 159 | # password: secret |
| 160 | ### |
| 161 | |
| 162 | ### ------------------------ |
| 163 | ### Web server configuration |
| 164 | ### ------------------------ |
| 165 | |
| 166 | ### |
| 167 | # Platypush comes with a versatile Web server that is used to: |
| 168 | # |
| 169 | # - Serve the main UI and the UIs for the plugins that provide one. |
| 170 | # - Serve custom user-configured dashboards. |
| 171 | # - Expose the `/execute` RPC endpoint to send synchronous requests. |
| 172 | # - Expose the `/ws/events` and `/ws/requests` Websocket paths, which can be |
| 173 | # respectively by other clients to subscribe to the application's events or |
| 174 | # send asynchronous requests. |
| 175 | # - Stream media files provided by other plugins, as well as camera and audio |
| 176 | # feeds. |
| 177 | # - Serve custom directories of static files that can be accessed by other |
| 178 | # clients. |
| 179 | # - Provide a versatile API for hooks - the user can easily create custom HTTP |
| 180 | # hooks by creating a hook with their custom logic that reacts when a |
| 181 | # `platypush.message.event.http.hook.WebhookEvent` is received. The `hook` |
| 182 | # parameter of the event specifies which URL will be served by the hook. |
| 183 | # |
| 184 | # The Web server is enabled by default, but you can disable it simply by |
| 185 | # commenting/removing the `backend.http` section. The default listen port is |
| 186 | # 8008. |
| 187 | # |
| 188 | # After starting the application, you can access the UI at |
| 189 | # http://localhost:8008, set up your username and password, and also create an |
| 190 | # access or session token from the configuration panel. |
| 191 | # |
| 192 | # This token can be used to authenticate calls to the available APIs. |
| 193 | # For example, to turn on the lights using the /execute endpoint: |
| 194 | # |
| 195 | # curl -XPOST -H "Authorization: Bearer $TOKEN" \ |
| 196 | # -H "Content-Type: application/json" \ |
| 197 | # -d ' |
| 198 | # { |
| 199 | # "type": "request", |
| 200 | # "action": "light.hue.on", |
| 201 | # "args": { |
| 202 | # "lights": ["Bedroom"] |
| 203 | # } |
| 204 | # }' http://localhost:8008/execute |
| 205 | # |
| 206 | # If you want to serve the Web server behind a reverse proxy, you can copy the |
| 207 | # reference configuration available at |
| 208 | # https://git.platypush.tech/platypush/platypush/src/branch/master/examples/nginx/nginx.sample.conf |
| 209 | |
| 210 | backend.http: |
| 211 | # # Bind address (default: 0.0.0.0) |
| 212 | # bind_address: 0.0.0.0 |
| 213 | # # Listen port (default: 8008) |
| 214 | port: 8008 |
| 215 | |
| 216 | # # resource_dirs can be used to specify directories on the host system that |
| 217 | # # you want to expose through the Web server. For example, you may want to |
| 218 | # # expose directories that contain photos or images if you want to make a |
| 219 | # # carousel dashboard, or a directory containing some files that you want to |
| 220 | # # share with someone (or other systems) using a simple Web server. |
| 221 | # # |
| 222 | # # In the following example, we're exposing a directory with photos on an |
| 223 | # # external hard drive other the `/photos` URL. An image like e.g. |
| 224 | # # `/mnt/hd/photos/IMG_1234.jpg` will be served over e.g. |
| 225 | # # `http://localhost:8008/photos/IMG_1234.jpg` in this case. |
| 226 | # resource_dirs: |
| 227 | # photos: /mnt/hd/photos |
| 228 | |
| 229 | # # Number of WSGI workers. Default: (#cpus * 2) + 1 |
| 230 | # num_workers: 4 |
| 231 | |
| 232 | ### ----------------------------- |
| 233 | ### Plugin configuration examples |
| 234 | ### ----------------------------- |
| 235 | |
| 236 | ### |
| 237 | # # The configuration of a plugin matches one-to-one the parameters required by |
| 238 | # # its constructor. |
| 239 | # # |
| 240 | # # Plugin classes are documented at https://docs.platypush.tech/en/latest/plugins.html |
| 241 | # # |
| 242 | # # For example, there is a `light.hue` plugin |
| 243 | # # (https://docs.platypush.tech/platypush/plugins/light.hue.html) whose |
| 244 | # # constructor takes the following parameters: `bridge`, `lights` (default |
| 245 | # # target lights for the commands), `groups` (default target groups for the |
| 246 | # # commands) and `poll_interval` (how often the plugin should poll for updates). |
| 247 | # # |
| 248 | # # This means that the `light.hue` plugin can be configured here as: |
| 249 | # |
| 250 | # light.hue: |
| 251 | # # IP address or hostname of the Hue bridge |
| 252 | # # NOTE: The first run will require you to register the application with |
| 253 | # # your bridge - that's usually done by pressing a physical button on your |
| 254 | # # bridge while the application is pairing. |
| 255 | # bridge: 192.168.1.3 |
| 256 | # # Groups that will be handled by default if nothing is specified on the request |
| 257 | # groups: |
| 258 | # - Living Room |
| 259 | # |
| 260 | # # How often we should poll for updates (default: 20 seconds) |
| 261 | # poll_interval: 20 |
| 262 | ### |
| 263 | |
| 264 | ### |
| 265 | # # Example configuration of the MQTT plugin. |
| 266 | # # This plugin allows you to subscribe to MQTT topics and trigger `platypush.message.event.mqtt.MQTTMessageEvent` |
| 267 | # # events that you can hook on when new messages are received. |
| 268 | # # You can also publish messages to MQTT topics through the `mqtt.publish` action. |
| 269 | # |
| 270 | # mqtt: |
| 271 | # # Host and port of the MQTT broker |
| 272 | # host: my-mqtt-broker |
| 273 | # port: 1883 |
| 274 | # # Topic to subscribe to. Messages received on these topics will trigger `MQTTMessageEvent` events. |
| 275 | # topics: |
| 276 | # - platypush/sensors |
| 277 | # |
| 278 | # # Extra listeners. You can use them to subscribe to multiple brokers at the same time. |
| 279 | # listeners: |
| 280 | # - host: another-mqtt-broker |
| 281 | # port: 1883 |
| 282 | # username: user |
| 283 | # password: secret |
| 284 | # topics: |
| 285 | # - platypush/tests |
| 286 | ### |
| 287 | |
| 288 | ### |
| 289 | # # Example configuration of a voice assistant. |
| 290 | # # Several voice assistant plugins and engines are available - Google |
| 291 | # # Assistant, Alexa, DeepSpeech, Picovoice etc. |
| 292 | # # |
| 293 | # # The Google Assistant is probably the most straightforward to configure and |
| 294 | # # the richest in terms of features provided out-of-the-box and speech |
| 295 | # # detection quality, while others may require further tinkering, may perform |
| 296 | # # worse than the Google model, and/or may run models on-device which could not |
| 297 | # # be within reach for some machines. |
| 298 | # # |
| 299 | # # Check the documentation of the `assistant.google` plugin for instructions on |
| 300 | # # how to get a credentials file that you can use with a custom assistant |
| 301 | # # installation. |
| 302 | # # |
| 303 | # # Note however that the Google Assistant plugin leverages the |
| 304 | # # `google-assistant-library`, which has been deprecated a while ago by Google |
| 305 | # # and it's unlikely to receive updates (although it still works and I'd still |
| 306 | # # expect it to work). |
| 307 | # |
| 308 | # assistant.google: |
| 309 | # # Path to your credentials file (by default it will look either under |
| 310 | # # ~/.config/google-oauthlib-tool/credentials.json or |
| 311 | # # <WORKDIR>/credentials/google/assistant.json |
| 312 | # # credentials_file: ~/credentials/assistant.json |
| 313 | # # If specified, then this sound will be played when a conversation starts |
| 314 | # # conversation_start_sound: ~/sounds/assistant-start.mp3 |
| 315 | ### |
| 316 | |
| 317 | ### |
| 318 | # # Example configuration of music.mpd plugin, a plugin to interact with MPD and |
| 319 | # # Mopidy music server instances. See |
| 320 | # # https://docs.platypush.tech/en/latest/platypush/plugins/music.mpd.html |
| 321 | # # You can easily install the dependencies through pip install 'platypush[mpd]' |
| 322 | # |
| 323 | # music.mpd: |
| 324 | # host: localhost |
| 325 | # port: 6600 |
| 326 | ### |
| 327 | |
| 328 | ### |
| 329 | # # Example last.fm scrobbler configuration, to synchronize your music |
| 330 | # # activities to your Last.fm profile. You'll need to register an application |
| 331 | # # with your account at https://www.last.fm/api. |
| 332 | # |
| 333 | # lastfm: |
| 334 | # api_key: <API_KEY> |
| 335 | # api_secret: <API_SECRET> |
| 336 | # username: <USERNAME> |
| 337 | # password: <PASSWORD> |
| 338 | ### |
| 339 | |
| 340 | ### |
| 341 | # # Plugins with empty configuration can also be explicitly enabled by specifying |
| 342 | # # `enabled: true` or `disabled: false`. An integration with no items will be |
| 343 | # # enabled with no configuration. |
| 344 | # |
| 345 | # clipboard: |
| 346 | ### |
| 347 | |
| 348 | ### |
| 349 | # # Enable the system plugin if you want your device to periodically report |
| 350 | # # system statistics (CPU load, disk usage, memory usage etc.) |
| 351 | # # |
| 352 | # # When new data is gathered, an `EntityUpdateEvent` with `plugin='system'` will |
| 353 | # # be triggered with the new data, and you can subscribe a hook to these events |
| 354 | # # to run your custom logic. |
| 355 | # |
| 356 | # system: |
| 357 | # # How often we should poll for new data |
| 358 | # poll_interval: 60 |
| 359 | ### |
| 360 | |
| 361 | ### |
| 362 | # # Example configuration for the calendar plugin. In this case, we have |
| 363 | # # registered a Google calendar that uses the `google.calendar` integration, and |
| 364 | # # a Facebook plugin and a NextCloud (WebDAV) plugin exposed over iCal format. |
| 365 | # # Installing the dependencies: pip install 'platypush[ical,google]' |
| 366 | # calendar: |
| 367 | # calendars: |
| 368 | # - type: google.calendar |
| 369 | # - type: calendar.ical |
| 370 | # url: https://www.facebook.com/events/ical/upcoming/?uid=your_user_id&key=your_key |
| 371 | # - type: calendar.ical |
| 372 | # url: https://my.nextcloud.org/remote.php/dav/public-calendars/id?export |
| 373 | ### |
| 374 | |
| 375 | ### |
| 376 | # # Example configuration for the alarm plugin. It is possible to define alarms |
| 377 | # # both statically, i.e. through configuration snippets under the `alarm` |
| 378 | # # section, and dynamically, i.e. with an `alarm.add` request with the |
| 379 | # # configuration of the desired alarm. |
| 380 | # |
| 381 | # alarm: |
| 382 | # # Media plugin that will be used to play the alarm audio. |
| 383 | # # If not specified, the first available configured media plugin |
| 384 | # # will be used. |
| 385 | # media_plugin: media.vlc |
| 386 | # |
| 387 | # alarms: |
| 388 | # morning_alarm: |
| 389 | # # Cron expression format: run every weekday at 7 AM |
| 390 | # when: '0 7 * * 1-5' |
| 391 | # media: ~/path/your_ringtone.mp3 |
| 392 | # audio_volume: 10 # 10% |
| 393 | # |
| 394 | # # Repeat the played media resource until the alarm is |
| 395 | # # snoozed/dismissed (default: true) |
| 396 | # media_repeat: true |
| 397 | # |
| 398 | # # Wait 5 minutes between a snooze and another run |
| 399 | # snooze_interval: 300 |
| 400 | # |
| 401 | # # After 10 minutes with no manual snooze/dismiss, |
| 402 | # # stop the alarm |
| 403 | # dismiss_interval: 600 |
| 404 | # |
| 405 | # # Actions to be executed when the alarm goes on |
| 406 | # actions: |
| 407 | # - action: tts.say |
| 408 | # args: |
| 409 | # text: Good morning |
| 410 | # |
| 411 | # - action: light.hue.bri |
| 412 | # args: |
| 413 | # value: 1 |
| 414 | # |
| 415 | # - action: light.hue.bri |
| 416 | # args: |
| 417 | # value: 140 |
| 418 | # transitiontime: 150 |
| 419 | # |
| 420 | # one_shot_alarm: |
| 421 | # # One-shot execution, with timestamp in ISO format |
| 422 | # when: '2020-02-18T07:00:00.000000' |
| 423 | # media: ~/path/your_ringtone.mp3 |
| 424 | # actions: |
| 425 | # - action: light.hue.on |
| 426 | # |
| 427 | # timer: |
| 428 | # # This alarm will execute the specified number of seconds |
| 429 | # # after being initialized (5 minutes after the plugin has |
| 430 | # # been initialized in this case) |
| 431 | # when: 300 |
| 432 | # media: ~/path/your_ringtone.mp3 |
| 433 | # actions: |
| 434 | # - action: light.hue.on |
| 435 | ### |
| 436 | |
| 437 | ### |
| 438 | # # Torrent plugin configuration, with the default directory that should be used |
| 439 | # # to store downloaded files. |
| 440 | # |
| 441 | # torrent: |
| 442 | # download_dir: ~/Downloads |
| 443 | ### |
| 444 | |
| 445 | ### |
| 446 | # # List of RSS/Atom subscriptions. These feeds will be monitored for changes and |
| 447 | # # a `platypush.message.event.rss.NewFeedEntryEvent` |
| 448 | # # (https://docs.platypush.tech/platypush/events/rss.html#platypush.message.event.rss.NewFeedEntryEvent) |
| 449 | # # will be triggered when one of these feeds has new entries - you can subscribe |
| 450 | # # the event to run your custom logic. |
| 451 | # |
| 452 | # rss: |
| 453 | # # How often we should check for updates (default: 5 minutes) |
| 454 | # poll_seconds: 300 |
| 455 | # # List of feeds to monitor |
| 456 | # subscriptions: |
| 457 | # - https://www.theguardian.com/rss/world |
| 458 | # - https://phys.org/rss-feed/ |
| 459 | # - https://news.ycombinator.com/rss |
| 460 | # - https://www.technologyreview.com/stories.rss |
| 461 | # - https://api.quantamagazine.org/feed/ |
| 462 | ### |
| 463 | |
| 464 | ### |
| 465 | # # The file monitor plugin can be used to track modifications to the |
| 466 | # # filesystem - for example, when a file or a directory is modified, created |
| 467 | # # or removed. |
| 468 | # |
| 469 | # file.monitor: |
| 470 | # paths: |
| 471 | # # Recursively monitor changes on the |
| 472 | # # ~/my-images folder that include all the files |
| 473 | # # matching a JPEG extension in case-insensitive |
| 474 | # # mode, excluding those whose name starts with |
| 475 | # # tmp_ and all the files contained in the |
| 476 | # # __MACOSX folders |
| 477 | # - path: ~/my-images |
| 478 | # recursive: true |
| 479 | # case_sensitive: false |
| 480 | # regexes: |
| 481 | # - '.*\\.jpe?g$' |
| 482 | # ignore_patterns: |
| 483 | # - '^tmp_.*' |
| 484 | # ignore_directories: |
| 485 | # - '__MACOSX' |
| 486 | ### |
| 487 | |
| 488 | ### |
| 489 | # # Example configuration of a weather plugin |
| 490 | # |
| 491 | # weather.openweathermap: |
| 492 | # token: secret |
| 493 | # lat: lat |
| 494 | # long: long |
| 495 | ### |
| 496 | |
| 497 | ### |
| 498 | # # You can add IFTTT integrations to your routines quite easily. |
| 499 | # # |
| 500 | # # Register an API key for IFTTT, paste it here, and you can run an |
| 501 | # # `ifttt.trigger_event` action to fire an event on IFTTT. |
| 502 | # # |
| 503 | # # You can also create IFTTT routines that call your Platypush instance, by |
| 504 | # # using Web hooks (i.e. event hooks that subscribe to |
| 505 | # # `platypush.message.event.http.hook.WebhookEvent` events), provided that the |
| 506 | # # Web server is listening on a publicly accessible address. |
| 507 | # |
| 508 | # ifttt: |
| 509 | # ifttt_key: SECRET |
| 510 | ### |
| 511 | |
| 512 | ### |
| 513 | # # The `http.webpage` integration comes with the mercury-parser JavaScript |
| 514 | # # library. It allows you to "distill" the content of a Web page and export it |
| 515 | # # in readable format (in simplified HTML, Markdown or PDF). |
| 516 | # |
| 517 | # http.webpage: |
| 518 | ### |
| 519 | |
| 520 | ### |
| 521 | # # The Bluetooth integration allows you to scan Bluetooth devices, hook events |
| 522 | # # when Bluetooth devices are detected/lost, and it natively supports several |
| 523 | # # device types that can be controlled or monitored via API or UI. |
| 524 | # |
| 525 | # bluetooth: |
| 526 | # poll_interval: 30 |
| 527 | ### |
| 528 | |
| 529 | ### |
| 530 | # # Example configuration of the zigbee.mqtt integration. |
| 531 | # # This integration listens for the events pushed by zigbee2mqtt service to an |
| 532 | # # MQTT broker. It can forward those events to native Platypush events (see |
| 533 | # # https://docs.platypush.tech/platypush/events/zigbee.mqtt.html) that you can |
| 534 | # # build automation routines on. You can also use Platypush to control your |
| 535 | # # Zigbee devices, either through the Web interface or programmatically through |
| 536 | # # the available plugin actions. |
| 537 | # |
| 538 | # zigbee.mqtt: |
| 539 | # # Host of the MQTT broker |
| 540 | # host: my-mqtt-broker |
| 541 | # # Listen port of the MQTT broker |
| 542 | # port: 1883 |
| 543 | # # Base topic, as specified in `<zigbee2mqtt_dir>/data/configuration.yaml` |
| 544 | # topic_prefix: zigbee2mqtt |
| 545 | ### |
| 546 | |
| 547 | ### |
| 548 | # # Example configuration of the zwave.mqtt integration. |
| 549 | # # This integration listens for the events pushed by ZWaveJS service to an MQTT |
| 550 | # # broker. It can forward those events to native Platypush events (see |
| 551 | # # https://docs.platypush.tech/platypush/events/zwave.html) that you can build |
| 552 | # # automation routines on. |
| 553 | # # You can also use Platypush to control your Z-Wave devices, either through the |
| 554 | # # Web interface or programmatically through the available plugin actions. |
| 555 | # |
| 556 | # zwave.mqtt: |
| 557 | # # Host of the MQTT broker |
| 558 | # host: my-mqtt-broker |
| 559 | # # Listen port of the MQTT broker |
| 560 | # port: 1883 |
| 561 | # # Gateway name, usually configured in the ZWaveJS-UI through `Settings -> |
| 562 | # # MQTT -> Name` |
| 563 | # name: zwavejs2mqtt |
| 564 | # # The prefix of the published topics, usually configured in the ZWaveJS-UI |
| 565 | # # through `Settings -> MQTT -> Prefix`. |
| 566 | # topic_prefix: zwave |
| 567 | ### |
| 568 | |
| 569 | ### -------------------- |
| 570 | ### Camera configuration |
| 571 | ### -------------------- |
| 572 | |
| 573 | ### |
| 574 | # # There are several providers for the camera integration - you can choose |
| 575 | # # between ffmpeg, gstreamer, PiCamera etc., and they all expose the same |
| 576 | # # interface/configuration options. |
| 577 | # # |
| 578 | # # It is advised to use the ffmpeg integration, as it's the one that provides |
| 579 | # # the highest degree of features and supported hardware. |
| 580 | # # |
| 581 | # # If the plugin is correctly configured, you can access your camera feed from |
| 582 | # # the Platypush Web panel, programmatically start/stop recording sessions, take |
| 583 | # # photos, get a feed stream URL etc. |
| 584 | # |
| 585 | # # The camera feed will be available at `/camera/<plugin>/video[.extension]`, |
| 586 | # # for example `/camera/ffmpeg/video.mjpeg` for MJPEG (usually faster), or |
| 587 | # # `camera/ffmpeg/video.mp4` for MP4. |
| 588 | # |
| 589 | # # You can also capture images by connecting to the |
| 590 | # # `/camera/<plugin>/photo[.extension]`, for example `/camera/ffmpeg/photo.jpg`. |
| 591 | # |
| 592 | # camera.ffmpeg: |
| 593 | # # Default video device to use |
| 594 | # device: /dev/video0 |
| 595 | # # Default resolution |
| 596 | # resolution: |
| 597 | # - 640 |
| 598 | # - 480 |
| 599 | # # The directory that will be used to store captured frames/images |
| 600 | # frames_dir: ~/Camera/Photos |
| 601 | # # Default image scaling factors (default: 1, no scaling) |
| 602 | # scale_x: 1.5 |
| 603 | # scale_y: 1.5 |
| 604 | # # Default rotation of the image, in degrees (default: 0, no rotation) |
| 605 | # rotate: 90 |
| 606 | # # Grayscale mode (default: False): |
| 607 | # grayscale: false |
| 608 | # # Default frames per second (default: 16) |
| 609 | # fps: 16 |
| 610 | # # Whether to flip the image along the horizontal axis (default: False) |
| 611 | # horizontal_flip: false |
| 612 | # # Whether to flip the image along the horizontal axis (default: False) |
| 613 | # vertical_flip: false |
| 614 | # |
| 615 | # # -- Streaming options |
| 616 | # # If `stream_on_start` is set to true, then camera streaming will start as |
| 617 | # # soon as the application/plugin is started. Otherwise, only when the |
| 618 | # # `camera.<plugin>.start_streaming` action is run. The camera will be |
| 619 | # # streamed on the specified `bind_address` and `listen_port` in the |
| 620 | # # specified `stream_format`. If `stream_format` is a video format (e.g. |
| 621 | # # h264 or mkv) then you can play the raw camera stream through e.g. |
| 622 | # # `vlc tcp://<address>:<listen_port>`. |
| 623 | # # Alternatively, you can access the camera stream over HTTP at |
| 624 | # # `http(s)://<address>:<http-port>/camera/<plugin>/video.<format>`. |
| 625 | # # For example, for MJPEG stream (usually the fastest option over HTTP): |
| 626 | # # `http://localhost:8008/camera/ffmpeg/video.mjpeg`. |
| 627 | # # An HTTP stream is the safest option, as it has to go through the standard |
| 628 | # # HTTP authentication process, while direct TCP access may expose your |
| 629 | # # camera to unauthenticated access. If you decide to directly stream over |
| 630 | # # TCP, make sure to carefully select the `bind_address`, add a firewall |
| 631 | # # rule for the streaming port, and/or ensure that the device's port is only |
| 632 | # # accessible from a safe network. |
| 633 | # # stream_on_start: false |
| 634 | # # bind_address: 0.0.0.0 |
| 635 | # # listen_port: 5000 |
| 636 | # # stream_format: h264 |
| 637 | ### |
| 638 | |
| 639 | ### ----------------- |
| 640 | ### Sound integration |
| 641 | ### ----------------- |
| 642 | |
| 643 | ### |
| 644 | # # The sound plugin allows you to stream from an audio source connected to the |
| 645 | # # machine, play audio files or synthetic audio waves or MIDI sounds. |
| 646 | # |
| 647 | # # After enabling the plugin, you can access the audio stream at |
| 648 | # # `/sound/stream[.extension]` (e.g. `/sound/stream.mp3`) if you want to get a |
| 649 | # # live recording of the captured sound from the configured audio |
| 650 | # # `input_device`. |
| 651 | # |
| 652 | # sound: |
| 653 | # enabled: true |
| 654 | ### |
| 655 | |
| 656 | ### ----------------------------------- |
| 657 | ### Some examples of media integrations |
| 658 | ### ----------------------------------- |
| 659 | |
| 660 | ### |
| 661 | # # Example configuration for the media.vlc plugin. You can replace `vlc` with |
| 662 | # # `mpv`, `mplayer`, `omxplayer` or `gstreamer` if you want to use another |
| 663 | # # player - the supported configuration option are the same across all these |
| 664 | # # players. |
| 665 | # |
| 666 | # media.vlc: |
| 667 | # # Volume level, between 0 and 100 |
| 668 | # volume: 50 |
| 669 | # # Where to store downloaded files |
| 670 | # download_dir: ~/Downloads |
| 671 | # # Play videos in fullscreen by default |
| 672 | # fullscreen: True |
| 673 | # # If youtube-dl or any compatible application is installed, play requested |
| 674 | # # videos in this format by default. Default: `best`. |
| 675 | # youtube_format: 'mp4[height<=?480]' |
| 676 | # # Extra arguments to pass to the executable. --play-and-exit may be a good |
| 677 | # # idea with VLC, so the player terminates upon stop instead of lingering in |
| 678 | # # the background. |
| 679 | # args: |
| 680 | # - --play-and-exit |
| 681 | # # List of directories to search for media files. The media files in these |
| 682 | # # folders can be searched through the `media.<player>.search` command, or |
| 683 | # # through the Web interface. |
| 684 | # media_dirs: |
| 685 | # - /mnt/hd/media/movies |
| 686 | # - /mnt/hd/media/series |
| 687 | # - /mnt/hd/media/videos |
| 688 | # - ~/Downloads |
| 689 | ### |
| 690 | |
| 691 | ### |
| 692 | # # Example configuration for the media.chromecast plugin, see |
| 693 | # # https://docs.platypush.tech/en/latest/platypush/plugins/media.chromecast.html |
| 694 | # # You can easily install the dependencies through pip install 'platypush[chromecast]' |
| 695 | # |
| 696 | # media.chromecast: |
| 697 | # chromecast: Living Room TV |
| 698 | ### |
| 699 | |
| 700 | ### |
| 701 | # # Example Kodi configuration. This makes it possible to control and query a |
| 702 | # # Kodi instance, from your automation hooks, from the Platypush APIs or from |
| 703 | # # the Platypush Web interface. It requires you to enable the JSON API service |
| 704 | # # from Kodi's settings. |
| 705 | # |
| 706 | # media.kodi: |
| 707 | # host: localhost |
| 708 | # http_port: 8080 |
| 709 | # username: kodi |
| 710 | # password: secret |
| 711 | ### |
| 712 | |
| 713 | ### |
| 714 | # # Example configuration for a Plex media server. This integration makes it |
| 715 | # # possible to navigate and search media items from your Plex library in the |
| 716 | # # media UI. |
| 717 | # |
| 718 | # media.plex: |
| 719 | # server: localhost |
| 720 | # username: plex |
| 721 | # password: secret |
| 722 | ### |
| 723 | |
| 724 | ### |
| 725 | # # Jellyfin media server configuration. |
| 726 | # |
| 727 | # media.jellyfin: |
| 728 | # server: https://media.example.com |
| 729 | # api_key: secret |
| 730 | ### |
| 731 | |
| 732 | ### --------------------- |
| 733 | ### Sensors configuration |
| 734 | ### --------------------- |
| 735 | |
| 736 | ### |
| 737 | # # The serial plugin can be used to read sensor data from a device connected |
| 738 | # # over serial/USB interface. |
| 739 | # # |
| 740 | # # It can be used, for example, to connect to an Arduino or ESP device over |
| 741 | # # serial port, where the remote microcontroller periodically sends sensor data |
| 742 | # # over the serial interface. |
| 743 | # # |
| 744 | # # The data can be sent on the wire either as raw string-encoded numbers (one |
| 745 | # # per line), or (better) in JSON format. For example, you can program your |
| 746 | # # microcontroller to periodically send JSON strings like these when you get new |
| 747 | # # readings from your sensors: |
| 748 | # # |
| 749 | # # {"temperature": 25.0, "humidity": 20.0, "smoke": 0.01, "luminosity": 45} |
| 750 | # # |
| 751 | # # The JSON will be automatically unpacked by the application, and the relevant |
| 752 | # # `platypush.message.event.sensor.SensorDataChangeEvent` events will be |
| 753 | # # triggered when the data changes - you can subscribe to them in your custom |
| 754 | # # hooks. |
| 755 | # |
| 756 | # serial: |
| 757 | # # The path to the USB interface with e.g. an Arduino or ESP microcontroller |
| 758 | # # connected. |
| 759 | # # A way to get a deterministic path name on Linux, instead of |
| 760 | # # `/dev/ttyUSB<n>`, can be the following: |
| 761 | # # |
| 762 | # # - Get the vendor and product ID of your device via e.g. `lsusb`. For |
| 763 | # # example, for an Arduino-compatible microcontroller: |
| 764 | # # |
| 765 | # # Bus 001 Device 008: ID 1a86:7523 QinHeng Electronics CH340 serial converter |
| 766 | # # |
| 767 | # # - In the case above, `1a86` is the vendor ID and `7523` is the product |
| 768 | # # ID. Create a new udev rule for it, so every time the device is |
| 769 | # # connected it will also be symlinked to e.g. `/dev/arduino`: |
| 770 | # # |
| 771 | # # echo 'SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="arduino"' | \ |
| 772 | # # sudo tee /etc/udev/rules.d/98-usb-serial.rules |
| 773 | # device: /dev/ttyUSB0 |
| 774 | # # How often the interface should be polled for updates, in seconds |
| 775 | # poll_interval: 1 |
| 776 | # # The tolerance argument can be used to tune when you want to be notified |
| 777 | # # of data changes through `SensorDataChangeEvent` events. In the case |
| 778 | # # below, if the microcontroller sends two consecutive temperature reads, |
| 779 | # # one for 22.0 and one for 22.2, then only one `SensorDataChangeEvent` will |
| 780 | # # be triggered (for the first read), since the absolute value of the |
| 781 | # # difference between the two events is less than the configured tolerance. |
| 782 | # # However, if the device sends two temperature reads, one for 22.0 and one |
| 783 | # # for 22.7, then two `SensorDataChangeEvent` events will be triggered. |
| 784 | # # The tolerance for all the metrics is set to a value close to zero by |
| 785 | # # default - i.e. any read, unless it's exactly the same as the previous |
| 786 | # # one, will trigger a new event. |
| 787 | # tolerance: |
| 788 | # temperature: 0.5 |
| 789 | # humidity: 0.75 |
| 790 | # luminosity: 5 |
| 791 | # |
| 792 | # # If a threshold is defined for a sensor, and the value of that sensor goes |
| 793 | # # below/above that temperature between two reads, then a |
| 794 | # # `SensorDataBelowThresholdEvent` or a `SensorDataAboveThresholdEvent` will |
| 795 | # # be triggered respectively. |
| 796 | # thresholds: |
| 797 | # temperature: 25.0 |
| 798 | ### |
| 799 | |
| 800 | ### |
| 801 | # # Alternatively to the serial plugin, you can also use the arduino plugin if |
| 802 | # # you want to specifically interface with Arduino. |
| 803 | # # |
| 804 | # # This plugin won't require you to write any logic for your microcontroller. |
| 805 | # # However, it requires your microcontroller to be flash with the Firmata |
| 806 | # # firmware, which allows programmatic external control. |
| 807 | # # |
| 808 | # # Note that the interface of this plugin is basically the same as the serial |
| 809 | # # plugin, and any other plugin that extends `SensorPlugin` in general. |
| 810 | # # Therefore, poll_interval, tolerance and thresholds are supported here too. |
| 811 | # |
| 812 | # arduino: |
| 813 | # board: /dev/ttyUSB0 |
| 814 | # # name -> PIN number mapping (similar for digital_pins). |
| 815 | # # It allows you to pick a common name for your PINs that will be used in |
| 816 | # # the forwarded events. |
| 817 | # analog_pins: |
| 818 | # temperature: 7 |
| 819 | # |
| 820 | # tolerance: |
| 821 | # temperature: 0.5 |
| 822 | # |
| 823 | # thresholds: |
| 824 | # temperature: 25.0 |
| 825 | ### |
| 826 | |
| 827 | ### |
| 828 | # # Another example: the LTR559 is a common sensor for proximity and luminosity |
| 829 | # # that can be wired to a Raspberry Pi or similar devices over SPI or I2C |
| 830 | # # interface. It exposes the same base interface as all other sensor plugins. |
| 831 | # |
| 832 | # sensor.ltr559: |
| 833 | # poll_interval: 1.0 |
| 834 | # tolerance: |
| 835 | # light: 7.0 |
| 836 | # proximity: 5.0 |
| 837 | # |
| 838 | # thresholds: |
| 839 | # proximity: 10.0 |
| 840 | ### |
| 841 | |
| 842 | ### ----------------------------------------- |
| 843 | ### Example configuration of the mail plugin. |
| 844 | ### ----------------------------------------- |
| 845 | # |
| 846 | # mail: |
| 847 | # # Display name to be used for outgoing emails. Default: |
| 848 | # # the `from` parameter will be used from :meth:`.send`, |
| 849 | # # and, if missing, the username from the account configuration |
| 850 | # # will be used. |
| 851 | # display_name: My Name |
| 852 | # |
| 853 | # # How often we should poll for updates (default: 60 seconds) |
| 854 | # poll_interval: 60 |
| 855 | # |
| 856 | # # Connection timeout (default: 20 seconds) |
| 857 | # # Can be overridden on a per-account basis |
| 858 | # timeout: 20 |
| 859 | # |
| 860 | # accounts: |
| 861 | # - name: "My Local Account" |
| 862 | # username: me@mydomain.com |
| 863 | # password: my-password |
| 864 | # |
| 865 | # # The default flag sets this account as the default one |
| 866 | # # for mail retrieval and sending if no account is |
| 867 | # # specified on an action. If multiple accounts are set |
| 868 | # # and none is set as default, and no account is specified |
| 869 | # # on an action, then the first configured account will be |
| 870 | # # used. |
| 871 | # default: true |
| 872 | # # Domain to be used for outgoing emails. Default: inferred |
| 873 | # # from the account configuration |
| 874 | # domain: example.com |
| 875 | # |
| 876 | # |
| 877 | # # Alternatively, you can run an external command |
| 878 | # # to get the password |
| 879 | # # password_cmd: "pass show mail/example.com" |
| 880 | # |
| 881 | # # Path to a custom certfile if the mail server uses a |
| 882 | # # self-signed certificate |
| 883 | # # certfile: /path/to/certfile |
| 884 | # |
| 885 | # # Path to a custom keyfile if the mail server requires |
| 886 | # # client authentication. It requires certfile to be set |
| 887 | # # too |
| 888 | # # keyfile: /path/to/keyfile |
| 889 | # |
| 890 | # incoming: |
| 891 | # # Supported protocols: imap, imaps |
| 892 | # server: imaps://mail.example.com:993 |
| 893 | # |
| 894 | # outgoing: |
| 895 | # # The `incoming` and `outgoing` configurations can |
| 896 | # # override the global `username` and `password` and |
| 897 | # # other authentication parameters of the account |
| 898 | # username: me |
| 899 | # password: my-smtp-password |
| 900 | # |
| 901 | # # Supported protocols: smtp, smtps, smtp+starttls, |
| 902 | # server: smtps://mail.example.com:465 |
| 903 | # |
| 904 | # # These folders will be monitored for new messages |
| 905 | # monitor_folders: |
| 906 | # - All Mail |
| 907 | ### |
| 908 | |
| 909 | ### -------------------------------- |
| 910 | ### Some text-to-speech integrations |
| 911 | ### -------------------------------- |
| 912 | |
| 913 | ### |
| 914 | # # `tts` is the simplest TTS integration. It leverages the Google Translate open |
| 915 | # # "say" endpoint to render text as audio speech. |
| 916 | # |
| 917 | # tts: |
| 918 | # # The media plugin that should be used to play the audio response |
| 919 | # # The default language of the voice |
| 920 | # language: en-gb |
| 921 | ### |
| 922 | |
| 923 | ### |
| 924 | # # `tts.google` leverages Google's official text-to-speech API to render audio |
| 925 | # # speech from text. |
| 926 | # # |
| 927 | # # Install its dependencies via 'pip install "platypush[google-tts]"'. |
| 928 | # # |
| 929 | # # Like all other Google integrations, it requires you to register an app on the |
| 930 | # # Google developers console, create an API key, and follow the instruction |
| 931 | # # logged on the next restart to give your app the required permissions to your |
| 932 | # # account. |
| 933 | # |
| 934 | # tts.google: |
| 935 | # # The default language of the voice |
| 936 | # language: en-US |
| 937 | # # The gender of the voice (MALE or FEMALE) |
| 938 | # gender: FEMALE |
| 939 | # # The path to the JSON file containing your Google API credentials |
| 940 | # credentials_file: '~/.credentials/platypush/google/platypush-tts.json' |
| 941 | ### |
| 942 | |
| 943 | ### |
| 944 | # # This TTS integration leverages mimic3, an open-source TTS Web server |
| 945 | # # developed by Mycroft (RIP). |
| 946 | # # |
| 947 | # # Follow the instructions at |
| 948 | # # https://docs.platypush.tech/platypush/plugins/tts.mimic3.html to quickly |
| 949 | # # bootstrap a mimic3 server. |
| 950 | # |
| 951 | # tts.mimic3: |
| 952 | # # The base URL of the mimic3 server |
| 953 | # server_url: http://127.0.0.1:59125 |
| 954 | # # Path of the default voice that should be used |
| 955 | # voice: 'en_US/vctk_low' |
| 956 | ### |
| 957 | |
| 958 | ## ---------- |
| 959 | ## Procedures |
| 960 | ## ---------- |
| 961 | |
| 962 | # Procedures are lists of actions that are executed sequentially. |
| 963 | # |
| 964 | # This section shows how to define procedures directly in your YAML |
| 965 | # configuration file(s). However, you can also put your procedures into Python |
| 966 | # scripts inside of the `<config-dir>/scripts` directory if you want access to |
| 967 | # a full-blown Python syntax. They will be automatically discovered at startup |
| 968 | # and available to the application. |
| 969 | # |
| 970 | # You can also access Python variables and evaluate Python expressions by using |
| 971 | # `${}` context expressions. |
| 972 | # |
| 973 | # The `context` special variable is a name->value dictionary containing the |
| 974 | # items returned from previous actions. For example, if an action returned |
| 975 | # `{"status": "ok", "temperature": 21.5}`, then the following actions can access |
| 976 | # those variables through `${context["status"]}` or |
| 977 | # `${context["temperature"]}`, or simply `${status}` and `${temperature}`, |
| 978 | # respectively. |
| 979 | # |
| 980 | # You can also add statements like `- if ${temperature > 20.0}` or |
| 981 | # `- for ${temp in temperature_values}` in your procedures. |
| 982 | # |
| 983 | # Besides the `context` variables, the following special variables are also |
| 984 | # available to the `${}` constructs when running a procedure: |
| 985 | # |
| 986 | # - `output`: It contains the parsed output of the previous action. |
| 987 | # - `errors`: It contains the errors of the previous action |
| 988 | # - `event`: If the procedure is an event hook (or it is executed within an |
| 989 | # event hook), it contains the event that triggered the hook |
| 990 | |
| 991 | ### |
| 992 | # # An example procedure that can be called when you arrive home. |
| 993 | # # |
| 994 | # # You can run this procedure from the Platypush `execute` Web panel, or |
| 995 | # # programmatically by sending a JSON request to your Web server (or to the |
| 996 | # # `/ws/requests` Websocket route, or to the TCP backend) |
| 997 | # # |
| 998 | # # curl -XPOST \ |
| 999 | # # -H "Authorization: Bearer $YOUR_TOKEN" \ |
| 1000 | # # -d '{"type": "request", "action": "procedure.at_home"}' |
| 1001 | # # |
| 1002 | # # A use-case can be the one where you have a Tasker automation running on your |
| 1003 | # # Android device that detects when your phone enters or exits a certain area, |
| 1004 | # # and sends the appropriate request to your Platypush server. |
| 1005 | # |
| 1006 | # procedure.at_home: |
| 1007 | # # Set the db variable AT_HOME to 1. |
| 1008 | # # Variables are flexible entities with a name and a value that will be |
| 1009 | # # stored on the database and persisted across sessions. |
| 1010 | # # You can access them in other procedures, scripts or hooks and run |
| 1011 | # # custom logic on the basis of their value. |
| 1012 | # - action: variable.set |
| 1013 | # args: |
| 1014 | # AT_HOME: 1 |
| 1015 | # |
| 1016 | # # Check the luminosity level from e.g. a connected LTR559 sensor. |
| 1017 | # # It could also be a Bluetooth, Zigbee, Z-Wave, serial etc. sensor. |
| 1018 | # - action: sensor.ltr559.get_measurement |
| 1019 | # |
| 1020 | # # If it's below a certain threshold, turn on the lights. |
| 1021 | # # In this case, `light` is a parameter returned by the previous response, |
| 1022 | # # so we can directly access it here through the `${}` context operator. |
| 1023 | # # ${light} in this case is equivalent to ${context["light"]} or |
| 1024 | # # ${output["light"]}. |
| 1025 | # - if ${int(light or 0) < 110}: |
| 1026 | # - action: light.hue.on |
| 1027 | # |
| 1028 | # # Say a welcome home message |
| 1029 | # - action: tts.mimic3.say |
| 1030 | # args: |
| 1031 | # text: Welcome home |
| 1032 | # |
| 1033 | # # Start the music |
| 1034 | # - action: music.mpd.play |
| 1035 | ### |
| 1036 | |
| 1037 | ### |
| 1038 | # # Procedure that will be execute when you walk outside your home. |
| 1039 | # |
| 1040 | # procedure.outside_home: |
| 1041 | # # Unset the db variable AT_HOME |
| 1042 | # - action: variable.unset |
| 1043 | # args: |
| 1044 | # name: AT_HOME |
| 1045 | # |
| 1046 | # # Stop the music |
| 1047 | # - action: music.mpd.stop |
| 1048 | # |
| 1049 | # # Turn off the lights |
| 1050 | # - action: light.hue.off |
| 1051 | ### |
| 1052 | |
| 1053 | ### |
| 1054 | # # Procedures can also take optional arguments. The example below shows a |
| 1055 | # # generic procedure that broadcasts measurements from a sensor through an |
| 1056 | # MQTT broker. |
| 1057 | # |
| 1058 | # # A listener on this topic can react to an `MQTTMessageEvent` and, for |
| 1059 | # # example, store the event on a centralized storage. |
| 1060 | # # |
| 1061 | # # See the event hook section below for a sample hook that listens for messages |
| 1062 | # # sent by other clients using this procedure. |
| 1063 | # |
| 1064 | # procedure.send_sensor_data(name, value): |
| 1065 | # - action: mqtt.send_message |
| 1066 | # args: |
| 1067 | # topic: platypush/sensors |
| 1068 | # host: my-mqtt-broker |
| 1069 | # port: 1883 |
| 1070 | # msg: |
| 1071 | # name: ${name} |
| 1072 | # value: ${value} |
| 1073 | # source: ${Config.get("device_id")} |
| 1074 | ### |
| 1075 | |
| 1076 | ## ------------------- |
| 1077 | ## Event hook examples |
| 1078 | ## ------------------- |
| 1079 | |
| 1080 | # Event hooks are procedures that are run when a certain condition is met. |
| 1081 | # |
| 1082 | # Check the documentation of your configured backends and plugins to see which |
| 1083 | # events they can trigger, and check https://docs.platypush.tech/events.html |
| 1084 | # for the full list of available events with their schemas. |
| 1085 | # |
| 1086 | # Just like procedures, event hooks can be defined either using the YAML |
| 1087 | # syntax, or in Python snippets in your `scripts` folder. |
| 1088 | # |
| 1089 | # A YAML event hook consists of two parts: an `if` field that specifies on |
| 1090 | # which event the hook will be triggered (type and attribute values), and a |
| 1091 | # `then` field that uses the same syntax as procedures to specify a list of |
| 1092 | # actions to execute when the event is matched. |
| 1093 | |
| 1094 | ### |
| 1095 | # # This example is a hook that reacts when an `MQTTMessageEvent` is received on |
| 1096 | # # a topic named `platypush/sensor` (see `send_sensor_data` example from the |
| 1097 | # # procedures section). |
| 1098 | # # |
| 1099 | # # It will store the event on a centralized Postgres database. |
| 1100 | # # |
| 1101 | # # Note that, for this event to be triggered, the application must first |
| 1102 | # # subscribe to the `platypush/sensor` topic - e.g. by adding `platypush/sensor` |
| 1103 | # # to the active subscriptions in the `mqtt` configurations. |
| 1104 | # |
| 1105 | # event.hook.OnSensorDataReceived: |
| 1106 | # if: |
| 1107 | # type: platypush.message.event.mqtt.MQTTMessageEvent |
| 1108 | # topic: platypush/sensor |
| 1109 | # then: |
| 1110 | # - action: db.insert |
| 1111 | # args: |
| 1112 | # engine: postgresql+pg8000://dbuser:dbpass@dbhost/dbname |
| 1113 | # table: sensor_data |
| 1114 | # records: |
| 1115 | # - name: ${msg["name"]} |
| 1116 | # value: ${msg["value"]} |
| 1117 | # source: ${msg["source"]} |
| 1118 | ### |
| 1119 | |
| 1120 | ### |
| 1121 | # # The example below is a hook that reacts when a `NewPlayingTrackEvent` event |
| 1122 | # # is received and synchronize the listening activity to the users' Last.fm |
| 1123 | # # profile (it requires the `lastfm` plugin and at least a music plugin |
| 1124 | # # enabled, like `music.mpd`). |
| 1125 | # |
| 1126 | # event.hook.OnNewMusicActivity: |
| 1127 | # if: |
| 1128 | # type: platypush.message.event.music.NewPlayingTrackEvent |
| 1129 | # then: |
| 1130 | # - if ${track.get('artist') and track.get('title')}: |
| 1131 | # - action: lastfm.scrobble |
| 1132 | # args: |
| 1133 | # artist: ${track['artist']} |
| 1134 | # title: ${track['title']} |
| 1135 | ## |
| 1136 | |
| 1137 | ### |
| 1138 | # # The example below plays the music on mpd/mopidy when your voice assistant |
| 1139 | # # triggers a speech recognized event with "play the music" content. |
| 1140 | # |
| 1141 | # event.hook.PlayMusicAssistantCommand: |
| 1142 | # if: |
| 1143 | # type: platypush.message.event.assistant.SpeechRecognizedEvent |
| 1144 | # # Note that basic regexes are supported for `SpeechRecognizedEvent`, |
| 1145 | # # so the hook will be triggered both if you say "play the music" and |
| 1146 | # # "play music" |
| 1147 | # phrase: "play (the)? music" |
| 1148 | # then: |
| 1149 | # - action: music.mpd.play |
| 1150 | ### |
| 1151 | |
| 1152 | ### |
| 1153 | # # This will turn on the lights when you say "turn on the lights" |
| 1154 | # |
| 1155 | # event.hook.TurnOnLightsCommand: |
| 1156 | # if: |
| 1157 | # type: platypush.message.event.assistant.SpeechRecognizedEvent |
| 1158 | # phrase: "turn on (the)? lights?" |
| 1159 | # then: |
| 1160 | # - action: light.hue.on |
| 1161 | ### |
| 1162 | |
| 1163 | ### |
| 1164 | # # The WebhookEvent is a special type of event. It allows you to dynamically |
| 1165 | # # register a Web hook that can be invoked by other clients, if the HTTP backend |
| 1166 | # # is active. |
| 1167 | # # |
| 1168 | # # In this case, we are registering a hook under `/hook/test-hook` that accepts |
| 1169 | # # POST requests, gets the body of the requests and logs it. |
| 1170 | # # |
| 1171 | # # NOTE: Since Web hooks are supposed to be called by external (and potentially |
| 1172 | # # untrusted) parties, they aren't designed to use the standard authentication |
| 1173 | # # mechanism used by all other routes. |
| 1174 | # # |
| 1175 | # # By default they don't have an authentication layer at all. You are however |
| 1176 | # # advised to create your custom passphrase and checks the request's headers or |
| 1177 | # # query string for it - preferably one passphrase per endpoint. |
| 1178 | # |
| 1179 | # event.hook.WebhookExample: |
| 1180 | # if: |
| 1181 | # type: platypush.message.event.http.hook.WebhookEvent |
| 1182 | # hook: test-hook |
| 1183 | # method: POST |
| 1184 | # then: |
| 1185 | # # Check the token/passphrase |
| 1186 | # - if ${args.get('headers', {}).get('X-Token') == 'SECRET': |
| 1187 | # - action: logger.info |
| 1188 | # args: |
| 1189 | # msg: ${data} |
| 1190 | ### |
| 1191 | |
| 1192 | ### ------------- |
| 1193 | ### Cron examples |
| 1194 | ### ------------- |
| 1195 | |
| 1196 | ### |
| 1197 | # # Cronjobs allow you to execute procedures at periodic intervals. |
| 1198 | # # Standard UNIX cron syntax is supported, plus an optional 6th indicator |
| 1199 | # # at the end of the expression to run jobs with second granularity. |
| 1200 | # # The example below executes a script at intervals of 1 minute. |
| 1201 | # |
| 1202 | # cron.TestCron: |
| 1203 | # cron_expression: '* * * * *' |
| 1204 | # actions: |
| 1205 | # - action: shell.exec |
| 1206 | # args: |
| 1207 | # cmd: ~/bin/myscript.sh |
| 1208 | ### |