Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][CSS][PHP]button/guzik do sterowania przekaźnikiem
Forum PHP.pl > Forum > Przedszkole
piterek-23
Witam,

Panowie/Panie, jak zrobić stronkę w php (wydaje mi się, że będzie najlepiej) aby można było sterować przekaźnikami na serwerze?

Mam programik dzięki któremu steruje (konsola Linux, Debian) w ten sposób:
/var/www/power.sh on 1 -włączy przekaźnik nr.1
/var/www/power.sh off 1 -wyłączy przekaźnik nr.1
/var/www/power.sh status 1 -wyświetli status (on/off) przekaźnika nr.1

Do sedna... jak to zrobić, aby na stronie była ikona (ikony-docelowo około 100) która jest obrazkiem on.png lub off.png (według statusu) a jak ją kliknę to się zmieni w stan przeciwny?

Tak na chłopski rozum... Otwieram przeglądarkę, wchodzę na swoją stronę i wyświetlają mi się ikony z aktualnym stanem przekaźników. Kliknę na ikonę z np. "on", a ona mi się zmieni na "off" i w tle uruchomi program, czyli wyłączam przekaźnik.
by_ikar
  1. <?php
  2.  
  3. $power = empty($_GET['power']) ? false : $_GET['power'];
  4.  
  5. if(false !== $power)
  6. {
  7. exec('power.sh '.('on' == $power ? 'on' : 'off'));
  8. }
  9.  
  10. echo '<a href="'.$_SERVER['PHP_SELF'].'?power=on"><img src="images/on.png"></a> <-> <a href="'.$_SERVER['PHP_SELF'].'?power=off"><img src="images/off.png"></a>';
piterek-23
Chyba nie bardzo umiem to zastosować-nie działa, nic się nie dzieje po kliknięciu na ikonę.
To co pokazałeś to dwie ikony, a można zrobić tak aby to była jedna ikonka-takie wszystko w jednym?
by_ikar
Można tak zrobić żeby była jedna ikona, tyle że wtedy powiedzmy twój power.sh musiał by zwracać stan w jakim się znajduje, w przeciwnym wypadku, możesz się już tylko sugerować tym czy przed chwilą został użyty "włącznik", tyle że wtedy kiedy otworzyłbyś stronę jeszcze raz, znów było by ON zamiast OFF. To jest tylko przykład jak może to być zrobione, pod warunkiem że niektóre dane podmienisz, bo ja nie wiem co ty tam masz. Jeżeli sobie z czymś takim nie radzisz (tzn nie rozumiesz tego co ci wysłałem) to przykro mi, ale nie wiem czy jestem w stanie ci jakoś to wytłumaczyć, ponieważ to są absolutne podstawy co ci tutaj wysłałem.

Możesz do tego przykładu dodać sobie wyświetlanie co zwraca exec:

  1. <?php
  2.  
  3. $power = empty($_GET['power']) ? false : $_GET['power'];
  4.  
  5. if(false !== $power)
  6. {
  7. echo exec('power.sh '.('on' == $power ? 'on' : 'off'));
  8. }
  9.  
  10. echo '<a href="'.$_SERVER['PHP_SELF'].'?power=on"><img src="images/on.png"></a> <-> <a href="'.$_SERVER['PHP_SELF'].'?power=off"><img src="images/off.png"></a>';


W ten sposób będziesz mógł sprawdzić czy komenda się wykonuje lub czy nie wyświetla jakichś błędów (np niepoprawna ścieżka do power.sh).
piterek-23
Z pomocą wujka Google zrobiłem coś takiego
  1. <?
  2. if($_GET[on]=="on"){
  3. $script="/var/www/power.sh on 1";
  4. $message=shell_exec($script);
  5. header("Location: test.php");
  6. }
  7. if($_GET[off]=="off"){
  8. $script="/var/www/power.sh off 1";
  9. $message=shell_exec($script);
  10. header("Location: test.php");
  11. }
  12. ?>
  13. <html>
  14. <a href="?on=on"><img src="images/on.png"></a>
  15. <a href="?off=off"><img src="images/off.png"></a>
  16. </html>

Na stronie mam dwa guziki "on" i "off" wszystko działa.
Jak teraz zrobić aby to był jeden obrazek, a nie dwa ?
Jak to zrobić aby obrazek (obazek 2w1-on/off) sam się ustawił do stanu?

Napisałem skrypt /var/www/status1.sh który sprawdza stan:

#!/bin/bash

status1=$(/var/www/power.sh status 1)
echo "$status1"

Po wywołaniu w konsoli podaje stan "on" lub "off" zależnie od stanu przekaźnika 1

Jak to teraz wszysko wsadzić w jeden "guzik"?
nospor
Skoro masz wartosc to robisz prosty IF ELSE i wyswietlasz odpowiedni guzi w zaleznosci od wartosci
piterek-23
Cytat(nospor @ 20.08.2014, 14:15:55 ) *
Skoro masz wartosc to robisz prosty IF ELSE i wyswietlasz odpowiedni guzi w zaleznosci od wartosci


Możesz coś więcej powiedzieć?
Skrypt BASH jeszcze potrafię sobie napisać, ale PHP, HTML to czarna magia dla mnie sad.gif
CuteOne
  1. if($_GET[on]=="on"){
  2. $script="/var/www/power.sh on 1";
  3. $message=shell_exec($script);
  4. header("Location: test.php");
  5. }
  6. else {
  7. $script="/var/www/power.sh off 1";
  8. $message=shell_exec($script);
  9. header("Location: test.php");
  10. }
  11. ?>
nospor
Dzis jakaś mania nieczytania ze zrozumieniem....

@CuteOne chodzi o to by się pojawiał jeden guzik a nie jak teraz dwa naraz... Jeden guzik a nie jeden IF ELSE.... tongue.gif

To są guziki
<a href="?on=on"><img src="images/on.png"></a>
<a href="?off=off"><img src="images/off.png"></a>

To one mają być w IF. Teraz jak już wszystko jasne, to możesz pomóc jeszcze raz CuteOne smile.gif
nospor
To weź sie wkoncu obudz bo skrypt jest nadal bledny.... Nigdzie nie inicjalizujesz zmiennej $icon. Weź pod uwage fakt, że gdy pierwszy raz wejdziesz w skrypt to ani OFF a ni ON nie pojdzie.

$icon ma byc ustalona na podstawie statusu ktory jest w zmiennej $status, a nie na podstawie wcisnietego guzika... Zeby takie podstawy musiec jeszcze tlumaczyc.,.. tongue.gif
nospor
Po odswiezeniu nadal masz zle. Powtarzam po raz kolejny
Cytat
$icon ma byc ustalona na podstawie statusu ktory jest w zmiennej $status, a nie na podstawie wcisnietego guzika



edit:
Aj, @CuteOne, nieladnie tak kasowac posty, na ktore ktos odpowiadał :/ A juz szczegolnie ze było tam 95% odpowiedzi i wystarczylo zrobic drobną poprawkę
piterek-23
Kolego @CuteOne
Możesz jeszcze raz pokazać kod o którym mówi @nospor?
Rochu
Jeżeli wszystko dobrze zrozumiałem to by tak to miało wyglądać + dodałem warunek, by nie było możliwości wywoływać ponownego uruchomienia, kiedy jest już on aktywny

  1. <?php
  2.  
  3. $status = shell_exec("/var/www/status1.sh"); //pobierasz aktualny status
  4.  
  5. if( in_array($_GET["action"], array("on", "off")) && $_GET["action"] != $status ){
  6.  
  7. $script = "/var/www/power.sh ".$_GET["action"]." 1";
  8. $message = shell_exec($script);
  9. header("Location: test.php");
  10.  
  11. }
  12.  
  13. $icon = ($status == "on") ? '<a href="?action=off"><img src="images/off.png"></a>' : '<a href="?action=on"><img src="images/on.png"></a>';
  14.  
  15. ?>
  16.  
  17. <html>
  18. <?php echo $icon; ?>
  19. </html>
piterek-23
Kolego @Rochu
Coś jest nie tak, bo jak wejdę na stronę to pokazuje mi się ikonka "off" (nie zależnie czy jest włączony czy nie przekaźnik) mogę na nią kliknąć tylko raz. Jeżeli jest wyłączony przekaźnik to go włączę i na tym koniec. Gdy jest włączony to nic nie zrobię sad.gif

Czy w ogóle da się coś takiego zrobić jak sobie wymyśliłem?
nospor
No dobra, ale skopiowales to bezmyslnie:
$status = shell_exec("/var/www/status1.sh")
?
Czy moze jednak podstawiles swoją komende? Bo przeciez na sprawdzanie statusu masz inną komendę niz podano ci w kodzie.
piterek-23
Kolego @nospor
Tak zmieniłem ścieżki, @Rochu odwołał się do skryptu /status1.sh o którym pisałem. Ten skrypt również poda stan.
nospor
No dobra, a patrzyles czy ten skrypt w podanym kodzie zwraca ci poprawną wartosc?

$status = shell_exec("/var/www/status1.sh")
var_dump($status);

wyswietla to co ma wyswietlac?
piterek-23
Odczytuje, ale "guzik nie przełącza.
Stan dobrze odczytuje.
https://imageshack.com/i/p5XX20TEj (czy tu na forum można wrzucać obrazki?)
nospor
No wlasnie masz złe wartosci. Widac wyraznie, ze masz na koncu dodane dwa biale znaki, np. dwie spacje...

Tak ma byc:
$status = shell_exec("/var/www/status1.sh"); //pobierasz aktualny status
$status = trim($status); //wyrzucenie bialych znakow
piterek-23
Teraz już ładnie pobiera status i odpowiednia ikona (on.png, off.png) ustawia się do aktualnego stanu przekaźnika smile.gif
Nie mogę teraz sobie przełączać on/off "guzikiem sad.gif
nospor
Ale ze co, nie dziala zmiana on/off po kliknieciu w guzik?

Zamiast
if( in_array($_GET["action"], array("on", "off")) && $_GET["action"] != $status ){
daj
if( in_array($_GET["action"], array("on", "off"))){

Jesli to nie pomoze to sprawdz czy w ogole ci wchodzi w tego IFa i czy poprawnie teb skrypt sie wykonuje
piterek-23
Mój skrypt teraz wyglada tak:
  1. <?
  2. if($_GET[on] == "on"){
  3. $script = "/var/www/power.sh on 1";
  4. $message = shell_exec($script);
  5. header("Location: test.php");
  6. }
  7. if($_GET[off] == "off"){
  8. $script = "/var/www/power.sh off 1";
  9. $message = shell_exec($script);
  10. header("Location: test.php");
  11. }
  12.  
  13. $script = "/var/www/power.sh status 1";
  14. $message = shell_exec($script);
  15. $message = trim($message)
  16. ?>
  17. <html>
  18. <?php
  19. if($message == "on" )echo '<a href="?off=off"><img src="images/on.png"></a>';
  20. else echo '<a href="?on=on"><img src="images/off.png"></a>';
  21. ?>
  22. </html>

Działa wszystko idealnie tak jak chciałem smile.gif
Jak teraz zrobić gdybym chciał mieć 100szt. takich przekaźników, po kilka na stronie, a jako tło zarys ścian?
nospor
No to oprocz ON OFF musisz tez przekazywac informacje o identyfikatorze przekaźnika by wiedziec,ktory masz przełączac.
piterek-23
Tak tylko się zastanawiam, że będzie problem z odczytami, ponieważ przekaźniki są na kartach po 8szt. a karty spięte magistralom RS485. Na RS485 w jednej chwili można tylko wysyłać lub tylko odbierać dane sad.gif
Chyba muszę coś takiego wymyślić, aby stan był sprawdzany globalnie dla wszystkich "guzików"
CuteOne
Zrób prosty test

  1. echo trim(shell_exec("/var/www/power.sh status 1"));
  2. shell_exec("/var/www/power.sh on 1");
  3. echo '<br />';
  4. echo trim(shell_exec("/var/www/power.sh status 2"));
  5. shell_exec("/var/www/power.sh on 2");
  6.  
  7. echo '<br /><br />';
  8. echo trim(shell_exec("/var/www/power.sh status 1"));
  9. echo trim(shell_exec("/var/www/power.sh status 2"));
piterek-23
Cytat(CuteOne @ 21.08.2014, 16:11:48 ) *
Zrób prosty test

Jak mam zrobić ten prosty test?

Przepraszam, ale jestem zielony jak szczypiorek na wiosnę sciana.gif
Wszystko robię w oparciu o Wasze podpowiedzi, Google i różne poradniki dostępne w sieci.
nospor
No przeciez ci CuteOne od razu ten test napisał.... ty masz go jedynie odpalic...
CuteOne
Zapisz mój kod do pliku i odpal. Wynik wrzuć na forum
piterek-23
Zapisałem to jako test2.php i odpaliłem w przeglądarce, a w niej otrzymałem:
  1. off
  2. off
  3.  
  4. onon

oraz przekaźniki 1 i 2 włączyły się.


Mam jeszcze update skryptu /var/www/power.sh
Komendą "/var/www/power.sh stan" wyświetli stan wszystkich przekaźników:
  1. 1:on
  2. 2:on
  3. 3:off
  4. 4:off
  5. 5:off
  6. 6:off
  7. 7:off
  8. 8:off
  9. itd.
CuteOne
Ok czyli możesz wysyłać i odbierać dane bez żadnych komplikacji. Teraz zostaje Ci już tylko napisanie odpowiedniego programiku smile.gif

Najpierw stwórz sobie plik główny np. index.php, wrzuć do niego to
  1. <form action="/przekaznik.php" method="post">
  2. <select name="nr">
  3. <option value="1">1</option> numery płytek
  4. <option value="2">2</option>
  5. <option value="3">3</option>
  6. itd..
  7. </select>
  8. <input type="submit" name="submit" value="Go!" />
  9. </form>


przekaznik.php
  1. <?php
  2. if (!array_key_exists('nr', $_POST['nr'])) header("Location: index.php");
  3.  
  4. $stany= explode(',', trim(shell_exec("/var/www/power.sh stan ".$_POST['nr'])));
  5. ?>
  6. <table>
  7. <tbody>
  8. <tr>
  9. <?php foreach ($stany as $k => $stan) : ?>
  10. <td>
  11. <a href="/zmien_stan.php?nr=<?= $_POST['nr']; ?>&status=<?= ($stan == 'on') ? 'off' : 'on'; ?>">
  12. <img src="images/<?= $stan; ?>.png">
  13. </a>
  14. </td>
  15. <?php
  16. if ($k % 4 == 1) echo '</tr><tr>';
  17. ?>
  18. <?php endforeach; ?>
  19. </tr>
  20. </tbody>
  21. </table>


Teraz tak:
- niech /var/www/power.sh stan przyjmuje nr płytki np. /var/www/power.sh stan 2 i zwracała tylko stany tych przekaźników
- /var/www/power.sh stan musi zwrócić stany rozdzielone przecinkami np. on,off,on,off

plik zmien_stan.php pozostawię tobie do zrobienia smile.gif

ps. pisane z palca, więc coś może nie działać smile.gif
ps2. mam nadzieję, że nie wykorzystujesz tego w jakieś elektrowni? tongue.gif
piterek-23
Cytat(CuteOne @ 21.08.2014, 17:52:37 ) *
ps2. mam nadzieję, że nie wykorzystujesz tego w jakieś elektrowni? tongue.gif

Nie, nie, to nie elektrownia to mój dom wink.gif
Z tą setką przekaźników to tak tylko palnąłem, ale 50szt. szybko się uzbiera smile.gif

Bardzo dziękuję za skrypty, ale nie do końca mi chodziło o to, żeby sterować każdą płytką z osobna.

Może bardziej obrazowo powiem co chcę uzyskać...
Wchodzę na swoją stronkę i-dom (he, he, nawet fajna nazwa) na podstronę np. salon i tam jest kilka, kilkanaście "guzików"-światło gniazdka, lampka itp. itd. czyli steruje sobie domkiem...
Czyli kilka podstron bo mam kilka pomieszczeń w domu.
Na każdej podstronie chciałbym używać 10-20 "guzików" i tak sobie myślę, że zrobiłbym to na podstawie skryptu power.sh. Czyli każde pomieszczenie ma swój skrypt. Czyli każda podstrona ma swój skrypt wykonawczy w którym są zdefiniowane wszystkie przekaźniki dla danego pomieszczenia.
Jak to teraz zrobić, aby każdy guzik z osobna nie pytał o stan tylko jeden guzik (obojętnie który zostanie kliknięty) pytając o stan ustawi je od razu dla wszystkich?

Panowie,

Naczytałem się jak głupi i normalnie jestem... głupi...
Im więcej czytam co, jak i do czego tym mniej wiem...

Napisałem coś takiego:
  1. <?php
  2. ?>
  3. <?php
  4. include("php_serial.class.php");
  5. $serial = new phpSerial();
  6. $serial->deviceSet("/dev/ttyS0");
  7. $serial->confBaudRate(19200);
  8. $serial->confParity("none");
  9. $serial->confCharacterLength(8);
  10. $serial->confStopBits(1);
  11. $serial->confFlowControl("none");
  12.  
  13. if($_GET[on] == "on"){
  14. $serial->deviceOpen();
  15. $serial->sendMessage("1711\r");
  16. header("Location: test.php");
  17. }
  18. if($_GET[off] == "off"){
  19. $serial->deviceOpen();
  20. $serial->sendMessage("1710\r");
  21. header("Location: test.php");
  22. }
  23. $status = trim(shell_exec("/var/www/power.sh status 1"))
  24. ?>
  25. <html>
  26. <?php
  27. if($status == "on" )
  28. echo '<a href="?off=off"><img style="width: 50px; height: 50px;" src="images/b_on.png"></a>';
  29. else
  30. echo '<a href="?on=on"><img style="width: 50px; height: 50px;" src="images/b_off.png"></a>';
  31. ?>
  32. </html>

Czyli odczytuje stan poprzez mój skrypt Bash-power.sh, a stan zmieniam prosto z PHP->karta przekaźników.
Jak wysłać komendę i odczytywać stan w PHP, pomijając całkowicie zewnętrzny skrypt?
Jak odczytać port /dev/ttyS0 w PHP?
xxdrago
nie chce mi się czytać już całości..

robiłem coś podobnego tylko zrobiłem sobie to na sesjach:
http://forum.php.pl/index.php?showtopic=193091

Ale zamiast sesji, można odczytywać stan lini i zwracać do php...

http://serwis.avt.pl/manuals/AVT5140.pdf
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.