HTML PHP Button Schaltzustand speichern

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    ich suche nach einer Möglichkeit, den Schaltzustand eines Button zu speichern. Oder sagen wir mal so, ich denke das müsste so gemacht werden :)
    Benötige das für meine Hausautomatisierung.
    Ich schalte heute via Webinterface meine Beleuchtung habe aber für jede Schaltung einen Aus und Ein Button, was ja auch funktioniert aber nicht wirklich schön ist.
    Möchte quasi mit einem button ein und ausschalten je nach Schaltzustand.
    Dafür fehlen mir aber einfach die Fachkentnisse in HTML / PHP .... :helpnew:

    Danke für eure Unterstützung :danke_ATDE:

    Timo

  • Oh Gott, da gäbe es ja tausende Möglichkeiten...
    Cookies, Flag Datei, Datenbank, Ändern der html nach jedem schalten... um nur 4 zu nennen ;)
    Jenachdem wie aufwendig du das ganzze betreiben willst,würde ich ne kleine DB sqlite nutzen in der die Dosen und der letzte Schaltzustand gespeichert wird. Beim Aufbau der Seite wird der Zustand ausgelesen und entsprechend dargestellt.

    --
    man ist das System-Anzeigeprogramm für die Handbuchseiten von Linux.

  • Nach Möglichkeit den geringsten Aufwand!!
    Ich mochte letztendlich nur die Farbe des Button entsprechend des Schaltzustandes ändern.
    Das Problem ist halt das ich von verschiedenen Devices auf die Webseite zugreife ....
    Wie stelle ich das aber im Detail an?

    Einmal editiert, zuletzt von JT179 (16. Januar 2015 um 09:53)

  • Ich denke das einfachste wäre mithilfe von PHP eine temporäre Datei zu erzeugen und dann beim Button zu prüfen was in der Datei drin steht, ob AN oder AUS.

    Also zunächst eine PHP Datei anlegen zB: index.php

    Code
    nano /var/www/index.php

    Und den Anfang wie folgt befüllen:
    [code=php]
    <!DOCTYPE html>
    <html>
    <head>
    <title>Schalten</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <meta name="robots" content="DISALLOW">
    </head>
    <body>
    <?php
    [/php]

    Da drunter folgt nun der Code in PHP (selbe Datei!), wo wir für jede Schaltung den Namen sowie dessen temporäre Datei festlegen, sowie den dazugehörigen GPIO:
    [code=php]$Schaltung['Wohnzimmer'] = "/var/www/.wohnzimmer.txt";
    $Schaltung['Schlafzimmer'] = "/var/www/.schlafzimmer.txt";
    $Schaltung['Badezimmer'] = "/var/www/.badezimmer.txt";

    $GPIO['Wohnzimmer'] = 22;
    $GPIO['Schlafzimmer'] = 24;
    $GPIO['Badezimmer'] = 27;[/php]

    Dann bauen wir eine Abfrage ein, wo wir prüfen ob ein Button gedrückt wurde (vom Formular):
    [code=php]if (isset($_POST) AND !empty($_POST)) {
    $VALID = 0;
    foreach ($_POST AS $arg => $var) {
    if ($arg == "Wohnzimmer") {
    if ($var == "An") {
    # hier dein code einfuegen zum schalten, zB mithilfe von GPIO.
    exec("gpio -g write ".$GPIO[$arg]." 1", $output, $return_var);
    } else if ($var == "Aus") {
    # hier dein code einfuegen zum schalten, zB mithilfe von GPIO.
    exec("gpio -g write ".$GPIO[$arg]." 0", $output, $return_var);
    }
    $VALID = 1;
    } else if ($arg == "Schlafzimmer") {
    if ($var == "An") {
    # hier dein code einfuegen zum schalten, zB mithilfe von GPIO.
    exec("gpio -g write ".$GPIO[$arg]." 1", $output, $return_var);
    } else if ($var == "Aus") {
    # hier dein code einfuegen zum schalten, zB mithilfe von GPIO.
    exec("gpio -g write ".$GPIO[$arg]." 0", $output, $return_var);
    }
    $VALID = 1;
    } else if ($arg == "Badezimmer") {
    if ($var == "An") {
    # hier dein code einfuegen zum schalten, zB mithilfe von GPIO.
    exec("gpio -g write ".$GPIO[$arg]." 1", $output, $return_var);
    } else if ($var == "Aus") {
    # hier dein code einfuegen zum schalten, zB mithilfe von GPIO.
    exec("gpio -g write ".$GPIO[$arg]." 0", $output, $return_var);
    }
    $VALID = 1;
    }
    if (!file_put_contents($Schaltung[$arg], $var)) {
    echo "ERROR: Kann Datei ".$Schaltung[$arg]." nicht beschreiben!<br/>";
    }
    }
    }
    [/php]


    Jetzt bauen wir uns ein Formular in dem die jeweiligen Dateien ausgelesen und je nach Zustand benannt werden - ist der Inhalt der Datei "Aus" wird der Button mit "An" beschriftet usw:
    [code=php]
    echo "<form action='' method='POST'>\n";
    foreach ($Schaltung AS $WHERE => $FILE) {
    echo " <p><b>".$Schaltung."</b><br/>\n";
    $STATE = file_get_contents($FILE);
    if ($STATE == "An") {
    echo " <button type='submit' name='".$WHERE."' value='Aus'>Aus</button>\n";
    } else if ($STATE == "Aus") {
    echo " &nbsp;<button type='submit' name='".$WHERE."' value='An'>An</button>\n";
    } else {
    echo " &nbsp;<button type='submit' name='".$WHERE."' value='An'>An</button>\n";
    }
    echo " </p>\n";
    }
    echo "</form>\n";
    [/php]

    Und dann brauche wir noch eine Funktion um zu prüfen ob die exec(); Befehle erfolgreich waren:
    [code=php]
    if (isset($return_var) AND $return_var >= 1) {
    echo "ERROR: ".exitcode($return_var)."<br/>\n";
    }
    if (isset($output) AND !empty($output)) {
    foreach ($output AS $line) { echo "$line<br/>\n"; }
    }

    function exitcode($code) {
    $ReturnCode['0'] = "Successful";
    $ReturnCode['1'] = "General Error (Miscellaneous errors, such as 'divide by zero' and other impermissible operations)";
    $ReturnCode['2'] = "Incorrect Usage";
    $ReturnCode['126'] = "Command found but not executable (Permission problem)";
    $ReturnCode['127'] = "Command not found (Possible problem with PATH or a typo)";
    $ReturnCode['128'] = "Invalid argument to exit (exit takes only integer args in the range 0 - 255)";
    $ReturnCode['130'] = "Script terminated by Control-C";
    return $ReturnCode[$code];
    }
    ?>

    </body>
    </html>
    [/php]


    Vollständiges Script:

    &quot;index.php&quot;

    [code=php]<!DOCTYPE html>
    <html>
    <head>
    <title>Schalten</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <meta name="robots" content="DISALLOW">
    </head>
    <body>
    <?php
    //---------- CONFIG - START

    $Schaltung['Wohnzimmer'] = "/var/www/.wohnzimmer.txt";
    $Schaltung['Schlafzimmer'] = "/var/www/.schlafzimmer.txt";
    $Schaltung['Badezimmer'] = "/var/www/.badezimmer.txt";

    $GPIO['Wohnzimmer'] = 22;
    $GPIO['Schlafzimmer'] = 24;
    $GPIO['Badezimmer'] = 27;

    //---------- CONFIG - END


    if (isset($_POST) AND !empty($_POST)) {
    $VALID = 0;
    foreach ($_POST AS $arg => $var) {
    if ($arg == "Wohnzimmer") {
    if ($var == "An") {
    # hier dein code einfuegen zum schalten, zB mithilfe von GPIO.
    exec("gpio -g write ".$GPIO[$arg]." 1", $output, $return_var);
    } else if ($var == "Aus") {
    # hier dein code einfuegen zum schalten, zB mithilfe von GPIO.
    exec("gpio -g write ".$GPIO[$arg]." 0", $output, $return_var);
    }
    $VALID = 1;
    } else if ($arg == "Schlafzimmer") {
    if ($var == "An") {
    # hier dein code einfuegen zum schalten, zB mithilfe von GPIO.
    exec("gpio -g write ".$GPIO[$arg]." 1", $output, $return_var);
    } else if ($var == "Aus") {
    # hier dein code einfuegen zum schalten, zB mithilfe von GPIO.
    exec("gpio -g write ".$GPIO[$arg]." 0", $output, $return_var);
    }
    $VALID = 1;
    } else if ($arg == "Badezimmer") {
    if ($var == "An") {
    # hier dein code einfuegen zum schalten, zB mithilfe von GPIO.
    exec("gpio -g write ".$GPIO[$arg]." 1", $output, $return_var);
    } else if ($var == "Aus") {
    # hier dein code einfuegen zum schalten, zB mithilfe von GPIO.
    exec("gpio -g write ".$GPIO[$arg]." 0", $output, $return_var);
    }
    $VALID = 1;
    }
    if (!file_put_contents($Schaltung[$arg], $var)) {
    echo "ERROR: Kann Datei ".$Schaltung[$arg]." nicht beschreiben!<br/>";
    }
    }
    }

    echo "<form action='' method='POST'>\n";
    foreach ($Schaltung AS $WHERE => $FILE) {
    echo " <p><b>".$Schaltung."</b><br/>\n";
    $STATE = file_get_contents($FILE);
    if ($STATE == "An") {
    echo " <button type='submit' name='".$WHERE."' value='Aus'>Aus</button>\n";
    } else if ($STATE == "Aus") {
    echo " &nbsp;<button type='submit' name='".$WHERE."' value='An'>An</button>\n";
    } else {
    echo " &nbsp;<button type='submit' name='".$WHERE."' value='An'>An</button>\n";
    }
    echo " </p>\n";
    }
    echo "</form>\n";


    if (isset($return_var) AND $return_var >= 1) {
    echo "ERROR: ".exitcode($return_var)."<br/>\n";
    }
    if (isset($output) AND !empty($output)) {
    foreach ($output AS $line) { echo "$line<br/>\n"; }
    }

    function exitcode($code) {
    $ReturnCode['0'] = "Successful";
    $ReturnCode['1'] = "General Error (Miscellaneous errors, such as 'divide by zero' and other impermissible operations)";
    $ReturnCode['2'] = "Incorrect Usage";
    $ReturnCode['126'] = "Command found but not executable (Permission problem)";
    $ReturnCode['127'] = "Command not found (Possible problem with PATH or a typo)";
    $ReturnCode['128'] = "Invalid argument to exit (exit takes only integer args in the range 0 - 255)";
    $ReturnCode['130'] = "Script terminated by Control-C";
    return $ReturnCode[$code];
    }
    ?>

    </body>
    </html>[/php]

  • Für solche temporären Dateien würde ich mir aber ein kleines RAM Laufwerk einrichten. Das schont dann die SD Karte.

    z.B.:

    Code
    tmpfs           /ram            tmpfs   size=500k         0       0


    in der Datei /etc/fstab einfügen, und man hat unter /ram dann ein halbes MB großes Laufwerk, was nur im Speicher ist.
    Auf die Karte speichern muss man das ja nur, wenn der RPi evtl mal rebooted.
    So hast du aber dann sehr viel länger was von der SD Karte, da es die Schreibzugriffe um einiges verringert.

  • Naja, normalerweise bin ich auch ein starker Verfächter von tmpfs - anstatt dafür extra ein Verzeichnis anzulegen könnte man in /etc/default/tmpfs auch einfach /tmp/ dafür aktivieren und die Dateien dort ablegen...

    Allerdings ist das flüchtig, dh nach einem Reboot sind die Dateien weg und genau das könnte hier zum Verhängnis werden... Wird der Pi unfreiwillig neu gestartet sind auch diese "Schalt Zustand"s Dateien weg und es kann der letzte Zustand nicht mehr nachvollzogen werden.
    Gegen freiwillige Neustartes kann man sich auch Scripts erstellen die das dann weg sichern usw aber das funktioniert nicht bei unfreiwilligen Neustarts.

    Die Belastung für die SD sollte bei diesen kleinen/wenigen Dateien aber eher mager ausfallen - wirklich viel oder oft wird da nicht geschrieben. Dann sollte man sich lieber Sorgen um /var/log/ machen bevor man wegen sowas banalem wie hier so ein Aufwand betreibt :D

    Forumsuche nach: varlog


    PS: tmpfs ist etwas anderes als ramfs. Ein "RAM Laufwerk" würde sich nur auf den RAM beschränken, tmpfs allerdings nutzt auch SWAP wenn kein RAM mehr zur Verfügung steht. Das ist besser da sonst durch solch ein "RAM Laufwerk" andere Programm abschmieren könnten aufgrund von zu wenig Arbeitsspeicher.

  • Ich denke auch das die "Belastung" der Karte minimal ist, wenn ich da am Tag, wenns hochkommt, 20 Schaltvorgänge mit tätige ist das schon viel.
    Aber trotzdem vielen Dank für den Hinweis!!

Jetzt mitmachen!

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