{"id":44572033,"url":"https://github.com/hello-nrfcloud/proto-map","last_synced_at":"2026-05-17T07:14:00.057Z","repository":{"id":205273031,"uuid":"713820763","full_name":"hello-nrfcloud/proto-map","owner":"hello-nrfcloud","description":"Documents the communication protocol between devices, the hello.nrfcloud.com/map backend and web application","archived":false,"fork":false,"pushed_at":"2026-05-03T01:55:50.000Z","size":2916,"stargazers_count":0,"open_issues_count":7,"forks_count":2,"subscribers_count":1,"default_branch":"saga","last_synced_at":"2026-05-03T03:35:44.584Z","etag":null,"topics":["cellular-iot","hello-nrfcloud","hello-nrfcloud-map","iot","lwm2m","nordicsemiconductor","nrf-asset-tracker"],"latest_commit_sha":null,"homepage":"https://hello.nrfcloud.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hello-nrfcloud.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-11-03T09:57:48.000Z","updated_at":"2026-05-03T01:54:37.000Z","dependencies_parsed_at":"2026-03-23T03:04:40.954Z","dependency_job_id":"6c27698f-f748-4b97-8fdd-c8bbfd00d071","html_url":"https://github.com/hello-nrfcloud/proto-map","commit_stats":{"total_commits":612,"total_committers":3,"mean_commits":204.0,"dds":"0.25326797385620914","last_synced_commit":"30baccdeac21649bad4de0e7576c9ad85bdc0aae"},"previous_names":["hello-nrfcloud/proto-lwm2m","hello-nrfcloud/proto-map"],"tags_count":343,"template":false,"template_full_name":null,"purl":"pkg:github/hello-nrfcloud/proto-map","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hello-nrfcloud%2Fproto-map","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hello-nrfcloud%2Fproto-map/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hello-nrfcloud%2Fproto-map/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hello-nrfcloud%2Fproto-map/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hello-nrfcloud","download_url":"https://codeload.github.com/hello-nrfcloud/proto-map/tar.gz/refs/heads/saga","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hello-nrfcloud%2Fproto-map/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32770544,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T02:36:36.067Z","status":"ssl_error","status_checked_at":"2026-05-08T02:36:07.210Z","response_time":54,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["cellular-iot","hello-nrfcloud","hello-nrfcloud-map","iot","lwm2m","nordicsemiconductor","nrf-asset-tracker"],"created_at":"2026-02-14T03:19:35.110Z","updated_at":"2026-05-08T07:02:39.403Z","avatar_url":"https://github.com/hello-nrfcloud.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# `hello.nrfcloud.com/map` Protocols [![npm version](https://img.shields.io/npm/v/@hello.nrfcloud.com/proto-map.svg)](https://www.npmjs.com/package/@hello.nrfcloud.com/proto-map)\n\n[![GitHub Actions](https://github.com/hello-nrfcloud/proto-map/actions/workflows/build-and-publish.yaml/badge.svg)](https://github.com/hello-nrfcloud/proto-map/actions/workflows/build-and-publish.yaml)\n[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)\n[![Renovate](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com)\n[![@commitlint/config-conventional](https://img.shields.io/badge/%40commitlint-config--conventional-brightgreen)](https://github.com/conventional-changelog/commitlint/tree/master/@commitlint/config-conventional)\n[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier/)\n[![ESLint: TypeScript](https://img.shields.io/badge/ESLint-TypeScript-blue.svg)](https://github.com/typescript-eslint/typescript-eslint)\n\nDocuments the communication protocol between devices, the\n`hello.nrfcloud.com/map` backend and web application.\n\nThe [`lwm2m`](./lwm2m/) folder contains the LwM2M objects that devices publish.\n\nLwM2M object definitions are shared between models and can be re-used. Some\nobjects provide special behavior (for example object\n[`14201` (Geolocation)](./lwm2m/14201.xml) will place the device's location on\nthe map).\n\nDevices publish LwM2M objects using\n[SenML](https://datatracker.ietf.org/doc/html/rfc8428) directly, which needs to\nmap to the defined LwM2M objects ([example](./senml/SenMLSchema.spec.ts)).\n\nThe SenML payload will be [expanded](./senml/senMLtoLwM2M.spec.ts) to fully\nqualified LwM2M object representations which can then be processed further, e.g.\nstored in a database.\n\nThis allows the `hello.nrfcloud.com/map` web application to visualize this data\nin a meaningful way to users without the need for custom implementation.\n\n## LwM2M rules\n\n- `LWM2MVersion` must be `1.1`\n- LwM2M objects are defined in the ID range from `14200` to `15000`\n  (non-inclusively).\n- The URN must have the prefix `urn:oma:lwm2m:x:`.\n- The `ObjectVersion` must be appended if it is not `1.0`, which is the default.\n- All objects must define one `Time` property. Time is a signed integer\n  representing the number of seconds since Jan 1 st, 1970 in the UTC time zone.\n- Objects must be `Multiple` instance.\n- Objects must be `Optional`.\n- Resources should only be marked as mandatory in case they must be published\n  together (e.g. latitude and longitude). This allows devices to only update the\n  values that have changed.\n- `RangeEnumeration` is only supported for `Float` and `Integer` and must be\n  specified as `\u003cmin\u003e..\u003cmax\u003e`, where `min` must be smaller than `max` and both\n  must be a number.\n- `Objlnk` resource type is not supported\n\nThe conformity to the rules is checked using the script\n[`./lwm2m/check-lwm2m-rules.ts`](./lwm2m/check-lwm2m-rules.ts).\n\n## SenML rules\n\n- The implementation follows the recommendation outline in section 7.4.5. of the\n  [LwM2M v1.1.1 Technical Specification](https://openmobilealliance.org/release/LightweightM2M/V1_1_1-20190617-A/OMA-TS-LightweightM2M_Core-V1_1_1-20190617-A.pdf):\n  `bn` and `n` fields are combined to form the unique identifier for a resource\n  in the form of `/\u003cobject ID\u003e/\u003cobject instance ID\u003e/\u003cresource ID\u003e/0`. The\n  resource instance ID `0` is always appended, because multiple resource\n  instances are not supported right now.\n- Use the custom property `blv` to specify the object version, `1.0` is the\n  default and should not be specified.\n- Timestamps are to be expressed in the **base time** property `bt` and are\n  mapped to the LwM2M object's timestamp property and must not be send as a\n  property.\n- SenML records may be a Time only, in case it is sufficient to express the\n  object as a combination of InstanceID and timestamp, for example in case of\n  the [Button Press (14220) object](./lwm2m/14220.xml).\n\n### Model definition rules\n\n- **device models** are identified using a model name, for example\n  `kartverket-vasstandsdata`\n- a [`README.md`](./models/kartverket-vasstandsdata/README.md) must be provided\n  that describes the model\n\nThe conformity to the rules is checked using the script\n[`./models/check-model-rules.ts`](./models/check-model-rules.ts).\n\n## Usage\n\n```bash\nnpm i --save-exact @hello.nrfcloud.com/proto-map\n```\n\n## Setup\n\nInstall the dependencies:\n\n```bash\nnpm ci\n```\n\nInstall [xmllint](https://github.com/GNOME/libxml2).\n\n## Run tests\n\n```bash\nnpm test\n```\n\n## Update generated code\n\n```bash\nnpx tsx generator/lwm2m.ts\nnpx tsx generator/models.ts\nnpx tsx generator/types.ts\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhello-nrfcloud%2Fproto-map","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhello-nrfcloud%2Fproto-map","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhello-nrfcloud%2Fproto-map/lists"}