From 77b0c6cc6cfd51c68c2b4e6af2a0febaca5ffacc Mon Sep 17 00:00:00 2001
From: arnaud <arnaud.watlet@umons.ac.be>
Date: Wed, 26 Oct 2022 11:47:36 +0200
Subject: [PATCH] Fixes bugs on MQTT and TCP communication - start woks on
 webserver and mqtt_interface (through Node-Red)

---
 config.py              |  8 +++----
 index.html             | 22 +++++++++----------
 mqtt_interface.py      | 50 +++++++++++++++++++++++++-----------------
 ohmpi.py               | 15 +++++++------
 simple_ohmpi_flow.json |  2 +-
 webserver.py           | 30 +++++++++++++------------
 6 files changed, 70 insertions(+), 57 deletions(-)

diff --git a/config.py b/config.py
index f92ef7e6..25f6efb4 100644
--- a/config.py
+++ b/config.py
@@ -56,13 +56,13 @@ SOH_LOGGING_CONFIG = {
 
 # MQTT logging configuration parameters
 MQTT_LOGGING_CONFIG = {
-    'hostname': 'ohmpy.umons.ac.be',
+    'hostname':'mg3d-dev.umons.ac.be',
     'port': 1883,
     'qos': 2,
     'retain': False,
     'keepalive': 60,
     'will': None,
-    'auth': None,
+    'auth': { 'username': 'mqtt_user', 'password': 'mqtt_password' },
     'tls': None,
     'protocol': MQTTv31,
     'transport': 'tcp',
@@ -74,13 +74,13 @@ MQTT_LOGGING_CONFIG = {
 
 # MQTT control configuration parameters
 MQTT_CONTROL_CONFIG = {
-    'hostname': 'ohmpy.umons.ac.be',
+    'hostname': 'mg3d-dev.umons.ac.be',
     'port': 1883,
     'qos': 2,
     'retain': False,
     'keepalive': 60,
     'will': None,
-    'auth': None,
+    'auth': { 'username': 'mqtt_user', 'password': 'mqtt_password' },
     'tls': None,
     'protocol': MQTTv31,
     'transport': 'tcp',
diff --git a/index.html b/index.html
index 699fc924..691332e9 100644
--- a/index.html
+++ b/index.html
@@ -142,7 +142,7 @@
 
         // useful functions
         function sendCommand(query, callback=null) {
-            // dic in the form: {'command': X, ...} as JSON
+            // dic in the form: {'cmd': X, ...} as JSON
             if (callback == null) {
                 function callback(x) {
                     console.log('default callback:', x)
@@ -163,7 +163,7 @@
 
         // start button
         function startBtnFunc() {
-            sendCommand('{"command": "start"}', function(x) {
+            sendCommand('{"cmd": "start"}', function(x) {
                 console.log(x['status'])
                 if (x['status'] == 'running') {
                     output.innerHTML = 'Status: measuring...'
@@ -175,7 +175,7 @@
 
         // stop button
         function stopBtnFunc() {
-            sendCommand('{"command": "stop"}', function(x) {
+            sendCommand('{"cmd": "stop"}', function(x) {
                 output.innerHTML = 'Status: ' + x['status']
                 clearInterval(interv)
                 getData()
@@ -197,7 +197,7 @@
             // define callback to send settigs to Pi
             function configCallback() {
                 sendCommand(JSON.stringify({
-                    'command': 'setConfig',
+                    'cmd': 'setConfig',
                      'config': formVals
                 }), function(x) {
                     console.log('setconfig:', x)
@@ -351,7 +351,7 @@
         
         // run RS check
         function rsBtnFunc() {
-            sendCommand('{"command": "rsCheck"}', function (res) {
+            sendCommand('{"cmd": "rsCheck"}', function (res) {
                 // update the bar plot
                 rsdata.push({
                 x: res['data']['AB'],
@@ -376,7 +376,7 @@
         // getData
         function getData() {
             sendCommand(JSON.stringify({
-                'command': 'getData',
+                'cmd': 'getData',
                 'surveyNames': Object.keys(data).slice(0, -1)
                 // last survey is often partial so we download it again
             }), function(ddic) {
@@ -497,7 +497,7 @@
 
         // remove data
         function removeDataBtnFunc() {
-            sendCommand('{"command": "removeData"}',function(x) {
+            sendCommand('{"cmd": "removeData"}',function(x) {
                 data = {}
                 output.innerHTML = 'Status: ' + x['status'] + ' (all data cleared)'
                 console.log('all data removed')
@@ -508,7 +508,7 @@
 
         // shutdown Pi
         function shutdownBtnFunc() {
-            sendCommand('{"command": "shutdown"}', function(x) {
+            sendCommand('{"cmd": "shutdown"}', function(x) {
                 console.log('shuting down...')
             })
         }
@@ -517,7 +517,7 @@
         
         // restart Pi
         function restartBtnFunc() {
-            sendCommand('{"command": "restart"}', function(x) {
+            sendCommand('{"cmd": "restart"}', function(x) {
                 console.log('rebooting...')
             })
         }
@@ -526,7 +526,7 @@
         
         // invert data
         // function invertBtnFunc() {
-        //     sendCommand('{"command": "invert"}', function(x) {
+        //     sendCommand('{"cmd": "invert"}', function(x) {
         //         console.log('inversion results', x)
         //     })
         // }
@@ -535,7 +535,7 @@
 
         // download data
         function downloadBtnFunc() {
-            sendCommand('{"command": "download"}', function(x) {
+            sendCommand('{"cmd": "download"}', function(x) {
                 let dwl = document.getElementById('download')
                 dwl.setAttribute('href', serverUrl + '/data.zip')
                 dwl.setAttribute('download', 'data.zip')
diff --git a/mqtt_interface.py b/mqtt_interface.py
index e9005264..24124527 100644
--- a/mqtt_interface.py
+++ b/mqtt_interface.py
@@ -6,42 +6,52 @@ import zmq
 
 ctrl_queue = Queue()
 
-
 def on_message(client, userdata, message):
     global socket
 
     # Send the command
     print(f'Sending command {message.payload.decode("utf-8")}')
-    socket.send_string(message.payload.decode("utf-8"))
-
-    #  Get the reply.
+    socket.send(message.payload)
+
+    #  Get the reply
+    # event = socket.poll(timeout=1000)
+    # if event == 0:
+    #     print('timeout')
+    #     reply = 'no reply...'
+    # else:
     reply = socket.recv()
-    print(f'Received reply {message.payload.decode("utf-8")}: {reply}')
 
+    print(f'Received reply {message.payload.decode("utf-8")}: {reply}')
 
 mqtt_client = mqtt.Client(f'ohmpi_{OHMPI_CONFIG["id"]}_listener', clean_session=False)  # create new instance
-print('now this')
 print('connecting to broker')
 trials = 0
 trials_max = 10
+broker_connected = False
 while trials < trials_max:
     try:
+        mqtt_client.username_pw_set(MQTT_CONTROL_CONFIG['auth'].get('username'),MQTT_CONTROL_CONFIG['auth']['password'])
         mqtt_client.connect(MQTT_CONTROL_CONFIG['hostname'])
         trials = trials_max
+        broker_connected = True
     except:
-        print('new trial')
+        print('trying again...')
         time.sleep(2)
         trials+=1
-print('Subscribing to topic', MQTT_CONTROL_CONFIG['ctrl_topic'])
-mqtt_client.subscribe(MQTT_CONTROL_CONFIG['ctrl_topic'], MQTT_CONTROL_CONFIG['qos'])
-mqtt_client.on_message = on_message
-mqtt_client.loop_start()
-context = zmq.Context()
-
-#  Socket to talk to server
-print("Connecting to ohmpi control server")
-socket = context.socket(zmq.REQ)
-socket.connect(f'tcp://localhost:{CONTROL_CONFIG["tcp_port"]}')
-
-while True:
-    time.sleep(.1)
+if broker_connected:
+    print('Subscribing to topic', MQTT_CONTROL_CONFIG['ctrl_topic'])
+    mqtt_client.subscribe(MQTT_CONTROL_CONFIG['ctrl_topic'], MQTT_CONTROL_CONFIG['qos'])
+    mqtt_client.on_message = on_message
+    mqtt_client.loop_start()
+
+    context = zmq.Context()
+    #  Socket to talk to server
+    print("Connecting to ohmpi control server")
+    socket = context.socket(zmq.REQ)
+    socket.connect(f'tcp://localhost:{CONTROL_CONFIG["tcp_port"]}')
+    
+    while True:
+       time.sleep(.1)
+else:
+    print("Unable to connect to broker")
+    exit(1)
diff --git a/ohmpi.py b/ohmpi.py
index ff8ebb59..2d0ac6a7 100644
--- a/ohmpi.py
+++ b/ohmpi.py
@@ -656,6 +656,9 @@ class OhmPi(object):
         self.exec_logger.debug(f'Start listening for commands on port {tcp_port}')
         while self.cmd_listen:
             try:
+                #id_sock = socket.recv()
+                #assert not socket.recv()    # empty data here
+                #assert socket.recv() == id_sock
                 message = socket.recv(flags=zmq.NOBLOCK)
                 self.exec_logger.debug(f'Received command: {message}')
                 e = None
@@ -706,14 +709,15 @@ class OhmPi(object):
                     reply = {'cmd_id': cmd_id, 'status': status}
                     reply = json.dumps(reply)
                     self.exec_logger.debug(f'Execution report: {reply}')
-                    self.exec_logger.debug(reply)
-                    reply = bytes(reply, 'utf-8')
+                    # self.exec_logger.debug(reply)
+                    # reply = bytes(reply, 'utf-8')
+                    reply = reply.encode('utf-8')
                     socket.send(reply)
             except zmq.ZMQError as e:
                 if e.errno == zmq.EAGAIN:
                     pass # no message was ready (yet!)
                 else:
-                    traceback.print_exc()
+                    self.exec_logger.error(f'Unexpected error while process: {e}')
 
     def measure(self, cmd_id=None):
         """Run the sequence in a separate thread. Can be stopped by 'OhmPi.stop()'.
@@ -827,8 +831,5 @@ print(current_time.strftime("%Y-%m-%d %H:%M:%S"))
 if __name__ == "__main__":
     # start interface
     Popen(['python', CONTROL_CONFIG['interface']])
-
+    print('done')
     ohmpi = OhmPi(settings=OHMPI_CONFIG['settings'])
-    
-    
-        
diff --git a/simple_ohmpi_flow.json b/simple_ohmpi_flow.json
index 767fde28..17df4bd7 100644
--- a/simple_ohmpi_flow.json
+++ b/simple_ohmpi_flow.json
@@ -1 +1 @@
-[{"id":"ea6628fd.4d57e8","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"6ae7e77e.04c64","type":"mqtt-broker","name":"ohmpi_mqtt_broker","broker":"ohmpy.umons.ac.be","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"64a75353.37700c","type":"ui_group","name":"Messages","tab":"5d888f29.07334","order":1,"disp":true,"width":"16","collapse":true},{"id":"142ad6ae.d55e29","type":"ui_group","name":"Buttons","tab":"5d888f29.07334","order":3,"disp":true,"width":"6","collapse":false},{"id":"5d888f29.07334","type":"ui_tab","name":"Home","icon":"dashboard","disabled":false,"hidden":false},{"id":"ea73b76b.ee0738","type":"ui_base","theme":{"name":"theme-light","lightTheme":{"default":"#0094CE","baseColor":"#0094CE","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif","edited":false},"darkTheme":{"default":"#097479","baseColor":"#097479","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif","edited":false},"customTheme":{"name":"Untitled Theme 1","default":"#4B7930","baseColor":"#4B7930","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"},"themeState":{"base-color":{"default":"#0094CE","value":"#0094CE","edited":false},"page-titlebar-backgroundColor":{"value":"#0094CE","edited":false},"page-backgroundColor":{"value":"#fafafa","edited":false},"page-sidebar-backgroundColor":{"value":"#ffffff","edited":false},"group-textColor":{"value":"#1bbfff","edited":false},"group-borderColor":{"value":"#ffffff","edited":false},"group-backgroundColor":{"value":"#ffffff","edited":false},"widget-textColor":{"value":"#111111","edited":false},"widget-backgroundColor":{"value":"#0094ce","edited":false},"widget-borderColor":{"value":"#ffffff","edited":false},"base-font":{"value":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"}},"angularTheme":{"primary":"indigo","accents":"blue","warn":"red","background":"grey","palette":"light"}},"site":{"name":"Node-RED Dashboard","hideToolbar":"false","allowSwipe":"false","lockMenu":"false","allowTempTheme":"true","dateFormat":"DD/MM/YYYY","sizes":{"sx":48,"sy":48,"gx":6,"gy":6,"cx":6,"cy":6,"px":0,"py":0}}},{"id":"147e389f.fc5a6f","type":"mqtt in","z":"ea6628fd.4d57e8","name":"","topic":"ohmpi_0001/exec","qos":"2","datatype":"auto","broker":"6ae7e77e.04c64","inputs":0,"x":110,"y":40,"wires":[["ddcc63.c93813a","40efede3.33021c"]]},{"id":"ddcc63.c93813a","type":"debug","z":"ea6628fd.4d57e8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":390,"y":40,"wires":[]},{"id":"40efede3.33021c","type":"ui_text","z":"ea6628fd.4d57e8","group":"64a75353.37700c","order":0,"width":"0","height":"0","name":"MQTT exec","label":"Execution","format":"{{msg.payload}}","layout":"row-spread","x":390,"y":80,"wires":[]},{"id":"64e06023.868f58","type":"mqtt in","z":"ea6628fd.4d57e8","name":"","topic":"ohmpi_0001/data","qos":"2","datatype":"auto","broker":"6ae7e77e.04c64","inputs":0,"x":100,"y":140,"wires":[["ac400b27.992c78","8d7f5d51.c06c4"]]},{"id":"ac400b27.992c78","type":"debug","z":"ea6628fd.4d57e8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":390,"y":140,"wires":[]},{"id":"8d7f5d51.c06c4","type":"ui_text","z":"ea6628fd.4d57e8","group":"64a75353.37700c","order":1,"width":0,"height":0,"name":"MQTT Data","label":"Data","format":"{{msg.payload}}","layout":"row-spread","x":390,"y":180,"wires":[]},{"id":"e1cc28ee.d2dd6","type":"mqtt out","z":"ea6628fd.4d57e8","name":"MQTT ctrl","topic":"ohmpi_0001/ctrl","qos":"0","retain":"false","broker":"6ae7e77e.04c64","x":380,"y":340,"wires":[]},{"id":"a144e7f8.416768","type":"ui_button","z":"ea6628fd.4d57e8","name":"","group":"142ad6ae.d55e29","order":0,"width":"2","height":"1","passthru":false,"label":"Start","tooltip":"","color":"","bgcolor":"green","className":"","icon":"","payload":"start","payloadType":"str","topic":"topic","topicType":"msg","x":70,"y":340,"wires":[["e1cc28ee.d2dd6","4a86345b.fb400c"]]},{"id":"abd65786.c433c8","type":"ui_button","z":"ea6628fd.4d57e8","name":"","group":"142ad6ae.d55e29","order":0,"width":"2","height":"1","passthru":false,"label":"Stop","tooltip":"","color":"","bgcolor":"red","icon":"","payload":"stop","payloadType":"str","topic":"topic","topicType":"msg","x":70,"y":400,"wires":[["e1cc28ee.d2dd6","4a86345b.fb400c"]]},{"id":"4a86345b.fb400c","type":"ui_audio","z":"ea6628fd.4d57e8","name":"","group":"142ad6ae.d55e29","voice":"urn:moz-tts:speechd:English%20(Received%20Pronunciation)?en","always":"","x":380,"y":400,"wires":[]},{"id":"398460c6.27a9e8","type":"mqtt in","z":"ea6628fd.4d57e8","name":"","topic":"ohmpi_0001/soh","qos":"2","datatype":"auto","broker":"6ae7e77e.04c64","inputs":0,"x":100,"y":240,"wires":[["21b85b73.b7ef34","498c2864.b36b18"]]},{"id":"21b85b73.b7ef34","type":"debug","z":"ea6628fd.4d57e8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":390,"y":240,"wires":[]},{"id":"498c2864.b36b18","type":"ui_text","z":"ea6628fd.4d57e8","group":"64a75353.37700c","order":1,"width":0,"height":0,"name":"MQTT SOH","label":"SOH","format":"{{msg.payload}}","layout":"row-spread","x":390,"y":280,"wires":[]},{"id":"3dbcbc0e.3d24ac","type":"ui_form","z":"ea6628fd.4d57e8","name":"Commands","label":"","group":"142ad6ae.d55e29","order":4,"width":0,"height":0,"options":[{"label":"cmd_id","value":"cmd_id","type":"text","required":false,"rows":null},{"label":"cmd","value":"cmd","type":"text","required":true,"rows":null},{"label":"args","value":"args","type":"text","required":false,"rows":null}],"formValue":{"cmd_id":"","cmd":"","args":""},"payload":"","submit":"submit","cancel":"cancel","topic":"topic","topicType":"msg","splitLayout":"","className":"","x":120,"y":640,"wires":[["e1cc28ee.d2dd6","bfc5c3.3e79724"]]},{"id":"bfc5c3.3e79724","type":"ui_text","z":"ea6628fd.4d57e8","group":"64a75353.37700c","order":3,"width":0,"height":0,"name":"","label":"text","format":"{{msg.payload}}","layout":"row-spread","className":"","x":380,"y":640,"wires":[]}]
\ No newline at end of file
+[{"id":"ea6628fd.4d57e8","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"6ae7e77e.04c64","type":"mqtt-broker","name":"ohmpi_mqtt_broker","broker":"mg3d-dev.umons.ac.be","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"64a75353.37700c","type":"ui_group","name":"Messages","tab":"5d888f29.07334","order":1,"disp":true,"width":"16","collapse":true},{"id":"142ad6ae.d55e29","type":"ui_group","name":"Buttons","tab":"5d888f29.07334","order":3,"disp":true,"width":"6","collapse":false},{"id":"5d888f29.07334","type":"ui_tab","name":"Home","icon":"dashboard","disabled":false,"hidden":false},{"id":"ea73b76b.ee0738","type":"ui_base","theme":{"name":"theme-light","lightTheme":{"default":"#0094CE","baseColor":"#0094CE","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif","edited":false},"darkTheme":{"default":"#097479","baseColor":"#097479","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif","edited":false},"customTheme":{"name":"Untitled Theme 1","default":"#4B7930","baseColor":"#4B7930","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"},"themeState":{"base-color":{"default":"#0094CE","value":"#0094CE","edited":false},"page-titlebar-backgroundColor":{"value":"#0094CE","edited":false},"page-backgroundColor":{"value":"#fafafa","edited":false},"page-sidebar-backgroundColor":{"value":"#ffffff","edited":false},"group-textColor":{"value":"#1bbfff","edited":false},"group-borderColor":{"value":"#ffffff","edited":false},"group-backgroundColor":{"value":"#ffffff","edited":false},"widget-textColor":{"value":"#111111","edited":false},"widget-backgroundColor":{"value":"#0094ce","edited":false},"widget-borderColor":{"value":"#ffffff","edited":false},"base-font":{"value":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"}},"angularTheme":{"primary":"indigo","accents":"blue","warn":"red","background":"grey","palette":"light"}},"site":{"name":"Node-RED Dashboard","hideToolbar":"false","allowSwipe":"false","lockMenu":"false","allowTempTheme":"true","dateFormat":"DD/MM/YYYY","sizes":{"sx":48,"sy":48,"gx":6,"gy":6,"cx":6,"cy":6,"px":0,"py":0}}},{"id":"147e389f.fc5a6f","type":"mqtt in","z":"ea6628fd.4d57e8","name":"","topic":"ohmpi_0001/exec","qos":"2","datatype":"auto","broker":"6ae7e77e.04c64","inputs":0,"x":110,"y":40,"wires":[["ddcc63.c93813a","40efede3.33021c"]]},{"id":"ddcc63.c93813a","type":"debug","z":"ea6628fd.4d57e8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":390,"y":40,"wires":[]},{"id":"40efede3.33021c","type":"ui_text","z":"ea6628fd.4d57e8","group":"64a75353.37700c","order":0,"width":"0","height":"0","name":"MQTT exec","label":"Execution","format":"{{msg.payload}}","layout":"row-spread","x":390,"y":80,"wires":[]},{"id":"64e06023.868f58","type":"mqtt in","z":"ea6628fd.4d57e8","name":"","topic":"ohmpi_0001/data","qos":"2","datatype":"auto","broker":"6ae7e77e.04c64","inputs":0,"x":100,"y":140,"wires":[["ac400b27.992c78","8d7f5d51.c06c4"]]},{"id":"ac400b27.992c78","type":"debug","z":"ea6628fd.4d57e8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":390,"y":140,"wires":[]},{"id":"8d7f5d51.c06c4","type":"ui_text","z":"ea6628fd.4d57e8","group":"64a75353.37700c","order":1,"width":0,"height":0,"name":"MQTT Data","label":"Data","format":"{{msg.payload}}","layout":"row-spread","x":390,"y":180,"wires":[]},{"id":"e1cc28ee.d2dd6","type":"mqtt out","z":"ea6628fd.4d57e8","name":"MQTT ctrl","topic":"ohmpi_0001/ctrl","qos":"0","retain":"false","broker":"6ae7e77e.04c64","x":380,"y":340,"wires":[]},{"id":"a144e7f8.416768","type":"ui_button","z":"ea6628fd.4d57e8","name":"","group":"142ad6ae.d55e29","order":0,"width":"2","height":"1","passthru":false,"label":"Start","tooltip":"","color":"","bgcolor":"green","className":"","icon":"","payload":"start","payloadType":"str","topic":"topic","topicType":"msg","x":70,"y":340,"wires":[["e1cc28ee.d2dd6","4a86345b.fb400c"]]},{"id":"abd65786.c433c8","type":"ui_button","z":"ea6628fd.4d57e8","name":"","group":"142ad6ae.d55e29","order":0,"width":"2","height":"1","passthru":false,"label":"Stop","tooltip":"","color":"","bgcolor":"red","icon":"","payload":"stop","payloadType":"str","topic":"topic","topicType":"msg","x":70,"y":400,"wires":[["e1cc28ee.d2dd6","4a86345b.fb400c"]]},{"id":"4a86345b.fb400c","type":"ui_audio","z":"ea6628fd.4d57e8","name":"","group":"142ad6ae.d55e29","voice":"urn:moz-tts:speechd:English%20(Received%20Pronunciation)?en","always":"","x":380,"y":400,"wires":[]},{"id":"398460c6.27a9e8","type":"mqtt in","z":"ea6628fd.4d57e8","name":"","topic":"ohmpi_0001/soh","qos":"2","datatype":"auto","broker":"6ae7e77e.04c64","inputs":0,"x":100,"y":240,"wires":[["21b85b73.b7ef34","498c2864.b36b18"]]},{"id":"21b85b73.b7ef34","type":"debug","z":"ea6628fd.4d57e8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":390,"y":240,"wires":[]},{"id":"498c2864.b36b18","type":"ui_text","z":"ea6628fd.4d57e8","group":"64a75353.37700c","order":1,"width":0,"height":0,"name":"MQTT SOH","label":"SOH","format":"{{msg.payload}}","layout":"row-spread","x":390,"y":280,"wires":[]},{"id":"3dbcbc0e.3d24ac","type":"ui_form","z":"ea6628fd.4d57e8","name":"Commands","label":"","group":"142ad6ae.d55e29","order":4,"width":0,"height":0,"options":[{"label":"cmd_id","value":"cmd_id","type":"text","required":false,"rows":null},{"label":"cmd","value":"cmd","type":"text","required":true,"rows":null},{"label":"args","value":"args","type":"text","required":false,"rows":null}],"formValue":{"cmd_id":"","cmd":"","args":""},"payload":"","submit":"submit","cancel":"cancel","topic":"topic","topicType":"msg","splitLayout":"","className":"","x":120,"y":640,"wires":[["e1cc28ee.d2dd6","bfc5c3.3e79724"]]},{"id":"bfc5c3.3e79724","type":"ui_text","z":"ea6628fd.4d57e8","group":"64a75353.37700c","order":3,"width":0,"height":0,"name":"","label":"text","format":"{{msg.payload}}","layout":"row-spread","className":"","x":380,"y":640,"wires":[]}]
diff --git a/webserver.py b/webserver.py
index f9d5dabc..8c0479f5 100644
--- a/webserver.py
+++ b/webserver.py
@@ -29,6 +29,8 @@ context = zmq.Context()
 socket = context.socket(zmq.REQ)
 socket.connect(f'tcp://localhost:{CONTROL_CONFIG["tcp_port"]}')
 print(colored(f'Sending commands and listenning on tcp port {tcp_port}.'))
+#id_sock = socket.getsockopt(zmq.IDENTITY)
+#socket.send(id_sock, zmq.SNDMORE)
 
 class MyServer(SimpleHTTPRequestHandler):            
     # because we use SimpleHTTPRequestHandler, we do not need to implement
@@ -52,19 +54,19 @@ class MyServer(SimpleHTTPRequestHandler):
         #global ohmpiThread, status, run
         dic = json.loads(self.rfile.read(int(self.headers['Content-Length'])))
         rdic = {} # response dictionnary
-        if dic['command'] == 'start':
+        if dic['cmd'] == 'start':
             #ohmpi.measure()
             socket.send_string(json.dumps({
                 'cmd_id': cmd_id,
-                'command': 'start'
+                'cmd': 'start'
             }))
-        elif dic['command'] == 'stop':
+        elif dic['cmd'] == 'stop':
             #ohmpi.stop()
             socket.send_string(json.dumps({
                 'cmd_id': cmd_id,
-                'command': 'stop'
+                'cmd': 'stop'
             }))
-        elif dic['command'] == 'getData':
+        elif dic['cmd'] == 'getData':
             # get all .csv file in data folder
             fnames = [fname for fname in os.listdir('data/') if fname[-4:] == '.csv']
             ddic = {}
@@ -81,10 +83,10 @@ class MyServer(SimpleHTTPRequestHandler):
                         'rho': df['R [ohm]'].tolist(),
                     }
             rdic['data'] = ddic
-        elif dic['command'] == 'removeData':
+        elif dic['cmd'] == 'removeData':
             shutil.rmtree('data')
             os.mkdir('data')
-        elif dic['command'] == 'update_settings':
+        elif dic['cmd'] == 'update_settings':
             #ohmpi.stop()
             socket.send_string(json.dumps({
                 'cmd_id': cmd_id,
@@ -106,11 +108,11 @@ class MyServer(SimpleHTTPRequestHandler):
                 print('new sequence set.')
             print('setConfig', ohmpi.pardict)
             """
-        elif dic['command'] == 'invert':
+        elif dic['cmd'] == 'invert':
             pass
-        elif dic['command'] == 'getResults':
+        elif dic['cmd'] == 'getResults':
             pass
-        elif dic['command'] == 'rsCheck':
+        elif dic['cmd'] == 'rsCheck':
             #ohmpi.rs_check()
             socket.send_string(json.dumps({
                 'cmd_id': cmd_id,
@@ -123,12 +125,12 @@ class MyServer(SimpleHTTPRequestHandler):
                 'res': df['RS [kOhm]'].tolist()
             }
             rdic['data'] = ddic
-        elif dic['command'] == 'download':
+        elif dic['cmd'] == 'download':
             shutil.make_archive('data', 'zip', 'data')
-        elif dic['command'] == 'shutdown':
+        elif dic['cmd'] == 'shutdown':
             print('shutting down...')
             os.system('shutdown now -h')
-        elif dic['command'] == 'restart':
+        elif dic['cmd'] == 'restart':
             print('shutting down...')
             os.system('reboot')
         else:
@@ -141,7 +143,7 @@ class MyServer(SimpleHTTPRequestHandler):
         
         message = socket.recv()
         print('+++////', message)
-        rdic['data'] = message
+        rdic['data'] = message.decode('utf-8')
         """
         while False:
             message = socket.recv()
-- 
GitLab