3homi112: Wert eines Reglers an eine Datei weitergeben

Hallo, Ich versuche, mir eine Weboberfläche zur Steuerung von LEDs zu bauen. Dazu brauche ich den Wert des Reglers mit der id="ageInputId". Dieser soll dann bei jeder Änderung in die Datei /var/www/html/textfile.txt ausgegeben werden, wo sie dann ein Skript auf dem Server interpretiert. Mein Code sieht bisher so aus (bitte nicht zu kritisch sein, hab gestern das erste Mal was mit html/php gemacht) :

<!doctype html>
<html>
        <head>
                <meta charset="utf-8">
                <title>RGB-LED1</title>
                <link rel="stylesheet" href="../formate.css" type"text/css">
        </head>
        <body>
               <div id="menu">
                <ul>
                        <li id="start"> <a href="../index.html" >Geräteübersicht</a></li>
                        <li id="aktuell"> <a href="led1.html">RGB-LED1</a></li>
                        <!--<li> <a href="led2.html">RGB-LED2</li>-->
                </ul>
               </div>
               <div id="farbkreis_rgb">
                <figure>
                        <img src="../img/farbkreis_rgb.png" width="450" height="450" alt="Farbkreis">
                </figure>
               </div>
               <div id="onoff">
                <label class="switch">
                        <input type="checkbox" name="onoff">
                        <div class="slider round"></div>
                </label>
               </div>
               <div id="helligkeit">
                <form name="helligkeit_form">
                        <input type="range" name="ageInputName" id="ageInputId" value="100" min="0" max="100" oninput="ageOutputId.value = ageInputId.value">
                        Helligkeit:<output name="ageOutputName" id="ageOutputId">100</output>%
                </form>
               </div>
<?php
                $f = fopen("/var/www/html/textfile.txt", 'w');
                $var = $_POST['ageOutputName'];
                fwrite($f, $var);
                fclose($f);
                echo $var;
        ?>
</body>

</html>

Jemand eine Idee was daran nicht funktioniert?

MfG 3homi112

  1. den Wert des Reglers mit der id="ageInputId". Dieser soll dann bei jeder Änderung in die Datei /var/www/html/textfile.txt ausgegeben werden

                <form name="helligkeit_form">
                        <input type="range" name="ageInputName" id="ageInputId" value="100" min="0" max="100" oninput="ageOutputId.value = ageInputId.value">
                        Helligkeit:<output name="ageOutputName" id="ageOutputId">100</output>%
                </form>
               </div>
    

    Jemand eine Idee was daran nicht funktioniert?

    Du solltest den Wert des Reglers an den Server senden, sonst wird das nichts. Im Moment schreibst du ihn nur in das Ausgabefeld ageOutputId. (Und da der Server bei jeder Änderung informiert werden soll, wirst du um Ajax nicht herumkommen. Hurra, da wird sich pl freuen …)

     <?php
               $f = fopen("/var/www/html/textfile.txt", 'w');
               $var = $_POST['ageOutputName'];
               fwrite($f, $var);
               fclose($f);
               echo $var;
       ?>
    

    Eventuell unterliegst du dem Irrtum, dass der PHP-Code im Browser ausgeführt wird. Dem ist nicht so, der bleibt auf dem Server und wird dort beim Aufruf der Seite einmalig ausgeführt. Der Browser bekommt von dem zwischen <?php und ?> nur das mit, was dort ausgegeben wird (hier in der letzten Zeile per echo).

    Desweiteren: Dein Wert steht in $_POST['ageInputName'], nicht in $_POST['ageOutputName'].

    Und das Umkopieren aus der Variablen $_POST in eine eigene Variable (Zeilen 2 und 3), ohne dabei irgendwas mit den Daten zu machen, ist bei PHP-Anfängern oft zu sehen und unnütz. Du kannst genauso gut fwrite($f, $_POST['ageInputName']); schreiben.

    1. Die Extrazeile war nur der Versuch, einen Teil umzubauen, hatte ich so in Tutorials gesehen, mich aber auch schon gefragt was das soll. Aber dass php nur Serverseitig läuft erklärt natürlich das Problem, dann muss ich mich eben in ajax reinlesen :). Mir kam vorhin noch die Idee, die Helligkeit abhängig von den Koordinaten in der Grafik zu machen, sprich wenn man weiter außen drückt, wird die Farbe dunkler und innen heller. Damit ließe sich doch auch die Farbe selbst auswählen. Sehe ich das richtig dass man das mittels input type="range" machen kann? Trotzdem schon mal danke. Grüße 3homi112

  2. Ich. Mehrere.

    1. Fehlt es an Absenden des Formulars.
    2. Wenn es denn abgesendet wird kommt folgende Fehlermeldung: PHP Notice: Undefined index: ageOutputName
    3. Das ist auch kein Wunder, weil Inhalte von <output> nicht gesendet werden.
    4. Wenn auch das gänge würdest Du den Input "ageInputName" nach dem Absenden wieder auf 100 setzen, weil Du diesen Wert fix definiert hast.
  3. Hello,

    nur als Ergänzung:

    Schau Dir auch mal die Gedanken aus diesem Thread zur Autovervollständigung an.

    Es besteht bei deiner Aufgabe ja durchaus auch die Frage, wann immer eine Änderung an den Server mitgeteilt werden soll. Soll das "kontinuierlich" geschehen, oder erst nach dem Ende des Verstellvorganges? "Kontinuierlich" würde auch nur entweder in bestimmten Zeitintervallen [Zeit(multi)plex], oder aber nach bestimmten "Spannungsänderungen" stattfinden können. Aus Erfahrung (professionelle Lichttechnik, Architektur- und Theaterlichtsteuerungen) weiß ich, dass das eine monströse philosophisch-technische Diskussion auslösen kann. Nimmt man nun noch die Unsicherheit der Übertragung per TCP hinzu (da ist Zeitgleichheit nicht garantiert), wird das eine durchaus spannende Aufgabe. Die Profisysteme übertragen daher immer den alten und den neuen Wert nebst den Zeitpunkten, zu denen sie gegolten haben.

    Für den Server (sofern es ein Linux-Host ist), empfehle ich noch die Literatur von iNotify, damit dort die Zeitverzerrung klein bleibt.

    Alternativ könntest Du anstatt in eine Datei auch direkt auf einen Socket schreiben.

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es
    Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
    1. Die Werte sollen schon nach Möglichkeit kontinuierlich geschrieben werden, aber es kommt auch nicht auf höchste Präzision an, da es sich nur um Raumbeleuchtung handelt (ca. 1s Verzögerung ist in Ordnung). Das Ganze soll später auf einem Raspberry Pi laufen, ich möchte aber in Dateien schreiben, damit ich unabhängig von der Weboberfläche die Interpretation der Werte ändern kann, da ich vielleicht noch andere Funktionen einbauen möchte (Außerdem komme ich mit bash Skripten besser klar). Zum Thema Ajax: ich hab jetzt schon den halben Tag darauf verwendet, mir da was zu basteln, aber bekomme gar keine Reaktion auf dem Server und verstehe das Ganze auch nicht wirklich. Ich hoffe das klingt jetzt nicht unverschämt oder so aber könntet ihr mir eine Vorlage für den Teil des Codes bauen? Grüße 3homi112

      1. Hello,

        ich habe Dir mal etwas gebastelt.

        <?php	### get_data.php ### utf-8 ### ÄÖÜäöü
            header('Content-Type: text/plain; Charset=utf-8');
            if (isset($_POST['level'])) echo $_POST['level'];
        ?>
        
        <!DOCTYPE HTML>
        <html>
        	<head>
        		<meta Charset="utf-8">
        		<title>Slider mit XHR</title>
        	</head>	
        	<body>
        
        		<div><input id="slider" type="range" min="0" max="100"> <span id="slidernum"></span></div>
        	
        		<script>
        			var url = "get_data.php";
        
        			(function(e, url) 
        			{
        				var tm = null;
        				var sendXHR = function() 
        				{
        					var http = new XMLHttpRequest();
        					var params = "level="+e.value;
        					http.open("POST", url, true);
        
        					//Send the proper header information along with the request
        					http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        
        					//Call a function when the state changes.
        					http.onreadystatechange = function() 
        					{
        						if(http.readyState == 4 && http.status == 200) 
        						{
        							document.getElementById('slidernum').innerHTML = http.responseText;
        			//				alert(http.responseText);
        						}
        					}
        					http.send(params);  
        				};
        
        				e.addEventListener('change', 
        				function() 
        				{
        					if(tm) 
        					{
        						window.clearTimeout(tm);
        					}
        					
        					tm = window.setTimeout(sendXHR, 200);
        				});
        			})(document.getElementById('slider'), url);
        
        		</script>
        	</body>
        </html>	
        

        Da wird noch drüber zu diskutieren sein.
        Ich habe hier jetzt aber bewusst auf jQuery verzichtet.

        Ich habe auch selber noch etliche Fragen dazu.
        Scheinbar ist beim Slider (mit Maus bedient) keine Timeoutfunktion notwendig?

        • Wie würde man das sinnvollerweise machen, wenn man mehrere Timeouts benötigen würde?
        • Wie übergibt man mehrere Parameter, die per POST gesendet werden sollen, wenn man NICHT die Schreibweise params = "level=10&color=red&blah=blubb" benutzen will?

        Liebe Grüße
        Tom S.

        --
        Es gibt nichts Gutes, außer man tut es
        Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
        1. Erstmal dankeschön :) Wenn ich das richtig lese, werden die Daten doch jetzt nur zum Server gesendet. Ich müsste also, um das in meine Datei einzufügen, noch

                      $f = fopen("/var/www/html/textfile.txt", 'w');
                      fwrite($f, $_POST['level']);
                      fclose($f);
          

          in die php einfügen? Grüße 3homi112

          1. Hello,

            Erstmal dankeschön :)

            Wenn Du den Eventlistener mit change anlegst, so wie im Beispiel, und nicht mit input, dann kannst du den Wrapper mit dem setTimeout wieder rausoperieren.

            Wenn ich das richtig lese, werden die Daten doch jetzt nur zum Server gesendet. Ich müsste also, um das in meine Datei einzufügen, noch

                        $f = fopen("/var/www/html/textfile.txt", 'w');
                        fwrite($f, $_POST['level']);
                        fclose($f);
            

            in die php einfügen?

            Im Prinzip schon. Du solltest aber Filelocking vorsehen fürs Lesen und Schreiben. Außerdem brauchst Du die Datei dann nicht ständig zu öffnen und zu schließen, sondern nur locken (LOCKEX), Zeiger auf Anfang, schreiben, flushen, truncaten und entsperren, bzw auf LOCKSH zurücksetzen. Der zweite Prozess, der sie auslesen soll, kann dann die Datei ebenfalls offenhalten. Er versucht dann nur, mit LOCKSH zu sperren (was aber erst geht, wenn der erste Prozess von LOCKEX auf LOCKSH zurückgeschaltet hat), den Dateizeiger auf den Anfang zurückzusetzen, zu lesen und wieder zu entsperren.

            Liebe Grüße
            Tom S.

            --
            Es gibt nichts Gutes, außer man tut es
            Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
            1. Hello,

              wenn du mit einem "normalen" Responder (also php-Script) arbeitest, musst Du leider DieDatei doch jedes Mal erneut öffnen. Ich hatte da wohl noch den Socket im Gedächtnis, auf den Du mit dem XHR schreiben könntest. Da würde das Responder-Script dann wie ein Server dauernd laufen.

              Liebe Grüße
              Tom S.

              --
              Es gibt nichts Gutes, außer man tut es
              Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
            2. So ich habe das ganze gerade mal eingebaut, funktioniert wunderbar. Die Verzögerung liegt bei 10 Ausführungen meines bash Skriptes pro Sekunde bei unter einer halben Sekunde Verzögerung, ist also völlig in Ordnung.

              Wie übergibt man mehrere Parameter, die per POST gesendet werden sollen, wenn man NICHT die Schreibweise params = "level=10&color=red&blah=blubb" benutzen will?

              Zielt die Frage auf mein Vorhaben ab, die "Klick-Koordinaten" auf dem Bild auszulesen?

              Jetzt noch Fragen zum Verständnis (damit ich das ganze auch alleine weiterverwenden kann):

              var params ="level="+e.value;
              

              legt für die Variable "params" den Wert "level=Wertvon<span id="slidernum">" fest? Aber woher bekommt <span> seinen Wert?

              "params" wird dann mittels http.send(params); an das php Skript gesendet und taucht da als Variable "level" auf?

              Würden wie bei <input type="image"> zwei Variablen ausgegeben, wie kann ich diese dann an php weitergeben?

              Zuletzt noch eine Frage zur Funktion: sollte die Änderung "live" an den Server übertragen werden oder ist es richtig, dass sie erst nach dem loslassen des sliders übergeben wird?

              Jetzt reicht es auch mit Fragen, hoffentlich ist es nicht zu viel geworden.

              Grüße 3homi112

              Edit: da ich schon eine Weile an der Antwort schreibe, habe ich deine Antwort erst jetzt gesehen :D. Hatte ich ohnehin gemacht, ich wollte erst sehen, dass das überhaupt funktioniert

              --

              In stillem Gedenken an die Demokratie in der Türkei

              1. Hello,

                So ich habe das ganze gerade mal eingebaut, funktioniert wunderbar. Die Verzögerung liegt bei 10 Ausführungen meines bash Skriptes pro Sekunde bei unter einer halben Sekunde Verzögerung, ist also völlig in Ordnung.

                Hast Du an das Locking und das Flushen gedacht?

                Wie übergibt man mehrere Parameter, die per POST gesendet werden sollen, wenn man NICHT die Schreibweise params = "level=10&color=red&blah=blubb" benutzen will?

                Zielt die Frage auf mein Vorhaben ab, die "Klick-Koordinaten" auf dem Bild auszulesen?

                Das ist mehr eine Erinnerung an mich selbst, das noch herauszufinden...

                Jetzt noch Fragen zum Verständnis (damit ich das ganze auch alleine weiterverwenden kann):

                var params ="level="+e.value;
                

                legt für die Variable "params" den Wert "level=Wertvon<span id="slidernum">" fest?

                Nein, das holt den Wert von e. Und e wird beim Aufruf der anonymen Funktion (Closure) ganz unten übergeben mii document.getElementById('slider'). Wie das genau funktioniert hat Christian in dem verlinkten Thread zur Autovervollständigung erklärt und steht auch im Wiki unter "Closure".

                Aber woher bekommt <span> seinen Wert?

                Der wird ihm durch den XHR.response-Handler zugewiesen, der vom PHP-Responder kommt.

                "params" wird dann mittels http.send(params); an das php Skript gesendet und taucht da als Variable "level" auf?

                Fast richtig. Params tauchen als Postparameter im Responder auf, weil wir ja für den XHR die Methode "POST" vereinbart haben.

                Würden wie bei <input type="image"> zwei Variablen ausgegeben, wie kann ich diese dann an php weitergeben?

                Indem Du z. B. einen Parameterstring, wie oben beschrieben zusammenbaust. Das kann man aber auch anders machen. Muss ich morgen nochmal suchen. Mit jQuery geht es ganz bequem, hat aber eben eine Menge Overhead für das jQuery-Modul.

                Zuletzt noch eine Frage zur Funktion: sollte die Änderung "live" an den Server übertragen werden oder ist es richtig, dass sie erst nach dem loslassen des sliders übergeben wird?

                Mit dem Event "change" überträgt der Slider immer erst beim Loslassen, mit dem Event "input" feuert er bei jeder Bewegung in Schrittweite.

                Die setTimeout-Geschichte kannst Du beim Slider vermutlich weglassen, wenn die Schrittweite passend gewählt wird. In der professionellen Lichttechnik werden mindestens 760 Schritte zwischen 0 und 100% benötigt, damit man die Differenzen nicht mehr sehen kann. Aber DMX-512-A kann auch nur 8 Bit Auflösung.

                Für den Bedienkomfort würde ich daher "input" als Event wählen. Das produziert dann aber etsprechend viele Requests und deine Abfrageschleife muss auch entsprechend schnell sein.

                Jetzt reicht es auch mit Fragen, hoffentlich ist es nicht zu viel geworden.

                Morgen gerne mehr vom Desktop...

                Edit: da ich schon eine Weile an der Antwort schreibe, habe ich deine Antwort erst jetzt gesehen :D. Hatte ich ohnehin gemacht, ich wollte erst sehen, dass das überhaupt funktioniert

                In stillem Gedenken an die Demokratie in der Türkei

                Da werden wir in den nächsten Monaten ca. 4.000.000 türkische politische Flüchtlinge bekommen

                Liebe Grüße
                Tom S.

                --
                Es gibt nichts Gutes, außer man tut es
                Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
                1. Hello,

                  Wie übergibt man mehrere Parameter, die per POST gesendet werden sollen, wenn man NICHT die Schreibweise params = "level=10&color=red&blah=blubb" benutzen will?

                  Zielt die Frage auf mein Vorhaben ab, die "Klick-Koordinaten" auf dem Bild auszulesen?

                  Das ist mehr eine Erinnerung an mich selbst, das noch herauszufinden...

                  Und hier die Antwort, wie es mit "simple JavaScript" ganz bequem geht:

                      var data = new FormData();
                  
                      data.append('user', 'Thomas');
                      data.append('pwd', 'Läbenskünßtler ');	
                      data.append('level', e.value);
                  

                  Der Browser macht dann daraus diesen Datenanhang. Die Boundaries werden vom FormData()-Objekt selber angelegt. Man darf daher auch KEINEN Content-Type festlegen! Der passende Header wird ebenfalls vom FormData()-Objekt veranlasst.

                  NICHT machen: http.setRequestHeader('Content-Type', ' multipart/form-data');

                  -----------------------------88191506118932
                  Content-Disposition: form-data; name="user"
                  
                  Thomas
                  -----------------------------88191506118932
                  Content-Disposition: form-data; name="pwd"
                  
                  Läbenskünßtler 
                  -----------------------------88191506118932
                  Content-Disposition: form-data; name="level"
                  
                  34
                  -----------------------------88191506118932--
                  

                  So kommen dann bei PHP die Daten im POST-Array an.
                  Ich habe hier bei den Daten nichts umkodiert, weil das Dokument mit utf-8 arbeitet.

                  Liebe Grüße
                  Tom S.

                  --
                  Es gibt nichts Gutes, außer man tut es
                  Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
                2. Hast Du an das Locking und das Flushen gedacht?

                  Hast du nicht hier:

                  wenn du mit einem "normalen" Responder (also php-Script) arbeitest, musst Du leider DieDatei doch jedes Mal erneut öffnen.

                  gesagt, dass das nicht funktioniert?

                  1. Hello,

                    Hast Du an das Locking und das Flushen gedacht?

                    Hast du nicht hier:

                    wenn du mit einem "normalen" Responder (also php-Script) arbeitest, musst Du leider DieDatei doch jedes Mal erneut öffnen.

                    gesagt, dass das nicht funktioniert?

                    Das sind zwei verfschiedene Schuhe. Locking benötigst Du eigentlich immer, wenn mehrere Prozesse zeitgleich auf dieselben Daten zugreifen können sollen und mindestens einer davon auch schreiben darf.

                    das fflush() sollte eigentlich automatisch beim Schließen mit fclose() passieren, genauso, wie das flock(LOCK_UN). Leider hatten die PHP-Entwickler da zwischendurch mal einen Knoten im Kopf. Ich weiß nun den aktuellen Stand nicht.

                    Wenn Du die Synchronisation zwischen schreibendem und lesenden Prozess nicht aufs Spiel setzen willst, darfst Du die Datei auch nicht jedes Mal neu erzeugen, sondern musst von beiden Prozessen auf eine bestehende Datei zugreifen. Deshalb benötigt Du in beiden Prozessen eine gemeinsame Locking-Methode. PHP verwendet von Haus aus "Advisory Locking". Wenn auch nur ein einziger beteiligter Prozess dies nicht einhält, ist die Strategie kaputt.

                    Und nach dem Schreiben der Daten muss die Datei auf die geschriebene Länge gekürzt werden fruncate(), solange sie noch gesperrt ist.

                    Du solltest also zum Beschreiben benutzen, wenn nur ein Datenwert in der Datei stehen soll:

                    $fp = fopen('dateiname', 'rb+');
                    flock ($fp, LOCK_EX);
                    fwrite($fp, $data);
                    # fflush($fp);   ### sollte eigentlich überflüssig sein
                    ftruncate($fp, strlen($data));
                    # flock($fp, LOCK_UN);   ### sollte eigentlich überflüssig sein
                    fclose($fp);
                    

                    Und im lesenden Prozess:

                    $fp = fopen('dateiname', 'rb');
                    
                    Datei kann offen bleiben
                    
                    while ($auswerten)
                    {
                        flock ($fp, LOCK_SH);
                        fseek ($fp, 0);
                        $data = fread($fp);
                        flock ($fp, LOCK_UN);
                    
                    ## hier Daten auswerten lassen
                        
                       sleep(1);
                    }
                    
                    fclose($fp);
                    

                    Die Fehlerbehandlungen habe ich jetzt noch weggelassen. Die gehören aber in jedes produktive Script!

                    Liebe Grüße
                    Tom S.

                    --
                    Es gibt nichts Gutes, außer man tut es
                    Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
                    1. Hello,

                      ich habe noch ein paar Möglichkeiten ausgetestet, wie man am besten den Slider-Event mittles XHR an den Server weitergeben kann.

                      element.change()

                      Der Eventlistener wird erst getriggert, wenn der Slider wieder losgelassen wird. Dadurch kann man kein zeitnahes Ein- oder Ausblenden durchführen. Die Anzahl der XHRs wird auf das Minimum reduziert

                      element.input()

                      Der Eventlistener wird bei jeder Berührung/Bewegung des Sliders getriggert. Dies führt zu einer extrom hohen XHR-Anzahl. Dies muss man für die Praxis irgendwie verhindern.

                      • setTimeout() wie gezeigt, immer erst nach einer gewissen Zeit den XHR auslösen. Entweder, wenn länger keine Benutzerhandlung vorgelegen hat, oder in regelmäßigen Zeitabständen, solange Bedienungshandlung vorliegt

                      • compareValues() nur bei entsprechender Änderung (if(Math.abs(oldValue - element.value) > 1) ... ) wird der XHR ausgelöst. Das führt zu einer relativ ausgeglichen Request-Salve, aber leider auch noch nicht zu einer feinen Auflösung.

                      • disable_XHR() solange ein XHR noch läuft (XHR.onreadystatechange hat noch nicht getriggert), wird kein weiterer ausgelöst. Das führt dazu, dass die Leistungsfähigkeit der Gesamtapperatur Berücksichtigung findet. Die kann aber sehr schwanken.

                      Vermutlich muss man, wenn man es ernst nimmt, mehrere Möglichkeiten kombinieren.
                      Jedenfalls musste ich feststellen, dass das Verfahren (Mit Browser und XHR) für eine einigermaßen gleichmäßige Steuerung nicht geeignet ist.

                      Liebe Grüße
                      Tom S.

                      --
                      Es gibt nichts Gutes, außer man tut es
                      Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
                      1. So jetzt ist alles geregelt, auch die "Klick-Koordinaten" werden ordnungsgemäß weitergegeben. Vielen lieben Dank an dich Tom, du hast mir sehr geholfen.

                        Grüße 3homi112

                        1. Aus Erfahrung (professionelle Lichttechnik, Architektur- und Theaterlichtsteuerungen)

                          Noch eine Frage: wenn ich beispielsweise Rot und Blau gleich mischen will, sollen Rot und Blau dann beide mit voller Helligkeit, also beide den Wert 255, leuchten oder soll der Wert insgesamt 255 sein, sprich für Rot und Blau jeweils 127? Leuchten beide LEDs voll, dann ist eine gemischte Farbe doch heller als eine einzelne Farbe überhaupt werden kann, leuchten aber beide nur halb, so müssten gemischte und einzelne Farbe gleich hell sein.

                          Grüße 3homi112

                          1. Aloha ;)

                            Leuchten beide LEDs voll, dann ist eine gemischte Farbe doch heller als eine einzelne Farbe überhaupt werden kann

                            Ja, das ist bei additiver Farbmischung immer so. Ich habe das vor ein paar Monaten mal ausführlich aufgeschrieben und mich dabei auch den Grundfarben und ihrer Helligkeit gewidmet.

                            TL;DR: Es ist völlig normal, dass (additiv) gemischte Farben heller sind als die (additiven) Grundfarben und das ist auch völlig in Ordnung so, du musst da nicht "drosseln" - außer wenn es dir speziell darum geht, die Helligkeit zu begrenzen. In dem Fall verlierst du dann aber einen guten Teil des Farbspektrums.

                            Grüße,

                            RIDER

                            --
                            Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
                            # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
                          2. Hello,

                            Noch eine Frage: wenn ich beispielsweise Rot und Blau gleich mischen will, sollen Rot und Blau dann beide mit voller Helligkeit, also beide den Wert 255, leuchten oder soll der Wert insgesamt 255 sein, sprich für Rot und Blau jeweils 127? Leuchten beide LEDs voll, dann ist eine gemischte Farbe doch heller als eine einzelne Farbe überhaupt werden kann, leuchten aber beide nur halb, so müssten gemischte und einzelne Farbe gleich hell sein.

                            Das hängt vom verwendeten Farbmodell ab.

                            Siehe hierzu auch "Luminanz und Chrominanz" und "YUV-Farbmodell". Wenn der Lichtstrom pro Fläche gleich bleiben soll, musst Du für weißes Licht die Luminanz zurücknehmen.

                            Liebe Grüße
                            Tom S.

                            --
                            Es gibt nichts Gutes, außer man tut es
                            Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
                            1. Aloha ;)

                              Noch eine Frage: wenn ich beispielsweise Rot und Blau gleich mischen will, sollen Rot und Blau dann beide mit voller Helligkeit, also beide den Wert 255, leuchten oder soll der Wert insgesamt 255 sein, sprich für Rot und Blau jeweils 127? Leuchten beide LEDs voll, dann ist eine gemischte Farbe doch heller als eine einzelne Farbe überhaupt werden kann, leuchten aber beide nur halb, so müssten gemischte und einzelne Farbe gleich hell sein.

                              Das hängt vom verwendeten Farbmodell ab.

                              Wir sprechen hier von Roten, Blauen und Grünen LEDs, die direkt angesteuert werden sollen (denn es ist ja nach den Werten für die einzelnen Farben gefragt). Welches andere Modell als RGB soll denn da bitte sinnvollerweise verwendet werden?

                              Grüße,

                              RIDER

                              --
                              Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
                              # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
                              1. Hello,

                                Das hängt vom verwendeten Farbmodell ab.

                                Wir sprechen hier von Roten, Blauen und Grünen LEDs, die direkt angesteuert werden sollen (denn es ist ja nach den Werten für die einzelnen Farben gefragt). Welches andere Modell als RGB soll denn da bitte sinnvollerweise verwendet werden?

                                Ein TV-Monitor hat auch Rote, Grüne und Blaue Lichtpunkte. Er arbeitet trotzdem mit dem YUV-Modell.

                                Man kann die Farbmodelle ineinander überführen. Und hier war die Frage, muss ich den Lichtstrom der einzelnen Kanäle mindern? Das ist für eine gleichmäßige Lichtstärke zu bejahen. Und verstehen kann man das am besten im YUV-Modell.

                                Bei einer Effektbeleuchtung ist es sicherlich nicht so wichtig. Allerdings wussten schon die Diskomacher der frühen Psychedelic-Period, dass die Scheinwerfer mit blauen Filtern immer am wenigsten Licht abgaben, wenn man gleich starke Leuchtmittel eingesetzt hat ;-P

                                Liebe Grüße
                                Tom S.

                                --
                                Es gibt nichts Gutes, außer man tut es
                                Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
                                1. Aloha ;)

                                  Ein TV-Monitor hat auch Rote, Grüne und Blaue Lichtpunkte. Er arbeitet trotzdem mit dem YUV-Modell.

                                  Das tut er nicht! Er nimmt ein Signal in YUV an, kodiert es um und gibt es als RGB aus. Am Ende, bei der Ausgabesteuerung, steht trotzdem RGB. Und wir sprechen doch hier über die Ausgabesteuerung?

                                  Man kann die Farbmodelle ineinander überführen. Und hier war die Frage, muss ich den Lichtstrom der einzelnen Kanäle mindern? Das ist für eine gleichmäßige Lichtstärke zu bejahen. Und verstehen kann man das am besten im YUV-Modell.

                                  Nun, eben das glaube ich nicht. Wie du richtigerweise sagst kann man die Farbmodelle ineinander überführen. Das muss man auch, um zu verstehen, was bei einer Änderung im Einen dann konkret im Anderen passiert.

                                  Deine Antwort sagt, was im YUV-Modell passiert. Die Erklärung, was das dann übertragen im RGB-Modell bedeutet bist du schuldig geblieben - und nur das war letztendlich gefragt.

                                  Ich hätte auch antworten können, dass es im HSL-Modell L als Wert für die Farbhelligkeit gibt, also bei gleichbleibendem L gleichbleibende Farbhelligkeit gegeben ist. Und was bringt einem das, wenn man wissen will, was das für RGB bedeutet? Richtig - Nichts!

                                  Ist ja okay, wenn du nach dem Farbmodell differenzieren und das anhand eines anderen Farbmodell erläutern willst, aber eben die Erläuterung was das bedeutet bist du ja schuldig geblieben.

                                  Abgesehen davon halte ich die qualitative Beobachtung des TO, dass 255+255 Lichtstärke aus zwei Farben ja mehr ist als nur 255 Lichtstärke aus einer Farbe für sehr viel sinnstiftender als jetzt noch überlegen zu müssen, wie ich jetzt genau wieder YUV-Werte in RGB umrechne und was eine Änderung da jetzt bewirkt.

                                  Allerdings wussten schon die Diskomacher der frühen Psychedelic-Period, dass die Scheinwerfer mit blauen Filtern immer am wenigsten Licht abgaben, wenn man gleich starke Leuchtmittel eingesetzt hat ;-P

                                  Richtig. Und hätten die mal gelesen, was ich in meiner Antwort verlinkt hatte, dann hätten sie sogar gewusst warum!

                                  Grüße,

                                  RIDER

                                  --
                                  Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
                                  # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
    2. Aloha ;)

      Nimmt man nun noch die Unsicherheit der Übertragung per TCP hinzu (da ist Zeitgleichheit nicht garantiert), wird das eine durchaus spannende Aufgabe. Die Profisysteme übertragen daher immer den alten und den neuen Wert nebst den Zeitpunkten, zu denen sie gegolten haben.

      Verwechselst du hier TCP und UDP oder verstehe nur ich was hier nicht?

      Ich verstehe bspw. nicht, was du mit "Zeitgleichheit" meinst. Zeitgleichheit kann sowieso nie garantiert werden, weil ja ein Übertragungsweg gegangen werden muss, wie soll also irgendwas zeitgleich passieren?

      Oder meinst du damit die Reihenfolge der Pakete? Die ist in TCP (anders als bei UDP) sehr wohl garantiert.

      Und bei TCP, das ja die Reihenfolge der Pakete von Haus aus garantiert, den alten Wert und entsprechende Zeitstempel zum Plausibilitätscheck mitzuschicken halte ich auch für vollig unnötig (ganz im Gegensatz zu UDP-Verbindungen, bei denen man sich selbst um Reihenfolge und Co. kümmern muss).

      Überhaupt ist „Unsicherheit“ nichts, was ich mit TCP in Verbindung bringe. Auf Vergleichsebene der Transportschicht ist doch viel eher UDP „leichtfüßig, schnell und unsicher“ und TCP „schwerfällig, langsam und sicher“. UDP ist wie ein schlecht gezielter Kugelhagel, bei dem gerne mal ein großer Teil der vielen Projektile daneben gehen darf, während TCP die Lenkrakete ist - präzise, trifft ihr Ziel genau dann, wenn sie es soll, aber mit viel Overhead behaftet und teuer.

      Also - verwechselst du hier was oder sehe nur ich den Sinn nicht?

      Grüße,

      RIDER

      --
      Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
      # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
      1. Hello,

        Nimmt man nun noch die Unsicherheit der Übertragung per TCP hinzu (da ist Zeitgleichheit nicht garantiert), wird das eine durchaus spannende Aufgabe. Die Profisysteme übertragen daher immer den alten und den neuen Wert nebst den Zeitpunkten, zu denen sie gegolten haben.

        Verwechselst du hier TCP und UDP oder verstehe nur ich was hier nicht?

        Nein.

        Ich verstehe bspw. nicht, was du mit "Zeitgleichheit" meinst. Zeitgleichheit kann sowieso nie garantiert werden, weil ja ein Übertragungsweg gegangen werden muss, wie soll also irgendwas zeitgleich passieren?

        Datenübertragung per IP ist nicht ohne weitere Maßnahmen zeithaltig, und schon gar nicht echtzeitfähig. Multiplexprotokolle bedienen diesen Anspruch besser.

        Oder meinst du damit die Reihenfolge der Pakete? Die ist in TCP (anders als bei UDP) sehr wohl garantiert.

        Nein. Ich meine die Laufzeitdifferenzen.
        Aber da 3homi112 keine Bühnenlichtsteuerung, sondern nur eine einfache Lichtstellanlage fürs Wohnzimmer bauen will, ist das nicht so tragisch.

        Liebe Grüße
        Tom S.

        --
        Es gibt nichts Gutes, außer man tut es
        Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
  4. Nachdem ihr nun Ajax und Synchronisieren durch habt, würde ich gern die Frage stellen, warum es überhaupt eine Datei sein muss. Kann das, was im bash Script läuft, nicht auch direkt von PHP aus passieren? Wenn es darum geht, ein Programm zu starten, das den Helligkeitsswert an die LED überträgt und ihm einen Parameter zu übergeben - das sollte doch auch direkt von PHP aus machbar sein. Oder ist das ein Security-Problem?

    Rolf

    1. Hello,

      das hatte ich ja schon vorgeschlagen:direkt auf einen Socket schreiben oder auf eine COM oder LPT Schnittstelle.

      Und den XHR kann man auch direkt mit einem Socket arbeiten lassen. Dann muss man den Responder nicht ständig neu laden, sondern lässt ihn wie einen Server laufen.

      Liebe Grüße
      Tom S.

      --
      Es gibt nichts Gutes, außer man tut es
      Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
      1. Jupp, sorry, ich hatte das vorhin auf dem Handy gelesen, da war's zu viel Text. Dein Socket-Vorschlag setzt dann allerdings voraus, dass 3homi112 weiß, wie er (oder sie) auf http- oder Socket-Ebene die Lichtanlage ansteuert.

        Ein bash-Script zerlegen und zu schauen, welches Control-Tool darin aufgerufen wird, könnte einfacher sein. Ich hab ja keine Ahnung, was das bash tut.

        Rolf

        1. Hello,

          da hasr Du mich jetzt falsch verstanden. Der PHP-Responder kann in der Mitte sitzen bleiben, nur eben als "Server", also einmal gestartet und dann in einer Schleife immer auf ein Socket-Event lauernd. Das kommt vom XHR aus dem Browser.

          Die Lichtsteuerung kann dann per Analogport, per COM oder USB, LPT, usw. angesteuert werden vom RASPI auf dem der Webserver läuft.

          Der Vorteil bei dieser Lösung wäre, dass nicht bei jedem Request das ganze PHP-Gedöns neu geladen weden muss. Das dauert nämlich.

          Liebe Grüße
          Tom S.

          --
          Es gibt nichts Gutes, außer man tut es
          Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
          1. Guten Morgen,

            Sagen wir mal so: die Datei ist ein gewisser Ausdruck von Faulheit, da ich mich in die ganze Thematik neu einlesen muss. Mit bash beschäftige ich mich quasi täglich, weil ich Ubuntu als Haupsystem nutze und es damit auch ständig gebrauche. Daher kenne ich mich damit schlicht besser aus und kann auch später mehr damit anfangen, als ich mich jemals mit HTML/PHP/Ajax auskennen werde. Da ich nicht den Anspruch habe, dass die Steuerung in Echtzeit läuft, sondern mich schon freue, wenn sie überhaupt läuft, beschäftige ich mich nicht mit Effizienteren Lösungen, auch wenn sie möglich und sogar sinnvoll sein mögen.

            Grüße 3homi112