2016-07-18 8 views
0

Ich habe eine Funktion, die mit dem Flaschenserver kommunizieren soll und den neuesten Stand der GPIO-Tasten, so dass die Farbe der Eigenschaften der Tasten kann über alle Clients hinweg synchronisiert werden. Auf Desktop-Chrome funktioniert die Funktion perfekt, aber auf dem Raspberry Pi-Chrom-Browser wird die Funktion vom Client gar nicht aufgerufen.

HTML-Code:

<div id="centerArea"> 
        <div id="temperatureBox"> 
         <div id="temperature"> 
          <div id="temperatureValue"></div>&deg <sup>C</sup> 
         </div> 
         <div id="humidity"> 
          Humidity: &nbsp;<div id="humidityValue"></div>% 
         </div> 
        </div> 
       </div> 

<div id="buttonsBar"> 
        <div id="buttons"> 
         <button type="submit" value="Button1" class="sync" id="B1" name="B1" onclick="b1(); return false;">Button1</button> 
        </div> 
        <div id="buttons"> 
         <button type="submit" value="Button2" class="sync" id="B2" name="B2" onclick="b2(); return false;">Button2</button> 
        </div> 
        <div id="buttons"> 
         <button type="submit" value="Button3" class="sync" id="B3" name="B3" onclick="b3(); return false;">Button3</button> 
        </div> 
        <div id="buttons"> 
         <button type="submit" value="Button4" class="sync" id="B4" name="B4" onclick="b4(); return false;">Button4</button> 
        </div> 
       </div> 

Kolben Code:

@app.route('/dhtTemp', methods=['GET','POST']) 
def readTemperature(): 
    #sleep(3) 
    dht22.trigger() 
    temperature = str('%.2f' % (dht22.temperature())) 
    return (temperature) 

@app.route('/dhtHum', methods=['GET','POST']) 
def readHumidity(): 
    #sleep(3) 
    dht22.trigger() 
    humidity = str('%.2f' % (dht22.humidity())) 
    return (humidity) 

@app.route('/B1status', methods=['GET','POST']) 
def readBStatus(): 
    b1status = str(gpio.input(relayPins[0])) 
    #b3status = str(gpio.input(relayPins[2])) 
    #b4status = str(gpio.input(relayPins[3])) 
    return (b1status) 

@app.route('/B2status', methods=['GET','POST']) 
def readB2Status(): 
    b2status = str(gpio.input(relayPins[1])) 
    return (b2status) 

JavaScript-Code:

function get_temps(){ 
$.getJSON("dhtTemp", 
    function(temperature){ 
     $('#temperatureValue').text(temperature) 

    } 
); 
$.getJSON("dhtHum", 
    function(data){ 
     $('#humidityValue').text(" " + data) 
    } 
); 
} 

function get_Bstatus(){ 
      function get_B1status(){ 
       $.getJSON("B1status", 
        function(b1status){ 
         if (b1status == "1"){ 
          document.getElementById("B1").style.borderColor = "red"; 
         } 
         else{ 
          document.getElementById("B1").style.borderColor = "green"; 
         } 
        } 
       ); 
      } 
      function get_B2status(){ 
       $.getJSON("B2status", 
        function(b2status){ 
         if (b2status == "1"){ 
          document.getElementById("B2").style.borderColor = "red"; 
         } 
         else{ 
          document.getElementById("B2").style.borderColor = "green"; 
         } 
        } 
       ); 
      } 
     } 
     setInterval('get_Bstatus()', 1000) 

weirdly genug, um den Code für die Temperatur Abrufen und Feuchtigkeit, obwohl es richtig, selbst funktioniert verwendet auch die gleiche $ .get-Funktion. Aber der Server nicht einmal wird immer alle Anfragen von der Client die Funktion get_Bstatus

das Protokoll für Client-Server-Interaktionen zu laden:

192.168.1.73 - - [18/Jul/2016 15:16:49] "GET /dhtTemp HTTP/1.1" 200 - 
192.168.1.73 - - [18/Jul/2016 15:16:49] "GET /dhtHum HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:49] "GET /B1status HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:49] "GET /B2status HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:50] "GET /B1status HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:50] "GET /B2status HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:51] "GET /dhtTemp HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:51] "GET /B1status HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:51] "GET /dhtHum HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:51] "GET /B2status HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:52] "GET /B1status HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:52] "GET /B2status HTTP/1.1" 200 - 
192.168.1.73 - - [18/Jul/2016 15:16:53] "GET /dhtTemp HTTP/1.1" 200 - 
192.168.1.73 - - [18/Jul/2016 15:16:53] "GET /dhtHum HTTP/1.1" 200 - 

die IP-Adresse in 73 endet der Client offen auf dem Raspberry Pi 3 selbst auf Chrom-Browser und das Ende in 228 ist der Client in Chrom auf einem Windows-Laptop geöffnet. Die Funktionen B1status und B2status werden vom Client nie auf dem Raspberry Pi aufgerufen, obwohl der Funktionsaufruf für Feuchtigkeit und Temperatur problemlos verläuft.

Genau deshalb kann ich einfach nicht herausfinden, warum gerade diese beiden Funktionen nicht funktionieren, während die anderen beiden gut funktionieren.

Es gibt keine Konsolenfehler in einem der Clients und wenn die Schaltfläche auf dem Client der Raspberry Pi angeklickt wird, wird es auf dem Client auf dem Windows-System entsprechend aktualisiert, so dass der Code funktioniert soweit ich das beurteilen kann, nur nicht auf Chrom-Browser.

dank

UPDATE

Offenbar separat ich brauche nur auf den Funktionen das Intervall einzustellen. Wie im zuvor verlinkten JavaScript-Code ersichtlich, wurden die Funktionen get_b1status und get_b2status von der Elternfunktion get_Bstatus aufgerufen.

Der Code begann auf allen Clients zu funktionieren, wenn ich die Funktionen getrennt und einzeln aufgerufen habe. So ist der Update-Code sieht etwa so aus:

counter1 = ""; 
counter2 = ""; 
counter3 = ""; 
counter4 = ""; 
function get_B1status(){ 
    $.getJSON("B1status", 
     function(b1status){ 
      if (counter1 != b1status){ 
       if (b1status == "1"){ 
        document.getElementById("B1").style.borderColor = "red"; 
        counter1 = b1status; 
       } 
       else{ 
        document.getElementById("B1").style.borderColor = "green"; 
        counter1 = b1status; 
       } 
      } 
     } 
    ); 
} 
function get_B2status(){ 
    $.getJSON("B2status", 
     function(b2status){ 
      if (counter2 != b2status){ 
       if (b2status == "1"){ 
        document.getElementById("B2").style.borderColor = "red"; 
        counter2 = b2status; 
       } 
       else{ 
        document.getElementById("B2").style.borderColor = "green"; 
        counter2 = b2status; 
       } 
      } 
     } 
    ); 
} 
function get_B3status(){ 
    $.getJSON("B3status", 
     function(b3status){ 
      if (counter3 != b3status){ 
       if (b3status == "1"){ 
        document.getElementById("B3").style.borderColor = "red"; 
        counter3 = b3status; 
       } 
       else{ 
        document.getElementById("B3").style.borderColor = "green"; 
        counter3 = b3status; 
       } 
      } 
     } 
    ); 
} 
function get_B4status(){ 
    $.getJSON("B4status", 
     function(b4status){ 
      if (counter4 != b4status){ 
       if (b4status == "1"){ 
        document.getElementById("B4").style.borderColor = "red"; 
        counter4 = b4status; 
       } 
       else{ 
        document.getElementById("B4").style.borderColor = "green"; 
        counter4= b4status; 
       } 
      } 
     } 
    ); 
} 
setInterval('get_B1status()', 1000) 
setInterval('get_B2status()', 1000) 
setInterval('get_B3status()', 1000) 
setInterval('get_B4status()', 1000) 

i schaffte es sogar in einem Zustand zu bringen, wo der Wert des Tastenzustandes in einer Variablen gespeichert ist und wenn auf dem nächsten Intervall hat der Staat nicht veränderte dann der Funktion spart grundsätzlich ein wenig Verarbeitungsaufwand vom Server.

+0

Sie versuchen Haben Sie Ihre Funktion direkt auf dem Web-Browser-Konsole (F12) aufrufen: 'get_Bstatus();' – Hackerman

+0

auch Was ist, wenn statt 'setInterval ('get_Bstatus()', 1000)' Sie diese Zeile schreiben als: 'setInterval (get_Bstatus(), 1000)' – Hackerman

+0

@Hackerman Ich habe tatsächlich versucht, was Sie vorgeschlagen haben, aber das Ergebnis war undefined Funktion oder so etwas, dann wurde mir klar, dass die Funktion vielleicht nicht einmal angerufen wurde, also ging ich zurück und änderte das, wie es war wie in der Editierung aufgerufen werden. Trotzdem danke. Auch das Aufrufen der Funktion, ohne in Begrenzer eingeschlossen zu sein, verursachte Probleme für mich, ich hatte es früher schon einmal für die Temperatur- und Feuchtigkeitsfunktionen ausprobiert und es gab nur einen Fehler, erinnere mich nicht, was es war, tut mir leid. –

Antwort

0

nur versuchen, holen() erste polyfills installieren npm i --save es6-promise isomorphic-fetch

und dann:

require('es6-promise').polyfill(); 
require('isomorphic-fetch'); 
Verwandte Themen