Arbeiten mit apscheduler

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
duri.rau
User
Beiträge: 12
Registriert: Sonntag 1. Mai 2016, 18:52

Hi,
Ich bin zwar Student aber Wirtschaftsingenieur und mein Projekt ist reines Hobby. :wink:

Zu meiner Frage: ich will mit meinem Programm zu bestimmten Uhrzeiten/Intervallen über I2C mein Magnetventil am Pi ansteuern (die Methode für die einzelne Ansteuerung der GPIO am I2C habe ich schon geschrieben.

Scheinbar ist apscheduler (mit Cron) für mein Vorhaben die Wahl. Nur verstehe ich die Funktionsweise nicht. So habe ich es verstanden:

Code: Alles auswählen

#import:
from apscheduler.schedulers.background import BackgroundScheduler
import time
#neue Instanz vom scheduler:
s=BackgroundScheduler
#irgendeine Funktion. Bspw. I2C schalten:
def schalten(Zustand, Adresse):
	if Zustand == 0:
		print ("Schalte " %Adresse%" aus.")
	elif Zustand == 1:
		print ("Schalte " %Adresse%" an.")	
	....
#keine Ahnung was das soll:
if __name__ == '__main__':
	#zwei Aufgabe hinzufügen die im Intervall von 2 Sekunden gestartet wird:
	s.add_job(func=schalten(1,1), ID=1, replace_existing=True, seconds=2)
	s.add_job(func=schalten(0,1), ID=2, replace_existing=True, seconds=2)
	#zwei Aufgaben die um 6 Uhr an und um 24 Uhr ausschalten
	s.add_job(func=schalten(1,2), target="crone", ID=3, replace_existing=True, hour=*6)
	s.add_job(func=schalten(1,2), target="crone", ID=3, replace_existing=True, hour=*0)
	#Scheduler Starten:
	s.start()
Ich dachte das Teil läuft jetzt bis ich es kille bis in alle Ewigkeit und übergibt an "Schalten" alle 2 Sekunden 1,0 und 0,0 und jeweils um 6 Uhr morgens und 24 Uhr abends 1,1 und 0,1...
Stattdessen bekomme ich "TypeError: add_job() missing 1 required positional argument: 'self'"

Dann habe ich überlegt ob ich das ganze wie mit multithreading mache (Klasse mit de scheduler, Konstruktoraufruf, etc. pp.) aber da komme ich auch nicht weiter.

Ich vermute ich habe ein grundlegendes Verständnisproblem. Ich hoffe mir kann jemand weiterhelfen. :/
Zuletzt geändert von duri.rau am Dienstag 3. Mai 2016, 11:29, insgesamt 1-mal geändert.
BlackJack

@duri.rau: Also erst einmal solltest Du da vom Compiler schon einen Syntaxfehler gemeldet bekommen. Das ist also nicht der Quelltext, den Du *tatsächlich* verwendest.

Und falls Du tatsächlich `s` so definierst wie es dort steht, dann wird dort kein Exemplar von `BackgroundScheduler` erzeugt, sondern Du bindest einfach nur den Namen `s` an die Klasse `BackgroundScheduler`. Du müsstest die Klasse schon *aufrufen* um ein Exemplar zu erzeugen. Das erklärt auch die Fehlermeldung.

Code: Alles auswählen

In [2]: a = int

In [3]: print a
<type 'int'>

In [4]: a = int()

In [5]: print a
0
Der Name `s` ist schlecht gewählt, und das Hauptprogramm auf Modulebene zu schreiben und dann auch noch zwischen definitionen von Funktionen zu verteilen ist ein guter Weg schwer zu durchschauenden und damit schwer wartbaren Code zu schreiben. Auf Modulebene gehören nur Definitionen von Konstanten, Funktionen, und Klassen. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst und von dem ``if __name__ == '__main__':``-Idiom aus aufgerufen wird. Letzteres sorgt dafür dass das Hauptprogramm nur ausgeführt wird wenn man das Modul als Programm ausführt, aber nicht wenn man es importiert.
duri.rau
User
Beiträge: 12
Registriert: Sonntag 1. Mai 2016, 18:52

Hi,
meine Lücken sind wohl größer als ich dachte (ich verstehe nicht alles was du geschrieben hast :lol: ).
Was ich verstanden habe:
1.) Eine Main-Klasse schreiben --> class Main(): mit Methode main()
2.) s=BackgroundScheduler --> wird zu --> schedule = BackgroundScheduler()
3.) alles ein klein wenig Strukturieren --> Klasse mit einer Sammlung von Methoden die ich im Hauptprogramm importiere

Somit arbeite ich das PyCharm Tutorial ein weiteres mal durch und mache mich nochmal an mein Programm.

Trotzdem vielen Dank für die schnelle Hilfe!
Benutzeravatar
snafu
User
Beiträge: 6737
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@duri.rau:
Nichts für ungut, aber abgesehen von deinem Punkt 2 entspricht keine deiner "Interpretationen" dem, was BlackJack geschrieben hat. Vielleicht nochmal aufmerksam seinen Beitrag durchlesen und weniger in Klassen denken.
duri.rau
User
Beiträge: 12
Registriert: Sonntag 1. Mai 2016, 18:52

@snafu
Danke, für den Hinweis. Ich schau mir das alles nochmal nach dem Tutorial an. Dann verstehe ich es hoffentlich richtig. :(
Antworten