Crontab funktioniert nicht

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Moon
User
Beiträge: 37
Registriert: Mittwoch 20. Dezember 2017, 15:21

Mittwoch 10. Januar 2018, 19:56

Hey,

ok alles klar.

Ich habe jetzt hier geschaut wie man wait_for_edge einsetzt.
Ich verstehe nicht woher channel kommt. Ist der Channel nun GPIO.input(pinNummer) oder nur die Pinnummer?

Bei diesem Code kommt nun folgene Fehlermeldung:
Traceback (most recent call last):
File "programme/ofen.py", line 23, in <module>
channel = GPIO.wait_for_edge(channel, GPIO_RISING, timeout = None)
NameError: name 'GPIO_RISING' is not defined

Wie kann es sein?

Code:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf8 -*-

import RPi.GPIO as GPIO
import time
import logging
from marrow.mailer import Message, Mailer
logging.basicConfig(level=logging.INFO)


# Benötigte Werte:
# GPIO.LOW (alles ok)
# GPIO.HIGH (fehler)

# Pin-Nummern aus dem Layout benutzen (siehe gpio.jpg)
GPIO.setmode(GPIO.BOARD) 


# input setzen auf Pin-Nummer: 7 = GPIO 4
GPIO.setup(7, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)

channel = 7
channel = GPIO.wait_for_edge(channel, GPIO_RISING, timeout = None)	

#while True:

if channel is None :
	print "Alles gut"
else:
		# Mailversand
	mail = Mailer({
		'manager.use': 'futures',
		'transport.use': 'smtp',
		'transport.host': 'smtp.gmail.com', # smtp server deines emailanbieters
		'transport.tls': 'ssl', # protokoll
		'transport.username': '', # deine email adresse
		'transport.password': '', # dein password
		'transport.max_messages_per_connection': 5
	})

	mail.start()

	#message = Message([('test', '')], [('Ich', '')], "Warnung!", plain="test")
	message = Message([('Heizungsfehlerinformation ( = Titel der E-Mail)', '')], [('Ich', '')], "Warnung! (= Betreff der E-Mail)", plain="Die Heizung im EG gibt ein Highsignal zurück. Das heißt irgendwas stimmt nicht! ( = E-Mail Text)")

	mail.send(message)
	mail.stop()

	print "Fertig"
	time.sleep(1)
		
Sirius3
User
Beiträge: 8090
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 10. Januar 2018, 20:02

@Moon: weil Du GPIO_RISING nicht definiert hast, das ist nur im Modul GPIO.
Moon
User
Beiträge: 37
Registriert: Mittwoch 20. Dezember 2017, 15:21

Mittwoch 10. Januar 2018, 20:05

Wie soll ich es denn definieren? Verstehe nicht.

Das Modul GPIO habe ich bereits auf meinem Pi installiert.
__deets__
User
Beiträge: 3078
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 10. Januar 2018, 20:08

Schau dir mal gaaaaaaanz genau an was du geschrieben hast, und wie die anderen Dinge mit GPIO aussehen....
Moon
User
Beiträge: 37
Registriert: Mittwoch 20. Dezember 2017, 15:21

Mittwoch 10. Januar 2018, 20:13

GPIO und die Optionen (Rising, Both, ..) wurden mit nem . verbunden? Meinst du das?

Wenn ich es so mache dann kommt folgende Fehlermeldung:
Traceback (most recent call last):
File "programme/ofen.py", line 23, in <module>
channel = GPIO.wait_for_edge(channel, GPIO.RISING, timeout = None)
TypeError: an integer is required
__deets__
User
Beiträge: 3078
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 10. Januar 2018, 20:29

Und welche deiner Argumente ist KEIN Integer?
Moon
User
Beiträge: 37
Registriert: Mittwoch 20. Dezember 2017, 15:21

Donnerstag 11. Januar 2018, 09:01

Ach ja. Das Timeout erwartet ein Integer. Timeout ist ja nur ein optionaler Parameter für die Funktion. Danke.

Nun habe ich es nochmal getestet und der Mailversand funktioniert. Jedoch nur wenn ich die python-file in putty mit python programme/ofen.py ausführe.

Nun kommen wir zum Punkt zurück, für welchen ich dieses Thema erstellt habe. Nämlich wie führe ich denn das Script dauerhaft im Hintergrund aus ohne es mit python programme/ofen.py zu starten. Wie bekomme ich dies denn hin?

Moon
Benutzeravatar
noisefloor
User
Beiträge: 2422
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Donnerstag 11. Januar 2018, 10:11

Hallo,

über eine systemd Service Unit. Die kann dein Skript auch bei Bedarf neu starten, falls es crasht.

Gruß, noisefloor
Moon
User
Beiträge: 37
Registriert: Mittwoch 20. Dezember 2017, 15:21

Donnerstag 11. Januar 2018, 13:07

Hey,

ok alles klar. Danke.

Habe nun nach diesem Tutorial einen service für mein Script erstellt.

Wenn ich nun aber

Code: Alles auswählen

sudo systemctl enable ofen.service
ausführe dann kommt folgende Fehlermeldung:
Failed to execute operation: Invalid argument.

Ich habe den service in folgendem Verzeichnis erstellt: /lib/systemd/system/ofen.service

Ofen.service sieht wie folgt aus:

Code: Alles auswählen

[Unit]
Description=Ofen Script Service
After=multi-user.target

[Service]
Type=idle
ExecStart=/usr/bin/python /home/pi/programme/ofen.py > /home/pi/programme/ofen.log 2>&1

[Install]
WantedBy=multi-user.targ
Und wenn ich mir den status der ofen.service ausgeben lasse kommt folgendes:

Code: Alles auswählen

sudo systemctl status ofen.service
● ofen.service - Ofen Script Service
   Loaded: loaded (/lib/systemd/system/ofen.service; disabled)
   Active: inactive (dead)

Habe mich über den Fehler informiert und wie man ihn denn beheben kann. Habe dann gelesen, dass systemd einen symlink in /etc/systemd/system/ mit dem namen xxx.target.wants erstellt. Wenn man diesen symlink löscht sollte es funktionieren.

Nun finde ich/habe ich keinen systemd ordner auf meinem pi. Kann den mit Filezille nicht finden. Wie kann ich nun den symlink löschen? Woher will ich wissen wie der symlink bei mir heißt?
Benutzeravatar
noisefloor
User
Beiträge: 2422
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Donnerstag 11. Januar 2018, 14:54

Hallo,

IMHO ist `multi-user.target`keine gütlige Direktive für `After`(macht auch wenig Sinn...) und `multi-user.targ` bei `WantedBy` gibt es nicht - da fehlt ein `et`.
Wenn man diesen symlink löscht sollte es funktionieren.
Ziemlich sicher nicht - siehe oben.

Und nimm' nicht FileZilla, dass ist für sowas nicht gemacht. Log' dich via SSH ein und mach' das auf der Kommandozeile.

Gruß, noisefloor
Moon
User
Beiträge: 37
Registriert: Mittwoch 20. Dezember 2017, 15:21

Donnerstag 11. Januar 2018, 15:55

Hey,

ok. Was ist denn eine gültige Direktive für After? Denn die bisher gefundenen Tutorials benutzen nur multi-user.target.

Nun dazu:
Habe jetzt die Servicedatei geändert. Habe ein Restart hinzugefügt mit on-abnormal. Bei install die fehlenden Buchstaben et hinzugefügt und das Anlegen eines Logs entfernt. Nun geht das aktivieren ohne Probleme. Nur wenn ich den Status überprüfe kommt, dass das Starten fehlerhaft war.

Der Marrow Mailer ist vorhanden. Habe dies schon überprüft.

Meldung:

Code: Alles auswählen

● ofen.service - Ofen Script Service
   Loaded: loaded (/lib/systemd/system/ofen.service; enabled)
   Active: failed (Result: exit-code) since Do 2018-01-11 15:53:54 CET; 1min 22s ago
  Process: 1039 ExecStart=/usr/bin/python /home/pi/programme/ofen.py (code=exited, status=1/FAILURE)
 Main PID: 1039 (code=exited, status=1/FAILURE)

Jan 11 15:53:53 raspberrypi systemd[1]: Starting Ofen Script Service...
Jan 11 15:53:53 raspberrypi systemd[1]: Started Ofen Script Service.
Jan 11 15:53:54 raspberrypi python[1039]: Traceback (most recent call last):
Jan 11 15:53:54 raspberrypi python[1039]: File "/home/pi/programme/ofen.py",...>
Jan 11 15:53:54 raspberrypi python[1039]: from marrow.mailer import Message,...r
Jan 11 15:53:54 raspberrypi python[1039]: ImportError: No module named marro...r
Jan 11 15:53:54 raspberrypi systemd[1]: ofen.service: main process exited, c...E
Jan 11 15:53:54 raspberrypi systemd[1]: Unit ofen.service entered failed state.
Hint: Some lines were ellipsized, use -l to show in full.

Nun sieht der Sevice so aus:

Code: Alles auswählen


[Unit]
Description=Ofen Script Service
After=multi-user.target

[Service]
Type=idele
ExecStart=/usr/bin/python /home/pi/programme/ofen.py
Restart=on-abnormal

[Install]
WantedBy=multi-user.target
narpfel
User
Beiträge: 213
Registriert: Freitag 20. Oktober 2017, 16:10

Donnerstag 11. Januar 2018, 16:18

@Moon: Wie aus der `systemctl`-Ausgabe ersichtlich ist, kann dein Programm das Modul `marro...` nicht finden. `marrow` scheint also nicht richtig installiert zu sein. Eventuell auch nochmal den Hint befolgen: “Hint: Some lines were ellipsized, use -l to show in full.”

Zeig’ mal die Ausgabe von `print(sys.path)`, wenn du das Programm manuell und mit systemd startest.
Benutzeravatar
noisefloor
User
Beiträge: 2422
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Donnerstag 11. Januar 2018, 16:29

Hallo,

wenn du E-Mails verschicken willst, dann macht z.B. das `network.target` oder `network-online.target`Sinn. Link: https://www.freedesktop.org/wiki/Softwa ... orkTarget/
Der Marrow Mailer ist vorhanden.
Offensichtlich nicht - sonst wäre der Fehlermeldung nicht da. Wie hast du den wo installiert?

Gruß, noisefloor
Moon
User
Beiträge: 37
Registriert: Mittwoch 20. Dezember 2017, 15:21

Donnerstag 11. Januar 2018, 17:15

Hey,

Der Marrow Mailer ist installiert und auch schon auf neustem Stand. Wenn ich ofen.py manuell mit python programme/ofen.py ausführe dann wird bei steigender Flanke auch eine Mail gesendet. Dann verstehe ich nicht warum nun gesagt wird, dass der marrow mailer nicht vorhanden ist.

Wenn ich folgenden Befehl ausführe : python -m pip install marrow.mailer
kommt folgende Meldung: Requirement already satisfied (use --upgrade to upgrade): marrow.mailer in ./.local/lib/python2.7/site-packages
Cleaning up...


@narpfel: Ja wenn ich -l hinzufüge wird aber auch nicht mehr angezeigt. Bei der ausgabe sys.path kommt die Fehlermeldung das dies nicht definiert ist:

Traceback (most recent call last):
File "programme/ofen.py", line 25, in <module>
print(sys.path)
NameError: name 'sys' is not defined

@noisefloor:

Ok. Alles klar danke für den Link. Werde ich mir durchlesen.
__deets__
User
Beiträge: 3078
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 11. Januar 2018, 17:22

Du hast den nur für deinen User, und nicht global installiert. Ich kenne die pip Funktionalität nicht, vermute aber mal du kannst das lösen indem du als Root installierst. Achte auf die ausgegebene Pfade.
Antworten