Python Variablen per PHP Webseite ändern

  • Guten Abend alle Zusammen,


    vor ca. 2 Jahren habe ich mit einen Raspberry Pi 4 (2GB RAM) einen Webserver gebaut, welcher die GPIOs meines Raspberrys steuert. Die PHP-Webseite führt nach dem drücken entsprechender Buttons Befehle aus (z.B.: gpio -g write 23 0). Das Funktioniert soweit auch alles ganz gut.


    Theoretisch möchte ich nun, dass man mit drücken von Buttons auf der Webseite bestimmte Variablen eines Python Skriptes ändern kann. Ziel soll es sein, dass man auf der Webseite einen Button drückt und dieser dann den Wert im Python Skript beeinflusst, allerdings soll das nur ein mal den Wert der Variable verändern. Wenn man dann wieder das "Gegenstück" des Buttons drückt (auch nur einmalige Änderung des Wertes), dann soll der andere Button wieder den Wert verändern können und anders herum. Dies kann auch über einen Schalter bewerkstelligt werden.

    Praktisch gesehen möchte ich I2C GPIO Expander (MCP23017) über eine Webseite ansteuern. Allerdings müssen dazu immer wieder alle Pins gesetzt werden: Pin 1 bis 8 = 0 bis 128, 0 bedeutet, dass kein Pin an ist, 4 bedeutet Pin 3 ist an, 7 bedeutet Pin 1, 2 und 3 ist an, 255 bedeutet alle Pins sind an, usw. (letzer Pin = Pin 8 = 128). Wenn ich jetzt also den Button für Anschalten von Pin 6 drücke, dann soll es dem Wert 32 hinzufügen. Wenn jetzt nochmal der gleiche Button gedrückt wird, sollen aber nicht nochmal 32 hinzugefügt werden, da ja sonst (32 + 32 = 64) Pin 6 angehen würde. Anders herum sollen allerdings auch keine 32 abgezogen werden können, wenn zuvor keine 32 hinzugefügt wurden (weil z.B. Pin 7 (64) noch an sein könnte und 64 - 32 = 32). Wenn man aber zuvor den Pin 6 aktiviert hat, dann soll sich dieser auch wieder deaktivieren lassen.


    Zur besseren Vorstellung werde ich das hier noch einmal grafisch darstellen:


    - Endgerät greift über (W)LAN auf eine Webseite des Raspberrys zu

    - auf der Webseite sind Buttons (oder Schalter -> nur Position wird gemerkt (vielleicht einfacher?))

    - beim drücken eines Buttons soll in einer Datenbank ein Wert geändert werden

    - ein Python Skript liest den Wert (entweder in Wiederholung oder bei Änderung)

    - Python Skript ändert darauf hin eine Variable (zählt nur einmal dazu bis "Gegenstück" gedrückt wurde)

    - Der Python Skript sendet dann die Daten über I2C Verbindung an den MCP23017

    - Wenn das Gerät die Webseite verlässt und/oder das gleiche/ein anderes Gerät (wieder) auf die Webseite geht, dann soll die Button-"Sperre" aktiv bleiben (bzw. die Schalter sollen ihre Position wiederherstellen)


    Meine Fragen sind jetzt folgende:

    1. Wie mache ich das, dass die Buttons auf meiner Webseite nur den Wert der Variable ändern, wenn zuvor die Bedingung ("Gegenstück" gedrückt) erfüllt worden ist?

    2. Wie ändere ich demzufolge den Wert in einer Datenbank über eine Webseite unter genannten Bedingungen?

    3. Wie stelle ich das an, dass die Webseite (oder das Python Skript) sich merkt, welche Buttons etwas bewirken dürfen?

    4. Wenn Schalter die bessere Variante sind, wie lass ich die Webseite merken, in welcher Position die waren?


    Ich hoffe, dass ich mein Problem ausführlich genug geschildert habe, bei Fragen versuche ich so schnell wie möglich zu antworten.

    Ich möchte mich im Vorfeld für Ideen, Ratschläge und Lösungen bedanken.

    Mit freundlichen Grüßen,

    Firefury04

  • Hallo,

    Wie mache ich das, dass die Buttons auf meiner Webseite nur den Wert der Variable ändern, wenn zuvor die Bedingung ("Gegenstück" gedrückt) erfüllt worden ist?

    wenn du dir in Python Zustände merken willst, dann benötigst du Klassen. Das heißt für dich, du musst dich mit der objektorientierten Programmierung befassen.

    Dann kannst du nach jeder Betätigung eines Buttons, den Zustand prüfen und je nach dem weitere Aktionen ausführen oder eben nichts unternehmen.


    Ich hab dir das nur mal beispielhaft mit einem tkinter-GUI geschrieben. Du kannst '+' so oft drücken wie du willst, der Wert ändert sich nur einmal, ebenso mit '-'. Das Prinzip kann man dann auf deine Anforderungen ausbauen.

    Zu 3. würde diese Antwort eigentlich auch passen.

    Ob sich eine Webseite Zustände merken kann? Ich würde die Logik rein über Python machen und die Webseite nur zur Darstellung und eben zur Bedinung nutzen. Auch der Zugriff auf die Datenbank könnte Python übernehmen.


    Ich würde an deiner Stelle mit der Logik des Programms beginnen, dann das Bearbeiten der Datenbank mit Python und dann die Bedingung über die Webseite. Schön Schritt für Schritt und dann ergeben sich auch konkretere Fragen, auf die man gezielter antworten kann.



    Grüße

    Dennis

    🎧 Halt mich fest, so fest wie du nur kannst, öffne ich die Augen dann bekomme ich Angst. Angst vorm Größenwahn, vorm Geist unserer Zeit, vor der Überschätzung unserer Fähigkeit 🎧

  • Alles was du brauchst ist ein bisschen binaere Arithmetik:


    Code
    x = 5
    
    # Setze 2 dazu
    x |= 2
    print( x )
    
    # Nimm 2 weg
    x &= ~2
    print( x )

    Diese Befehle setzen oder loeschen den Wert, egal wie oft sie ausgefuehrt werden.

    Edited once, last by Tell ().