Remote observing ESP SerialMonitor

E1cid.Append payload to textarea element in open template/WebPage - #3 by E1cid

Hallo,
The suggestion of E1cid was applied, and working fine : change ESP32 SerialMonitor to WebSerial, or to No Serial.
Except... the ESP callback() accepts each msg correct. But goes bananas when... an other is sent ???.
And sometimes accepts 2 consecutive msg, and then fails for a 3rd.

I debugged the NR MQTT out-node, and that looks fine (eg 09_esp32/WebSerialSts : msg.payload : string[2] "WS").
NR generates only NS, WS or SM.
When the callback fails, the SerialMonitor is death, though the ESP keeps on publishing sensor readings to NR.
I cannot debug the callback as the SerialMonitor does not react anymore.
It is not elegant, but for now, I added ESP.restart().

No idea if this is a NR or an ESP issue.

What am I missing ?

Cheers,

T

//--- called by Setup ------------------------------------------------------------
void initMQTT() {
  client.setServer(MQTT_IP.c_str(), MQTT_PORT);
  client.setCallback(MQTTcallback);       
}

//--- called by Setup ------------------------------------------------------------
void MQTTcallback(char* topic, byte* message, unsigned int length) {
  message[length] = '\0'; // Null-terminate the message to treat it as a C-style string   
  String strMsg = String((char*)message).substring(0, length); 
  echoSerial("MQTTcallback message arrived on topic : " + String(topic) +" : " + strMsg); 

  if (strcmp(topic, "09_esp32/WebSerialSts")==0) {   
    WebSerialSts(strMsg);
  }

  else {
    echoSerial("debug MQTT : Invalid topic");
    client.publish("esp32/WebSerialMsg", "MQTTcallback failed to get topic ! ESP.restart..."); 
    ESP.restart();
  }
}

//--- called by Loop  ------------------------------------------------------------
void MQTTreconnect() {
  while (!client.connected()) {
    echoSerial("MQTTreconnect - Attempting reconnect...");

    if (client.connect("espClient_09")) {
      echoSerial("MQTTreconnect - connected ! ");
      client.subscribe("09_esp32/WebSerialSts");     
    } else {
      Serial.println("MQTTreconnect - failed, rc=" + String(client.state()) + " try again in 3 seconds");   
      delay(3000);
    }
  }
}
[
    {
        "id": "50da04b3.af25fc",
        "type": "websocket out",
        "z": "b27365bdbcced484",
        "name": "",
        "server": "985ecbc7.67a138",
        "client": "",
        "x": 490,
        "y": 420,
        "wires": []
    },
    {
        "id": "42a28745.bd5d78",
        "type": "http response",
        "z": "b27365bdbcced484",
        "name": "",
        "x": 610,
        "y": 80,
        "wires": []
    },
    {
        "id": "1787be40.e87842",
        "type": "http in",
        "z": "b27365bdbcced484",
        "name": "",
        "url": "/webserial",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 100,
        "y": 80,
        "wires": [
            [
                "adf5eb6fdb320197",
                "8d534dbaaeecbb04"
            ]
        ]
    },
    {
        "id": "eccc8bc2.133378",
        "type": "websocket in",
        "z": "b27365bdbcced484",
        "name": "",
        "server": "985ecbc7.67a138",
        "client": "",
        "x": 110,
        "y": 520,
        "wires": [
            [
                "9adfff59.652"
            ]
        ]
    },
    {
        "id": "9adfff59.652",
        "type": "debug",
        "z": "b27365bdbcced484",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 310,
        "y": 520,
        "wires": []
    },
    {
        "id": "9e0187980030a273",
        "type": "mqtt out",
        "z": "b27365bdbcced484",
        "name": "05 Techn. Room",
        "topic": "05_esp32/WebSerialSts",
        "qos": "0",
        "retain": "false",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "407a01e4.6b637",
        "x": 740,
        "y": 140,
        "wires": []
    },
    {
        "id": "220bfe5c6a10d807",
        "type": "http in",
        "z": "b27365bdbcced484",
        "name": "",
        "url": "/webserialPost",
        "method": "post",
        "upload": false,
        "swaggerDoc": "",
        "x": 110,
        "y": 200,
        "wires": [
            [
                "4ec8b329cbb601b2",
                "92b37cebce018d80"
            ]
        ]
    },
    {
        "id": "f26dc0cef4885c5c",
        "type": "mqtt in",
        "z": "b27365bdbcced484",
        "name": "",
        "topic": "esp32/WebSerialMsg",
        "qos": "2",
        "datatype": "auto-detect",
        "broker": "407a01e4.6b637",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 120,
        "y": 420,
        "wires": [
            [
                "50da04b3.af25fc",
                "90668d0fa6c6de08"
            ]
        ],
        "info": "Bentel will activate a contactor when in mode \"Awake and Up\". This contactor is connected to 05_ESP32 pin 31.\n05_ESP32 will MQTT-publish to topic \"05_esp32/stateBentel\".\nNR will MQTT-publish \"on\" to topic 08_esp32/FOSCAM\n08_ESP32 will MQTT-subscribe to NR topic 08_esp32/FOSCAM, and set Relais 1 and switch the CAM off. "
    },
    {
        "id": "d492f8d112d2f31c",
        "type": "template",
        "z": "b27365bdbcced484",
        "name": "HTML",
        "field": "payload",
        "fieldType": "msg",
        "format": "handlebars",
        "syntax": "mustache",
        "template": "<!DOCTYPE html>\n<head>\n  <title>NodeRed WebPage</title>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>ESP32 Serial Monitor</title>\n  <style>\n  html {\n    font-family: Arial, Helvetica, sans-serif;\n    text-align: left;\n  }\n  h1 {\n    font-size: 1.8rem;\n    color: white;\n    text-align: center;\n  }\n  h2 {\n    font-size: 1.5rem;\n    font-weight: bold;\n    color: #143642;\n  }\n  h3 {\n    font-size: 1.0rem;\n    font-weight: bold;\n    color: #143642;\n  }\n  .topnav {\n    overflow: hidden;\n    background-color: #143642;\n  }    \n  .button {\n    padding: 15px 50px;\n    font-size: 24px;\n    text-align: center;\n    outline: none;\n    color: #fff;\n    background-color: #0f8b8d;\n    border: none;\n    border-radius: 5px;\n    -webkit-touch-callout: none;\n    -webkit-user-select: none;\n    -khtml-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n    -webkit-tap-highlight-color: rgba(0,0,0,0);\n  }\n  .button:active {\n    background-color: #0f8b8d;\n    box-shadow: 2 2px #CDCDCD;\n    transform: translateY(2px);\n  }        \n\n  </style>\n</head>\n\n<script type = \"text/javascript\">\n  window.onload = function() {\n    addEvents();\n  }\n      \n  function addEvents() {\n    //list all events\n    //addEvent(document.getElementById('state08.2.update'), 'click', updateState082);\n  }  \n\n  function addEvent(element, evnt, funct){\n    if (element.attachEvent)\n      return element.attachEvent('on'+evnt, funct);\n    else\n      return element.addEventListener(evnt, funct, false);\n    }\n\n    var ws;\n    var wsUri = \"ws:\";\n    var loc = window.location;\n    console.log(loc);\n    if (loc.protocol === \"https:\") { wsUri = \"wss:\"; }\n    // This needs to point to the web socket in the Node-RED flow\n    // ... in this case it's ws/simple\n    wsUri += \"//\" + loc.host + loc.pathname.replace(\"webserial\",\"ws/webserial\");\n\n\n    var line = \"\";    // either uncomment this for a building list of messages\n    function wsConnect() {\n      console.log(\"connect\",wsUri);\n      ws = new WebSocket(wsUri);\n      //var line = \"\";    // either uncomment this for a building list of messages\n      ws.onmessage = function(msg) {\n      //    var line = \"\";  // or uncomment this to overwrite the existing message\n          // parse the incoming message as a JSON object\n          var data = msg.data;\n          var initialLine = \"\";\n          console.log(data);\n          line = `${data}\\r\\n${line}`;\n          document.getElementById('messages').textContent = line;\n      }\n      ws.onopen = function() {\n          document.getElementById('status').innerHTML = \"<b>WebSocket: connected</b>\";\n          console.log(\"WebSocket: connected\");\n      }\n      ws.onclose = function() {\n          document.getElementById('status').innerHTML = \"WebSocket: not connected\";\n          setTimeout(wsConnect,3000);   // in case of lost connection tries to reconnect every 3 secs\n      }\n    }\n\n  function input_update(newID, newVal) {\n    newVal = newVal.toUpperCase();\n    switch(newVal) {\n      case \"NS\":\n        input_post(newID, newVal);\n        break;  \n      case \"SM\":\n        input_post(newID, newVal);\n        break;  \n      case \"WS\":\n        input_post(newID, newVal);\n        break;  \n      case \"C\":\n        document.getElementById(\"messages\").textContent = \"\";\n        break;\n      default:\n        document.getElementById('serialInput').value = \"Invalid entry\";\n    }    \n  }\n  function input_post(newID, newVal) {\n    fetch(\"http://192.168.0.4:1880/webserialPost\", {\n    method: \"POST\", \n    body: JSON.stringify({newID, newVal}),\n    headers: { \"Content-type\": \"application/json; charset=UTF-8\" } })\n    .then((response) => response.json())\n    .then((json) => window.location.reload());         \n  }\n\n</script>\n\n<body onload=\"wsConnect();\" onunload=\"ws.disconnect();\">\n  <div class=\"topnav\">\n    <h1>ESP32 WebSerial Monitor</h1>\n  </div>\n\n  <p>Return ...... : <a href=\"/wsHC\">Home Control</a></p>\n  <p>Return ...... : <a href=\"/wsESPSU\">ESP Set up</a></p><br>    \n\n  <input type=\"text\" id=\"serialESP\"   size=\"15\" style=\"font-weight: bold\" value=\"{{global[file].WebSerial_ESPID}}\" readonly> <br><br>\n\n  <input type=\"text\" id=\"serialInput\" size=\"15\" style=\"background-color: lightyellow\" >\n  <input type=\"submit\" id=\"btn.update\"\n    onclick=\"input_update(serialESP.value,serialInput.value)\" value=\"Send\" />\n  <p>...NS: No Serial, SM: Serial Monitor, WS: WebSerial</p>    \n  <p>...C: Clear output</p>  \n\n  <div id=\"status\">unknown</div>\n\n  <textarea id=\"messages\" rows=\"20\" cols=\"80\" style=\"resize: vertical;\"> </textarea>\n\n</body>\n</html>\n",
        "output": "str",
        "x": 470,
        "y": 80,
        "wires": [
            [
                "42a28745.bd5d78"
            ]
        ]
    },
    {
        "id": "adf5eb6fdb320197",
        "type": "change",
        "z": "b27365bdbcced484",
        "name": "set globals",
        "rules": [
            {
                "t": "set",
                "p": "#:(file)::WebSerial_ESPID",
                "pt": "global",
                "to": "payload.ESPID",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 310,
        "y": 80,
        "wires": [
            [
                "d492f8d112d2f31c"
            ]
        ]
    },
    {
        "id": "8d534dbaaeecbb04",
        "type": "debug",
        "z": "b27365bdbcced484",
        "name": "debug",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 290,
        "y": 120,
        "wires": []
    },
    {
        "id": "4ec8b329cbb601b2",
        "type": "debug",
        "z": "b27365bdbcced484",
        "name": "debug",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 290,
        "y": 220,
        "wires": []
    },
    {
        "id": "90668d0fa6c6de08",
        "type": "debug",
        "z": "b27365bdbcced484",
        "name": "debug",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 290,
        "y": 440,
        "wires": []
    },
    {
        "id": "92b37cebce018d80",
        "type": "function",
        "z": "b27365bdbcced484",
        "name": "WebSerialSts",
        "func": "var pl = msg.payload;\nvar gv = global.get(\"WebSerial_ESPID\", \"file\") || \"Oops !\";\nvar topic = `${gv}/WebSerialSts`; \nvar msg1 = null; // 05 Techn. Room\nvar msg2 = null; // 06 Techn. Room CV\nvar msg3 = null; // 07 tbn\nvar msg4 = null; // 08 Garage\nvar msg5 = null; // 09 Garage TECLO\nvar msg6 = null; // 10 tbn\nvar msg7 = null; // 11 Living\nvar msg8 = null; // 12 Bedroom 1\nvar msg9 = null; // 13 Bedroom 2\n\nif (gv == \"05_esp32\") {\n    msg1 = {\n      topic: topic,\n      payload: pl.newVal\n    };\n}\nelse if (gv == \"06_esp32\") {\n    msg1 = null;    \n    msg2 = {\n        topic: topic,\n        payload: pl.newVal\n    };\n}\nelse if (gv == \"09_esp32\") {\n    msg1 = null;    \n    msg5 = {\n        topic: topic,\n        payload: pl.newVal\n    };\n}\n\nreturn [msg1, msg2, msg3, msg4, msg5, msg6, msg7, msg8, msg9];  ",
        "outputs": 9,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 480,
        "y": 200,
        "wires": [
            [
                "9e0187980030a273",
                "e3c018165d6de37f"
            ],
            [
                "a6c75673c6495d5a"
            ],
            [
                "ef4b321fdad53af5"
            ],
            [
                "28ca1eed57366a5e",
                "ac67bbd109977a1d"
            ],
            [
                "f277d99b550b4479",
                "ac4cc8adc94cbbba"
            ],
            [
                "dd6b48ca93e86a29"
            ],
            [
                "6f8c0a274e20380e",
                "03fcb5a37a6c2431"
            ],
            [
                "1e5fe79e8098ccfe"
            ],
            [
                "0141a12e9ee29dd6",
                "a70ad6054f13b2f3"
            ]
        ]
    },
    {
        "id": "a6c75673c6495d5a",
        "type": "mqtt out",
        "z": "b27365bdbcced484",
        "name": "06 Techn. Room CV",
        "topic": "06_esp32/WebSerialSts",
        "qos": "0",
        "retain": "false",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "407a01e4.6b637",
        "x": 760,
        "y": 200,
        "wires": []
    },
    {
        "id": "e3c018165d6de37f",
        "type": "debug",
        "z": "b27365bdbcced484",
        "name": "debug 134",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 950,
        "y": 140,
        "wires": []
    },
    {
        "id": "ac4cc8adc94cbbba",
        "type": "debug",
        "z": "b27365bdbcced484",
        "name": "debug 135",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 950,
        "y": 380,
        "wires": []
    },
    {
        "id": "28ca1eed57366a5e",
        "type": "mqtt out",
        "z": "b27365bdbcced484",
        "name": "08 Garage",
        "topic": "08_esp32/WebSerialSts",
        "qos": "0",
        "retain": "false",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "407a01e4.6b637",
        "x": 730,
        "y": 320,
        "wires": []
    },
    {
        "id": "f277d99b550b4479",
        "type": "mqtt out",
        "z": "b27365bdbcced484",
        "name": "09 Garage TECLO",
        "topic": "09_esp32/WebSerialSts",
        "qos": "0",
        "retain": "false",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "407a01e4.6b637",
        "x": 750,
        "y": 380,
        "wires": []
    },
    {
        "id": "6f8c0a274e20380e",
        "type": "mqtt out",
        "z": "b27365bdbcced484",
        "name": "11 Living",
        "topic": "11_esp32/WebSerialSts",
        "qos": "0",
        "retain": "false",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "407a01e4.6b637",
        "x": 720,
        "y": 500,
        "wires": []
    },
    {
        "id": "1e5fe79e8098ccfe",
        "type": "mqtt out",
        "z": "b27365bdbcced484",
        "name": "12 Bed 1",
        "topic": "12_esp32/WebSerialSts",
        "qos": "0",
        "retain": "false",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "407a01e4.6b637",
        "x": 720,
        "y": 560,
        "wires": []
    },
    {
        "id": "0141a12e9ee29dd6",
        "type": "mqtt out",
        "z": "b27365bdbcced484",
        "name": "13 Bed 2",
        "topic": "13_esp32/WebSerialSts",
        "qos": "0",
        "retain": "false",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "407a01e4.6b637",
        "x": 720,
        "y": 620,
        "wires": []
    },
    {
        "id": "ef4b321fdad53af5",
        "type": "mqtt out",
        "z": "b27365bdbcced484",
        "name": "07 tbn",
        "topic": "07_esp32/WebSerialSts",
        "qos": "0",
        "retain": "false",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "407a01e4.6b637",
        "x": 710,
        "y": 260,
        "wires": []
    },
    {
        "id": "dd6b48ca93e86a29",
        "type": "mqtt out",
        "z": "b27365bdbcced484",
        "name": "10 tbn",
        "topic": "10_esp32/WebSerialSts",
        "qos": "0",
        "retain": "false",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "407a01e4.6b637",
        "x": 710,
        "y": 440,
        "wires": []
    },
    {
        "id": "03fcb5a37a6c2431",
        "type": "debug",
        "z": "b27365bdbcced484",
        "name": "debug 136",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 950,
        "y": 500,
        "wires": []
    },
    {
        "id": "a70ad6054f13b2f3",
        "type": "debug",
        "z": "b27365bdbcced484",
        "name": "debug 137",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 950,
        "y": 620,
        "wires": []
    },
    {
        "id": "ac67bbd109977a1d",
        "type": "debug",
        "z": "b27365bdbcced484",
        "name": "debug 159",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 950,
        "y": 320,
        "wires": []
    },
    {
        "id": "985ecbc7.67a138",
        "type": "websocket-listener",
        "z": "b27365bdbcced484",
        "path": "/ws/webserial",
        "wholemsg": "false"
    },
    {
        "id": "407a01e4.6b637",
        "type": "mqtt-broker",
        "name": "",
        "broker": "localhost",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "sessionExpiry": ""
    }
]

Note sure what is going on but two things i notice right off.
1 There is no response node to your http in post node.
2 Your fetch call has no error catch to handle any errors.

[edit] Another thing i notice is you force a page reload, would it be better just to update the dome elements data.

Thank You E1cid.

  1. Page reload : is now out. no need for.
  2. error catch : indeed, should be added
  3. no node in post : "[ws]/ws/webserial" was twice in. is now removed.

Probably the issue is on the ESP32 side, though the snippet (callback) is copy conform with an example of RandomNerdTutorials.

Thanks anyway.
T

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.