[{"id":"5905d21e.2bc55c","type":"tab","label":"Sailing Performance Dashboard","disabled":false,"info":""},{"id":"b4f3630c.1ea2","type":"json","z":"5905d21e.2bc55c","name":"","property":"payload","action":"","pretty":false,"x":490,"y":500,"wires":[["44b57282.348e1c","8d80b0bf.8e214"]]},{"id":"8d80b0bf.8e214","type":"function","z":"5905d21e.2bc55c","name":"SPD to Signal K","func":"function pushAngleValue(values, path, d) { // Convert from deg to rad\n if (typeof d !== 'undefined') {\n values.push( { \"path\": path, \"value\": d * (Math.PI / 180) } );\n }\n}\n\nfunction pushDistanceValue(values, path, d) { // Convert miles to m\n if (typeof d !== 'undefined') {\n values.push( { \"path\": path, \"value\": 1852 * d} );\n }\n}\n\nfunction pushSpeedValue(values, path, k) { // Convert kts to m/s\n if (typeof k !== 'undefined') {\n values.push( { \"path\": path, \"value\": k * 0.514444 } );\n }\n}\n\nfunction pushStringValue(values, path, s) {\n if (typeof s !== 'undefined') {\n values.push({ \"path\": path, \"value\": s} );\n }\n}\n\nfunction pushAnyValue(values, path, s) {\n if (typeof s !== 'undefined') {\n values.push( { \"path\": path, \"value\": s} );\n }\n}\n\nvalues = [];\npushAngleValue(values, \"environment.wind.angleApparent\", msg.payload.AWA);\npushAngleValue(values, \"environment.wind.angleTrueWater\", msg.payload.TWA);\npushAngleValue(values, \"environment.wind.angleTrueGround\", msg.payload.GEOWIND);\npushStringValue(values,\"environment.wind.shift\", msg.payload.windshift);\npushSpeedValue(values,\"environment.wind.speedApparent\", msg.payload.AWS); \npushSpeedValue(values,\"environment.wind.speedTrue\", msg.payload.TWS);\npushSpeedValue(values,\"environment.wind.speedTrue.average\", msg.payload[\"TWS-avg\"]);\npushSpeedValue(values,\"environment.wind.speedTrue.trend\", msg.payload[\"TWS-trend\"]);\npushSpeedValue(values,\"environment.wind.speedOverGround\", msg.payload[\"GEOWIND-TWS\"]);\npushSpeedValue(values,\"environment.wind.speedOverGround.average\", msg.payload[\"GEOWIND-TWS-avg\"]);\npushSpeedValue(values,\"environment.wind.speedOverGround.trend\", msg.payload[\"GEOWIND-TWS-trend\"]); \npushAngleValue(values,\"environment.wind.upwash\", msg.payload.Upwash);\npushStringValue(values,\"environment.wind.bow\", msg.payload.BOW);\npushAnyValue(values,\"environment.depth.average\", msg.payload[\"Depth-avg\"]);\npushAnyValue(values,\"environment.depth.change\", msg.payload[\"Depth-change\"]);\npushSpeedValue(values,\"environment.current.drift\", msg.payload[\"Current-kts\"]);\npushAngleValue(values,\"environment.current.setTrue\", msg.payload[\"Current-degrees-relative\"]);\npushAnyValue(values,\"environment.heave\", msg.payload[\"Heave-vertical\"]);\npushAngleValue(values,\"steering.rudderAngle\", msg.payload[\"Rudder-angle\"]);\npushAngleValue(values,\"navigation.destination.twa\", msg.payload[\"TWA-to-WP\"]);\npushStringValue(values,\"navigation.destination.waypoint\", msg.payload.Waypoint); \npushDistanceValue(values,\"navigation.destination.distance\", msg.payload.DTW);\npushAnyValue(values,\"navigation.destination.enroute\", msg.payload[\"Est-Time en Route\"]);\npushAngleValue(values,\"navigation.destination.bearing\", msg.payload.BTW);\npushSpeedValue(values,\"navigation.destination.vmg\", msg.payload[\"VMG-to-WP\"]);\npushAnyValue(values,\"navigation.waypoint.polarspeedRatio\", msg.payload[\"Performance-to-WP\"]); \npushAngleValue(values,\"navigation.courseOverGroundTrue\", msg.payload[\"COG\"]);\npushAngleValue(values,\"navigation.headingTrue\", msg.payload[\"HDG-corrected\"]); \npushSpeedValue(values,\"navigation.speedOverGround\", msg.payload.SOG);\npushSpeedValue(values,\"navigation.speedOverGround.forward\", msg.payload[\"SOG-forward\"]);\npushSpeedValue(values,\"navigation.speedThroughWater\", msg.payload[\"STW-corrected\"]); \npushSpeedValue(values,\"navigation.speed-shortage\", msg.payload[\"Speed-shortage\"]);\npushDistanceValue(values,\"navigation.racing.layline.distance\", msg.payload[\"Distance-layline\"]); \npushAnyValue(values,\"navigation.racing.layline.time\", msg.payload[\"Time-layline\"]); \npushAngleValue(values,\"navigation.attitude.heel.best\", msg.payload[\"Best-heel\"]); \npushAngleValue(values,\"navigation.attitude.heel\", msg.payload[\"Actual-heel\"]); \npushAngleValue(values,\"navigation.attitude.pitch\", msg.payload[\"Actual-pitch\"]); \npushAngleValue(values,\"navigation.attitude.yaw\", msg.payload[\"Actual-yaw\"]); \npushAnyValue(values,\"navigation.rateOfTurn\", msg.payload[\"Rate-of-Turn\"]);\npushAnyValue(values,\"navigation.courseRhumbline.crossTrackError\", msg.payload.XTE); \npushSpeedValue(values,\"performance.velocityMadeGood\", msg.payload.VMG);\npushAngleValue(values,\"performance.beatAngle\", msg.payload[\"Upwind-angle\"]);\npushAngleValue(values,\"performance.beatAngle.error\", msg.payload[\"UA-error\"]); \npushAngleValue(values,\"performance.gybeAngle\", msg.payload[\"Downwind-angle\"]); \npushAngleValue(values,\"performance.gybeAngle.error\", msg.payload[\"DA-error\"]); \npushAngleValue(values,\"performance.targetAngle\", msg.payload[\"Best-angle\"]);\npushAngleValue(values,\"performance.targetAngle.error\", msg.payload[\"Best-angle-error\"]);\npushAngleValue(values,\"performance.leeway.expected\", msg.payload[\"Expected-leeway\"]);\npushAngleValue(values,\"performance.leeway\", msg.payload[\"Actual-leeway\"]);\npushAnyValue(values,\"performance.polarSpeedRatio\", msg.payload[\"Performance-incl-current\"]);\npushAnyValue(values,\"performance.polarSpeedRatio.waterspeed\", msg.payload[\"Performance-waterspeed\"]); \npushAnyValue(values,\"performance.polarspeedRatio.windward\", msg.payload[\"Performance-to-windward\"]); \npushSpeedValue(values,\"performance.polarSpeed\",msg.payload[\"Target-speed\"]);\npushSpeedValue(values,\"performance.velocityMadeGood.target\", msg.payload[\"Target-VMG\"]); \npushStringValue(values,\"performance.Trim-advice1\", msg.payload[\"Trim-advice1\"]); \npushStringValue(values,\"performance.Trim-advice2\", msg.payload[\"Trim-advice2\"]); \npushStringValue(values,\"performance.Trim-advice3\", msg.payload[\"Trim-advice3\"]); \npushAngleValue(values,\"spd.Off Course\", msg.payload[\"Off Course\"]);\npushAnyValue(values,\"spd.Speed-sideways\", msg.payload[\"Speed-sideways\"]);\npushSpeedValue(values,\"spd.Speed from current\", msg.payload[\"Speed from current\"]); \n// TODO\npushAnyValue(values, \"spd.Current-from-degrees\", \"\");\npushAngleValue(values,\"spd.Current-to-degrees\", msg.payload[\"Current-to-degrees\"]);\n// TODO\npushAnyValue(values, \"spd.Current-impact\", \"\");\npushStringValue(values,\"spd.Wind-message\", msg.payload[\"Wind-message\"]);\npushStringValue(values,\"spd.Current-message\", msg.payload[\"Current-message\"]); \npushSpeedValue(values,\"spd.Performance-SOG\", msg.payload[\"Performance-SOG\"]); \npushAnyValue(values,\"spd.GPS-RMC-time\", msg.payload[\"GPS-RMC-time\"]);\npushStringValue(values,\"spd.Direction-to-steer\", msg.payload[\"Direction-to-steer\"]);\npushAnyValue(values,\"spd.controls.Current-limit-degrees\", msg.payload[\"Current-limit-degrees\"]);\npushAnyValue(values,\"spd.controls.Current-limit-kts\", msg.payload[\"Current-limit-kts\"]);\npushAnyValue(values,\"spd.controls.Shift-limit\", msg.payload[\"Shift-limit\"]); \npushAnyValue(values,\"spd.controls.Records-filter\", msg.payload[\"Records-filter\"]);\npushAnyValue(values,\"spd.controls.Replay-speed\", msg.payload[\"Replay-speed\"]);\npushAnyValue(values,\"spd.controls.Log-nr\", msg.payload[\"Log-nr\"]); \npushAnyValue(values,\"spd.controls.Records-processed\", msg.payload[\"Records-processed\"]);\npushAnyValue(values,\"spd.controls.Performance-filter\", msg.payload[\"Performance-filter\"]); \npushStringValue(values,\"spd.controls.Speed-source\", msg.payload[\"Speed-source\"]);\n\nreturn { payload: {\n \"updates\": [\n {\n \"source\": { \"label\": \"spd\", \"type\": \"performance\", \"src\": \"spd\" },\n \"values\": values\n }\n ]\n }\n}\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":660,"y":500,"wires":[["5b15d1e7ae204937","aa48fb5ebbe65b4c"]]},{"id":"afc09c64.dd2c9","type":"websocket in","z":"5905d21e.2bc55c","name":"","server":"","client":"c19e9b7a.5af818","x":140,"y":520,"wires":[["65ab04c1932bf8d0"]]},{"id":"65ab04c1932bf8d0","type":"switch","z":"5905d21e.2bc55c","name":"","property":"payload","propertyType":"msg","rules":[{"t":"regex","v":"^{","vt":"str","case":false},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":350,"y":520,"wires":[["b4f3630c.1ea2"],["b7be7380b3d8fceb"]]},{"id":"44b57282.348e1c","type":"debug","z":"5905d21e.2bc55c","name":"SailingPD json","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":660,"y":580,"wires":[]},{"id":"aa48fb5ebbe65b4c","type":"debug","z":"5905d21e.2bc55c","name":"SignalK delta","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":890,"y":580,"wires":[]},{"id":"5b15d1e7ae204937","type":"signalk-send-delta","z":"5905d21e.2bc55c","name":"","x":910,"y":500,"wires":[]},{"id":"b7be7380b3d8fceb","type":"debug","z":"5905d21e.2bc55c","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":450,"y":580,"wires":[]},{"id":"c19e9b7a.5af818","type":"websocket-client","path":"ws://_sailingpd:9090/ws","tls":"","wholemsg":"false","hb":"0"}]