Uruchamianie skryptu pythona w screen – na przykładzie sterowania wentylatorem w RPI4

Jakiś czas temu na swojej malince nr 4 zamontowałem obudowę z wentylatorem – wentylator jest na 3piny, więc jest możliwość sterowania jego obrotami. Napisałem więc mały skrypt (zmodyfikowałem to co znalazłem w internecie – niestety źródła już nie potrafię znaleźć) który to steruje obrotami tego wentylatora na podstawie temperatury procka. Wszystko działa pięknie, tylko gdy uruchomię ponownie malinkę to ręcznie muszę uruchamiać ten skrypt. Wpadłem więc na pomysł aby uruchamiać go w „wirtualnej konsoli” czyli w aplikacji screen (mała aplikacja, która umożliwia utworzenie wielu sesji konsoli). A dlaczego tak? – bo program wypluwa informację dot temp i obrotów wentylatora, a tworząc usługę nie miałbym takie łatwego dostępu do tych danych.

Skrypt sterujący wentylatorem

Poniżej przedstawiam skrypt do sterowania wentylatorem (niestety nie pamiętam źródła tego skryptu więc podam tylko jego część). Wentylator zasilany jest napięciem 5VDC

#!/usr/bin/python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time
import subprocess

# Configuration
FAN_PIN = 14  # BCM pin used to drive transistor's base
WAIT_TIME = 1  # [s] Time to wait between each refresh
FAN_MIN = 25  # [%] Fan minimum speed.
PWM_FREQ = 50  # [Hz] Change this value if fan has strange behavior

# Configurable temperature and fan speed steps
tempSteps = [40, 70]  # [°C]
speedSteps = [0, 100]  # [%]

# Fan speed will change only of the difference of temperature is higher than hysteresis
hyst = 1

# Setup GPIO pin
GPIO.setmode(GPIO.BCM)
GPIO.setup(FAN_PIN, GPIO.OUT, initial=GPIO.LOW)
fan = GPIO.PWM(FAN_PIN, PWM_FREQ)
fan.start(0)

i = 0
cpuTemp = 0
fanSpeed = 0
cpuTempOld = 0
fanSpeedOld = 0

def PrintTemp():
    print('CPU temperature is')
    time.sleep(5)

# We must set a speed value for each temperature step
if len(speedSteps) != len(tempSteps):
    print("Numbers of temp steps and speed steps are different")
    exit(0)

print('Start')

Uruchomienie usługi dla screen

Tworzymy usługę fan_start.service w katalogu systemd/system/ poprzez otwarcie go w edytorze a następnie zapisaniu.

sudo nano /etc/systemd/system/fan.service

W usłudze tej wpisujemy następujący kod powodujący uruchomienie skryptu bash.

[Unit]
Description=Test Screen Creation
After=network.target

[Service]
Environment="PYTHONPATH=/home/daniel/skrypty" #gdzie znajduje się nasz skrypt
Environment="OTHER_VAR=value"
User=daniel #użytkownik który to uruchamia
WorkingDirectory=/home/daniel/skrypty #ścieżka do naszych skryptów
ExecStart=/usr/bin/screen -dmS wentylator python3 /home/daniel/skrypty/fan_ctrl.py #nasz skrypt
Type=forking
RemainAfterExit=yes
Environment=TERM=xterm

[Install]
WantedBy=multi-user.target

Usługa ta uruchamia powoduje utworzenie wirtualnej konsoli i uruchomienie w niej naszego programu.

Aby sprawdzić działanie skryptu w pierwszej kolejności aktywujemy naszą usługę a następnie sprawdzamy status tej usługi. Czasem dobrze jest zresetować naszą malinkę.

sudo systemctl enable fan.service
sudo systemctl start fan.service
sudo systemctl status fan.service