No Description

dependabot[bot] b6d69e82a8 build(deps-dev): bump black from 24.2.0 to 24.3.0 (#108) 1 week ago
.github 176a5bb8b2 build(deps): bump docker/build-push-action from 5.2.0 to 5.3.0 (#104) 1 week ago
docs 56dc5bad31 prepare-for-shutdown: publish config for home assistant to enable automatic discovery 3 years ago
systemctl_mqtt 86523b2f5b dev / test env: upgrade black to first stable release 2 years ago
tests 86523b2f5b dev / test env: upgrade black to first stable release 2 years ago
.dockerignore 74669520c1 added dockerfile & docker-compose.yml 3 years ago
.gitignore c790a93981 instruct sessions to lock on systemctl/hostname/lock-all-sessions 3 years ago
.isort.cfg 04fcb2b7a9 isort: added config to workaround persistent misclassification of paho.mqtt.client 3 years ago
.pylintrc c57260b7c0 drop compatibility with pyhon3.5 2 years ago
CHANGELOG.md 077b5973a6 drop compatibility with python3.7 (reached end of life on 2023-06-27); remove pylint-import-requirements from pipeline (incompatible with pylint, see commit below); relock env with pipenv v2023.10.3 on python v3.11.2 (removes "sanitized-package" entry, see commit below) 5 months ago
COPYING 1574063886 mqtt message on topic systemctl/hostname/poweroff schedules poweroff with delay of 4 seconds 3 years ago
Dockerfile a093b0e924 fix dockerfile: ignore "sanitized-package" added by dependabot 2 years ago
Makefile e72910d853 refactor makefile: minor renamings for consistency with switchbot-mqtt's Makefile 3 years ago
Pipfile 9c71499b36 manually fix entry for "exceptiongroup" in Pipfile.lock 5 months ago
Pipfile.lock b6d69e82a8 build(deps-dev): bump black from 24.2.0 to 24.3.0 (#108) 1 week ago
README.md 35d8115ac3 pipeline: remove coveralls ("422 Client Error: Unprocessable Entity for url: https://coveralls.io/api/v1/jobs", `pytest --cov-fail-under=100 …` in place) 11 months ago
docker-apparmor-profile accc617ede fix apparmor profile for arch != amd64 (`ImportError: [...]/_gi.cpython-38-aarch64-linux-gnu.so: Permission denied`) 2 years ago
docker-compose.yml c32424c058 docker-compose: assign bridge name 3 years ago
mypy.ini 1574063886 mqtt message on topic systemctl/hostname/poweroff schedules poweroff with delay of 4 seconds 3 years ago
setup.py 077b5973a6 drop compatibility with python3.7 (reached end of life on 2023-06-27); remove pylint-import-requirements from pipeline (incompatible with pylint, see commit below); relock env with pipenv v2023.10.3 on python v3.11.2 (removes "sanitized-package" entry, see commit below) 5 months ago

README.md

systemctl-mqtt

CI Pipeline Status Coverage Status Last Release Compatible Python Versions DOI

MQTT client triggering & reporting shutdown on systemd-based systems

Setup

$ pip3 install --user --upgrade systemctl-mqtt
$ systemctl-mqtt --mqtt-host HOSTNAME_OR_IP_ADDRESS

On debian-based systems, dependencies can optionally be installed via:

$ sudo apt-get install --no-install-recommends python3-dbus python3-gi python3-paho-mqtt

Usage

Schedule Poweroff

Schedule poweroff by sending a MQTT message to topic systemctl/hostname/poweroff.

$ mosquitto_pub -h MQTT_BROKER -t systemctl/hostname/poweroff -n

Shutdown Report

systemctl-mqtt subscribes to logind's PrepareForShutdown signal.

systemctl halt|poweroff|reboot triggers a message with payload true on topic systemctl/hostname/preparing-for-shutdown.

Lock Screen

Lock screen by sending a MQTT message to topic systemctl/hostname/lock-all-sessions.

$ mosquitto_pub -h MQTT_BROKER -t systemctl/hostname/lock-all-sessions -n

Home Assistant 🏡

Sample Setup

Send Poweroff Command

# https://www.home-assistant.io/docs/mqtt/broker/#configuration-variables
mqtt:
  broker: BROKER_HOSTNAME_OR_IP_ADDRESS
  # credentials, additional options…

script:
  poweroff_raspberry_pi:
    sequence:
      service: mqtt.publish
      data:
        topic: systemctl/raspberrypi/poweroff

homeassistant:
  customize:
    script.poweroff_raspberry_pi:
      friendly_name: poweroff pi
      icon: mdi:power

Trigger Automation on Shutdown

automation:
- trigger:
    platform: mqtt
    topic: systemctl/raspberrypi/preparing-for-shutdown
    payload: 'true'
  action:
    service: switch.turn_off
    entity_id: switch.desk_lamp

Automatic Discovery of Shutdown Sensor (Optional)

After enabling MQTT device discovery home assistant will automatically detect a new entity binary_sensor.hostname_preparing_for_shutdown.

mqtt:
  broker: BROKER_HOSTNAME_OR_IP_ADDRESS
  discovery: true # default in home assistant >=v0.117.0
  # credentials, additional options…

homeassistant discovery binary_sensor.hostname_preparing_for_shutdown

When using a custom discovery_prefix pass --homeassistant-discovery-prefix custom-prefix to systemctl-mqtt.

Docker 🐳

  1. Clone this repository.
  2. Edit docker-compose.yml.
  3. Load AppArmor profile: sudo apparmor_parser ./docker-apparmor-profile
  4. sudo docker-compose up --build

Pre-built docker image are available at https://hub.docker.com/r/fphammerle/systemctl-mqtt/tags

Annotation of signed tags docker/* contains docker image digests: https://github.com/fphammerle/systemctl-mqtt/tags

MQTT via TLS

TLS is enabled by default. Run systemctl-mqtt --mqtt-disable-tls … to disable TLS.

MQTT Authentication

systemctl-mqtt --mqtt-username me --mqtt-password secret …
# or
systemctl-mqtt --mqtt-username me --mqtt-password-file /var/lib/secrets/mqtt/password …

Adapt Poweroff Delay

systemctl-mqtt --poweroff-delay-seconds 60 …