diff --git a/FHEM/01_FHEMWEB.pm b/FHEM/01_FHEMWEB.pm
index 1660368b5..5b6be3ef4 100644
--- a/FHEM/01_FHEMWEB.pm
+++ b/FHEM/01_FHEMWEB.pm
@@ -179,6 +179,7 @@ FHEMWEB_Initialize($)
hiddenroomRegexp
httpHeader
iconPath
+ jsLog:1,0
longpoll:0,1,websocket
longpollSVG:1,0
logDevice
@@ -420,10 +421,12 @@ FW_Read($$)
my $idx = 0;
$data = pack("C*", map { $_ ^ $m[$idx++ % 4] } unpack("C*", $data));
}
- $hash->{BUF} = "";
+
my $ret = FW_fC($data);
FW_addToWritebuffer($hash,
FW_longpollInfo("JSON", defined($ret) ? $ret : "")."\n");
+ $hash->{BUF} = substr($hash->{BUF}, $i+$len);
+ FW_Read($hash, 1) if($hash->{BUF});
return;
}
@@ -1198,6 +1201,7 @@ FW_dataAttr()
}
return
+ addParam("jsLog", 0).
addParam("confirmDelete", 1).
addParam("confirmJSError", 1).
addParam("addHtmlTitle", 1).
@@ -3966,6 +3970,12 @@ FW_log($$)
each HTTP Header X can be accessed via %{X}i.
+
+
jsLog [1|0]
+ if set, and longpoll is websocket, send the browser console log
+ messages to the FHEM log. Useful for debugging tablet/phone problems.
+
+
longpoll [0|1|websocket]
If activated, the browser is notifed when device states, readings or
@@ -4726,6 +4736,13 @@ FW_log($$)
+
+ jsLog [1|0]
+ falls gesetzt, und longpoll=websocket, dann werden Browser
+ Konsolenmeldungen in das FHEM-Log geschrieben. Nützlich bei der
+ Fehlersuche auf Tablets oder Handys.
+
+
longpoll [0|1|websocket]
Falls gesetzt, FHEMWEB benachrichtigt den Browser, wenn
diff --git a/www/pgm2/fhemweb.js b/www/pgm2/fhemweb.js
index ef9c7a6e8..16eb0f065 100644
--- a/www/pgm2/fhemweb.js
+++ b/www/pgm2/fhemweb.js
@@ -3,10 +3,13 @@ var FW_version={};
FW_version["fhemweb.js"] = "$Id$";
var FW_serverGenerated;
+var FW_jsLog;
var FW_serverFirstMsg = (new Date()).getTime()/1000;
var FW_serverLastMsg = FW_serverFirstMsg;
var FW_isIE = (navigator.appVersion.indexOf("MSIE") > 0);
-var FW_isiOS = navigator.userAgent.match(/(iPad|iPhone|iPod)/);
+var FW_isiOS = navigator.userAgent.match(/(iPad|iPhone|iPod)/) ||
+ (navigator.platform === 'MacIntel' &&
+ navigator.maxTouchPoints > 1); /* iPad OS 13+ */
var FW_scripts = {}, FW_links = {};
var FW_docReady = false, FW_longpollType, FW_csrfToken, FW_csrfOk=true;
var FW_root = "/fhem"; // root
@@ -80,9 +83,11 @@ FW_jqueryReadyFn()
if(FW_docReady) // loading fhemweb.js twice is hard to debug
return;
FW_docReady = true;
- FW_serverGenerated = $("body").attr("generated");
+ FW_serverGenerated = $("body").attr("generated");
+ FW_jsLog = $("body").attr("data-jsLog");
FW_longpollType = $("body").attr("longpoll");
+
var ajs = $("body").attr("data-availableJs");
if(ajs) {
ajs = ajs.split(",");
@@ -500,16 +505,27 @@ FW_delayedStart()
}
-
+var FW_logStack=[];
function
log(txt)
{
var d = new Date();
var ms = ("000"+(d.getMilliseconds()%1000));
ms = ms.substr(ms.length-3,3);
- txt = d.toTimeString().substring(0,8)+"."+ms+" "+txt;
+ var lTxt = d.toTimeString().substring(0,8)+"."+ms+" "+txt;
if(typeof window.console != "undefined")
- console.log(txt);
+ console.log(lTxt);
+
+ if(FW_jsLog && FW_longpollType == "websocket") {
+ FW_logStack.push(txt);
+ if(FW_pollConn && FW_pollConn.readyState == FW_pollConn.OPEN) {
+ while(FW_logStack.length) {
+ txt = '{Log 1, "jsLog: '+FW_logStack.shift().replace(/"/g, "'")+'"}';
+ console.log(txt);
+ FW_pollConn.send(txt);
+ }
+ }
+ }
}
function
@@ -540,7 +556,7 @@ FW_csrfRefresh(callback)
}
function
-FW_cmd(arg, callback)
+FW_cmd(arg, callback, rep)
{
if(arg.length < 120)
log("FW_cmd:"+arg);
@@ -548,6 +564,8 @@ FW_cmd(arg, callback)
log("FW_cmd:"+arg.substr(0,120)+"...");
$.ajax({
url:addcsrf(arg)+'&fw_id='+$("body").attr('fw_id'),
+ headers: { "cache-control": "no-cache" },
+ dataType: "text",
method:'POST',
success: function(data, textStatus, req){
FW_csrfOk = true;
@@ -557,9 +575,18 @@ FW_cmd(arg, callback)
FW_errmsg(req.responseText, 5000);
},
error:function(xhr, status, err) {
- if(xhr.status == 400 && typeof FW_csrfToken != "undefined") {
+ // iOS 13+ is not queueing requests, have to do it myself. Forum #116962
+ if(xhr.status == 0 && xhr.readyState == 0 && (!rep || rep < 10)) {
+ rep = (rep ? rep+1 : 1);
+ log("FW_cmd retry #"+rep);
+ setTimeout(function(){FW_cmd(arg, callback, rep)}, 200);
+
+ } else if(xhr.status == 400 && typeof FW_csrfToken != "undefined") {
FW_csrfToken = "";
FW_csrfRefresh(function(){FW_cmd(arg, callback)});
+
+ } else {
+ log("FW_cmd error: "+status+"/"+JSON.stringify(xhr));
}
}
});
@@ -1098,7 +1125,8 @@ FW_doUpdate(evt)
var l = input.substr(FW_longpollOffset, nOff-FW_longpollOffset);
FW_longpollOffset = nOff+1;
- log("Rcvd: "+(l.length>132 ? l.substring(0,132)+"...("+l.length+")":l));
+ if(l != '[""]') // jsLog answer
+ log("Rcvd: "+(l.length>132 ? l.substring(0,132)+"...("+l.length+")":l));
if(!l.length)
continue;
if(l.indexOf("<")== 0) { // HTML returned by proxy, if FHEM behind is dead