Einen Hintergrund Prozess zur Temperaturüberwachung erstellen
Posted: Fri Apr 05, 2019 8:02 pm
Hallo zusammen,
bislang stelle ich nur Fragen, ich hoffe dass ich bald auch wem ein paar Antworten geben kann
aber nun zu meinem Problem
ich versuche im Hintergrund die Temperatur mit drei farbigen LEDs zu überwachen
bzw etwas kompliziert vermutlich: Einen Taster zu überwachen.
Wie ich schon herausgefunden habe geht das wohl mit 'crontab', ist das zwar kein richtiges "Überwachen", aber für den Zweck mit den LEDs glaube ich ganz gut
-------------------------------------------------
/home/fan/fan_and_temp.py
-------------------------------------------------
-------------------------------------------------
ja am Code lässt ich sicherlich noch was verbessern (Tipps nehme ich gerne entgegen), leider ist python ebenso neu für mich wie linux Oo
als cronjob
*/1 * * * * python3 /home/fan/fan_and_temp.py
# mit loggen in syslog
#*/1 * * * * python3 /home/fan/fan_and_temp.py 2>&1 | logger -t myTemp
1. Frage: Angeblich kann man mit 'crontab' die Ausgabe nur in syslog loggen, oder gibt es da eine Möglichkeit das in eine eigene Datei umzuleiten?
Zweiter Versuch den ich im I-Net gefunden habe. Einen Prozess erstellen der auf eine Edge am GPIO wartet (eigentlich zum Shutdown gedacht).
-------------------------------------------------
/usr/local/bin/listen_for_signal.py
-------------------------------------------------
-------------------------------------------------
sudo chmod +x /usr/local/bin/listen_for_signal.py
-------------------------------------------------
/etc/init.d/listen_for_signal.sh
-------------------------------------------------
-------------------------------------------------
sudo chmod +x /etc/init.d/listen_for_signal.sh
sudo /etc/init.d/listen_for_signal start
--> bei Tastendruck gibt er mir genau einmal 'Button pressed' dann ist laut 'ps -eLf' Kommando kein Prozess mit 'listen_for_signal' mehr aktiv (vorher schon).
2. Frage: Wie bekomme ich es hin, dass der Prozess aktiv bleibt? Oder ist da ein anderer Fehler drin? Die INIT-Bewehle habe ich so übernommen und aus den Recherchen im Netz werde ich da noch nicht ganz schlau, aber ich glaube daran liegt es auch nicht.
Ps. das angepasste Skript mit LEDs geht auch aber eben nur einmal.
-------------------------------------------------
/usr/local/bin/listen_for_signal.py
-------------------------------------------------
-------------------------------------------------
bislang stelle ich nur Fragen, ich hoffe dass ich bald auch wem ein paar Antworten geben kann
aber nun zu meinem Problem
ich versuche im Hintergrund die Temperatur mit drei farbigen LEDs zu überwachen
bzw etwas kompliziert vermutlich: Einen Taster zu überwachen.
Wie ich schon herausgefunden habe geht das wohl mit 'crontab', ist das zwar kein richtiges "Überwachen", aber für den Zweck mit den LEDs glaube ich ganz gut
-------------------------------------------------
/home/fan/fan_and_temp.py
-------------------------------------------------
Code: Select all
import RPi.GPIO as GPIO
PIN_OUT_red = 23
PIN_OUT_yel = 24
PIN_OUT_green = 4
# GPIO-Nummerierung nehmen, nicht die der Pins
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(PIN_OUT_red, GPIO.OUT)
GPIO.setup(PIN_OUT_yel, GPIO.OUT)
GPIO.setup(PIN_OUT_green, GPIO.OUT)
# Temperatur auslesen
tempData = "/sys/class/thermal/thermal_zone0/temp"
dateilesen = open(tempData, "r")
temperatur = dateilesen.readline(2)
dateilesen.close()
warm = 45
heiss = 55
temperatur = int(temperatur)
if temperatur < warm:
# print ("Die CPU hat " + temperatur + " Grad (gruene LED).")
GPIO.output(PIN_OUT_red, GPIO.LOW)
GPIO.output(PIN_OUT_yel, GPIO.LOW)
GPIO.output(PIN_OUT_green, GPIO.HIGH)
if (temperatur >= warm) and (temperatur < heiss):
# print ("Die CPU hat " + temperatur + " Grad (gelbe LED).")
GPIO.output(PIN_OUT_red, GPIO.LOW)
GPIO.output(PIN_OUT_yel, GPIO.HIGH)
GPIO.output(PIN_OUT_green, GPIO.LOW)
if temperatur >= heiss:
# print ("Die CPU hat " + temperatur + " Grad (rote LED und Luefter).")
GPIO.output(PIN_OUT_red, GPIO.HIGH)
GPIO.output(PIN_OUT_yel, GPIO.LOW)
GPIO.output(PIN_OUT_green, GPIO.LOW)
# kein cleanup, die led soll ja bis zur naechtsen pruefung anbleiben
# GPIO.cleanup()
ja am Code lässt ich sicherlich noch was verbessern (Tipps nehme ich gerne entgegen), leider ist python ebenso neu für mich wie linux Oo
als cronjob
*/1 * * * * python3 /home/fan/fan_and_temp.py
# mit loggen in syslog
#*/1 * * * * python3 /home/fan/fan_and_temp.py 2>&1 | logger -t myTemp
1. Frage: Angeblich kann man mit 'crontab' die Ausgabe nur in syslog loggen, oder gibt es da eine Möglichkeit das in eine eigene Datei umzuleiten?
Zweiter Versuch den ich im I-Net gefunden habe. Einen Prozess erstellen der auf eine Edge am GPIO wartet (eigentlich zum Shutdown gedacht).
-------------------------------------------------
/usr/local/bin/listen_for_signal.py
-------------------------------------------------
Code: Select all
#!/usr/bin/env python
import RPi.GPIO as GPIO
import subprocess
PIN = 22
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.wait_for_edge(PIN, GPIO.FALLING)
# subprocess.call(['shutdown', '-h', 'now'], shell=False)
subprocess.call('echo Button pressed', shell=True)
sudo chmod +x /usr/local/bin/listen_for_signal.py
-------------------------------------------------
/etc/init.d/listen_for_signal.sh
-------------------------------------------------
Code: Select all
#! /bin/sh
### BEGIN INIT INFO
# Provides: listen_for_signal.py
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
# If you want a command to always run, put it here
# Carry out specific functions when asked to by the system
case "$1" in
start)
echo "Starting listen_for_signal.py"
/usr/local/bin/listen_for_signal.py &
;;
stop)
echo "Stopping listen_for_signal.py"
pkill -f /usr/local/bin/listen_for_signal.py
;;
*)
echo "Usage: /etc/init.d/listen_for_signal.sh {start|stop}"
exit 1
;;
esac
exit 0
sudo chmod +x /etc/init.d/listen_for_signal.sh
sudo /etc/init.d/listen_for_signal start
--> bei Tastendruck gibt er mir genau einmal 'Button pressed' dann ist laut 'ps -eLf' Kommando kein Prozess mit 'listen_for_signal' mehr aktiv (vorher schon).
2. Frage: Wie bekomme ich es hin, dass der Prozess aktiv bleibt? Oder ist da ein anderer Fehler drin? Die INIT-Bewehle habe ich so übernommen und aus den Recherchen im Netz werde ich da noch nicht ganz schlau, aber ich glaube daran liegt es auch nicht.
Ps. das angepasste Skript mit LEDs geht auch aber eben nur einmal.
-------------------------------------------------
/usr/local/bin/listen_for_signal.py
-------------------------------------------------
Code: Select all
#!/usr/bin/env python
import time
import RPi.GPIO as GPIO
PIN_IN = 22
PIN_OUT_red = 23
PIN_OUT_yel = 24
PIN_OUT_green = 4
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(PIN_IN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(PIN_OUT_red, GPIO.OUT)
GPIO.setup(PIN_OUT_yel, GPIO.OUT)
GPIO.setup(PIN_OUT_green, GPIO.OUT)
# var pushtime zum Messen der Laenge des Tastendrucks
pushtime = 0
tempData = "/sys/class/thermal/thermal_zone0/temp"
try:
# Auf Tastendruck pruefen 'GPIO.FALLING' (Pull-down Schaltkreis am GPIO 22)
GPIO.wait_for_edge(PIN_IN, GPIO.FALLING)
dateilesen = open(tempData, "r")
temperatur = dateilesen.readline(2)
dateilesen.close()
# aktuelle Temp ausgeben
print("Die CPU-Temperatur betraegt " + temperatur + " Grad.")
start = time.time()
time.sleep(0.2)
warm = 45
heiss = 55
temperatur = int(temperatur)
# unter einer Temp von 'warm' gruene LED an alle anderen aus (einschliesslich luefter)
if temperatur < warm:
GPIO.output(PIN_OUT_red, GPIO.LOW)
GPIO.output(PIN_OUT_yel, GPIO.LOW)
GPIO.output(PIN_OUT_green, GPIO.HIGH)
# ab einer Temp von 'warm' gelbe LED an (gruen aus bei steigend, rot bleibt an bei fallender Temp)
if (temperatur >= warm) and (temperatur < heiss):
GPIO.output(PIN_OUT_yel, GPIO.HIGH)
GPIO.output(PIN_OUT_green, GPIO.LOW)
# ab einer Temp von 'heiss' rote LED an alle anderen aus (Luefter an)
if temperatur >= heiss:
GPIO.output(PIN_OUT_red, GPIO.HIGH)
GPIO.output(PIN_OUT_yel, GPIO.LOW)
GPIO.output(PIN_OUT_green, GPIO.LOW)
# Schleife beim gedrueckthalten des Tasters, um die dauer zu ermitteln
while GPIO.input(PIN_IN) == GPIO.LOW:
pushtime = time.time() - start
# print(pushtime)
time.sleep(0.02)
if pushtime >=5:
break
pushtime = time.time() - start
# print(pushtime)
if pushtime >= 5:
print("Tastendruck fuer 5 Sekunden, Luefter wird ausgeschaltet.")
GPIO.output(PIN_OUT_red, GPIO.LOW)
elif pushtime >= 1:
print("Tastendruck fuer min. 1 Sekunde, Luefter wird eingeschaltet.")
GPIO.output(PIN_OUT_red, GPIO.HIGH)
# Temp-Ausgabe nur bei kurzem Tastendruck
# else:
# print("Die CPU-Temperatur betraegt " + temperatur + " Grad.")
except KeyboardInterrupt:
print("Abbruch")
GPIO.cleanup()