Über externen Befehl / Schaltfläche in python-skript eingreifen

  • Hallo Zusammen,


    Mein Stromverbrauchsmonitor läuft ja jetzt schon seit über einem Jahr wirklich perfekt.

    Ich habe ein python-script erstellt, dass mir über einen gpio den so-Ausgang des Stromzählers abfragt.

    Es schreibt dann alle 5 Minuten die Impulse und somit den kw-Verbrauch in eine csv-Datei, die ich mit einer html-Seite und php visualisiere.


    Das python-script läuft allerdings komplett autonom. Also ohne jeden Eingriff oder Paramter durch eine Bedienung oder Ähnliches.

    Jetzt möchte ich das aber etwas erweitern und z. B. Eine Variable einbauen, die ich über einen externen Befehl (also nicht im Skript selbst), auf 0 zurückstellen kann. Im Endeffekt eine Art Button, den ich anklicken kann um einen weiteren Zähler auf 0 zu stellen. Es soll dann z. B. Irgendwo angezeigt werden (Verbrauch seit letzter Rückstellung am ....sowieso, x,xxKW).


    Könnt ihr mich mal auf die richtige Spur bringen, wie ich das Anfange?

    Programmiere ich das im python-script selbst, oder in tkinter oder über die html/php-Seite?


    Ich möchte auch z. B. Eine Art Statusanzeige des python-scripts erstellen, wo z. B. Immer ein Roter Punkt blinkt, wenn der gpio vom s0 einen Impuls bekommt usw.


    Dank Euch schön

    Andi

  • Ich würde eine "config" Datei anlegen, die von überall aus bearbeitet werden kann. Dein Python- Script kann dort lesen, ob es anderes reagieren muss.

    Ich habe eine Raspi Beere 3 und freue mich, dass sie läuft. Ich programmiere gern und freue mich wenn es auch funktioniert. Aber grundsätzlich hab ich keine Ahnung davon :conf:

    Bitte löscht nie dieses Forum! Hier steht alles drin was ich mir merken muss!

  • Hallo,


    Folgende Möglichkeiten kann ich dir vorschlagen:

    Periodische Auswertung einer Textdatei ( Guido64 Vorschlag ^^)

    Du integrierst in dein Skript einen Socket und sendest darüber Befehle

    https://docs.python.org/3/library/socket.html

    Oder der umfassendste Vorschlag...du verwendest Django, Flask o.ä und ersetzt damit auch den PHP Teil (einfach mal danach suchen ^^)

  • Hallo,


    Quote

    Programmiere ich das im python-script selbst, oder in tkinter oder über die html/php-Seite?

    Erst mal im Skript. Das Skript muss ja auch irgendwas (Datei, Socket, Named Pipe, ...) lauschen, um mitzubekommen, dass ein "Befehl" extern gesendet wurde.


    Quote

    Ich möchte auch z. B. Eine Art Statusanzeige des python-scripts erstellen, wo z. B. Immer ein Roter Punkt blinkt, wenn der gpio vom s0 einen Impuls bekommt usw.

    Das spricht IMHO für ein Pub-Sub System. Dein Python-Skript ist der Publisher, der eine Nachricht sendet, wenn der Impuls erhalten wurde. Mit dem Publisher kannst du dann beliebig viele (oder keinen) Subscriber verbinden, die dann bei einer Nachricht agieren.


    Gruß, noisefloor

  • Hallo Zusammen,


    vielen Dank Euch.

    Dann hab ich schon mal eine Grundlage.

    Ich sollte also eine seperate Datei erstellen, die die Parameter für die Befehle enthält.

    Und mein python script schaut dann regelmäßig in der Datei, ob etwas ausserhalb des Standard-Programmablaufs aufgerufen werden muss.
    Das könnte ich ja dann auch über die bestehende Html-php-seite lösen, die die Schaltflächen enthält und an die Dateien die Werte übermittelt.


    Für Zähler zurückzusetzen glaub ich ist das super. Aber für die anzeige eine gpio-Impulses jedes mal in eine Datei zu schauen...... hmmmm.

    Aber Ihr habt mir ja auch noch weitere Tipps gegeben, die ich mir jetzt erst mal genauer anschaue.


    Ich hab mal nen Anfang.

    Dank Euch

  • Hi Andi


    Ich hatte das so gemacht mit einem Python- Script, was Impulse aufnimmt. Das sah so aus:


    *Ich Zähle alles 10 Minuten lang und schreibe es in eine Datei.

    *Die Zählung ist immer 10 Sekunden, dann werden Wert in Variablen festhalten.

    - Größte Zahl in 10 Sek. -kleinste Zahl -Durchschnitt aus den 10 Sekundenblöcken der letzten 10 Minuten.

    *Das ganze sind Impulse aus einer Windmessung.


    Aber ab und zu will ich "live" Daten beobachten... Da das nicht permanent gefragt ist, muss ich ja nicht die SD Karte am laufenden Band ackern lassen. Also nur auf Anfrage über Web oder was du magst.


    *Dazu benutze ich eine "config" Datei, in der eine Zahl gespeichert werden kann (genau dann wird diese Datei durch Klick in der Webseite erstellt!).

    *Das Pythonskript schaut alle 10 Sekunden ob die "config" vorhanden ist und wenn "JA" arbeitet sie das ab, was ich vordefiniert habe.

    *Ausgabe der Werte z.B. alle 10 Sekunden oder was du willst wie: Verbrauch seit letzter Rückstellung am ....sowieso, x,xxKW...

    *zum Ende des 10 Minuten Blockes wird durch das Phytonscript die Datei gelöscht. (kann ja jederzeit wieder durch Klick erzeugt werden)


    Ich habe mich dafür entschieden, weil ich der Meinung bin, dass die "Last" für die Beere alle 10 Sekunden zu schauen, ob eine Datei existiert, nicht so groß ist. Ja und ich bin damit in der Lage für eine befristete Zeit Sonderausgaben zu nutzen. Ich deinem Fall eher was zu Konfigurieren, wenn ich an "Rückstellung denke.


    wenn es gefällt, Daumen hoch:thumbup:

    Ich habe eine Raspi Beere 3 und freue mich, dass sie läuft. Ich programmiere gern und freue mich wenn es auch funktioniert. Aber grundsätzlich hab ich keine Ahnung davon :conf:

    Bitte löscht nie dieses Forum! Hier steht alles drin was ich mir merken muss!

  • Hallo Guido,

    ja das hört sich genau nach dem an, was ich brauche. Vielen Dank.

    Aber alle 10 Sekunden einen Dateizugriff für einen Fall, der nur selten eintritt. Damit muss ich mich erst anfreunden.


    Tschö

    Andi

  • Hallo nochmals zusammen :)

    Tecci ok also wenn du dich für diese Lösung mit der Dateiabfrage entschieden hast möchte ich dir hierfür noch folgende Tipps geben:


    Die Funktion check_datei() rufst du zwar alle 10 Sekunden auf (wohl über einen Datetime Vergleich zwischen 2 Datetimeobjekten ob das gewünschte Timedelta erreicht ist), aber nicht direkt die Datei. Hier wird zuerst der passende Pfad aus Dateiname und Pfad zusammengesetzt (os.path.join()) und anschließend geprüft ob die Datei existiert (os.path.isfile()). Wenn nein ist die Funktion auch schon zu Ende und du erhältst ein None von der Funktion zurück. Wenn die Datei existiert ließt du die Datei aus, und gibst den Inhalt als Rückgabewert zurück. Diesen Rückgabewert musst du halt dann entsprechend filtern, aufbereiten und die entsprechenden Funktionen im Skript aufrufen.

  • Hi Hofei,


    vielen Dank.

    So werd ichs probieren und melde mich dann wieder.

    Aber Danke nochmal an Alle.

  • Hallo ich bins nochmal,


    jetzt ist mir eingefallen, ich könnte doch auch direkt im php-script den gpio-Eingang auslesen und mir den Status auf der Webseite anzeigen lassen.

    Es funktioniert aber nicht und ich vermute weil ich im php-script den gpio nicht neu als Input oder Output definiere.

    Aber das traue ich mich nicht, weil ja der gpio schon in meinem python-script benutzt und definiert wird.

    Meint Ihr es könnte trotzdem gehen und ich sollte den Ansatz weiter verfolgen, oder ist das kritisch den gpio nochmal zu verwenden bzw. zu definieren.


    Gruß

    Andi

  • du kannst doch mit PHP dein Python ansprechen...

    Ich habe eine Raspi Beere 3 und freue mich, dass sie läuft. Ich programmiere gern und freue mich wenn es auch funktioniert. Aber grundsätzlich hab ich keine Ahnung davon :conf:

    Bitte löscht nie dieses Forum! Hier steht alles drin was ich mir merken muss!

    • Official Post

    Hallo,


    nicht das hich hier alles gelesen hätte, deshalb nur ein Hinweis. PHP kann natürlich die GPIO nicht auslesen, denn der User www-data befindet sich nicht in der Gruppe gpio.


    BTW: Sinnvoller wäre es IMHO allemal PHP ganz wegzulassen und stattdessen nur Python via Bottle etc. zu benutzen, aber das wurde bestimmt weiter oben schon geschrieben.

  • du kannst doch mit PHP dein Python ansprechen...

    Kann man, sollte man aber nicht. Das ist eine echt üble Lösung, die man keinesfalls empfehlen oder gar bevorzugen kann. Gibt's tausende Threads dazu, in denen das warum erklärt ist. Entweder alles in PHP oder Python auch serverseitig verwenden.


    Edit: hyle

    Wieso empfehlen immer (Unwort) alle bottle? Flask ist IMO die bessere Wahl, weil nicht viel komplizierter aber an vielen Stellen deutlich komfortabler und mächtiger. Außerdem, so wie ich das sehe, deutlich weiter verbreitet.

    :conf:


    Edit 2: Hofei jetzt komm bloß nicht noch mit Django :lol::evil:;)

  • Check. Dann bleib ich in meim python script.

    Hatte ja auch schon Bedenken den gpio über php anzusprechen.

    DANKE

    • Official Post

    Ich tue mich gerade im wissenschaftlich/technischen Bereich mit Englisch leichter.

    Dir ist schon klar, dass Streber keiner leiden kann? :elektro:



    Tecci Machbar wäre das mit PHP, aber wenig sinnvoll, wenn Du ohnehin Python nutzt... Ach übrigens, habe ich schon Flask erwähnt? (Nicht dass ich von Linusgkartellamt noch Ärger bekomme...) :cool:

  • Hallo,


    Linus, hyle: Sanic ist der heiße Scheiß - wer arbeitet 2018 denn noch synchron? ;)


    Wenn man nur das Routing braucht ist es IMHO ziemlich Latte, ob Bottle oder Flask, dass tut sich nicht viel. Bzw. es ist für Neuanfänger IMHO minimal einfacher mit Bottle.


    Gruß, noisefloor