Ausführen von Script für definierten Zeitraum unterbinden

  • MoinMoin,

    wir bekommen zur Zufahrtsregelung eine Schranke vor unseren Laderampen.
    Diese soll über eine Webseite, welche auch mit der Anzeige von 2 Kameras versehen ist, zu öffnen sein.
    Zum öffnen soll die Schranke einen Impuls von 1 Sekunde Dauer bekommen.
    Das funktioniert auch mit folgenden Dateien einwandfrei.
    Leider kann man nun so oft und so schnell hintereinander klicken wie man möchte. Jeder Klick wird ausgeführt.
    Gibt es eine Möglichkeit ein nach Ausführen des Scriptes erneutes Aufrufen für 20 Sekunden zu unterbinden?
    Mir ist bei der Recherche zu diesem Thema die Funktion flock begegnet. Ich kriege sie allerdings nicht dazu mir die Ausführung zu unterbinden.
    Eine weitere Problematik ist die Möglichkeit den Quelltext einzusehen. In diesem stehen leider in Klarschrift die Zugangsdaten der beiden Kameras.
    Kann man diese Logindaten vllt. verschleiern?
    Über einen hilfreichen Tritt in die Seite würde ich mich als absoluter Neuling in diesem Thema freuen.

    Vielen Dank schon mal,
    Honk

    iframe.php

    Einmal editiert, zuletzt von HerrHonk (7. Februar 2017 um 11:22)

  • Ausführen von Script für definierten Zeitraum unterbinden? Schau mal ob du hier fündig wirst!

  • Hallo,

    ich habe lange nichts mehr in PHP gemacht und deshalb eine allgemeine Lösung, wie ich in eier solchen Lage verfahre:

    Ich hole mir beim Programmstart über gettickcount die Zeit in eine 32 Bit Variable. Wenn ein Schaltimpuls kommt, hole ich mir erneut die Zeit und vergleiche den neuen Wert mit dem gespeicherten Wert. Wenn der neue Wert kleiner als der alte ist, springe ich aus der Funktion und der Schaltimpuls wird unterdrückt.

    Wenn die neue Zeit größer ist, speichere ich den neuen Wert und zähle die Zeit, die gesperrt werden soll dazu. Danach wird das Schaltsignal weitergeleitet.

    Wenn nun während der Sperrphase weitere Impulse kommen, wird die Aktuelle Zeit kleiner sein als der letzte Schaltimpuls + Sperrzeit und weitere Impulse werden so lange ignoriert, bis die neue Zeit größer ist.

    Sollte der Pi im Dauerbetrieb laufen, ist natürlich der Überlauf zu beachten.

  • Servus,


    ... gettickcount die Zeit in eine 32 Bit Variable. Wenn ein Schaltimpuls ... erneut die Zeit und vergleiche den neuen Wert mit dem gespeicherten Wert. Wenn der neue Wert kleiner als der alte ist, ...


    Du meinst vermutlich:

    Zitat


    ... mit dem gespeicherten Wert plus der Verzögerung. Wenn der neue Wert kleiner als der alte ist, ...


    Der neue kann nur kleiner sein, wenn ein Überlauf stattgefunden hat. Ansonsten ist er zwangsläufig immer größer ...
    Der Unix-Timestamp würde z.B. erst -> 2038 <- überlaufen ...


    Das mit dem "Zeit merken" wird so wohl nicht funktionieren. Das ist ja PHP auf einer Web-Seite. Da wird der Code ja nur ausgeführt, wenn eine Aktion durch den Nutzer ausgelöst wird.
    Da müsste imho irgendwas mit z.B. javascript her oder ein eigenes Programm/script, das die Verzögerung realisiert und z.B. statt "gpio write ...."ausgeführt wird. Da klappt das mit dem Zeitstempel wieder ...

    //EDIT: Obwohl ... evtl. kannst Du den Zeitstempel in einer Datei ablegen und bei jedem Auslösen zuerst mal lesen ... ist aber so eine Sache wegen der Schreiberei auf SD
    //NOCH WAS: das Problem mit Deinen Login-Daten wäre evtl. auch lösbar, indem Du die Daten in einer Datei hinterlegst. Damit vermeidest Du allerdings nur, dass der Klartext im PHP-Source steht.

    cu,
    -ds-

  • arg... schon wieder dieses $val = trim(@shell_exec()) Zeug.... *würg*

    Wenn es denn unbedingt PHP sein muss dann bitte so machen:
    FAQ => Nützliche Links / Linksammlung => PHP: Anleitung zum schalten von GPIO

    Weitaus besser, schneller und insbesondere beim Umgang mit GPIO's, empfehlenswerter wäre allerdings:
    FAQ => Nützliche Links / Linksammlung => [Python] Webserver, Websocket und ein bisschen AJAX
    Damit wäre es dir auch problemlos möglich dein Anliegen/Problem ziemlich einfach und schnell umzusetzen, weil du dann nur eine globale Variable/Dictionary benötigst um bereits durchgeführte Aktionen zu speichern.


    dreamshader: $_SESSION könnte man evtl. noch nutzen, aber das ist auch nicht das Gelbe vom Ei :fies:

  • Hallo zusammen,

    warum so kompliziert?

    Reicht nicht eine einfache Anwendung mit Buttons zum Hochfahren und zum Herunterfahren? Und bevor nicht vollständig der Endpunkt erreicht wurde, reagiert die Anwendung nicht auf Ereignisse? Und vielleicht noch eine Umkehr, falls sich irgendwas in den Weg stellt?

    Dann spart man sich dieses Heckmeck mit diversen Programmiersprachen und -umgebungen. Und muss sich nicht durch irgendwelche Systemschwächen hindurchkämpfen.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • MoinMoin,

    vielen Dank für Eure Tips.
    Ich habe mich dann nach der Empfehlung von meigrafd mit Phyton beschäftigt.
    Leider funktioniert es nicht so wie ich möchte.
    Der Impuls wird für 1 Sekunde ausgelöst aber leider wird die nächste Auslösung innerhalb von 15 Sekunden nicht verhindert.
    Wo habe ich Blödsinn geschrieben?

    Sorry wegen meiner Frage auf ein wahrscheinlich offensichtliches Problem.
    Es ist mein erster Kontakt mit Python und da keine Fehlermeldung ausgegeben wird, schwimm ich hier ziemlich.
    Vielen Dank schon mal.

    Gruß,
    Honk

  • Bist du sicher dass das so funktioniert?
    Ich sehe da nichts wo bzw wovon die "impuls()" Funktion ausgeführt wird, sehe aber auch Probleme in der Benennung da du auch eine Variable hast die so heißt.
    Der Ansatz bzgl. "now" ist aber schon nicht schlecht, auch wenn das so nicht viel Sinn macht ;)

    Also wenn du das mit Python umsetzen möchtest dann guck dir bitte eine der Möglichkeiten vorzugsweise für bottle aus dem 2.Link in Beitrag#4 an.
    Zusätzlich benötigst du dann noch eine Interrupt Routine wie du sie hier findest: FAQ => Nützliche Links / Linksammlung => Interrupt => #8 und/oder #9

    Die Ausgangslage ist ja das du einen Taster hast und bei drücken dieses Tasters soll ein GPIO für 1sec auf HIGH gestellt werden.
    Ein erneutes drücken des Tasters soll für 20sec blockiert werden.
    Und dann soll das ganze auch noch visuell auf einer Webseite dargestellt werden? Um was für Kameras handelt es sich eigentlich?

  • Honk: das funktioniert alles so nicht. Du bestimmst zB ja now gar nicht zu dem Zeitpunkt, an dem es zu einem Ereignis kommt. Und das Programm läuft auch nur einmal durch, danach ist es beendet. Es weiss doch nicht magisch, dass es beim nächsten Start warten soll - du modifizierst ja keinen Quelltext.

    Da muss eine while-Schleife rein, und ein paar time.sleeps.

  • Bevor du frustriert keine Lust mehr hast - auch wenn PHP nicht sonderlich toll ist und ich den Anblick trim(@shell_exec()) wirklich nicht mehr ertragen kann - hier eine mögliche Lösung zu Beitrag#1

    [code=php]
    <?php
    if (!isset($_SESSION)) { session_start(); }
    ini_set("session.gc_maxlifetime", 3600); // default: 3600 sec, 60 min

    $impulsBlocktime = 20; // sec

    ob_implicit_flush(true);
    @ob_end_flush();

    if (isset($_GET['Befehl']) AND $_GET['Befehl'] === 'impulsein') {
    if (isset($_SESSION['lastImpuls'])) {
    if ((time() - $_SESSION['lastImpuls']) > $impulsBlocktime) {
    sendImpuls();
    }
    } else {
    sendImpuls();
    }
    }

    function sendImpuls() {
    exec("/usr/local/bin/gpio -g write 23 1", $output, $return_var);
    sleep(1);
    exec("/usr/local/bin/gpio -g write 23 0", $output, $return_var);
    $_SESSION['lastImpuls'] = time();

    if (isset($return_var) AND $return_var == "126") { echo "<b>ERROR: Command found but not executable (Permission problem)!</b><br/>\n"; }
    if (isset($return_var) AND $return_var == "127") { echo "<b>ERROR: Command not found (Possible problem with PATH or a typo)!</b><br/>\n"; }
    if (isset($output) AND !empty($output)) {
    foreach ($output AS $line) {
    echo "$line<br/>\n";
    }
    }
    }
    ?>

    <html>
    <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
    <title>iframe.php</title>
    <style>
    body {background-color:#DCDCDC;}
    </style>
    </head>

    <body>
    <p>
    <a href="?Befehl=impulsein"><img src="schranke-hoch.png" height="200" width="200" style="border:none;"></a>
    </p>
    </body>
    </html>
    [/php]

    Aber ich empfehle dir trotzdem das Konstrukt mit Python umzusetzen

  • Guten Morgen,
    vielen Dank für Eure Hilfe und insbesondere an meigrafd.
    Durch das PHP Script habe ich nun mit der Schrankensteuerung Zeit gewonnen und kann sinnvoller an das Thema Python heran gehen.
    Ich habe mir am Wochenende privat einen Pi bestellt und werde mich zu Hause erst mal mit den Grundlagen in Sachen Python beschäftigen.
    Ziel ist immer noch die Umsetzung über Python mit einem Impuls welcher instanzunabhängig max alle 20 Sekunden ausgegeben werden kann.
    Ferner soll der Zugriff auf die Webseite über eine LDAP Abfrage auf unser AD gruppenbasiert geregelt werden und es soll ein Logging laufen.
    Mal schauen ob das alles so möglich ist.
    Also, vielen Dank noch mal und wahrscheinlich bis bald. :blush:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!