Configuration#
Configuration file#
You can use the default
config.yaml
as a template/reference.
The location of the config.yaml to be used by the application is determined
in the following way:
It can be passed through the command-line
-c/--configargument.If not specified via
-c, it will be read from thePLATYPUSH_CONFIGenvironment variable.If not specified, use
./config.yamlif available.If not available, and you are running Platypush within a Docker container, or as a privileged user (and usually you shouldn’t), or as a systemd service created by a supported package manager, then
/etc/platypush/config.yamlwill be used if available.Otherwise, if you are running Platypush as a non-privileged user or in a virtual environment,
$XDG_CONFIG_HOME/platypush/config.yamlwill be used (defaults to~/.config/platypush/config.yaml).
Scripts directory#
By default, any custom Python scripts will be searched under
<CONFDIR>/scripts, where <CONFDIR> is the path to your config.yaml.
You can override it in your config.yaml:
scripts_dir: /path/to/custom/scripts
Since everything under the scripts directory will be imported as a submodule, you can create your own libraries of scripts that can import other scripts:
# Content of scripts/music.py
from platypush import run
def music_play(plugin='music.mopidy', resource=None):
run(f'{plugin}.play', resource)
# Content of scripts/lights.py
from platypush import run
def lights_toggle(plugin='light.hue', groups=('Living Room',)):
run(f'{plugin}.toggle', groups=groups)
# Content of scripts/home.py
from platypush import procedure
from scripts.music import music_play
from scripts.lights import lights_toggle
@procedure
def at_home():
music_play()
lights_toggle()
Splitting configuration on multiple files#
The config.yaml file can become very complex, especially if you embed many
hooks and procedures in it in YAML format.
To make the configuration more maintainable, and also to isolate modules that
you can reuse across multiple instances, you can leverage the include
directive:
# All paths are relative to config.yaml, or to the location of the current file
include:
- assistant.yaml
- db.yaml
- media.yaml
- mqtt.yaml
- sensors.yaml
# ...
Working directory#
This is where the application will store its data and integration plugins will store their data. The order of precedence is:
-w/--workdircommand line argument.The
PLATYPUSH_WORKDIRenvironment variable.The
workdirfield in the configuration file.$XDG_DATA_HOME/platypush(default:~/.local/share/platypush) if launched with a non-privileged user,/var/lib/platypushif launched as root or with a system user.
Database#
The application stores entities, variables, users, integrations state and more on a database. The engine configuration supports the SQLAlchemy engine syntax.
Note: The application uses a local SQLite database by default, which is
natively supported by SQLAlchemy. The application has also been tested against
MySQL/MariaDB and Postgres, and should work fine with any modern relational
database supported by SQLAlchemy. However, any backend other than SQLite may
require an additional Python dependency for the SQLAlchemy driver (for example
pg8000 for PostgreSQL).
Order of precedence for the engine:
--main-db/--dbcommand line argument.The
PLATYPUSH_DBenvironment variable.The
main.dbfield in the configuration file.sqlite:///<WORKDIR>/main.db
Device ID#
The device ID is a unique identifier for a Platypush instance on a network and is used to reliably dispatch messages when multiple instances use a shared backend.
The order of precedence is:
--device-idcommand line argument.The
PLATYPUSH_DEVICE_IDenvironment variable.The
device_idfield in the configuration file.The hostname of the machine.
systemd service#
If you installed Platypush from a system package manager then you’ll also have
a systemd service installed for it.
You can start/enable Platypush like any other systemd service:
# systemctl start platypush
# systemctl enable platypush
Or, if you want to run the Platypush service as a generic user:
❯ systemctl --user start platypush
❯ systemctl --user enable platypush
Otherwise, you can create your own systemd service copying the provided
.service
file
to e.g. ~/.config/systemd/user or /etc/systemd/system.
Redis#
Platypush uses Redis as a in-memory queue to deliver messages and as a pub/sub bus for inter-process communication.
If you installed Platypush through a package manager, then the Redis service will automatically be installed and started if you launch the Platypush service as a privileged user.
If you run Platypush in a container then by default it’ll start its own Redis
instance through the --start-redis command-line option.
You can customize the Redis configuration through the:
--redis-host,--redis-portand--redis-queuecommand-line options.PLATYPUSH_REDIS_HOST,PLATYPUSH_REDIS_PORTandPLATYPUSH_REDIS_QUEUEenvironment variables.Through your
config.yaml:
# See https://redis-py.readthedocs.io/en/latest/connections.html#redis.Redis
# for the full list of supported parameters
redis:
host: redis-host
port: 6379
username: redis-user
password: redis-pass
nginx#
If you want to access your Platypush web panel outside your home network, it may be a good idea to use an nginx/Apache reverse proxy with a valid SSL certificate (e.g. managed by certbot). A sample an nginx configuration is provided in the repository.