[PATCH] - FHEMWEB um "Neustart"-Seite erweitert

Begonnen von Markus Bloch, 29 Januar 2015, 00:52:12

Vorheriges Thema - Nächstes Thema

Markus Bloch

Hallo zusammen,

passend zu meinem Vorschlag in der Wunschliste: http://forum.fhem.de/index.php/topic,32909.msg252921.html#new

Ich habe mich doch mal rangewagt und einen Patch erzeugt, der FHEM um eine "Neustart"-Seite erweitert. Das heißt, wenn man im Web-Interface "shutdown restart" eingibt, wird die Antwort noch ausgeliefert "FHEM restarts now. Please be patient..." und nach 2 Sekunden Verzögerung wird der "shutdown restart" durchgeführt. Sobald FHEM wieder neugestartet ist, wird eine Meldung "FHEM Restart successfully completed." ausgegeben.

Somit bleibt die Seite in Takt und es erscheint nicht mehr die übliche Fehlermeldung "Kann keine Verbindung herstellen ...." nach einem "shutdown restart".

Dazu wurden folgende Änderungen vorgenommen:

- FHEMWEB führt "shutdown restart" nicht sofort aus. Merkt sich aber, das ein Restart durchgeführt werden soll ($FW_restart = 1).
- es wird www/pgm2/restart.js eingebunden, wenn ein Restart ansteht ($FW_restart = 1)
- im Content-<div> wird der Text "FHEM restarts now. Please be patient..." ausgegeben
- Sobald der Content in den Write-Buffer übertragen wurde, wird das Kommando "sleep 2; shutdown restart" gestartet. Die 2 Sekunden stellen sicher, dass der Browser noch alle Objekte wie restart.js usw. nachladen kann, bevor der restart beginnt.
- die restart.js setzt sich als ready-Funktion, da ja die regulären Javascript-Funktionalitäten nicht benötigt werden, während des Neustarts
- Es wird $fhem_started aller 2 Sekunden zyklisch geprüft. Sobald der aktuellste Wert größer dem ersten Wert ist, ist der Neustart erfolgreich => Es wird "FHEM Restart successfully completed." eingeblendet.
- die fhemweb.js-Funktion fw_cmd() wurde um einen optionalen Parameter "timeout" ergänzt, der ein maximales Timeout für einen Request in Millisekunden setzt.

Hier der Output aus der Javascript-Konsole von Chrome bei einem Neustart:

00:47:29.289 FW_cmd:/fhem?cmd={$fhem_started}&XHR=1
fhemweb.js:154 00:47:29.332 old startTime: 1422488743

fhemweb.js:154 00:47:29.401 Longpoll with filter
fhemweb.js:154 00:47:31.301 FW_cmd:/fhem?cmd={$fhem_started}&XHR=1
fhemweb.js:154 00:47:31.618 Rcvd:
fhemweb.js:154 00:47:31.618 ERRMSG:Connection lost, trying a reconnect every 5 seconds.<
fhemweb.js:178 POST http://192.168.179.38:8083/fhem?cmd={$fhem_started}&XHR=1 net::ERR_CONNECTION_RESET
fhemweb.js:154 00:47:33.316 FW_cmd:/fhem?cmd={$fhem_started}&XHR=1
fhemweb.js:178 POST http://192.168.179.38:8083/fhem?cmd={$fhem_started}&XHR=1 net::ERR_CONNECTION_REFUSED
fhemweb.js:154 00:47:35.319 FW_cmd:/fhem?cmd={$fhem_started}&XHR=1
fhemweb.js:154 00:47:36.524 ERRMSG:<
fhemweb.js:154 00:47:36.631 Longpoll with filter
fhemweb.js:154 00:47:37.322 FW_cmd:/fhem?cmd={$fhem_started}&XHR=1
fhemweb.js:154 00:47:39.324 FW_cmd:/fhem?cmd={$fhem_started}&XHR=1
fhemweb.js:154 00:47:41.331 FW_cmd:/fhem?cmd={$fhem_started}&XHR=1
fhemweb.js:154 00:47:43.338 FW_cmd:/fhem?cmd={$fhem_started}&XHR=1
fhemweb.js:154 00:47:45.339 FW_cmd:/fhem?cmd={$fhem_started}&XHR=1
fhemweb.js:154 00:47:47.354 FW_cmd:/fhem?cmd={$fhem_started}&XHR=1
fhemweb.js:154 00:47:49.370 FW_cmd:/fhem?cmd={$fhem_started}&XHR=1
fhemweb.js:154 00:47:50.969 new startTime: 1422488868
fhemweb.js:154 00:47:50.969 restart complete



Das gesamte Verhalten funktioniert sehr zuverlässig. Es wurde auf IE11, Mozilla, Chrome getestet, alles ohne Probleme.

Was haltet ihr davon?

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

rudolfkoenig

Ich habe eine deutlich einfachere Variante gerade eingecheckt: fhemweb.js prueft den Inhalt von input.maininput, und versendet ihn via FW_cmd falls es mit shutdown anfaengt.

Vorteil dieser Variante: klein mit begrenzter Wirkung, und damit weniger Nebeneffekte.
Nachteil: es prueft nur input.maininput, d.h. sowas wie <a href...> wird nicht behandelt.
Fuer solche Faelle schlage ich vor Javascript mit FW_cmd() zu verwenden.

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Markus Bloch

Damit habe ich leider Bauchschmerzen.

Die Variante es direkt in fhemweb.js abzufangen find ich gut. Deine Änderung bezieht sich allerdings auf "shutdown" und "shutdown restart". Wenn FHEM mit shutdown runtergefahren ist, ist dann wirklich noch eine intakte FHEM Seite notwendig? In diesem Fall finde ich es schon korrekt, wenn hier die Browser-Fehlerseite kommt.

Desweiteren halte ich es dennoch für angebracht im Falle von "shutdown restart" Dem Nutzer eine Meldung zu präsentieren, dass FHEM jetzt im Hintergrund automatisch neustartet (z.B. mit $("div#content").html("FHEM is restarting in background...")). Das es keine Abschlussmeldung über den Neustart gibt, damit kann ich leben.

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

betateilchen

Das sehe ich doch auch jetzt schon im Frontend, nämlich an der "connection lost. Retrying 5 seconds" (oder so ähnlich) die kommt, sobald ein shutdown restart ausgeführt wird.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Markus Bloch

Die Meldung beschreibt mir nur die Folge, aber nicht die Ursache. Ich finde intuitiv ist das für Normalsterbliche nicht.
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

betateilchen

Ich traue einem Normalsterblichen durchaus zu, sich daran erinnern zu können, vor fünf Sekunden ein shutdown angefordert zu haben 8)

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Markus Bloch

Zitat von: betateilchen am 01 Februar 2015, 01:17:49
Ich traue einem Normalsterblichen durchaus zu, sich daran erinnern zu können, vor fünf Sekunden ein shutdown angefordert zu haben 8)

Du musst wohl Optimist sein, wenn du so ein starkes Vertrauen hast:

- http://forum.fhem.de/index.php/topic,33333.0.html
- und noch weitere (Sitz gerade im Zug und Internet ist zu buggy um alles zu sammeln)
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

betateilchen

Zitat von: Markus Bloch am 05 Februar 2015, 17:08:26
Du musst wohl Optimist sein, wenn du so ein starkes Vertrauen hast

Wenn dem nicht so wäre, wäre ich seit ca. fünf Jahren nicht mehr am Leben.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!