Posts by noisefloor

    Hallo,


    Quote

    Gibt's eine "bessere" GUI Library für meine Zwecke, die auch in angemessener Zeit erlernbar ist?

    GUI-Programmierung ist halt nicht einfach. Unter Python sollte man sich schon zumindest grundlegend mit Objektorientierung, Klassen, deren Methoden und Instanzen auskennen. Außerdem laufen GUI-Programme i.d.R. nicht-linear, d.h. der Mainloop der GUI kontrolliert, wann was / wer dran ist. Das ist gerade für Anfänger manchmal verwirrend, bis man das geblickt hat.


    Klar gibt es Frameworks, die das auf einen höheren Level weg abstrahieren - aber dafür kommt man dann relativ schnell an anderer Stelle an Grenzen, wie du festgestellt hast.


    Die gängigen Frameworks, die auch unter Python genutzt werden, sind Tkinter, Qt und bis zu einem gewissen Grad auch GTK.

    Welches für dich am besten ist, ist schwierig zu sagen, weil wir den Umfang und das genaue Ziel deines Projekts kennen.


    Gruß, noisefloor

    Hallo,


    du weißt aber schon, dass Python + CGI seit > 10 Jahren obsolet ist und man das nur als allerletzten Notnagel benutzt? Stand der Dinge ist Python-Applikationen via WSGI auszuführen. I.d.R. via WSGI-Applikationssserver wie z.B. gunicorn. Und man verwendet ein WSGI-kompatibles Framework wie z.B. Flask oder Bottle oder Django. Klingt kompliziert - ist es aber nicht. Jedenfalls ist quasi alles besser als CGI.


    Gruß, noisefloor


    P.S.: dem im 1. Post verlinkten Tutorial würde ich auch nicht wirklich trauen - es nämlich kein Ubuntu 18, 19 oder 20...

    Hallo,


    also mit der Zeile Zeile <img id="welcome" src="welcome.png" alt="Begrüßung"> wird das Bild im Document-Root des Webservers erwartet. Document-Root ist bei dir via Reverse-Proxy auf `http://192.168.200.2/`. Da wird die Anfrage dann hin durchgereicht, wobei da dann auch das Bild auch im Document-Root liegen sollte bzw. "irgendwas" auf der IP-Adresse lauschen sollte, so dass `http://192.168.200.2/BILDNAME.jpg` auch `BILDNAME.jpg` zurück liefern sollte.


    Welchen Fehler bekommst du, wenn du auf dem Client den Quelltext der Webseite aufrufst und dann auf den Link des Bild im Quelltext bekommst. Bekommst du `404 not found`?


    Gruß, noisefloor

    Nachtrag: habe es gerade auf meinem Pi Zero ausprobiert, funktioniert. Python Version ist 3.7.3:


    Die komplette Ausgabe kann ich leider nicht posten, weil die Länge eines Forenposts wohl auf 50.000 Zeichen begrenzt ist - die Ausgabe ist aber länger.


    Gruß, noisefloor

    Hallo,


    bei mir auf dem Pi Zero braucht gpiozero auch spürbar lange, um importiert zu werden. Meine _Vermutung_ ist, dass gpiozero wesentlich mehr beim importieren instanziert / initialisiert.


    Stören tut's mich nicht, weil a) der Pi Zero so oder so "lahm" ist und b) wenn gpiozero einmal importiert ist alles "normal" schnell läuft.


    Wenn du wissen willst, was beim Importieren von gpiozero abläuft -> Quellcode lesen. Oder einen Profiler laufen lassen:


    Python
    >>> import cProfile
    >>> cProfile.run('import gpiozero')


    Gruß, noisefloor

    Hallo,


    Quote

    Jetzt wird die letzte Nachricht aber nicht überschrieben, sondern in eine neue Zeile angehängt:

    Das ist ein eine Sache der Shell und nicht von MQTT. Das von dir gezeigte Verhalten sollten aber nicht sein, weil die Umleitung mit `>` die Datei neu anlegt falls nicht existent und überschreibt falls existent. Es sein denn, deine Bash wird mit der Option `-C` (noclobber) aufgerufen.


    Gruß, noisefloor

    Hallo,


    Quote

    aber wo finde ich den Body der Anfrage?

    Den müsstest du generieren. Wobei ich glaube ich zu schnell war: im `scr` Attribut geht das ja gar nicht, da kann "nur" eine URL stehen.


    Plan C: du nutzt ja scheinbar MariaDB oder MySQL. Du könntest noch eine Master-Slave Replikation für die DB bauen, wobei dein Pi der Master und der VServer der Slave der DB ist. Und dann Grafana auch auf dem VServer installieren.


    Gruß, noisefloor

    Hallo,


    Quote

    Auf den ersten Blick war bin ich noch total überfordert.

    Ja, ich auch ;) Wobei es glaube ich gar nicht so kompliziert ist, wie es ausschaut, weil du die URL ja "nur" an einer Stelle teilen musst und dann alles "rechts" davon brauchst.


    Plan B: die Parameter nicht als GET-Parameter in die URL packen, sondern in den Body des Requests. Sofern Grafana damit umgehen kann.


    Gruß, noisefloor

    Hallo,


    Quote

    Ich möchte das, wenn die Sensoren 1 bis 7, auf GPIO.HIGH stehen die Pumpe auch auf GPIO.HIGH geschaltet wird.

    Dann musst du die Sensoren auch abfragen - tust du nämlich in Zeile 192 nicht. `SENSOR1`, `SENSOR2` etc. sind Integer-Werte und nicht Funktionsaufrufe. Da muss dann sowas die `if GPIO.input(SENSOR1) ...` hin.


    Wenn man eine Reihe von Wahrheitswerten abfragen will und alle müssen wahr sein, dann kann man einfach die `any()` Funktion nehmen.


    Ein paar generellen Anmerkungen:

    * das Rpi.GPIO Modul ist veraltet. Stand der Dinge ist das gpiozero-Modul. Was auch eine bessere API hat.

    * Bei einem Aufruf einer Funktion oder Methode kommt zwischen den Namen und die Klammer kein Leerzeichen.

    * In den Zielen 86 bis 126 steht sehr ähnlicher Code -> sollte man bessere eine Funktion für Schreiben, statt Code zu wiederholen.

    * Wenn man anfängt, Variablenamen zu nummerieren sollte man sich überlegen, ob man nicht besser eine Liste zum Speichern der Informationen nimmt.


    Gruß, noisefloor

    Hallo,


    dann stimmt die Konfiguration nicht, also die vorgeschlagene ProxyPass Konfig.


    IMHO reicht die Konfig auch so nicht, weil die GET-Parameter und die anderen Teile der URL nicht weitergegeben sondern abgeschnitten werden (also das `d-solo/jsed0Ukgz/temperatur?orgId=1&refresh=1m&theme=light&panelId=2" frameborder="0"`.

    IMHO musst du noch eine Rewrite-Rule definieren, damit das durch geht.


    100% sicher bin ich da aber nichts, weil ich a) das noch nie gemacht habe und b) nginx als ReverseProxy für meine Python-Apps nutze.


    Gruß, noisefloor

    Hallo,


    weißt du, wie ein Reverse Proxy funktioniert? Du leitest auf dem Webserver im Moment alle Anfrage auf / (also die "Hauptseite" des Servers) an die IP-Adresse 192.168.200.2 weiter. D.h. dein Raspi müsste für den VServer unter 192.168.200.2 erreichbar sein. Ist er aber ziemlich sicher nicht, da 192.168.x.x eine IP-Adresse für private / interne Netzwerke ist.


    Ist dein Pi überhaupt von außerhalb erreichbar? Sonst funktioniert deine Konstellation sowie so nicht.


    Gruß, noisefloor