UNPKG

node-red-contrib-barco-sources-here

Version:

utility to get map information using here map

190 lines (174 loc) 7.01 kB
"use strict" module.exports = function(RED) { const request = require("request"); let _mongoUtils = require("./mongoUtils.js"); let _mqttUtils = require("./mqttUtils.js"); let _config = null; let _interval = null; let _node = null; //let mqtturl = `mqtt://${process.env.MQTT_BROKER}:${process.env.MQTT_PORT}`; let mqtturl = 'mqtt://10.51.49.122:10101'; // Here mappings const Here_severities = { "1": "LOW", "2": "LOW", "3": "MED", "4": "HIGH" }; const Here_types = { "1": "Accident", "2": "Congestion", "3": "DisabledVehicle", "4": "MassTransit", "5": "Miscellaneous", "6": "OtherNews", "7": "PlannedEvent", "8": "RoadHazard", "9": "Construction", "10": "Alert", "11": "Weather" }; function getHereData(){ const latRad = parseInt(_config.lat) * Math.PI / 180; let zoom = parseInt(_config.zoom) const n = Math.pow(2, zoom); //this._xTile = Math.round(n * ((lon + 180) / 360)); let xTile = Math.round(n * (((parseInt(_config.lon)) + 180) / 360)); let yTile = Math.round(n * (1-(Math.log(Math.tan(latRad) + 1/Math.cos(latRad)) /Math.PI)) / 2); request.get( `https://traffic.cit.api.here.com/traffic/6.2/incidents/json/${zoom}/${xTile}/${yTile}?criticality=0,1,2,3&status=active,inactive,deleted,expired&type=Accident,Congestion,DisabledVehicle,RoadHazard,Construction,PlannedEvent,MassTransit,OtherNews,Weather,Misc,RoadClosure,LaneRestriction&app_id=${_config.id}&app_code=${_config.code}`, (err,res,body)=>{ if(err||res.statusCode!==200){ //error handling console.log("Error in getting Here response"+err); } else { //save to mongo let data = JSON.parse(body); //console.log("Got response from Here: "+JSON.stringify(data)); sendToWorldMap(data); parseMessage(data, function(message){ _mongoUtils.updateDocument(message, function(err){ if(err){_node.status({fill:"red",shape:"dot",text:RED._("Error in saving update")});} else { _mqttUtils.publishEvent(_config.basePath, function(err){ if(err){_node.status({fill:"red",shape:"dot",text:RED._("Error in sending update")});} else { _node.status({fill:"green",shape:"dot",text:RED._("Here.status.connected")}); } }); _node.status({fill:"green",shape:"dot",text:RED._("Here.status.connected")}); } }); }); } }); } function sendToWorldMap(data){ /*let incidents = data.resourceSets[0].resources; incidents.forEach(e=>{ _node.send({payload:{ "name" : e.description, "command": {"zoom":3}, "lat": e.point.coordinates[0], "lon": e.point.coordinates[1], "photoUrl" : "http://www.universalcargo.com/wp-content/uploads/Shipping_Alert.png" }} ); });*/ let message = {payload:{ "mqtt": { "path":'/com/barco/analytics/map/here', "url" : mqtturl }, "rest" : _config.basePath+'/incidents/here' }}; //console.log("Sending message to worldmap: "+JSON.stringify(message)); _node.send(message); } function parseMessage(data, callback){ let returnArray = []; let incidents = data.TRAFFIC_ITEMS.TRAFFIC_ITEM; incidents.forEach(e=>{ let ob = { "type": e.TRAFFIC_ITEM_TYPE_DESC, "severity": e.CRITICALITY.ID, "description": { "short": e.TRAFFIC_ITEM_DESCRIPTION.filter(o=>o.TYPE=="short_desc")[0].value, "long": e.TRAFFIC_ITEM_DESCRIPTION.filter(o=>o.TYPE=="desc")[0].value }, "start": e.START_TIME, "end": e.END_TIME, "coordinates": { "lat": e.LOCATION.GEOLOC.ORIGIN.LATITUDE, "lon": e.LOCATION.GEOLOC.ORIGIN.LONGITUDE }, "lastModified": e.ENTRY_TIME, "iconURL": 'http://content.mqcdn.com/mqtraffic/congestion_mod.png', "source": e }; returnArray.push(ob); }); let message = { "payload": { "here": { "source": data, "incidents": returnArray } } }; callback(message); } function getISODateFormat(date, callback){ let oldDate = String(date); let newDate = oldDate.split("(")[1].split(")")[0]; //console.log("Transformed Date is :"+ newDate); return callback(new Date(Number(newDate)).toISOString()); } function HereSource(config) { RED.nodes.createNode(this,config); _config = config; _node = this; console.log("BasePath is: "+_config.basePath) if(_config.disable === true){ console.log("Stopping interval") stopInterval(); } else { console.log("Starting interval") setTimeout(function(){getHereData()}, 10000); startInterval(); } RED.httpNode.get('/incidents/here', function (req, res) { _mongoUtils.findDocuments(function(err, msg){ if(err) res.send(err); else{ //console.log("####got response from mongodb: "+JSON.stringify(msg)); msg = JSON.parse(JSON.stringify(msg)); msg = msg.here; msg.incidents.forEach(e=>{ e.type = Here_types[String(e.type)]; e.severity = Here_severities[String(e.severity)]; }); res.send(msg); } }); }.bind(this)); this.on("close", function (removed, done) { if (removed) { _mqttUtils.closeConnection(); } let node = this; done(); }); } function stopInterval() { _interval && clearInterval(_interval); _interval = null; } function startInterval() { _interval = setInterval(()=>{ getHereData(); }, 5*60*1000); } RED.nodes.registerType("here",HereSource); };