Page 1 of 1

Einen Hintergrund Prozess zur Temperaturüberwachung erstellen

Posted: Fri Apr 05, 2019 8:02 pm
by xellos_000
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
-------------------------------------------------

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()
-------------------------------------------------

Re: Einen Hintergrund Prozess zur Temperaturüberwachung erstellen

Posted: Sat Apr 06, 2019 7:27 am
by smartifahrer
Zu 1.: Mit Phyton kannst du selbst beliebige Dateien erstellen und bearbeiten. Stichwort Datei-Funktionen
https://www.python-kurs.eu/dateien.php
https://py-tutorial-de.readthedocs.io/d ... on-dateien

Zu 2.: Pack den Code in eine While-Schleife wie beim Taster.

Re: Einen Hintergrund Prozess zur Temperaturüberwachung erstellen

Posted: Sat Apr 06, 2019 2:37 pm
by xellos_000
Danke für die links! Die Antwort hatte mir aber schon geholfen. Ich habe nicht darüber nachgedacht, dass ich ja such statt der 'print' Ausgabe eine Ausgabe in eine Datei im pythonskript machen kann - war schon etwas spät in der Nacht.

und die while Schleife nach dem 'try:', oder?

Code: Select all

try:
  while 1:
                # 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)
                ...
Habe ich auch schon probiert und funktioniert! Der Prozess ist aktiv und der Taster tut was er soll.

nur ne Frage dazu .. so läuft ja jetzt im Hintergrund die ganze Zeit eine while-Schleife! Ich bin mir nicht sicher ob oder wie dass das System belastet xD, aber so wie ich das sehe hängt(wenn man das so sagen kann) die while-Schleife ja bei GPIO.wait_for_edge. Sonst hätte ich ja nen permanenten print output, oder?

Funktioniert aber. Danke dir nochmal