Forum: Mikrocontroller und Digitale Elektronik ESP8266 - Seite nicht neu Laden, wenn Button betätigt wird


von DanS S. (dns712)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

um die Übertragung zu beschleunigen würde ich gerne bei Button 
Betätigung nur eine Aktion senden, aber nicht das die Seite komplett neu 
geladen werden muss. Wie kann ich das umsetzten?

Bin ein HTML-Neuling habe im Moment folgende Seite die geladen 
wird.(siehe Bild und Code)
1
      USART_puts(USART1, "<!DOCTYPE html><head><meta name=\"viewport\" content=\"width=480\"/><h1>Powersteuerung:</h1></head>");
2
      USART_puts(USART1, "<body>");
3
      USART_puts(USART1, "<form ACTION=\"Gartensteuerung\" method=\"get\">");
4
      USART_puts(USART1, "<button style=\"height:100px;width:100px\" name=\"ACTION\" value=\"ON1\">Ausgang 1 ON</button>");
5
      USART_puts(USART1, "<button style=\"height:100px;width:100px\" name=\"ACTION\" value=\"ON2\">Ausgang 2 ON</button>");
6
      USART_puts(USART1, "<button style=\"height:100px;width:100px\" name=\"ACTION\" value=\"ON3\">Ausgang 3 ON</button>");
7
      USART_puts(USART1, "<button style=\"height:100px;width:100px\" name=\"ACTION\" value=\"ON4\">Ausgang 4 ON</button>");
8
      USART_puts(USART1, "<br></br>");
9
      USART_puts(USART1, "<button style=\"height:100px;width:100px\" name=\"ACTION\" value=\"OFF1\">Ausgang 1 OFF</button>");
10
      USART_puts(USART1, "<button style=\"height:100px;width:100px\" name=\"ACTION\" value=\"OFF2\">Ausgang 2 OFF</button>");
11
      USART_puts(USART1, "<button style=\"height:100px;width:100px\" name=\"ACTION\" value=\"OFF3\">Ausgang 3 OFF</button>");
12
      USART_puts(USART1, "<button style=\"height:100px;width:100px\" name=\"ACTION\" value=\"OFF4\">Ausgang 4 OFF</button>");
13
      USART_puts(USART1, "</body>");
14
      USART_puts(USART1, "</html>\r\n");

von Einer K. (Gast)


Lesenswert?

JavaScript kann das.

von Sven B. (scummos)


Lesenswert?

AJAX ist das Wort, nach dem du googlen musst.

von Chr. M. (snowfly)


Lesenswert?

Wenn du ein Beispiel suchst, hier ist es umgesetzt in Arduino.
https://www.john-lassen.de/en/projects/esp-8266-arduino-ide-webconfig

von DanS S. (dns712)


Lesenswert?

Danke für das schnelle Feedback.
Macht es Sinn für die Kommunikation mit dem ESP8266 das Protokoll auf 
Javaskript umzustellen?

: Bearbeitet durch User
von Nick S. (c0re)


Lesenswert?

DanS S. schrieb:
> Danke für das schnelle Feedback.
> Macht es Sinn für die Kommunikation mit dem ESP8266 das Protokoll auf
> Javaskript umzustellen?

Welches Protokoll? Javascript ist eine websprache und kann in /mit HTML 
verwendet werden... ?

von Joachim S. (oyo)


Lesenswert?

Wo liegt denn überhaupt konkret das Problem? Dein HTML-Code ist doch eh 
nicht sonderlich lang, es fällt mir gerade schwer nachzuvollziehen, wie 
die paar Bytes in der Praxis ein grosses Problem darstellen sollen.

Ein paar Bytes und unnötige Redundanz könntest Du noch einsparen, wenn 
Du
<style>button {height:100px; width:100px;}</style>
in die head-Section schreibst, und dann das entsprechende style-Attribut 
aus den einzelnen Button-Tags entfernst.
Aber ansonsten...

von Mampf unterwegs (Gast)


Lesenswert?

Ajax mit JQuery :) funktioniert prima :)

von DanS S. (dns712)


Lesenswert?

Kenn jemand ein gutes Beispiel wo AJAX mit JQuery verwendet wird was zu 
meinen Problem passt.

Oder ein paar Zeilen Code die mein Problem lösen?

Hab so gut wie keine Erfahrung mit HTML und JavaScript.

Joachim S. schrieb:
> Wo liegt denn überhaupt konkret das Problem? Dein HTML-Code ist doch eh
> nicht sonderlich lang, es fällt mir gerade schwer nachzuvollziehen, wie
> die paar Bytes in der Praxis ein grosses Problem darstellen sollen.

Es wird im Außenbereich eingesetzt.
Dort wo es zurzeit zum Einsatz kommt ist das WLAN ziemlich schwach und 
führt daher zu Verzögerungen bis zu 3 Sekunden wenn die ganze Seite 
geladen werden muss. Da ich ja nur ein Signal zum Schalten senden möchte 
wäre es von Vorteil nur die Aktion des betätigen Button zuschicken statt 
die ganze Seite erneut zu laden.

von Stefan F. (Gast)


Lesenswert?

Guck doch einfach mal bei Wikipedia. Da ist ein beispiel, wie man AJAX 
ohe Frameworks programmiert. Das ist klein, einfach und funktioniert.

von Joachim S. (oyo)


Lesenswert?

Ich persönlich bin ja skeptisch, ob AJAX hier wirklich das Allheilmittel 
ist. Sicher, AJAX ist die absolut korrekte Antwort auf die eigentliche 
im Eröffnungsposting gestellte Frage, wie man die Befehle schicken kann, 
ohne die komplette Seite neu laden zu müssen.

Dennoch bezweifle ich irgendwie, dass der Threadstarter mit der 
AJAX-Lösung rundum zufrieden sein wird. Ich vermute eher, dass der 
Threadstarter nach vielen Stunden des Herumtüftelns feststellen würde, 
dass sein Code plötzlich dreimal so umfangreich ist, das erste Laden der 
Seite sogar länger dauert, weil auch der HTMl-Code inkl. Javascript 
deutlich länger geworden ist, das Senden der Befehle trotzdem nur 
geringfügig schneller geht, und AJAX auch wieder neue 
Nachteile/Herausforderungen mit sich bringt.

@Threadstarter: Wenn es Dir darum geht, die Menge der per WLAN von/zum 
ESP8266 übertragenen Daten (und somit letztlich die Latenzzeit) zu 
minimieren, weil das WLAN an der Stelle im Garten so schwach ist, dann 
wäre die optimale Lösung dieses Problems MQTT. Das würde die Architektur 
zwar komplett über den Haufen werfen und u.A. einen zusätzlichen 
Server/MQTT-Broker (z.B. in Form eines Raspberry Pi) erfordern, würde 
die Latenzzeit und von/zum ESP8266 übertragene Datenmenge aber auf das 
absolute Minimum reduzieren.
Ich weiss, MQTT wirkt erst einmal abschreckend, schon durch den 
zusätzlichen zentralen MQTT-Broker; und die übliche Lösung, stattdessen 
einen kleinen Webserver auf dem ESP laufen zu lassen, viel einfacher. 
Aber spätestens, wenn man es mit mehr als 1-2 ESP8266-basierten Geräten 
zu tun hat, die vielleicht sogar noch intelligent miteinander vernetzt 
werden sollen, oder auch nur ein Gerät dazu kommt, das keine reine 
Datensenke, sondern eine Datenquelle ist (z.B. ein Rauch- oder 
Bewegungsmelder) merkt man schnell die Nachteile des naheliegenden 
Ansatzes, auf jedem Device einen eigenen Webserver laufen zu lassen und 
Kommunikation und Steuerung per HTTP und HTML machen zu wollen.

https://www.heise.de/developer/artikel/MQTT-Protokoll-fuer-das-Internet-der-Dinge-2168152.html

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Ich würde in solchen Fällen gerne eine lokal installierte HTML Datei 
(als Alternative zu einer App) verwenden, die per Javascript einfache 
UDP Nachrichten sendet. Aber das scheint nicht möglich zu sein.

Oder doch? Falls ja, wo kann ich dazu etwas nachlesen?

von Sven B. (scummos)


Lesenswert?

Ich glaube nicht dass JS UDP kann. Aber wenn du eh eine lokale 
"Anwendung" hast, gibt es IMO wenig Gründe JS zu nehmen. Nimm halt 
irgendwie Python oder so.

von Hans (Gast)


Lesenswert?

Joachim S. schrieb:
> Dennoch bezweifle ich irgendwie, dass der Threadstarter mit der
> AJAX-Lösung rundum zufrieden sein wird. Ich vermute eher, dass der
> Threadstarter nach vielen Stunden des Herumtüftelns feststellen würde,
> dass sein Code plötzlich dreimal so umfangreich ist, das erste Laden der
> Seite sogar länger dauert, weil auch der HTMl-Code inkl. Javascript
> deutlich länger geworden ist, das Senden der Befehle trotzdem nur
> geringfügig schneller geht, und AJAX auch wieder neue
> Nachteile/Herausforderungen mit sich bringt.

jQuery soll man normaleise (wenn man keine Datenschutzbedenken hat) 
ohnehin über die entsprechenden CDNs ausliefern. Damit wird das HTML nur 
minimal größer und das eigentliche Javascript aus dem Internet gezogen.

Dummerweise ist die jQuery Doku gerade down. Sonst hätte ich ein kleines 
Beispiel gepostet.

von Joachim S. (oyo)


Lesenswert?

Stefan U. schrieb:
> Ich würde in solchen Fällen gerne eine lokal installierte HTML Datei
> (als Alternative zu einer App) verwenden, die per Javascript einfache
> UDP Nachrichten sendet. Aber das scheint nicht möglich zu sein.
>
> Oder doch? Falls ja, wo kann ich dazu etwas nachlesen?

UDP direkt per Webbrowser-Javascript ist m.W.n. tatsächlich schlicht 
nicht möglich.
Eine Not-Lösung wäre möglicherweise eine Art HTTP-UDP-Bridge; also dass 
man quasi per HTTP-Request die nötigen Informationen (IP-Adresse & Port 
des Empfängers + eigentliche Daten) an einen zwischengeschalteten 
Webserver schickt, und dieser zwischengeschaltete Webserver dann ein 
entsprechendes UDP-Paket an den eigentlichen Empfänger sendet.

von Joachim S. (oyo)


Lesenswert?

Hans schrieb:
> jQuery soll man normaleise (wenn man keine Datenschutzbedenken hat)
> ohnehin über die entsprechenden CDNs ausliefern. Damit wird das HTML nur
> minimal größer und das eigentliche Javascript aus dem Internet gezogen.

Dass jQuery per CDN ausgeliefert wird, habe ich stillschweigend 
vorausgesetzt. jQuery vom ESP8266 serven zu lassen, wäre im vorliegenden 
Szenario ja wirklich Unsinn und würde das vermeintliche Problem ja nur 
verschlimmern.

von Einer K. (Gast)


Lesenswert?

Joachim S. schrieb:
> UDP direkt per Webbrowser-Javascript ist m.W.n. tatsächlich schlicht
> nicht möglich.

Es würde auch in der Regel wenig Sinn machen.

Bei Ajax Anwendungen MÖCHTE ich den Response des Servers auswerten 
können, alleine schon um die Farbe des Klickfeldes ändern zu können, 
wenn eine Lampe angeht. (oder, was auch immer gerade gezeigt werden 
will)

Und es gibt ja noch Websockets...

Beide Verfahren kann man mit dem ESP abhandeln.

Auch Speichermangel kann nicht wirklich das Problem sein. Denn bis zu 
3MByte SPIFFS sind von hause aus drin. Selbst die Anbindung einer 
SD-Karte bereitet keine unendlichen Sorgen.

Das ausliefern der JQuery Datei ist also vom ESP aus möglich. Und durch 
mitsenden der betreffenden HTTP Cache Header, belastet es nur einmal das 
Netz, pro Sitzungsdauer.
Bitte, auch bei sonstigen statischen Inhalten (Bilder,CSS, usw) an die 
Cache Header denken.

von Sven B. (scummos)


Lesenswert?

Arduino F. schrieb:
> Joachim S. schrieb:
>> UDP direkt per Webbrowser-Javascript ist m.W.n. tatsächlich schlicht
>> nicht möglich.
>
> Es würde auch in der Regel wenig Sinn machen.
>
> Bei Ajax Anwendungen MÖCHTE ich den Response des Servers auswerten
> können, alleine schon um die Farbe des Klickfeldes ändern zu können,
> wenn eine Lampe angeht.

?
Das geht mit UDP genauso ...

von Einer K. (Gast)


Lesenswert?

Sven B. schrieb:
> ?
> Das geht mit UDP genauso ...

Ja?
Dann zeige doch mal bitte, wie du den Browser überredest, einen UDP 
Socket auf zu halten, und er dann die Antwort an JS weiter reicht...

Ich fürchte das wird dir schwer fallen.

Wenn es sich um "Port aufhalten" dreht, sind einfach Websockets das 
Mittel der Wahl.

Da hilft es auch nicht, darauf rum zu hacken, dass ich mich evtl. etwas 
unklar ausgedrückt habe.

von Joachim S. (oyo)


Lesenswert?

Arduino F. schrieb:
> Und es gibt ja noch Websockets...

In der Tat, Websockets könnten hier mglw. noch eine Lösung sein. 
Irgendwelche Workarounds mit UDP hingegen machen imho tatsächlich eher 
wenig Sinn.

> Auch Speichermangel kann nicht wirklich das Problem sein. Denn bis zu
> 3MByte SPIFFS sind von hause aus drin. Selbst die Anbindung einer
> SD-Karte bereitet keine unendlichen Sorgen.
>
> Das ausliefern der JQuery Datei ist also vom ESP aus möglich.

Klar, möglich wäre das schon. Macht im hier vorliegenden Fall ja aber 
nun wenig Sinn, jQuery vom ESP statt von einem CDN ausliefern zu lassen. 
Das Problem, um das es hier geht, würde es ja nur verschlimmern - wenn 
angeblich schon ca. 700 Bytes an HTML-Daten für sekundenlange Latenzen 
sorgen sollen, weil die WLAN-Verbindung am Standort des ESP so übel ist, 
warum sollte man dann unnötigerweise ca. 80kb jQuery-Daten dann über die 
gleiche schlechte Netzwerkanbindung übertragen, wenn man es genauso gut 
von einem schnellen CDN ausliefern lassen könnte. Zusätzlicher 
Arbeitsaufwand, der das Problem aber nur verschlimmern würde.

von Sven B. (scummos)


Lesenswert?

Arduino F. schrieb:
> Sven B. schrieb:
>> ?
>> Das geht mit UDP genauso ...
>
> Ja?
> Dann zeige doch mal bitte, wie du den Browser überredest, einen UDP
> Socket auf zu halten, und er dann die Antwort an JS weiter reicht...

Geht halt nicht weil ist nicht implementiert, aus welchem Grund auch 
immer. Aber Sinn machen würde es schon, man könnte Web Sockets 
genausogut auch mit UDP machen -- warum soll das weniger Sinn machen als 
TCP?

von Einer K. (Gast)


Lesenswert?

Sven B. schrieb:
> Geht halt nicht weil ist nicht implementiert, aus welchem Grund auch
> immer. Aber Sinn machen würde es schon, man könnte Web Sockets
> genausogut auch mit UDP machen -- warum soll das weniger Sinn machen als
> TCP?

Ungelegte Eier...

Joachim S. schrieb:
> wenn
> angeblich schon ca. 700 Bytes an HTML-Daten für sekundenlange Latenzen
> sorgen sollen, weil die WLAN-Verbindung am Standort des ESP so übel ist,
Naja...
Auch da gibt es sicherlich Mittel und Wege...
Ein Repeater?
Auf halben Weg noch einen ESP setzen(ESP-Mesh)?

Vielleicht ist es auch einfach nur die falsche Technik am richtigen Ort?


Joachim S. schrieb:
> Zusätzlicher
> Arbeitsaufwand, der das Problem aber nur verschlimmern würde.
Der Zusätzliche Arbeitsaufwand beschränkt sich doch nur auf das Senden 
zusätzlicher Cache Header.
Diese Header verschlimmern das Problem nicht, sie mildern es.

von Andreas M. (andiator)


Lesenswert?

UDP ist schon alleine wegen der schlechten Verbindung unbrauchbar - die 
Nachrichten werden verlorengehen, ohne dass man das mitkriegt.

WebSockets ist für einen Anfänger zu viel, hier ist AJAX ohne jQuery 
tatsächlich die bessere Wahl (ungetestet):
1
...
2
<button style="height:100px;width:100px" onclick="Ausgang1On(event)">Ausgang 1 ON</button>
3
<div id="status"></div>
4
<script>
5
function Ausgang1On(event) {
6
  event.preventDefault();
7
  event.stopPropagation();
8
  var xhttp = new XMLHttpRequest();
9
  xhttp.onreadystatechange = function() {
10
    if (this.readyState == 4 && this.status == 200) {
11
      document.getElementById("status").innerHTML =
12
      this.responseText;
13
    }
14
  };
15
  xhttp.open("GET", "ausgang1on", true);
16
  xhttp.send();
17
}
18
</script>
19
...
Beim Klick auf den Button wird function "Ausgang1On" aufgerufen, die 
dann Seite "ausgang1on" aufruft.
Der Returnwert der Seite, es könnte einfach ein String "Eingeschaltet" 
sein, wird in die <div id="status"> reingeschrieben.

Das ist alles.

MfG,
Andreas

: Bearbeitet durch User
von Planlos (Gast)


Lesenswert?

DanS S. schrieb:
> um die Übertragung zu beschleunigen würde ich gerne bei Button
> Betätigung nur eine Aktion senden, aber nicht das die Seite komplett neu
> geladen werden muss. Wie kann ich das umsetzten?

Wenn du nicht unbedingt auf das neumodische Javascript/AJAX-Gedöhns 
umsteigen willst: Das geht ganz Old-School per HTTP-Response-Code.

https://http.cat/204 "No Content"

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
> The HTTP 204 No Content success status response code indicates that the
> request has succeed, but that the client doesn't need to go away from its
> current page.

von Joachim S. (oyo)


Lesenswert?

Planlos schrieb:
> DanS S. schrieb:
>> um die Übertragung zu beschleunigen würde ich gerne bei Button
>> Betätigung nur eine Aktion senden, aber nicht das die Seite komplett neu
>> geladen werden muss. Wie kann ich das umsetzten?
>
> Wenn du nicht unbedingt auf das neumodische Javascript/AJAX-Gedöhns
> umsteigen willst: Das geht ganz Old-School per HTTP-Response-Code.
>
> https://http.cat/204 "No Content"
>
> https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
>> The HTTP 204 No Content success status response code indicates that the
>> request has succeed, but that the client doesn't need to go away from its
>> current page.

Interessant, dieser Statuscode 204 war mir bislang gar nicht 
bewusst/bekannt.

Erscheint mir auf Anhieb tatsächlich die einfachste und sinnvollste 
Lösung zu sein.

von Sascha W. (sascha-w)


Lesenswert?

die Frage die sich noch stellt - will der TO nur den Befehl absetzen, 
was man mit dem laden einer Minimaldatei oder Leerdatei in ein nicht 
sichtbares IFrame machen könnte, oder möchte er auf der Seite auch eine 
visuelle Rückmeldung sehen?

Sascha

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.