YAML aliases/anchors can make repetitive configuration sections easier
to deal with. However when dealing with dictionaries, care needs to be
taken to not modify the original anchor since PyYAML utilizes a
reference when encountering an alias instead of a copy of the
dictionary.
In combination with resetting the log level on the handlers, this
allows messages lower than the default INFO to be logged when using
the logger component.
Since the requirements only change when the software is updated,
this adds a command line switch to disable pip installs on
startup. The default behavior is maintained when the switch is
not specified. Skipping pip helps a lot with startup on older RPi
hardware.
Calling load_yaml_config_file(config_path) causes issues when trying to
load from multiple files in a directory since config_path is modified in
the closure.
This also separates the parse code block into its own function so that
there is no restriction that the object be a dictionary for included
files. This means that scalars, lists, etc. can also be stored in
separate files -- for example, the scene component expects a list.
Allows including other files in the main configuration.yaml file. With
this functionality, passwords or other sensitive information can be
stored in a separate file from the main configuration.
A script is composed of a sequence of actions (currently service calls)
that are executed in order. Individual actions can also be delayed by a
given timedelta.
With the recent change to YAML, it is now easier to support lists by
default. Any config section that previous relied on the "domain",
"domain 1", "domain 2" format can now use YAML lists instead. The old
format is also still supported.
threading.Thread already contains a _stop() function which is called in
threading._after_fork(). Assigning an Event object to _stop caused
periodic exceptions to be thrown. This renames the _stop variable to
_stop_event to prevent a naming collision.