BARANI MeteoHelix IoT Pro Gen2 -> allMETEO Actility integration (Master Guide) for ThingPark, SwissCom and others
/BARANI DESIGN - Integration Guide
BARANI IoT sensors → allMETEO via Actility ThingPark
One connection for every BARANI LoRaWAN device. ThingPark posts its native uplink report to allMETEO, which decodes the raw payload by DevEUI - no decoder to install in ThingPark and no message template to write.
Who this guide is for - networks built on Actility ThingPark
Actility's ThingPark is the LoRaWAN network server behind ThingPark Enterprise (private networks, hosted or on-premise), the free ThingPark Community network and most national public LoRaWAN networks - Actility puts it at more than 50 operators. In January 2026 Actility was acquired by Netmore Group; ThingPark continues under Netmore, and Orange, KPN and Swisscom have confirmed their networks carry on. Wherever your BARANI devices are registered on a ThingPark-based network, this guide applies unchanged: the connection settings and the allMETEO endpoint are identical, only the portal branding differs.
| Network | Where | Portal you log in to | Notes |
|---|---|---|---|
| ThingPark Enterprise (Actility / Netmore) | Private networks worldwide - SaaS (EU, US, APAC) or on-premise; resold by partners such as Sensational Systems in the UK | thingparkenterprise.eu2.actility.com for the EU2 platform - your platform URL is in your welcome e-mail · actility.com | Reference platform for this guide |
| ThingPark Community | Free Actility-run network for makers and pilots | community.thingpark.io | Same Connections page as Enterprise |
| Swisscom LPN | Switzerland | portal.lpn.swisscom.ch · swisscom.ch | BARANI's own fleet runs here - screenshots in Parts 4 and 7 |
| KPN LoRa | Netherlands | ThingPark account issued by KPN · kpn.com | ThingPark Wireless since 2016. Portal URL: TODO / verify |
| Orange Business | France | Customers usually work in Live Objects: liveobjects.orange-business.com · orange-business.com | ThingPark core, but Live Objects forwards data in its own format - this guide applies only with direct ThingPark access; otherwise ask BARANI support |
| Proximus | Belgium, Luxembourg | ThingPark account issued by Proximus · proximus.be | ThingPark Wireless since 2015. Portal URL: TODO / verify |
| Digita | Finland | digita.fi | ThingPark Wireless since 2016; on Netmore's platform service since 2024 - TODO / verify current portal |
| Netzikon (telent) | Germany | telent.de | ThingPark-powered at launch (2016) - TODO / verify current status |
| NNNCo | Australia | nnnco.com.au | ThingPark Exchange partner - TODO / verify platform |
| Netmore networks | Sweden, UK, Ireland, Netherlands and others | netmoregroup.com | Actility's new owner - TODO / verify which networks expose the ThingPark portal |
| Tata Communications, EchoStar Mobile | India; Europe (satellite + LoRaWAN) | tatacommunications.com · echostarmobile.com | Reported ThingPark users - TODO / verify before publishing |
Log in to your network portal. If it has Connections (or, on legacy portals, Application servers and AS routing profiles) with a Basic HTTPS option and a ThingPark (JSON) payload format, it is ThingPark and this guide applies. Networks on other servers - The Things Stack, ChirpStack, LORIOT, Everynet, Helium - have their own allMETEO guides.
1How this works
Every BARANI IoT sensor sends a LoRaWAN uplink whose payload is a compact binary frame. Actility ThingPark - the network server behind ThingPark Enterprise, ThingPark Community and many operator networks (Swisscom LPN, Orange, KPN and others) - delivers each uplink to an application server as a DevEUI_uplink report carrying the raw payload_hex together with the DevEUI, port, frame counter, timestamp and radio metadata. allMETEO's Actility endpoint accepts that report as-is and decodes the payload server-side, keyed on the station's DevEUI.
With akenza we had to install a payload decoder and hand-build a TTN-v3 webhook body, because akenza cannot emit ThingPark's format. ThingPark is the format: a Basic HTTPS connection posts ThingPark's own JSON, which is exactly what the allMETEO Actility endpoint parses. BARANI's own fleet on Swisscom LPN - a ThingPark Wireless network - reaches allMETEO the same way, through an application-server routing profile with these very settings (screenshot in Part 4).
Sensor (MeteoHelix / MeteoWind / MeteoRain / MeteoAG / MeteoALTIM)
| LoRaWAN uplink - FPort 1 - binary payload
v
ThingPark base station --> ThingPark network server (LRC)
| Basic HTTPS connection: POST DevEUI_uplink JSON
| (payload_hex, DevEUI, FPort, FCntUp, Time, radio metadata)
v
https://gw.allmeteo.com/swtelora/uplink --> allMETEO station (matched by DevEUI)
Because the body is ThingPark-native, one connection serves every BARANI device in the account, whatever its generation. Per device there are only two steps: register it in ThingPark (Part 3) and provision the station in allMETEO (Part 6).
2Prerequisites
- A ThingPark Enterprise account (SaaS shown:
thingparkenterprise.eu2.actility.com) and a user with the Administrator or Device, Multicast Groups and Connections Manager role - other roles cannot add devices or connections. - LoRaWAN coverage at the site: a base station registered in the account (or roaming coverage) so the device can join.
- The device credentials from the BARANI serial sheet: DevEUI, JoinEUI (called AppEUI on older sheets) and AppKey (OTAA).
- An allMETEO account (
weather.allmeteo.com) where the station will be provisioned under its DevEUI. - The allMETEO Actility endpoint URL (Appendix W) and, if the endpoint requires it, the Authorization header value from allMETEO -> Integration.
https://gw.allmeteo.com/swtelora/uplink is allMETEO's ThingPark endpoint. It was created in November 2020 for the first Swisscom LPN customers (Swisscom LPN runs on ThingPark) and has since been used unchanged by Actility ThingPark Enterprise customers in Kenya (2022) and Zurich (2024). It needs no Authorization header and ignores ThingPark's tunnel-interface token. The allMETEO Integration -> Help page does not list it yet: the LoRaServer entry shown there (/loraserver/uplink) does not accept ThingPark JSON.
Capture: allMETEO portal, left menu Integration, Help tab (optional - only to show readers what the page looks like and that the LoRaServer row is not the one to use). File: images/01-allmeteo-integration-help.png
3Register the device in ThingPark
Add the device under the account, let it join, and confirm that periodic uplinks arrive on FPort 1 before touching the connection.
- Devices -> ADD DEVICE. BARANI is not in the ThingPark device catalog, so click View More Manufacturers and choose Generic, then pick the Class A model for your ISM band (EU868 for the UK and EU; BARANI IoT Pro devices are LoRaWAN 1.0.x Class A).
- Name - use the BARANI serial number (e.g.
2601LH141) so ThingPark and allMETEO agree on names. DevEUI - from the serial sheet. - Activation mode OTAA: enter the AppKey and the JoinEUI.
- Connectivity plan (if shown) - any LoRaWAN plan. Connections - tick the
allMETEOconnection if it already exists (Part 4); otherwise attach it later (Part 5). Location - Manual or No location. - Click ADD.
Capture: TPE: Devices -> ADD DEVICE, after selecting View More Manufacturers -> Generic and the model; fields filled with a BARANI unit (mask the AppKey). File: images/02-tpe-add-device.png
Capture: Same ADD DEVICE form (or the device's edit form), scrolled to the Connections section. File: images/03-tpe-device-connection.png
Confirm it joins and sends
Open Network tools -> Wireless Logger and filter by the DevEUI. Within one uplink interval (10 minutes for most BARANI devices) you should see the Join request / Join accept pair, then periodic uplinks on FPort 1 with the payload length of your device (Part 9). Join requests without a Join accept mean wrong keys; nothing at all means no coverage.
Capture: TPE: Network tools -> Wireless Logger, filter by the DevEUI, expand one FPort-1 row so payload_hex is visible. File: images/04-tpe-wireless-logger.png
Periodic measurements are on FPort 1. Other ports carry service or alarm frames (for example FPort 2 service and FPort 3 alarms on MeteoWind). The connection forwards every port (Part 4); allMETEO handles them by port and DevEUI.
4Create the allMETEO connection (once per account)
A ThingPark connection is the outbound route from the network server to an application server. Create one Basic HTTPS connection for allMETEO and reuse it for every BARANI device in the account.
- Connections -> ADD CONNECTION -> Basic HTTPS.
- Name:
allMETEO. Domains: leave empty unless your account uses domain segregation. Additional information: optional. - Tunnel interface authentication: allMETEO ignores the token on uplinks, so the data path works with it enabled or disabled. BARANI's own connection runs with it disabled (the portal then shows a red 'authentication is disabled' notice - expected); enabling it only changes how downlinks to your devices are signed. Maximum timestamp deviation: leave the default.
- URLs:
https://gw.allmeteo.com/swtelora/uplink. Strategy: Sequential (required when there is a single URL). Leave port-based routing off so every port reaches allMETEO. - Custom HTTP Headers: none. Unlike the LoRaServer / LORIOT integrations, this endpoint does not use an allMETEO API Authorization token.
- Payload format: ThingPark (JSON) - labelled 'Content Type: JSON' on older portals. Not XML, and not JSON untyped.
- Click ADD. The connection appears in the list with state OPENED; opening it shows the page in the screenshot below (Swisscom LPN shown - ThingPark Enterprise renders the same page).
Capture: TPE: left menu Connections. File: images/05-tpe-connections-list.png
Capture: TPE: Connections -> ADD CONNECTION, before choosing a type. File: images/06-tpe-connection-type.png
Capture: TPE: the Basic HTTPS form just before clicking ADD (or the saved connection's edit view). Mask the tunnel key if shown. File: images/07-tpe-basic-https-form.png
Payload format ThingPark (JSON), no custom headers, authentication off and every port (*) routed to gw.allmeteo.com/swtelora/uplink is exactly what BARANI's own Swisscom LPN connection has run since 2020 - the annotated screenshot above is that connection. JSON untyped and XML have never been used against this endpoint; stay with JSON.
What ThingPark will send
Every uplink becomes one HTTP POST to the URL with ThingPark's query string appended (?LrnDevEui=...&LrnFPort=...&LrnInfos=...&AS_ID=...&Time=...&Token=...) and a JSON body rooted at DevEUI_uplink - see Appendix W. allMETEO uses DevEUI, FPort, FCntUp, payload_hex and Time; the rest is metadata it ignores.
The application server must present a valid (not self-signed) TLS certificate, answer within about 100 ms, and keep HTTP keep-alive open for at least 30 minutes. If too many requests are pending, ThingPark blacklists the server for 30 seconds and those uplinks are lost - Basic HTTPS has no queue. gw.allmeteo.com meets these rules; it already serves the Swisscom fleet.
Variants
- ThingPark X IoT Flow HTTPS connection (the other HTTPS type in ADD CONNECTION) sends the same
DevEUI_uplinkJSON but adds message queuing and payload drivers. It also works; Basic HTTPS is used here because it mirrors the fleet path exactly and has fewer moving parts. (TODO / verify on a live account before recommending it.) - Operator portals (ThingPark Wireless: Swisscom LPN, Orange, KPN and others). Current portals use the same Connections page as ThingPark Enterprise, so Parts 4-5 apply unchanged (Swisscom LPN is the example above). Portals still on the legacy Device Manager use different screens for the same settings: Application servers -> Add: Name
allMETEO, TypeHTTP Application Server (LoRaWAN), Content Type JSON, no HTTP custom headers, Uplink/downlink security left Inactive; one Route with Source ports*, Routing strategy Sequential, Destinationhttps://gw.allmeteo.com/swtelora/uplink. Then AS routing profiles -> Add a profile containing that application server, and select it in each device's Settings. Same body, same endpoint.
5Attach the device to the connection
- Devices -> open the device -> edit -> Connections -> tick
allMETEO-> Save. A device can have several connections, so the allMETEO one can sit next to any customer application server. - New devices: tick the connection in the ADD DEVICE form (Part 3) - with Add another checked, ThingPark keeps the model, activation mode and connections for the next unit.
- Many devices: use the CSV bulk import (Devices -> bulk operations), which carries the connection assignment per row.
Capture: TPE: Devices -> open the device; capture the header/summary with the Connections field visible. File: images/08-tpe-device-page.png
If ThingPark shows uplinks but allMETEO stays empty, check this first: a device whose page lists no connection is received and displayed by ThingPark but never sent anywhere. Wireless Logger marks a forwarded uplink with a green upward arrow, Sent to Application; without a connection that mark never appears.
Capture: TPE: a device whose Connections field is empty (e.g. the customer's unit before the fix). File: images/14-tpe-device-no-connection.png
6Provision the station in allMETEO
allMETEO matches every incoming report to a station by DevEUI. Register (or confirm) the station keyed on the device DevEUI - shown lowercase in the allMETEO UI, e.g. ac1f09fffe0e18d8 - and select the correct device model so allMETEO applies the right decoder: MeteoHelix, MeteoWind (choose the anemometer cup under MeteoWind Settings), MeteoRain, MeteoAG or MeteoALTIM.
Capture: allMETEO: Devices -> station -> Settings, DevEUI and model visible. The one from the MeteoWind akenza guide can be reused. File: images/09-allmeteo-station-deveui.png
- Gen1 and Gen2 units of the same family use different payload lengths - pick the model that matches the unit (Part 9); a Gen2 frame on a Gen1 station decodes to nothing.
- No API Authorization token is needed for this endpoint - skip the allMETEO Integration -> API Authorization step that the LoRaServer / LORIOT guides use.
The DevEUI ThingPark sends (uppercase hex, no separators) must equal the station's DevEUI in allMETEO. Case does not matter; a typo does.
7Verify end to end
- ThingPark: Connections -> allMETEO -> Last Reports lists one row per uplink - DevEUI, Report type, Content DATA, timestamp, FCnt and Delivery to app. with a green tick when allMETEO answered 2xx. Wireless Logger shows the same uplinks with the Sent to Application arrow.
- allMETEO: open the station -> Data tab. Measurements arrive every uplink interval with current timestamps.
Capture: TPE: Connections -> open the allMETEO connection -> Last Reports after a few uplinks. Optional - screenshot 16 already shows this page. File: images/10-tpe-connection-stats.png
Like the TTI endpoint, the allMETEO gateway answers 200 ok to any well-formed POST and does not validate ThingPark's token - so a green Delivery to app. tick or the Sent to Application arrow means only that the POST was accepted, not that a station stored it. If the Data tab stays empty, work through Part 8.
Optional: inspect the exact body before cutover
Create a second, temporary Basic HTTPS connection whose URL is a webhook.site catcher, attach the device to both, and wait for one uplink. The captured request shows the query string and the DevEUI_uplink body (compare with Appendix W); delete the test connection afterwards. The free webhook.site tier caps at 50 requests and the URL expires after 7 days.
Capture: webhook.site inbox showing one POST from ThingPark: URL bar with LrnDevEui=... and the JSON body. File: images/12-webhooksite-body.png
8Troubleshooting
Ordered by how often each one turns out to be the cause.
- Uplinks visible in ThingPark, nothing in allMETEO (the most common report). Check in this order: (1) the device page lists the
allMETEOconnection, and the connection's Last Reports shows the device's uplinks with a green Delivery to app. tick; (2) the connection URL is exactlyhttps://gw.allmeteo.com/swtelora/uplink- not/loraserver/uplink(the entry the allMETEO Integration -> Help page shows for generic LoRa servers; it does not parse ThingPark JSON, which is exactly what tripped the City of Zurich in 2024), not/tti/uplink(reads TTN-v3 fields at the root, so a ThingPark body reads null and is dropped silently while still answeringok), and not the LORIOT or ChirpStack ones; (3) Content Type is JSON - an XML body is dropped; (4) the station exists in allMETEO under exactly that DevEUI with the right model; (5) if the endpoint needs the Bearer token, the header is present and the token includes this device; (6) the connection is OPENED and its monitoring page shows no HTTP errors. - Device never joins - Wireless Logger shows Join requests without a Join accept: wrong AppKey or JoinEUI (compare with the serial sheet). No join requests at all: no coverage, wrong ISM band profile, or the device is switched off.
- Joins and sends, but allMETEO decodes nothing - the payload length in Wireless Logger does not match the station model (Gen1 vs Gen2, Part 9). Change the model in allMETEO; ThingPark needs no change.
- Data stops after working - Basic HTTPS has no queue: if the application server was unreachable or slow, ThingPark blacklists it for 30 seconds and those uplinks are gone. Check the connection's monitoring page for errors; an outage on the receiving side means lost data, not delayed data.
- Duplicate or out-of-order rows -
FCntUpis the sequence number; an uplink flaggedLate(received through a slow base station) can be ignored. - Service or alarm frames (ports other than 1) - forwarded too; allMETEO handles them by port. Nothing to configure.
- Connections page is read-only or hides the URL - your user has domain restrictions; cross-domain connections are read-only for such users. Ask an administrator.
9Device catalog
Every BARANI LoRaWAN device uses the same ThingPark connection and the same endpoint. The table lists what differs per device: the FPort-1 payload length you will see in Wireless Logger, and the model to select in allMETEO.
| Device | ThingPark model | FPort-1 payload | allMETEO model |
|---|---|---|---|
| MeteoHelix IoT Pro Gen2 | Generic - Class A (your ISM band) | 16 bytes | MeteoHelix (Gen2) |
| MeteoWind IoT Pro Gen2 / Gen3 | Generic - Class A | 14 bytes | MeteoWind + anemometer cup |
| MeteoWind IoT Pro Gen2 HNWL | Generic - Class A | 21 bytes | MeteoWind HNWL |
| MeteoRain IoT Pro Gen2 | Generic - Class A | 6 bytes | MeteoRain (Gen2) |
| MeteoAG IoT Pro Gen2 | Generic - Class A | 13 bytes | MeteoAG |
| MeteoALTIM IoT Pro Gen2 | Generic - Class A | 16 bytes | MeteoALTIM |
| MeteoWind IoT Pro Gen1 | Generic - Class A | 10 bytes | MeteoWind (Gen1) |
| MeteoHelix / MeteoRain Gen1 | Generic - Class A | see the message-format FAQ | matching Gen1 model |
The allMETEO model names above are descriptive - TODO / verify the exact labels in the allMETEO station settings before publishing. Decoders for every generation are published in barani-design/P_SRC_device_decoders; none of them is needed in ThingPark for this path.
Appendix W - the report ThingPark sends
This is the HTTP request ThingPark's network server posts to the connection URL for one BARANI uplink (Basic HTTPS, Content Type JSON), abridged. Numbers are typed; with JSON untyped every value arrives as a string, and with XML the document is a different format entirely. The query string carries the DevEUI and port again plus the tunnel-interface signature (AS_ID, Time, Token), which allMETEO ignores.
POST /swtelora/uplink?LrnDevEui=AC1F09FFFE0E18D8&LrnFPort=1&LrnInfos=HTTP_RP_2ea666f7-1-1170211&AS_ID=TWA_100012345.1234.AS&Time=2026-09-20T09%3A10%3A28.695%2B00%3A00&Token=e2f2ed5b...c5f5 HTTP/1.1
Host: gw.allmeteo.com
Content-Type: application/json
{
"DevEUI_uplink": {
"Time": "2026-09-20T09:10:28.695+00:00",
"DevEUI": "AC1F09FFFE0E18D8",
"FPort": 1,
"FCntUp": 368,
"LostUplinksAS": 0,
"ADRbit": 1,
"MType": 2,
"FCntDn": 3,
"payload_hex": "0a0138401c000c56410a9594eddf",
"mic_hex": "d0ffa164",
"Lrcid": "000000CB",
"LrrRSSI": -94.0,
"LrrSNR": 8.75,
"LrrESP": -94.54,
"SpFact": 7,
"SubBand": "G1",
"Channel": "LC3",
"Lrrid": "10001273",
"Late": 0,
"LrrLAT": 47.934113,
"LrrLON": 1.196017,
"Lrrs": { "Lrr": [ { "Lrrid": "10001273", "Chain": 0, "LrrRSSI": -94.0, "LrrSNR": 8.75, "LrrESP": -94.54 } ] },
"DevLrrCnt": 1,
"CustomerID": "100012345",
"CustomerData": { "loc": null, "alr": { "pro": "LORA/Generic", "ver": "1" }, "tags": [], "doms": [], "name": "2605LW044" },
"BaseStationData": { "doms": [], "name": "Site gateway" },
"ModelCfg": "0",
"DevAddr": "0574FA90",
"TxPower": 14.0,
"NbTrans": 1,
"Frequency": 868.1,
"DynamicClass": "A"
}
}
DevEUI-> station match.FPort-> message type (1 = periodic data).FCntUp-> sequence number.payload_hex-> the raw frame allMETEO decodes.Time-> observation time (ISO 8601 with offset).LrrRSSI,LrrSNR,SpFact,Lrrid-> radio quality and receiving base station;CustomerData.name-> the device name in ThingPark.- TODO / verify against the endpoint source which of these fields allMETEO stores beyond the five it needs.
Appendix O - changing keys over the air (Port 100)
Gen2 devices accept an OTAA credential change on downlink port 100: a 24-byte payload = [AppKey 16 bytes][AppEUI 8 bytes] (48 hex characters), sent as a confirmed downlink. To change only the AppEUI, keep the current AppKey and append the new AppEUI.
- ThingPark Enterprise: Devices -> open the device -> Send downlink -> Payload = the 48-hex-character string -> LoRaWAN port =
100-> tick Send confirmed data downlink frame -> Validate. The button is active only once a connection is attached to the device. - Class A: the downlink is delivered in the receive window after the device's next uplink (about 10 minutes), so it queues; watch the device's recent-packets list for the delivery and the confirmed ACK.
- Update the join server before the device rejoins: edit the device in ThingPark (AppKey / JoinEUI) so the next OTAA join succeeds - a mismatch leaves the unit dark until a site visit.
- Byte order is as displayed (MSB-first); confirm against the firmware before sending.
Appendix D - decoded values inside ThingPark (optional)
Not needed for allMETEO. If the customer also wants measurements on the ThingPark dashboard, ThingPark X IoT Flow supports custom payload drivers following the LoRa Alliance codec API (decodeUplink(input)) - the format the BARANI repo decoders already use. This requires an IoT Flow connection rather than Basic HTTPS; see Actility's driver developer guide. (TODO / verify on a live account.)
