Nodred Timeserver graph display
This commit is contained in:
		
							parent
							
								
									2d93f323b4
								
							
						
					
					
						commit
						cd67cb2335
					
				| @ -49,7 +49,7 @@ | ||||
|         "to": "", | ||||
|         "reg": false, | ||||
|         "x": 200, | ||||
|         "y": 400, | ||||
|         "y": 420, | ||||
|         "wires": [ | ||||
|             [ | ||||
|                 "84f1cda2.069e7" | ||||
| @ -82,7 +82,7 @@ | ||||
|         "retain": "", | ||||
|         "broker": "2a15ab6f.ab2244", | ||||
|         "x": 690, | ||||
|         "y": 400, | ||||
|         "y": 420, | ||||
|         "wires": [] | ||||
|     }, | ||||
|     { | ||||
| @ -135,7 +135,7 @@ | ||||
|         "action": "", | ||||
|         "pretty": false, | ||||
|         "x": 540, | ||||
|         "y": 400, | ||||
|         "y": 420, | ||||
|         "wires": [ | ||||
|             [ | ||||
|                 "72d5e7ee.d1eba8" | ||||
| @ -165,7 +165,7 @@ | ||||
|         "action": "", | ||||
|         "property": "payload.payload_raw", | ||||
|         "x": 380, | ||||
|         "y": 400, | ||||
|         "y": 420, | ||||
|         "wires": [ | ||||
|             [ | ||||
|                 "dac8aafa.389298" | ||||
| @ -212,8 +212,8 @@ | ||||
|         "type": "function", | ||||
|         "z": "449c1517.e25f4c", | ||||
|         "name": "Generate Time Answer", | ||||
|         "func": "/* LoRaWAN Timeserver\n\nconstruct 6 byte timesync_answer from gateway timestamp and node's time_sync_req\n\nbyte    meaning\n0       sequence number (taken from node's time_sync_req)\n1..4    current second (from epoch time 1970)\n5       1/250ths fractions of current second\n\n*/\n\nfunction timecompare(a, b) {\n  \n  const timeA = a.time;\n  const timeB = b.time;\n\n  let comparison = 0;\n  if (timeA > timeB) {\n    comparison = 1;\n  } else if (timeA < timeB) {\n    comparison = -1;\n  }\n  return comparison;\n}\n\nlet confidence = 2000; // max millisecond diff gateway time to server time\n\nvar gateways = msg.payload.metadata.gateways;\nvar gateway_time = gateways.map(gw => {\n    return {\n      time: new Date(gw.time),\n      eui: gw.gtw_id,\n      }\n  });\nvar server_time = new Date(msg.payload.metadata.time);\n\n// validate all gateway timestamps against lorawan server_time (which is assumed to be recent)\nvar gw_timestamps = gateway_time.filter(function (element) {\n  return ((element.time > (server_time - confidence) && element.time <= server_time));\n});\n\n// if no timestamp left, we have no valid one and exit\nif (gw_timestamps.length === 0) return null;\n\n// sort time array in ascending order to find most recent timestamp for time answer\ngw_timestamps.sort(timecompare);\n\nvar timestamp = gw_timestamps[0].time;\nvar eui = gw_timestamps[0].eui;\n\nvar seconds = Math.floor(timestamp/1000);\nvar fractions = (timestamp % 1000) / 4;\nvar seqno = msg.payload.payload_raw[0];\n\nlet buf = new ArrayBuffer(6);\nnew DataView(buf).setUint8(0, seqno);\nnew DataView(buf).setUint32(1, seconds);\nnew DataView(buf).setUint8(5, fractions);\n\nmsg.payload = new Buffer(new Uint8Array(buf));\nvar infoMsg = { payload: eui };\n\nreturn [infoMsg, msg];", | ||||
|         "outputs": 2, | ||||
|         "func": "/* LoRaWAN Timeserver\n\nconstruct 6 byte timesync_answer from gateway timestamp and node's time_sync_req\n\nbyte    meaning\n0       sequence number (taken from node's time_sync_req)\n1..4    current second (from epoch time 1970)\n5       1/250ths fractions of current second\n\n*/\n\nfunction timecompare(a, b) {\n  \n  const timeA = a.time;\n  const timeB = b.time;\n\n  let comparison = 0;\n  if (timeA > timeB) {\n    comparison = 1;\n  } else if (timeA < timeB) {\n    comparison = -1;\n  }\n  return comparison;\n}\n\nlet confidence = 2000; // max millisecond diff gateway time to server time\n\nvar gateways = msg.payload.metadata.gateways;\nvar gateway_time = gateways.map(gw => {\n    return {\n      time: new Date(gw.time),\n      eui: gw.gtw_id,\n      }\n  });\nvar server_time = new Date(msg.payload.metadata.time);\n\n// validate all gateway timestamps against lorawan server_time (which is assumed to be recent)\nvar gw_timestamps = gateway_time.filter(function (element) {\n  return ((element.time > (server_time - confidence) && element.time <= server_time));\n});\n\n// if no timestamp left, we have no valid one and exit\nif (gw_timestamps.length === 0) return null;\n\n// sort time array in ascending order to find most recent timestamp for time answer\ngw_timestamps.sort(timecompare);\n\nvar timestamp = gw_timestamps[0].time;\nvar eui = gw_timestamps[0].eui;\nvar offset = server_time - timestamp;\n\nvar seconds = Math.floor(timestamp/1000);\nvar fractions = (timestamp % 1000) / 4;\nvar seqno = msg.payload.payload_raw[0];\n\nlet buf = new ArrayBuffer(6);\nnew DataView(buf).setUint8(0, seqno);\nnew DataView(buf).setUint32(1, seconds);\nnew DataView(buf).setUint8(5, fractions);\n\nmsg.payload = new Buffer(new Uint8Array(buf));\nvar infoMsg = { payload: eui };\nvar offsetMsg = { payload: offset };\n\nreturn [infoMsg, msg, offsetMsg];", | ||||
|         "outputs": 3, | ||||
|         "noerr": 0, | ||||
|         "x": 380, | ||||
|         "y": 300, | ||||
| @ -224,11 +224,15 @@ | ||||
|             ], | ||||
|             [ | ||||
|                 "49e3c067.e782e" | ||||
|             ], | ||||
|             [ | ||||
|                 "46ce842a.614d5c" | ||||
|             ] | ||||
|         ], | ||||
|         "outputLabels": [ | ||||
|             "gw_eui", | ||||
|             "time_sync_ans" | ||||
|             "time_sync_ans", | ||||
|             "offset_ms" | ||||
|         ] | ||||
|     }, | ||||
|     { | ||||
| @ -246,6 +250,48 @@ | ||||
|         "wires": [], | ||||
|         "icon": "node-red/bridge.png" | ||||
|     }, | ||||
|     { | ||||
|         "id": "8712a5ac.ed18e8", | ||||
|         "type": "ui_text", | ||||
|         "z": "449c1517.e25f4c", | ||||
|         "group": "edb7cc8d.a3817", | ||||
|         "order": 0, | ||||
|         "width": 0, | ||||
|         "height": 0, | ||||
|         "name": "Timeserver", | ||||
|         "label": "Recent timeserver was:", | ||||
|         "format": "{{msg.payload}}", | ||||
|         "layout": "col-center", | ||||
|         "x": 670, | ||||
|         "y": 320, | ||||
|         "wires": [] | ||||
|     }, | ||||
|     { | ||||
|         "id": "46ce842a.614d5c", | ||||
|         "type": "ui_gauge", | ||||
|         "z": "449c1517.e25f4c", | ||||
|         "name": "offset", | ||||
|         "group": "edb7cc8d.a3817", | ||||
|         "order": 1, | ||||
|         "width": 0, | ||||
|         "height": 0, | ||||
|         "gtype": "gage", | ||||
|         "title": "Offset [ms]", | ||||
|         "label": "units", | ||||
|         "format": "{{value}}", | ||||
|         "min": 0, | ||||
|         "max": "2000", | ||||
|         "colors": [ | ||||
|             "#00b500", | ||||
|             "#e6e600", | ||||
|             "#ca3838" | ||||
|         ], | ||||
|         "seg1": "", | ||||
|         "seg2": "", | ||||
|         "x": 690, | ||||
|         "y": 360, | ||||
|         "wires": [] | ||||
|     }, | ||||
|     { | ||||
|         "id": "2a15ab6f.ab2244", | ||||
|         "type": "mqtt-broker", | ||||
| @ -268,5 +314,26 @@ | ||||
|         "willTopic": "", | ||||
|         "willQos": "0", | ||||
|         "willPayload": "" | ||||
|     }, | ||||
|     { | ||||
|         "id": "edb7cc8d.a3817", | ||||
|         "type": "ui_group", | ||||
|         "z": "", | ||||
|         "name": "Timeserver", | ||||
|         "tab": "d525a5d.0832858", | ||||
|         "order": 4, | ||||
|         "disp": true, | ||||
|         "width": "6", | ||||
|         "collapse": false | ||||
|     }, | ||||
|     { | ||||
|         "id": "d525a5d.0832858", | ||||
|         "type": "ui_tab", | ||||
|         "z": "", | ||||
|         "name": "Timeserver", | ||||
|         "icon": "sync", | ||||
|         "order": 3, | ||||
|         "disabled": false, | ||||
|         "hidden": false | ||||
|     } | ||||
| ] | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user