Posts by noisefloor

    Hallo,

    rc.local mag alt sein, aber total veraltet ist es nicht. Es tut schnell und zuverlässig das, wofür es gemacht wurde,

    Das ist schlichtweg falsch. Spätestens mit systemd ist rc.local obsolet und veraltet. rc.local wird bei den meisten Distros noch von systemd ausgewertet und on the fly in Units umgewandelt. D.h. systemd entscheidet alleine, wann wie wo das ausgeführt wird, nicht der Nutzer. Kann klappen, muss aber nicht.
    Mit einer systemd Service Unit ist man in jeder Hinsicht flexibler.


    Auch wenn ist old-school Linuxer gerne krampfhaft an der Vergangenheit festhalten - rc.local ist eine von den Sachen, die wirklich komplett zukunftslos sind.


    Gruß, noisefloor

    Hallo,


    keine Ahnung, woran das liegt. Wie gesagt kann ich das Problem bei mir auch nicht nachstellen, weil bei mir alles dahin installiert wird, wo es hin installiert werden soll.


    Zum Virtual Environment: https://wiki.ubuntuusers.de/venv/. Ist auf Raspbian und andere Distros übertragbar. Ggf. muss nur der Name des zu installierenden Pakets angepasst werden. Funktioniert übrigens auch unter Windows. Wenn man dort Python über das Microsoft Store oder manuell installiert ist das venv Modul schon dabei. Nur der Befehl zum Aktivieren des venv ist unter Windows etwas anders.


    Gruß, noisefloor

    Hallo,


    was ist denn ein "Raspbery Pi Micro W"? Das Modell gibt es IMHO nicht... Meinst du den Pi Zero W oder einen Pico W?


    Unabhängig davon: kommt drauf an. Eine DB hat den Vorteil, dass du Daten i.d.R. beliebig selektieren und aggregieren kannst. Dann du das nie brauchst kannst du die Daten auch linear in eine Datei schreiben.


    Wenn du Daten nicht unbegrenzt lange brauchst, kannst du a) entweder periodisch selber aufräumen, b) eine Datenbank wie RRDtool benutzen, die von vorneherein nur Platz für X Einträge vorsieht oder c) eine Datenbank nehmen, die eine TTL (time to live) pro Eintrag kennt, wie z.B. Redis.


    Wie viele Daten sind das denn in 24h? Eine andere Alternative wäre noch, die Daten gar nicht zu speichern, sondern einfach im RAM zu halten.


    Gruß, noisefloor

    Hallo,


    das ist ein bisschen umständlich programmiert... besser wäre IMHO, wenn du statt des angestaubten RPi.GPIO Moduls das neuere, schönere, bessere gpiozerio Modul nutzt. Da definierst du den Eingang als Button (also das er sich wie ein Taster verhält). Dann kannst du a) die Bounce-Time einstellen (also falsche / kurze Signalspitzen wegbügeln) und b) gezielt auf die steigende Flanke (=Signal liegt an) reagieren.

    Dann ist die Fehlersuche auch einfacher.


    Die Zeilen 1, 16 und 17 sind überflüssig, weil die dort definierten Daten nie gebraucht werden bzw. in der while-Schleife überschrieben.

    Importe gehören immer an den Anfang des Codes, macht es übersichtlicher.


    Gruß, noisefloor

    Hallo,

    habe in der /etc/rc.local

    rc.local ist total veraltet und das nutzt auch niemand mehr. Das gibt es nur noch aus Gründen der Rückwärtskompatibilität. Zum Starten von Skripten / Prozessen ist schon seit ein paar Jahren systemd Stand der Dinge, bei quasi alle Linux-Distributionen. Du solltest dir also eine systemd Service Unit schreiben, dann bekommst du auch das Logging via journald gratis dazu, was die Fehlersuche ggf. einfacher macht.


    Zum Skript:

    Statt RPi.GPIO nimmt man eigentlich seit mehreren Jahren das gpiozero Modul, weil das die einfachere / schönere / bessere API hat.
    Das os Modul für Verzeichnis Operation ist auch eher angestaubt, dafür gibt es das pathlib Modul.
    Für das Logging kann man auch das `logging` Modul nehmen, dass muss man nicht alles von Hand selber implementieren.
    Strings stückelt man nicht mit + zusammen, sondern nutzt f-Strings oder alternativ die format-Methode von Strings.


    Gruß, noisefloor

    Hallo,


    mal davon ausgehend, dass die das gpio Modul zur Abfrage der GPIO Pins nimmst: die Button-Klasse kennt die `wait_for_press` Method. Die wartet, bis ein Signal anliegt. Spart dir also den busy loop.


    Je nach dem, wie schnell die Impulse kommen und wie wichtig es ist, keinen Impuls zu verpassen, solltest du den Schreibvorgang in die DB aus der Schleife der Abfrage des GPIO Pins auslagern.


    DIe 2. if-Abfrage kannst du vereinfachen, indem du auf 0 oder glatt durch 600 teilbar prüfst.


    Gruß, noisefloor

    Hallo,


    gemacht. Das exectuable binary liegt unter ~/.local/bin (wo es hin gehört) und die Dateien des Flet-Moduls unter ~/.local/share/pythonVERSION/site-packages/flet (wo es hin gehört).


    Einen Pfad ~/.flet habe ich nicht (braucht man eigentlich auch nicht).


    Bei dir läuft bei der Installation also irgendwas falsch. Am besten alles sauber deinstallieren, kontrollieren, dass alles weg ist, und dann `python3 -m pip install flet` (_ohne_ sudo!) ausführen.


    Oder besser direkt ein virtual environment anlegen und nutzen.


    Gruß, noisefloor

    Hallo,


    das der Pfad ~/.flet/... ist, ist extrem komisch. Ich kann heute Abend mal die Nutzerinstallation außerhalb eines venv in einer mittels Multipass virtualisierten Ubuntu-Instanz testen. Das sollte dann eigentlich auf Raspbian übertragbar sein.


    Gruß, noisefloor

    Hallo,

    Ja der Test findet erst einmal auf einem Windows PC mit der VirtualBox und mit einem Raspberry OS drauf statt.

    Das ist keine virtuelle Umgebung im Sinne von Python virtual environments, sondern komplett virtualisierte Rechner. Hat mit deinem Problem nichts zu tun.


    Ein virtual environment ist einfach eine Python-Umgebgung, die gegen das systemweite Python isoliert ist und trotzdem vollen Zugriff auf das Betriebssystem bzw. die Ressourcen der Hardware hat. Wenn man das virtual environment nicht mehr braucht löscht man dessen Verzeichnis einfach rekursiv und man ist fertig.


    Sollte man immer nutzen, egal ob Windows oder Linux oder MacOS, sofern ein Python-Modul nicht zwingend systemweis installiert sein muss.


    Gruß, noisefloor

    Hallo,


    wie hast du Flet installiert? Der Pfad sieht extrem komisch aus.


    Und es ist _immer_ eine gute Idee, unter Python mit virtual environments zu arbeiten, damit man ohne Probleme rum spielen kann, ohne mit den ggf. pro Nutzer installierten Modulen oder den systemweiten zu kollidieren.


    Wenn ich mir ein venv anlegen und da via pip Flet installiere funktioniert das alles, wie es soll.


    Gruß, noisefloor

    Hallo,


    ok, macht's einfacher. Suchst das fertiges oder könntest du ggf. was selber programmieren? Letzteres ging z.B. über eine in Python geschriebene Anwendung, die mit deinen Benutzerrechten läuft und über einen WSGI Applikationsserver ausgeliefert wird und dann Prozesse / Anwendungen z.B. via `subprocess` startet. Wenn das ganz aus dem Internet erreichbar sein soll / muss, setzt du noch einen Reverse Proxy davor, den du natürlich entsprechend absichern musst, damit niemand mit deinem Benutzer " Quatsch" auf deinem Server macht.


    Gruß, noisefloor

    Hallo,


    der Knackpunkt ist, dass systemweise Prozesse mit Root-Rechten gestartet werden müssen - du willst aber ein Webinterface auf keinen Fall mit Root-Rechten laufen lassen. Also per SSH einloggen und dann ggf. mit Root-Rechten etwas ausführen, ist schon der sichere Weg.


    Der Weg, um einen Prozess 1x zum Zeitpunkt X laufen zu lassen, ist `systemd-run`.


    BTW: cron ist angestaubt und wird sowieso in einen systemd Unit gewandelt. Der aktuelle Weg mit mehr Kontrolle ist eine systemd Timer Unit.


    Gruß, noisefloor

    Hallo,


    das würde ich auch mal behaupte, was hyle sagt: Tkinter ist nicht Multitouch fähig, bzw. die Multitouch-Fähigkeit kommt ja vom angeschlossenen Bildschirm - was über VNC halt ein "normaler" Bildschirm ist. Und dein Finger steuert den einen Mauszeiger. Das Handydisplay ist zwar Multitouch-fähig - aber das ist hier egal, weil des Raspi das Display des Handys nicht sieht.


    Was theoretisch gehen sollte ist, wenn du das ganze als Webanwendung schreibst. Für Echtzeitsteuerung bietet sich dann eine Websocketverbindung von Client (=Handy) zum Raspi an.

    Was theoretisch auch gehen sollte ist, wenn du ein GUI-Framework nimmt, was (auch) als Progressive Web App laufen kann - dann sparst du dir viele Code für Websockets etc. Ein Framework, mit dem das IMHO gehen sollte, ist Flet (https://flet.dev/). Habe ich im Sommer und Herbst mal ein bisschen mit gecodet, das ist schon ganz gut. Wie gut (und ob) das auf dem Raspi läuft weiß ich allerdings nicht, habe es unter Linux und Windows auf x86 Rechnern genutzt.


    Gruß, noisefloor

    Hallo,


    Quote

    Kann ich nun die Elemente auch direkt in der Datei auslesen, anstatt alle Werte erneut zu laden?

    Wie definierst du denn den Unterschied zwischen "Datei auslesen" und "Werte neu laden"?


    Grundsätzlich: I/O auf ein Laufwerk ist im Vergleich zum RAM Zugriff immer langsamer - weil schneller als RAM geht nicht.


    Du kannst bei text-basierten Formaten eigentlich nicht gezielt auf Werte zugreifen, d.h. du kannst nicht ohne weiteres sagen "lade mir die 42. Zeile aus der Datei foo.txt oder foo.csv, ohne die Datei zu lesen.

    Python kennt zwar die seek-Methode für Dateien bzw. Datei-ähnliche Objekte, mit dem du den Zeiger innerhalb der Datei aus des X-te Byte setzen kannst und dann da anfängst zu lesen - dann musst du aber auch genau wissen, bei welchem Byte welche Zahl steht. Also nicht wirklich praktikabel hier.


    Gruß, noisefloor

    Hallo,


    und wenn du Zeile 11 änderst wie von Hofei beschrieben direkt die Zeilen 6 bis 9 löschen, weil die überflüssig bis unsinnig sind.

    Das `time_sleep(5)` in Zeile 24 dürfte auch überflüssig sein.

    Und wenn du schon beim ändern bist, vielleicht direkt aussagekräftige Variablennamen nehmen. Macht die Verständlichkeit des Quellcodes wesentlich einfacher. Z.B. "vorlauf" statt "Vorl" (also ich rate mal, dass "Vorl" die Vorlauftemperatur ist...). Wenn man Variablen anfängt zu nummerieren ist das immer ein starkes Zeichen dafür, dass man entweder a) schlechte Variablennamen hat oder b) eigentlich eine Liste verwenden will.

    Variablennamen schreibt man in Python klein bzw. klein_mit_unterstrich.


    Und vielleicht auch mal das Tutorial auf docs.python.org durcharbeiten. Wie man Rückgabewerte für Funktionen definiert könnte man auch schon bei rudimentären Python-Kenntnissen wissen.


    Gruß, noisefloor

    Hallo,


    außerdem ist Beiträge löschen ja auch keine Lösung, wenn dir die Antworten nicht gefallen bzw. du nicht weiter machen willst. Ist ja letztendliche deine Entscheidung, weil es dein Problem betrifft. Ein simpler Post "Hat sich erledigt" wäre der bessere Schritt gewesen.


    Gruß, noisefloor