{"id":18647682,"url":"https://github.com/artcom/eppsa-ips-evaluation","last_synced_at":"2025-11-05T07:30:29.229Z","repository":{"id":142420072,"uuid":"105129300","full_name":"artcom/eppsa-ips-evaluation","owner":"artcom","description":null,"archived":false,"fork":false,"pushed_at":"2017-10-18T14:48:53.000Z","size":313,"stargazers_count":0,"open_issues_count":5,"forks_count":0,"subscribers_count":15,"default_branch":"master","last_synced_at":"2024-12-27T12:22:26.802Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/artcom.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-09-28T09:28:17.000Z","updated_at":"2017-09-28T09:31:52.000Z","dependencies_parsed_at":null,"dependency_job_id":"46edd3cf-2737-4ced-8bec-a5cdf4fcb075","html_url":"https://github.com/artcom/eppsa-ips-evaluation","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artcom%2Feppsa-ips-evaluation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artcom%2Feppsa-ips-evaluation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artcom%2Feppsa-ips-evaluation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artcom%2Feppsa-ips-evaluation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/artcom","download_url":"https://codeload.github.com/artcom/eppsa-ips-evaluation/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239449677,"owners_count":19640564,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-07T06:27:26.163Z","updated_at":"2025-11-05T07:30:29.184Z","avatar_url":"https://github.com/artcom.png","language":"JavaScript","readme":"# Indoor Positioning Systems Evaluation Backend\n\nTools for the evaluation of the quality / accuracy of indoor positioning systems. Node.js application.\n\n## Usage\n\nService can be configured in the following ways:\n- using a ```.config.json``` file based on the ```.config.example.json``` file\n- using environmental variables:\n    - DATABASE\n    - DATABASE_USER\n    - DATABASE_PORT\n    - DATABASE_HOST\n    - DATABASE_PASSWORD\n    - QUUPPA_SERVER\n\n```bash\nnpm install\nnpm run start\n```\n\n## Tests\n\n### Configuration\n\nTests will use a test database defined int a ```.config.json``` file when the database and Quuppa server environmental\nvariables are not set\n\n### Run\n\nTests can be run using\n\n```bash\nnpm run test\n```\n\nOr run on file changes with\n\n```bash\nnpm run test-watch\n```\n\nTest coverage data can be generated with\n\n```bash\nnpm run test-with-coverage\n```\n\nCoverage data can be displayed in a browser at ```coverage/index.html```\n\n## RESTful service\n\nThe service exposes a RESTful API on port 3000. The API allows setting up experiments and running them. All POST\nrequests should contain the header ```Content-Type: application/json```\n\n### Running an experiment\n\nEnd point: ```/experiments/experiment-name/run```\n\nAccepts POST requests.\n\nAfter the experiment has been created and set up (define points, nodes and node positions, see **Experiment set up**)\n\nThe experiment can be run by sending a POST request to ```/experiments/experiment-name/run``` with:\n\n```json\n{\n  \"experimentTypes\": [\"experiment_type\", ...],\n  \"repeats\": \"integer\",\n  \"interval\": \"integer(milliseconds)\"\n}\n```\n\nThe experiments of types ```experimentTypes``` will be run ```repeats``` times at an interval of ```interval```\nmilliseconds. Postion data will be collected for all nodes defined in nodePositions and stored in PositionData alongside\nwith position error metrics. Primary error metrics for the complete experiment will be stored in ExperimentMetrics.\n\nThe experiment can be re-run after changing the node positions and the data will be stored under the same experiment\nname.\n\nSupported experiment types:\n- \"Quuppa\"\n\n### Retrieving experimental data\n\n#### Per point position data\n\nEnd point: ```/experiments/experiment-name/position-data```\n\nAccepts GET requests. Returns the position data for all point measures for the experiment ```experiment-name``` in the form:\n\n```json\n[\n  {\n    \"pointName\": \"point_name\",\n    \"point\": {\n      \"name\": \"point_name\",\n      \"trueCoordinateX\": \"float\",\n      \"trueCoordinateY\": \"float\",\n      \"trueCoordinateZ\": \"float\"\n    },\n    \"experimentName\": \"experiment_name\",\n    \"localizedNodeId\": \"node_id\",\n    \"localizedNodeName\": \"node_name\",\n    \"node\": {\n      \"id\": \"node_id\",\n      \"name\": \"node_name\",\n      \"type\": \"node_type\"\n    },\n    \"estCoordinateX\": \"float\",\n    \"estCoordinateY\": \"float\",\n    \"estCoordinateZ\": \"float\",\n    \"estZoneLabel\": \"zone_label\",\n    \"latency\": \"float\",\n    \"powerConsumption\": \"float\",\n    \"localizationError2d\": \"float\",\n    \"localizationError3d\": \"float\"\n  },\n  ...\n]\n```\n\n#### Experiment metrics\n\nEnd point: ```/experiments/experiment-name/primary-metrics```\n\nAccepts GET requests. Returns the primary error metrics for the experiment ```experiment-name``` in the form:\n\n```json\n{\n  \"experimentName\": \"experiment_name\",\n  \"error2dAverage\": \"float\",\n  \"error2dMin\": \"float\",\n  \"error2dMax\": \"float\",\n  \"error2dVariance\": \"float\",\n  \"error2dMedian\": \"float\",\n  \"error2dRMS\": \"float\",\n  \"error2dPercentile75\": \"float\",\n  \"error2dPercentile90\": \"float\",\n  \"error3dAverage\": \"float\",\n  \"error3dMin\": \"float\",\n  \"error3dMax\": \"float\",\n  \"error3dVariance\": \"float\",\n  \"error3dMedian\": \"float\",\n  \"error3dRMS\": \"float\",\n  \"error3dPercentile75\": \"float\",\n  \"error3dPercentile90\": \"float\",\n  \"zoneAccuracyAverage\": \"float\",\n  \"latencyAverage\": \"float\",\n  \"latencyMin\": \"float\",\n  \"latencyMax\": \"float\",\n  \"latencyVariance\": \"float\",\n  \"latencyMedian\": \"float\",\n  \"latencyRMS\": \"float\",\n  \"latencyPercentile75\": \"float\",\n  \"latencyPercentile90\": \"float\",\n  \"powerConsumptionAverage\": \"float\",\n  \"powerConsumptionMin\": \"float\",\n  \"powerConsumptionMax\": \"float\",\n  \"powerConsumptionVariance\": \"float\",\n  \"powerConsumptionMedian\": \"float\",\n  \"powerConsumptionRMS\": \"float\",\n  \"powerConsumptionPercentile75\": \"float\",\n  \"powerConsumptionPercentile90\": \"float\"\n}\n```\n\n### Experiment set up\n\n#### Create zones with known borders\n\nEnd point: ```/zones```\n\nAccepts GET and POST requests.\n\nNew zones can be created:\n\n- using a POST request to ```/zones``` with:\n\n```json\n{\n    \"name\": \"zone_name\",\n    \"xMin\": \"float\",\n    \"xMax\": \"float\",\n    \"yMin\": \"float\",\n    \"yMax\": \"float\",\n    \"zMin\": \"float\",\n    \"zMax\": \"float\"\n}\n```\n\n- or in a batch using a POST request to ```/zones``` with:\n\n```json\n[\n    {\n        \"name\": \"zone_name\",\n        \"xMin\": \"float\",\n        \"xMax\": \"float\",\n        \"yMin\": \"float\",\n        \"yMax\": \"float\",\n        \"zMin\": \"float\",\n        \"zMax\": \"float\"\n    },\n    ...\n]\n```\n\nZones can be retrieved:\n\n- using a GET request to ```/zones/zone-name``` and will return:\n\n```json\n{\n    \"name\": \"zone_name\",\n    \"xMin\": \"float\",\n    \"xMax\": \"float\",\n    \"yMin\": \"float\",\n    \"yMax\": \"float\",\n    \"zMin\": \"float\",\n    \"zMax\": \"float\"\n}\n```\n\n- or in batch using a GET request to ```/zones``` and will return:\n\n```json\n[\n    {\n        \"name\": \"zone_name\",\n        \"xMin\": \"float\",\n        \"xMax\": \"float\",\n        \"yMin\": \"float\",\n        \"yMax\": \"float\",\n        \"zMin\": \"float\",\n        \"zMax\": \"float\"\n    },\n    ...\n]\n```\n\n#### Create zone sets\n\nEnd point: ```/zone-sets```\n\nAccepts GET, POST and DELETE requests.\n\nNew zone sets can be created:\n\n- using a POST request to ```/zone-sets``` with:\n\n```json\n{ \"name\": \"set_name\" }\n```\n\nAll zones sets can be retrieved:\n\n- using a GET request to ```/zone-sets``` and will return:\n\n```json\n[\n  {\n    \"name\": \"set_name\",\n    \"zones\": [\n      {\n        \"name\": \"zone_name\",\n        \"xMin\": \"float\",\n        \"xMax\": \"float\",\n        \"yMin\": \"float\",\n        \"yMax\": \"float\",\n        \"zMin\": \"float\",\n        \"zMax\": \"float\"\n      },\n      ...\n    ]\n  },\n  ...\n]\n```\n\nA single zone set can be retrieved:\n\n- using a GET request to ```/zone-sets/set-name``` and will return:\n\n```json\n{\n  \"name\": \"set_name\",\n  \"zones\": [\n    {\n      \"name\": \"zone_name\",\n      \"xMin\": \"float\",\n      \"xMax\": \"float\",\n      \"yMin\": \"float\",\n      \"yMax\": \"float\",\n      \"zMin\": \"float\",\n      \"zMax\": \"float\"\n    },\n    ...\n  ]\n}\n```\n\nA set can be deleted:\n\n-using a DELETE request to ```/zone-sets/set-name``` and will return:\n\n```json\n{ \"zoneSetName\": \"set_name\" }\n```\n\nA zone can be added to a set:\n\n- using a POST request to ```/zone-sets/set-name``` with:\n\n```json\n{ \"zoneName\": \"zone_name\" }\n```\n\nA zone can be removed from a set:\n\n- using a DELETE request to ```/zone-sets/set-name/zone-name``` and will return:\n\n```json\n{\n  \"zoneSetName\": \"set_name\",\n  \"zoneName\": \"zone_name\"\n}\n```\n\n#### Create points with known coordinates\n\nEnd point: ```/points```\n\nAccepts GET and POST requests.\n\nNew points can be created:\n\n- using a POST request to ```/points``` with:\n\n```json\n{\n    \"name\": \"point_name\",\n    \"trueCoordinateX\": \"float\",\n    \"trueCoordinateY\": \"float\",\n    \"trueCoordinateZ\": \"float\"\n}\n```\n\n- or in a batch using a POST request to ```/points``` with:\n\n```json\n[\n    {\n        \"name\": \"point_name\",\n        \"trueCoordinateX\": \"float\",\n        \"trueCoordinateY\": \"float\",\n        \"trueCoordinateZ\": \"float\"\n    },\n    ...\n]\n```\n\nPoints can be retrieved:\n\n- using a GET request to ```/points/point-name``` and will return:\n\n```json\n{\n    \"name\": \"point_name\",\n    \"trueCoordinateX\": \"float\",\n    \"trueCoordinateY\": \"float\",\n    \"trueCoordinateZ\": \"float\"\n}\n```\n\n- or in a batch using a GET request to ```/points``` and will return:\n\n```json\n[\n    {\n        \"name\": \"point_name\",\n        \"trueCoordinateX\": \"float\",\n        \"trueCoordinateY\": \"float\",\n        \"trueCoordinateZ\": \"float\"\n    },\n    ...\n]\n```\n\n#### Create nodes to be positioned\n\nEnd point: ```/nodes```\n\nAccepts GET and POST requests.\n\nNew nodes can be created:\n\n- using a POST request to ```/nodes``` with:\n\n```json\n{\n    \"id\": \"node_id\",\n    \"name\": \"node_name\",\n    \"type\": \"node_type\"\n}\n```\n\n- or in a batch using a POST request to ```/nodes``` with:\n\n```json\n[\n    {\n        \"id\": \"node_id\",\n        \"name\": \"node_name\",\n        \"type\": \"node_type\"\n    },\n    ...\n]\n```\n\nNodes can be retrieved:\n\n- using a GET request to ```/nodes/node-name``` and will return:\n\n```json\n{\n    \"id\": \"node_id\",\n    \"name\": \"node_name\",\n    \"type\": \"node_type\"\n}\n```\n\n- or in a batch using a GET request to ```/nodes``` and will return:\n\n```json\n[\n    {\n        \"id\": \"node_id\",\n        \"name\": \"node_name\",\n        \"type\": \"node_type\"\n    },\n    ...\n]\n```\n\n\n#### Create experiment\n\nEnd point: ```/experiments```\n\nAccepts GET, POST and DELETE requests.\n\nNew experiment can be created:\n\n- using a POST request to ```/experiments``` with:\n\n```json\n{\n    \"name\": \"experiment_name\"\n}\n```\n\nExperiments can be retrieved:\n\n- using a GET request to ```/experiments/experiment-name``` and will return:\n\n```json\n{\n    \"name\": \"experiment_name\"\n}\n```\n\n- or in a batch using a GET request to ```/experiments``` and will return:\n\n```json\n[\n    {\n        \"name\": \"experiment_name\"\n    },\n    ...\n]\n```\n\nExperiments and all associated data (experiment metrics, position data, node positions) can be deleted using a DELETE request at ```/experiments/experiment-name```\n\n#### Define node positions\n\nEnd point: ```/experiments/experiment-name/node-positions```\n\nAccepts GET and POST requests.\n\nNode positions can be defined or modified:\n\n- using a POST request to ```/experiments/experiment-name/node-positions``` with:\n\n```json\n{\n  \"localizedNodeName\": \"node_name\", \"pointName\": \"point_name\"\n}\n```\n\n- or in a batch using a POST request to ```/experiments/experiment-name/node-positions``` with:\n\n```json\n[\n    {\n      \"localizedNodeName\": \"node_name\", \"pointName\": \"point_name\"\n    },\n    ...\n]\n```\n\nNode positions can be retrieved:\n\n- using a GET request to ```/experiments/experiment-name/node-positions/node-name``` and will return:\n\n\n```json\n{\n  \"localizedNodeName\": \"node_name\", \"pointName\": \"point_name\", \"experimentName\": \"experiment_name\"\n}\n```\n\n- or in a batch using a GET request to ```/experiments/experiment-name/node-positions``` and will return:\n\n```json\n[\n    {\n      \"localizedNodeName\": \"node_name\", \"pointName\": \"point_name\", \"experimentName\": \"experiment_name\"\n    },\n    ...\n]\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartcom%2Feppsa-ips-evaluation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fartcom%2Feppsa-ips-evaluation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartcom%2Feppsa-ips-evaluation/lists"}