Posts by tdl

    Entschuldigung, aber warum ist das Unsinn?

    Er möchte doch die Position des Balles feststellen und nicht simulieren.


    Ich versuche einen normalen Tischkicker so umzubauen, dass die eine seite selbstständig spielt, also von Motoren gesteuert wird. Um das zu schaffen muss ich ja den Ball tracken und zu jeder zeit wissen wo er sich befindet.

    Ich denke hier möchte jemand in erster Linie einen Tischkicker so umbauen, dass, wie es auch im Post steht, eine Seite selbstständig spielt. Daraus resultierte die Erkenntnis wohl den Ball tracken zu müssen. Nirgends steht, dass das Ziel des Projekts das Tracken des Balles selber sei.

    Deshalb der Vorschlag den Ball zu simulieren statt ihn zu verfolgen. Das dürfte das Ziel "alleine gegen den Computer Tischfußball spielen" ebenso erreichbar machen und wird auch nicht die Welt kosten, was ich bei so manch anderen Vorschlag doch stark bezweifel.

    Simuliere den Ball.


    Von unten mit einem Laser und Ablenkspiegeln. Dann fällt quasi auch die Reaktionszeit für die gesteuerten Spieler weg (die wirst du dann eher reinrechnen müssen um überhaupt noch eine Chance gegen die Maschine zu haben). :) Und bei den manuellen Spielern ein "Force Feedback" wie bei guten Lenkrädern, dann "spürst" du auch den Ball.

    Vielen Dank! Das Tutorial ist schon paar Jahre alt, den Autor habe ich schon vor einer Woche angeschrieben und leider bisher keine Antwort bekommen

    Beachte bei der Suche nach Tutorials mal das Datum der Ergebnisse und suche dir die neueren Ergebnisse raus. Das soll jetzt keine Wertung deiner Fremdsprachenkenntnisse sein, aber schränke die Suche nicht in der Sprache ein. So schwer ist es gar nicht, auch mit geringen Englischkenntnissen eine Schritt für Schritt Anleitung auf englisch abzuarbeiten.

    Noch ein Tipp: Suche mal nach "balena access point" Da gibt es ein OS für den Pi (in der Anleitung ein 3er) extra für den Einsatz als Accesspoint.

    `Path`-Objekte haben eine `write_text()`-Methode (ungetestet):

    Da war Dennis89 leicht schneller. :) Ich hatte nicht weit genug nach unten gescrollt oder es glatt überlesen auf der Seite. Das ist tatsächlich um Längen einfacher. Hab ich übernommen, die Funktion "log_schreiben" gestrichen und stattdessen eine Funktion "weckzeit_löschen" geschrieben.

    Code
    def weckzeit_löschen():
        LOG_DATEI.write_text("Wecker ist aus!")
        print ("\nWeckzeiten werden gelöscht!")
        run([SNIPER], check = True)


    Das mit dem ``x in range(a, b)``

    The advantage of the range type over a regular list or tuple is that a range object will always take the same (small) amount of memory, no matter the size of the range it represents (as it only stores the start, stop and step values, calculating individual items and subranges as needed).

    Ich lese da raus, dass mitnichten "60 Vergleiche" gemacht werden, sondern nur der Start und Stopwert genommen werden. Ich gleiche ja auch nicht ab ob "minute" im Bereich 0-60 enthalten ist sondern ob sie außerhalb dieses Bereichs liegt (if not). Und da scheint range in diesem Fall nichts anderes als eine klein, größer, gleich Abfrage zu machen.

    Nichts desto trotz habe ich auch diese Zeile geändert. ;)



    Das mit dieser Funktion definitiv was nicht stimmt, sieht man wie eingangs erwähnt schon am Namen, weil man da Probleme hat einen guten Namen zu finden der beschreibt was die Funktion tut, ohne das man da einen ganzen Roman als Namen hat.

    Ich hab die Funktion jetzt probeweise WIEDER in aufgeteilt, um dann in der main() diese beiden Fuktionen direkt nacheinander auszuführen.

    Gefällt mir nicht! Werde ich wieder rückgängig machen. Ich bin auch nach wie vor der Meinung, dass du dich da zu sehr am Namen störst.

    Vielleicht sollte ich sie wirklich in "arg-check()", "einganscheck()" oder vielleicht auch "hakan_check()" umbenennen. :lol:

    gegnüber:

    Und wenn du schreibst "..Was die Funktion macht habe ich schon verstanden..." verstehe ich deine Kritik am Namen nicht. "mein_name_tut_nichts_zur_sache()", bei diesem Namen OK, aber nicht bei den vorherigen nur weil du persönlich einen anderen Namen wählen würdest oder meine Namenswahl nicht nachvollziehen kannst.

    Kritik ist angekommen, ich sehe es anders. Wenn du das als "aufstampfen" bezeichnen möchtest, steht dir das frei.

    Auch der Satz: "...bis keiner mehr Lust hat auf die Fragen zu antworten wenn Du gar nichts lernen willst....". Wenn es dich stört, wenn nicht jeder deiner Vorschläge auch umgesetzt wird, tut es mir leid, aber so ist das Leben. Ich hab doch auch vieles von dir angenommen (str bei strftime weg, Path.write_text, exit() entfernt, while True entfernt, am Ende sogar range durch <=> ersetzt, gegenüber "ich lass die Funktion in einem").


    Danke

    für deine Hilfe


    Thorsten

    Der Funktionsame ist ja quasi richtig aber der sollte halt nicht sein, weil der Inhalt der Funktion nicht so sein sollte. Funktionen sollten möglichst einen Job erledigen und einzeln testbar sein.

    Die Funktion hat die Aufgabe die übergebenen Argumente zu prüfen. Was aber bringt eine Prüfung wenn nicht auf das Prüfergebnis reagiert wird je nachdem wie es ausfällt? Die Funktion hat also bereits an dieser Stelle zwei Jobs: Prüfen und Reagieren.

    Jetzt gibt es verschiedene Möglichkeiten der Eingabe und auch der Falscheingabe. Deshalb wird die Prüfung aufgeteilt. Hier durch die If Abfrage.

    Als erstes wird geprüft ob das 1. Argument vielleicht genau eine "99" ist. 99 Ist die vorgesehene Eingabe um den Wecker auszustellen, die Weckzeit zu löschen. Was dann auch geschieht. Danach wird das Programm beendet. Wie ich weiter oben schon schrieb, gibt es ja in diesem Fall auch keinen Grund für das Programm weiter zu laufen. Prüfung >> direkte Reaktion auf Ergebnis der Prüfung.

    Als nächstes kommt das elif. Hier wird geprüft ob Argument 1 + 2 im jeweils richtigen Bereich liegen. Tun sie das nicht, Wird der entsprechende Hinweis gegeben wie die Eingabe zu erfolgen hat und in welchen Bereichen sich die Eingaben befinden müssen.

    Haben die Argumente diese Prüfungen überstanden gehts weiter im Programm. Aber halt. was wenn jemand gar nichts eingibt oder es gar mit Buchstaben versucht? Dan greifen die Ausnahmeregelungen aus dem except. Weisen darauf hin, dass nur Ziffern akzeptiert werden und beendet das Programm.

    Natürlich kann man daraus 2 Funktionen machen. Man kann auch die Stunden und Minuten in einer jeweils getrennten Funktion überprüfen. Und dann kommt der nächste und sagt, dass man das aber auch alles in einer Funktion zusammenfassen kann. Viele Wege führen zum Ziel. Ob nun Weg a oder Weg b der "bessere" oder "schönere" ist sei da mal dahin gestellt.


    Das erste exit() konnte übrigens tatsächlich weg, die beiden anderen müssen aber bleiben. Die haben einen Sinn. Sie unterdrücken die Fehlermeldungen des Systems und geben ausschließlich den von mir für den jeweiligen Fall vorgesehenen Text aus.


    Beim Range verstehe ich was du meinst, aber da wir hier nicht von Listen mit 1,8 Millionen Einträgen reden sonder 24 bzw 60 sind diese Bedenken m. E. vernachlässigbar. Auch hier: Änder ich es (wieder zurück, das hatte ich ja schon mal) kommt der nächste und meint "Ich mach das aber anders..." Zusätzlich werden die Eingaben auch noch auf der Webseite auf Richtigkeit geprüft, <input type="number">


    Zu der Sache mit dem Path hast du jetzt zwei mal vage Andeutungen gemacht, dann mach aber auch mal "Butter bei die Fische".


    Thema Sniper: Ich glaube dem Programm ist es egal ob es jetzt von einem Python Script oder einem professionellen Bashkiller abgeschossen wird.

    Das Bashscript "sniper" habe ich auch für andere Sachen im Einsatz. Es hat sich bewährt und ist doch völlig ausreichend. Nur des guten Geschmacks wegen werd ich da jetzt nichts neues schreiben.


    Eine gute Nacht, ich mach jetzt Schluss


    Thorsten

    Man sieht am Funktionsnamen `args_checken_loeschen_plausi()` eigentlich schon das diese Funktion zu viel macht.

    Über Namensgebung lässt sich streiten, man könnte sie auch einfach "eingaben_pruefen()" nennen. Ob sie zu viel macht? In einer früheren Version sah es so aus (Beitrag #22). Da ist nicht mehr viel von der "plausi_check()" übriggeblieben. Und da beide Funktionen letzlich die Argumente überprüfen, was lag da näher, als sie zusammenzulegen. Die Reihenfolge ist zwingend. Die "exits" sind notwendig und Bestandteil des korrekten Programmablaufs (Beitrag #28).

    Die ``while``-Schleife macht keinen Sinn, weil die *immer* mindestens einmal durchlaufen wird und *immer* ersten Durchlauf abgebrochen wird. Damit ist das keine Schleife.

    Ich gehe mal davon aus, dass du mit "die 'while'_Schleife die erste von beiden meinst. Hab ich eben probiert stimmt, die ist jetzt weg. Danke.

    Ein ``x in range(a, b)``-Test ist ungewöhnlich bis falsch. Da muss man hoffen, dass der Wertebereich recht klein ist,

    Ungewöhnlich kann ich nicht beurteilen, aber für falsch funktioniert es einfach zu gut ;) . Auch muss man da nichts hoffen, der Wertebereich ist doch klar definiert und steht im Code. Ehrlich gesagt finde ich das sogar eleganter als mit kleiner, größer, gleich Abfrage.

    `log_schreiben()` geht kürzer — `Path`-Objekte haben da eine passende Methode.

    Wenn du auf Path.open() anspielst, dann ist es tatsächlich kürzer. Um ein Zeichen. Falls du was anderes gemeint hast: Entschuldige bitte meinen Sarkasmus :)

    Code
    def log_schreiben(logtext):
        with LOG_DATEI.open("w", encoding="ascii") as datei:
        with open(LOG_DATEI, "w", encoding="ascii") as datei:
            datei.write(logtext)


    Was macht das Sniper-Skript eigentlich? Doch nicht etwa *dieses* Programm abschiessen‽ Das könnte sich ja einfach selbst beenden.

    Mit Verweis auf Beitrag #17. Doch genau das macht sniper. Wie im echten Leben. Peng und weg! Wie beendest du denn einen Prozess? In der Regel wird der Wecker ja auch nicht in der Konsole gestartet sondern über ein Webinterface gestellt und wieder ausgeschaltet. da läuft eine Instanz des Programms in einer Endlosschleife im Hintergrund. Wie soll ich der denn sonst sagen dass sie sich beenden soll?


    Danke für deine Anregungen. Aber das Programm läuft fehlerfrei und macht genau das was es machen soll.

    *In* einer f-Zeichenkette braucht man kein `strftime()` aufrufen, da kann man die Formatierung direkt über die Platzhaltersyntax regeln:

    Danke für den Hinweis, habs direkt umgeschrieben.

    Das kann man anders regeln als mehrfach die Funktion print() aufzurufen. ;)


    Z.B. so:
    Code print(f"{FEHLER}\nWert für Stunden : 0-23" \ "Wert für Minute : 0-59" \ "\nWecker ausstellen: ./wecken.py 99\n")

    Mann könnte der Übersicht wegen auch nach der öffnenden und vor der schließenden runden Klammer in eine neue Zeile gehen.

    Das ist praktisch. Danke. Ich hab da grad mal mit rumgespielt, man bräuchte dann auch nicht mehr entsprechend einrücken. Aber dann wird unübersichtlich.

    dann geht es nicht? Das würde mich schwer wundern oder wir haben aneinander vorbei geredet.


    Zum Vergleich nochmal dein Original, damit du weist was ich gemeint habe:

    Nein, haben wir nicht, ich hab schlampig getestet. Ich hatte es nur aus der Funktion unten entfernt. Ok, funktioniert auch ohne, wenn ich es aus beiden Funktionen rausnehme.

    'weckzeit_in_log_schreiben' auch das Argument 'weckzeit', dass gar nicht benutzt wird.

    Kam mir auch komisch vor, aber es wird tatsächlich benötigt, da "weckzeit" im "logtext" verwendet wird.

    Wenn du aus der Dauerschleife ausbrechen willst ist die gängige Methode 'break' anstatt 'exit()' zu verwenden. Wenn du im 'else'-Zweig 'True' zurück gibst, benötigst du kein 'break' mehr, die Dauerschleife wird auch verlassen.

    Auch die exits sind so richtig, ich möchte dort ja nicht einfach nur aus der Schleife raus, sondern wirklich das Programm an dieser Stelle komplett verlassen. Habs mit break versucht. Das hat, soweit ich das überblicke zur Folge, dass ich zwar aus der Schleife raus bin aber das Programm versucht mit den fehlerhaften Werten weiter zu machen, was dann wieder Fehlermeldungen nach sich zieht. In der Funktion plausi_check(). und auch in der Funktion check_args_auf_loeschen() macht es ja keinen Sinn, wenn das Programm weitermacht, mit was auch?


    plausi_check() konnte ich mittlerweile dank range() um einiges kürzen:

    Ja, auch die Printzeilen könnte man in einer zusammenführen, ich hasse es aber horizontal scrollen zu müssen :daumendreh2:

    Auch wenn du das so angibst, wie ich es vorgeschlagen habe?

    Auch guten Morgen,


    ja, so klappt es. aus den Docs lese ich aber eher, dass man das macht wenn mehrere Element zusammengefasst werden. Mein Pfad sieht aber nicht nach mehreren Elementen aus, keine Leerzeichen, keine Kommas. Der Punkt vor der Dateiendung kann es auch nicht sein, bei *txt geht es ja problemlos ohne eckige Klammern. Aber nach dem was ich gelesen habe, was das alles kann, bin ich ja mal gespannt ob ich je auf den Stand kommen werde es auch zu brauchen :lol:


    Ich würde einfach Mal das schedule-Module einwerfen.

    Der Einwurf ist klasse! Hättest du den nicht bereits vor einer Woche machen können? :)

    Und gleich auch gelernt, das schedule mit sch am Anfang geschrieben wird. Das werd' ich in der nächsten Version bestimmt einbauen.

    Ich hab jetzt nichts dazu gefunden, aber geht damit auch so was wie "schedule.von-mai-bis-august"?


    Thorsten

    Du siehst, erst durch 'check=True' wird Python gemeldet, dass mit dem 'run'-Befehl etwas nicht stimmt und erst jetzt kann man im Programm darauf reagieren. Anders würde das Programm durch laufen, als sei der 'run'-Befehl erfolgreich ausgeführt worden. (Also je nach dem was da so gemacht wird).

    Guten Abend, so wird da ein Schuh draus. In deinem Beispielcode aus dem anderen Beitrag stand dieser Ausschnitt;

    Code
    def check_input():
        if argv[1] == '99':
            print('gelöscht')
        else:
            return True
    
    
    def main():
        if check_input():

    und schreibst weiter unten:

    Quote


    Um den Erfolg des Befehls zu registrieren, dazu ist auch das 'check=True' da. Funktioniert etwas nicht, dann wird eine Ausnahmebehandlung ausgeführt und man kann entsprechend reagieren.

    im Code steht das mit dem "check-True" so nicht drin. Und dann beginnt deine main() mit if check_input():. Das hab ich nicht verstanden und mir zusammengereimt "Wenn Check_input ein True zurückgibt, dann.. :". Aber eine Ausgabe hab ich nicht bemerkt. Jetzt mit deinem Beispielen mit und ohne ergibt das mehr Sinn. Hab ich verstanden, ich denke aber, ich werde es hier aber nicht einsetzen. Auch aus Gründen im nächsten Absatz.


    Dann meintest du das mit dem String vor dem Path ist unnötig. Muss ich widersprechen, im Code gleich mehr. Ich hab Path zuerst ohne str und beim zweiten mal mit ausgeführt. Was man bei der 2. Ausführung auch schön sehen kann: Ich bekomme eine Meldung von Sniper, dass er erfolgreich war und auch vom System, dass der Prozess terminiert wurde. Das reicht mir dann an Meldungen, zumal ich sie im Hauptbedienelement, der Webseite, sowieso nicht zu sehen bekomme.

    Anscheinend hat subprocess Probleme mit pathlib.Path. Man findet mehrere Beiträge im Netz dazu. Die Lösung mit dem String hab ich dann hier gefunden.


    Bei der Funktion "plausi_check()" bin ich auch noch nicht am Ende, aber doch erst mal happy, dass sie tatsächlich funktioniert. Das verfeinern, vereinfachen bis hin zum komplett umschreiben kommt garantiert.


    P.S wenn ich mich unklar ausgedrückt habe, einfach sagen.

    Nö, nur manchmal ist die Materie an sich "unklar". Mir zumindest. Da brauch ich dann noch Schubser aus anderen Richtungen zu gleichen Thema, dann fällt ja meist der Groschen. Und ich lerne ständig dazu. Python ist meine erste "Hochsprache" in die ich tatsächlich reinkomme. Ich habs mal mit C/C++ versucht, da kam ich aber irgendwie gleich am Anfang schon nicht weiter. Und mit "Atari-Basic" aus den 80ern kommt man ja heute auch nicht mehr weiter :lol:


    Dann sag ich dir - und natürlich auch allen anderen Beteiligten hier im Thread - mal Dankeschön für diese ganze Arbeit mit mir! :danke_ATDE:


    Bis zum nächsten Problem

    Viele Grüße


    Thorsten

    schaue dir doch so Sachen nochmals an und vergleiche das mit deinem jetzigen Code.

    Du kannst dir auch mal Schritt für Schritt anschauen, wie du die Abfrage nach der richtigen Eingabe gemacht hast und wie das bei mir abläuft.

    Das mit Zeile 14 und den doppelten Klammern war mir auch noch aufgefallen und ich hatte sie entfernt. Hat sich mit deiner Antwort überschnitten.

    Ich hab jetzt lang getüftelt und auch die Ausnahmeregelungen geschafft.

    Das mit der zeitwert.minute funktioniert so leider nicht, da er dann nur die Minute nimmt und die Stunde außer acht lässt. Soll heißen bei einer angenommenen Weckzeit von 08:30 weckt auch um 09:30, um 10:30, ... , was nicht so optimal ist. :sleepy: Ich hab es aber dann trotzdem mit strftime() auf Minuten formatiert (Was die Wartezeit beim testen enorm verkürzte).


    Hab (ich hoffe mal) alle Varianten von Falscheingaben probiert und es klappt soweit. Sie werden alle abgefangen und kommentiert, bis hin zum Userabruch durch STRG+C, da werden dann sogar die Weckzeiten in der weckzeit.txt wieder gelöscht.


    Hier jetzt also mein überarbeiteter Code der diesmal hoffentlich weniger Kritikpunkte aufzuweisen hat.

    vg


    Thorsten

    Wenn ich deinen Code jetzt mit meinen Verbesserungsvorschlägen ändere, dann kommt wieder so ein ähnlicher raus, wie ich schonmal geschrieben habe, von dem her habe ich darauf verzichtet und setze den Link dazu nochmal rein. Du kannst deinen Code, meinen Code und meine Kommentare noch mal vergleichen, falls etwas nicht klar ist.

    Keine Musterlösung, sondern nur mein Vorschlag:

    Danke für die vielen Kritikpunkte.

    Mit der Übergabe von Argumenten habe ich tatsächlich noch arge Probleme. Deshalb auch der sich wiederholende Code, sonst hatte immer wieder was gemeckert "xy is not defined". Und dann hab ich mich einfach in dieser (falschen) Arbeitsweise verstrickt und war froh es irgendwie hingefrickelt bekommen zu haben. Trugschluss. Außerdem lief es dann doch nicht richtig habe ich bemerkt. Fazit: Weg damit, nochmal machen.


    Heute habe ich es noch einmal neu geschrieben. Diesmal wirklich Funktion für Funktion einzeln und immer wieder zwischengetestet.

    Variablen-, Pfad- und Funktionsnamen habe ich aussagekräftiger gestaltet (hoffe ich).

    Die Write Geschichte habe ich, dank deiner tollen Erklärung oben zum Argumente übergeben, jetzt tatsächlich so hinbekommen dass sie nicht jedesmal meckert "es wäre kein text definiert, welchen ich jetzt logtext genannt habe.

    Das mit der "Minutenabfrage" hab ich erst mal hinten angestellt. Da muss ich doch dann nur bei uhrzeit das :&S entfernen und die weckzeit genauso formatieren?


    Es wird empfohlen dem subprocess-Aufruf immer die check-Option mitzugeben. Wenn das fehlt gibt subprocess immer ein erfolgreich ausgeführter Befehl zurück, auch wenn dieser an sich nicht erfolgreich war. Das kann zu Problemen bei der Fehlerbehandlung/Ausnahmebedingungen führen.

    Das hab ich noch nicht verstanden. Wie es gemacht wird, was die Rückgaben bedeuten und was ich damit anfangen kann. Also eigentlich alles an der Sache :)

    Der Wecker wird ja eigentlich auch nur über die Web-Oberfläche bedient, und die lässt gar keine Falscheinggaben zu. Die können ja nur über die Konsole gemacht werden. Aber schön wäre es schon, wenn Falscheingaben trotzdem abgefangen würden. Deshalb habe ich die Funktion "plausi_check()" geschrieben, welche allerdings nicht funktionieren will. Da bekomme ich Syntaxfehler bei denen ich noch nicht verstehe warum. So wie die Funktion (ohne Auskommentierung) da steht ist es das "exit()" in dem "if"-Bereich. Kommentiere ich das aus ist es das "elif". Ich bin noch nicht dahintergestiegen was ich den nun schon wieder bei so einer einfachen Abfrage falsch gemacht habe, aber das kommt bestimmt noch.


    vg

    Thorsten


    Und hier das (vorläufige) Ergebnis: Besser so?

    Nachtrag: Zeile 14 entfernt und in Zeile 52 + 66 die doppelten Klammen rausgenommen.

    Also zeig es mal bitte!

    Muss als sudo ausgeführt werden sonst killt es nicht. Und wenn ich hier direkt ein sudo vor das kill setze funktioniert das zwar in der Konsole mit pi, aber der www-data darf es nicht.

    Boah und eben grad sehe ich das "basename" im Code. War das der Grund für die Fehlermeldung meiner Eingangsfrage? Würde mich jetzt schon interessieren: Muss ich beim verwenden einer main() Funktion zwangsweise eine Dateiendung haben oder hatte kam diese Basename-Meldung gar nicht von dem Python-Script sondern von sniper weil der Dateiname in SCRIPT nicht passte?

    :wallbash: Man, das Problem hatte ich schon mal mit sniper , war wohl so blockiert, dass ich es vergessen hatte. Die Lösung liegt darin auch für die neue sniper3 einen Eintrag mit sudo visudo zu erstellen: www-data ALL=NOPASSWD:/home/pi/wecker/sniper3.sh


    Als ich eben auf das Stichwort sudo visudo im Netz traf fiel es mir direkt wieder ein.

    Zeig mal die /home/pi/wecker/sniper.sh! Vielleicht gibt es dort einen Ansatzpunkt.

    Sorry Hyle, hab deinen Beitrag erst jetzt gesehen.

    Problem gelöst. Willst du sie noch sehen?


    Dennis89 Danke für die Vorlage. Was hälst du davon wie ich es umgesetzt habe, also so fürs erste? Jetzt hab ich die Logik hinter dieser main() Geschichte endlich geblickt.


    llutz Auch dir Danke, das Problem lag aber tatsächlich nur an der fehlenden Dateiendung.

    und was ist wenn du ./wecken3.py 99 nimmst?

    Vorhin hatte ich das script einfach nur mit .py Endung kopiert und das alte gelöscht.

    jetzt habe ich alles was eine "3" im Namen hat gelöscht, den Pi neugestartet, der Übersicht halber ein "test.py" im Ordner ~/wecker erstellt und ausführbar gemacht.

    Der Basename Fehler ist jetzt weg. Hat mir ja keine Ruhe gelassen und ich hatte weiter gegoogelt bis ich schließlich auf den debian-manpages was gefunden hatte. Jetzt hab ich verstanden warum du das mit der Endung vorgeschlagen hattest. Ich gehe also davon aus, dass beim Kopieren einer Datei auch irgendwelche "Zusätze" mit kopiert werden wie z. B. "ist ausführbar" und es deshalb bei der Fehlermeldung geblieben war.


    *Pause, rumfrickel*


    So, mein Script funktioniert soweit tatsächlich. Es heißt jetzt offiziell erstmal wieder "wecken3.py"

    Die Sniperdatei musste ich entsprechend angleichen. Ich hab jetzt erst mal eine sniper3.sh damit mir da nichts durcheinander kommt.

    Aus der Konsole klappt es soweit.


    Die php Seite entsprechend umgeschrieben, sie verweist jetzt auf beide "3er" Dateien.

    Weckzeit setzen mit der php Seite klappt.


    Löschen nicht. Die sniper3.sh wird definitiv gestartet wenn ich auf den Button klicke, aber sie löscht nicht. Das geht nur aus der Konsole heraus.


    Wenn ich alles wieder auf die alte wecken ohne Ziffer zurücksetze und die alte sniper.sh nehme funktioniert das Löschen. Allerdings nicht für Zeiten die mit wecken3.py erstellt wurden.

    grep -r wecken3 /home/pi/{schalten,wecken}/*

    wolltest du evtl. das hier?

    Code
    pi@schaltpi:~ $ ls  -r ~/
    wecker  schalten  afterboot.py
    pi@schaltpi:~ $ ls  -r ~/wecker
    weckzeit.txt  wecken3.py  wecken2  wecken  sniper.sh  README.txt  codesend
    pi@schaltpi:~ $ ls  -r ~/schalten
    winterled.py  sniffer  README  lichtwecker.sh  codesend

    grep -r wecken3 /home/pi/{schalten,wecken}/*

    Das Verzeichnis wiederum heisst wecker nicht wecken. ;) Ich habe es mit verschiedenen Schreibweisen je aus ~/wecker und ~/  heraus. Alles ohne Ausgabe:

    wecken3 != wecken, welches ist nun was bei dir?

    Nein ist es nicht

    "wecken" läuft ja eigentlich problemlos, soweit war ich ja schon. Dann wollte ich das alles so umschreiben, dass es mit einer main() Funktion läuft; das ist wecken3 bzw. jetzt wecken3.py.

    Die komplette Vorgeschichte von "wecken" findest du unter dem Link im ersten Beitrag hier.

    Ich hätte "wecken3(.py)" jetzt auch "testwecken" oder "Kurt-Friedrich.py" nennen können, aber Ziffern hinter dem Namen fand ich übersichtlicher. :lol: