Shutdown Script | |
---|---|
Participants | |
Skills | Python, Linux |
Status | Finished |
Niche | |
Purpose | Saving energy and money |
Tool | No |
Location | |
Cost | |
Tool category |
Shutdown.png {{#if:No | [[Tool Owner::{{{ProjectParticipants}}} | }} {{#if:No | [[Tool Cost::{{{Cost}}} | }}
A script that shuts PC's down on the space when space state is off.
It checks space status on MQTT and shuts machine down if space is closed.
- Make sure you have paho installed.
apt install python3 apt install python-is-python3 apt install python-pip pip install paho-mqtt
new script
Make a directory called /etc/spaceStateExecutor/ and make a new file called config.yaml
mqtt: host: mqtt.vm.nurd.space port: 1883 on_space_open: - echo "Space is open" - your_command_here on_space_closed: - echo "Space is closed" - your_command_here
Now make a systemd service using `systemctl edit spaceStateExecutor --full --force` and paste the following:
[Unit] Description=NurdSpace State Executor After=network-online.target [Service] Type=simple Restart=always ExecStart=/usr/bin/spacestate-executor [Install] WantedBy=multi-user.target
Make sure to save this file as /usr/bin/spacestate-executor and finally run `chmod +x /usr/bin/spacestate-executor` after that you can start and enable the service with `systemctl enable spaceStateExecutor --now`. You don't need to restart the service after you change the config (except for mqtt) as the script reloads the config.
#! /usr/bin/python3 import os import yaml import time import logging import paho.mqtt.client /etc/systemd/system/.service example """ logging.basicConfig(level=logging.INFO) class spaceStateExecutor(): client = paho.mqtt.client.Client() spacestate = False def __init__(self): logging.info("Starting spaceStateExecutor") self.setup_mqtt() self.client.loop_forever() def load_config(self): with open("/etc/spaceStateExecutor/config.yaml", 'r') as stream: try: return yaml.load(stream, Loader=yaml.FullLoader) except yaml.YAMLError as exc: logging.error("Error loading config: " + str(exc)) import sys; sys.exit(1) def setup_mqtt(self): self.client.on_connect = self.on_connect self.client.on_message = self.on_message self.client.on_disconnect = self.on_disconnect self.client.connect("mqtt.vm.nurd.space") def on_disconnect(self, client, userdata, rc): self.setup_mqtt() def on_connect(self, client, userdata, flags, rc): self.client.subscribe("space/state") logging.info("Connected to MQTT") def on_space_open(self): self.callback_executor("on_space_open") def on_space_closed(self): self.callback_executor("on_space_closed") def callback_executor(self, callback_name): config = self.load_config() callbacks = config[callback_name] for callback in callbacks: logging.info("Executing for " + callback_name + ": " + callback) os.system(callback) def on_message(self, client, userdata, msg): if msg.topic == "space/state": _current_spacestate = self.spacestate self.spacestate = True if msg.payload.decode("utf-8").lower() == "true" else False if _current_spacestate == self.spacestate: # Spacestate didn't change return if self.spacestate == True: try: self.on_space_open() except Exception as e: logging.error("An error occured while executing on_space_open: " + str(e) + "\n") else: try: self.on_space_closed() except Exception as e: logging.error("An error occured while executing on_space_closed: " + str(e) + "\n") while True: try: spaceStateExecutor() except Exception as e: logging.error("An error occured while executing spaceStateExecutor: " + str(e) + "\n") time.sleep(5)
older script
- Log in as root and access root folder.
sudo -s cd /root/
- Enter crontab.
crontab -e
- Add a cronjob on the last line with the location of the script file.
* * * * * python /home/user/space_status_shutdown.py
The Script
Make sure the file has a .py extension.
- !/usr/bin/env python
- 2019 The_Niz
- checks space status and shuts machine down if space is closed
import paho.mqtt.client as mqtt
import os
- The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
if rc==0:
client.connected_flag=True #set flag
print("Connected with result code "+str(rc))
else:
print("Bad connection Returned code=",rc)
client.loop_stop()
client.disconnect()
client.subscribe("space/state")
- The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
if msg.payload.decode('utf-8')=="False":
print("Space is uit")
os.system('sudo /bin/systemctl poweroff')
else:
print("Space is aan")
client.loop_stop()
client.disconnect()
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("mqtt.vm.nurd.space", 1883, 60)
client.loop_forever()
</nowiki>