diff --git a/src/assets/images/user-guide/integrations/kpn-things-integration-architecture.svg b/src/assets/images/user-guide/integrations/kpn-things-integration-architecture.svg new file mode 100644 index 0000000000..86f9f4df01 --- /dev/null +++ b/src/assets/images/user-guide/integrations/kpn-things-integration-architecture.svg @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + ThingsBoard Deployment + + + + + + + + + + + + + + + + + + + + IoT Device + + + + KPN Things + Platform + + + + + + + + + + + + + + + + + + KPN Things + Integration + + + + + + + + Data Converters + + + + + + + Uplink + + + Downlink + + + + ThingsBoard + Core Service + + + + + + + + + + + + Storage + + + + + + + + + + + + Dashboards + + + + + + + + + + + + + + + + Rule Engine + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + device + uplink + + + HTTP uplink + event + + + uplink payload + + + telemetry / + attribute + + + + device + downlink + + + API call + + + encoded payload + + + RPC / attribute + + + + + + Uplink — device data to ThingsBoard + + + + Downlink — commands to device + + \ No newline at end of file diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-1.png b/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-1.png index ae47daa834..477cb3312d 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-1.png and b/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-1.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-2.png b/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-2.png index 78eeb685f3..cb52c8c1f7 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-2.png and b/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-2.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-3.png b/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-3.png index 5f3b10a93a..9814b3f7f8 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-3.png and b/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-3.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-4.png b/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-4.png index d211cd64e2..a0052824f1 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-4.png and b/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-4.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-5.png b/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-5.png index 5a13fab74e..b6f5d7311d 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-5.png and b/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-5.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-6.png b/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-6.png index 8fded0b193..d5616786c2 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-6.png and b/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-6.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-7.png b/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-7.png deleted file mode 100644 index e4417b65a5..0000000000 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-7.png and /dev/null differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-send-data-now.png b/src/assets/images/user-guide/integrations/kpn/kpn-send-data-now.png index 76e8a57b66..5e3ecd315f 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-send-data-now.png and b/src/assets/images/user-guide/integrations/kpn/kpn-send-data-now.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-1-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-1-pe.png index c3207b34f7..84bf17b66a 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-1-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-1-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-10-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-10-pe.png index 04ea083e21..1da764ac5b 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-10-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-10-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-11-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-11-pe.png index c9e6b1e57e..17179fa2d9 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-11-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-11-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-12-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-12-pe.png index aa50b87a53..f452e2524e 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-12-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-12-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-13-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-13-pe.png deleted file mode 100644 index a53545b44a..0000000000 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-13-pe.png and /dev/null differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-14-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-14-pe.png index 1362d793ec..28cc38e49b 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-14-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-14-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-15-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-15-pe.png index 0a9d7f7dc9..9162f13c38 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-15-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-15-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-16-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-16-pe.png index 60645d85df..0505461aea 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-16-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-16-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-17-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-17-pe.png index b4017d3058..e615f3f2bf 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-17-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-17-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-18-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-18-pe.png index e208128d0c..aa86ddccc9 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-18-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-18-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-19-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-19-pe.png index 4b31fde651..f3b5010433 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-19-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-19-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-2-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-2-pe.png index 700fe1adaa..912ea162d2 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-2-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-2-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-20-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-20-pe.png new file mode 100644 index 0000000000..6b929d2c30 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-20-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-3-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-3-pe.png index 31c811f548..4499a01ef9 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-3-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-3-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-4-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-4-pe.png index 9c06842f2f..0f0557b988 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-4-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-4-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-5-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-5-pe.png deleted file mode 100644 index 3e40a86f0a..0000000000 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-5-pe.png and /dev/null differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-6-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-6-pe.png index 78e9888d3d..e7268b702e 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-6-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-6-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-7-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-7-pe.png index 8828db764c..8ad4e35f8c 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-7-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-7-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-8-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-8-pe.png index 4cde3b4004..98ea908ac1 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-8-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-8-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-9-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-9-pe.png index e7980daca7..9f54d77380 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-9-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-9-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-device-1-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-device-1-pe.png index 3a0ddcbd6b..b8046e59e8 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-device-1-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-device-1-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-1.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-1.png new file mode 100644 index 0000000000..a1839db8c3 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-1.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-10.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-10.png new file mode 100644 index 0000000000..0529e8d5a8 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-10.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-11.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-11.png new file mode 100644 index 0000000000..4ad83f7d0f Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-11.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-12.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-12.png new file mode 100644 index 0000000000..9df5800a47 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-12.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-13.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-13.png new file mode 100644 index 0000000000..3e5474ed7c Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-13.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-14-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-14-pe.png new file mode 100644 index 0000000000..6f45c397a2 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-14-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-15-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-15-pe.png new file mode 100644 index 0000000000..338118453f Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-15-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-16-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-16-pe.png new file mode 100644 index 0000000000..69c8d83823 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-16-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-17-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-17-pe.png new file mode 100644 index 0000000000..5d186d6924 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-17-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-18-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-18-pe.png new file mode 100644 index 0000000000..1d6b9b054c Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-18-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-19-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-19-pe.png new file mode 100644 index 0000000000..150f51a2ff Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-19-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-2.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-2.png new file mode 100644 index 0000000000..fddeda4f0f Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-2.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-20-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-20-pe.png new file mode 100644 index 0000000000..69b30234c2 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-20-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-21-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-21-pe.png new file mode 100644 index 0000000000..1ca877193a Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-21-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-22-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-22-pe.png new file mode 100644 index 0000000000..85cdfdb9ab Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-22-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-23-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-23-pe.png new file mode 100644 index 0000000000..6f36c7dd61 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-23-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-24-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-24-pe.png new file mode 100644 index 0000000000..568f84b470 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-24-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-25-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-25-pe.png new file mode 100644 index 0000000000..0ab2cc1aae Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-25-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-26-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-26-pe.png new file mode 100644 index 0000000000..81ef02b10e Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-26-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-27-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-27-pe.png new file mode 100644 index 0000000000..88b6087df0 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-27-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-3.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-3.png new file mode 100644 index 0000000000..5cfd30779d Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-3.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-4.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-4.png new file mode 100644 index 0000000000..104d2f2957 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-4.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-5.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-5.png new file mode 100644 index 0000000000..51b5d05c74 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-5.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-6.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-6.png new file mode 100644 index 0000000000..dcd9ecd6c3 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-6.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-7.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-7.png new file mode 100644 index 0000000000..63fe02866f Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-7.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-8.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-8.png new file mode 100644 index 0000000000..f501772626 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-8.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-9.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-9.png new file mode 100644 index 0000000000..34586a1b5f Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-9.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-test-1-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-1-pe.png new file mode 100644 index 0000000000..6519b8662b Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-1-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-test-2-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-2-pe.png new file mode 100644 index 0000000000..f08609d979 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-2-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-test-3-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-3-pe.png new file mode 100644 index 0000000000..d15cd8914e Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-3-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-test-4-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-4-pe.png new file mode 100644 index 0000000000..764da45184 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-4-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-test-5-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-5-pe.png new file mode 100644 index 0000000000..4b4356008c Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-5-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-test-6-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-6-pe.png new file mode 100644 index 0000000000..624c034d48 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-6-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-test-7-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-7-pe.png new file mode 100644 index 0000000000..36b18299e3 Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-7-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-test-8-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-8-pe.png new file mode 100644 index 0000000000..3c333679ea Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-8-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-test-9-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-9-pe.png new file mode 100644 index 0000000000..58ca39884f Binary files /dev/null and b/src/assets/images/user-guide/integrations/kpn/kpn-things-test-9-pe.png differ diff --git a/src/assets/images/user-guide/integrations/kpn/kpn-things-uplink-1-pe.png b/src/assets/images/user-guide/integrations/kpn/kpn-things-uplink-1-pe.png index bdce6bff16..31a648ad00 100644 Binary files a/src/assets/images/user-guide/integrations/kpn/kpn-things-uplink-1-pe.png and b/src/assets/images/user-guide/integrations/kpn/kpn-things-uplink-1-pe.png differ diff --git a/src/content/_includes/docs/user-guide/integrations/kpn-things.mdx b/src/content/_includes/docs/user-guide/integrations/kpn-things.mdx index 4207df770f..baa22495d9 100644 --- a/src/content/_includes/docs/user-guide/integrations/kpn-things.mdx +++ b/src/content/_includes/docs/user-guide/integrations/kpn-things.mdx @@ -3,15 +3,153 @@ import ImageGallery from '~/components/ImageGallery.astro'; import DocImage from '~/components/DocImage.astro'; import Banner from '~/components/Banner.astro'; import { Steps, Aside } from '@astrojs/starlight/components'; +import Tabs from '@components/Tabs.astro'; +import TabItem from '@components/TabItem.astro'; import { Products } from '~/models/site.models'; KPN Things is an IoT platform provided by KPN, a Dutch telecommunications company. It supports a range of IoT connectivity types — including LoRa, LTE-M, and mobile data — and lets users connect, manage, and route device data to cloud destinations via a concept called **Flows**. -After integrating KPN Things with ThingsBoard, you can connect, communicate, process, and visualize data from your devices in the ThingsBoard IoT platform. +After integrating KPN Things with ThingsBoard, device data flows from the KPN Things platform directly into ThingsBoard for processing, monitoring, and visualization. -## Create the KPN Things integration in ThingsBoard + + +## Prerequisites + +Before creating the integration, ensure: + +- You have access to {props.product !== Products.PAAS && props.product !== Products.PAAS_EU && <>ThingsBoard PE or }ThingsBoard Cloud with integration functionality enabled for your tenant. +- You have permissions to create integrations and data converters in ThingsBoard. +- You have a KPN Things portal account with administrative access. +- You have at least one IoT device created and registered in the KPN Things platform. +- Your device is linked to a **Flow** in KPN Things — devices must be assigned to a flow to send or receive data. +- Optional: For testing downlink functionality, you will need API credentials from KPN Things (see Obtain KPN Things API Credentials section). + + + +## Create KPN Things Uplink Data Converter + +The uplink converter receives each HTTP message sent by KPN Things, parses the JSON payload, and returns a structured object that ThingsBoard uses to create or update a device and store its telemetry and attributes. + +KPN Things pre-decodes device data to SenML format before forwarding it to ThingsBoard (enabled in the **[Enable Data Processing](#enable-data-processing)** step). Because of this, the default converter passes the incoming JSON through without modification — no custom byte decoding is needed. You can extend it to rename fields, filter values, or derive additional attributes. + +For the full decoder function reference — all input parameters and output fields — see Uplink data converter. + + + 1. Go to **Integrations center ⇾ Data converters**. + 2. Click **+ Add data converter ⇾ Create new converter**. + + +In the **Add data converter** dialog: + + +
    +
  1. Converter type — leave Uplink (selected by default).
  2. +
  3. Integration type — in the search field, enter KPN and select KPN Things from the list.
  4. +
  5. Name — enter a converter name, for example KPN Things Uplink Converter.
  6. +
  7. + Configure the decoder: +
      +
    • The default decoder is pre-filled. Leave it unchanged for this guide.
      By default the editor opens in TBEL; use the TBEL / JS toggle (upper right) to switch languages.
    • +
    + + + + + ```js + /* + * By default, we receive a message that is already correctly formatted. + * But you can change the code for your purposes. + */ + return decodeToJson(payload); + ``` + + + ```js + /** Decoder **/ + + /* + By default, KPN Things sends a message that is already formatted + according to the ThingsBoard uplink converter output structure. + The JavaScript converter receives the payload as a byte array and parses it as JSON. + */ + var data = decodePayloadToJson(payload); + + return data; + + /** Helper functions **/ + + function decodePayloadToString(payload) { + var str = ''; + + for (var i = 0; i < payload.length; i++) { + str += String.fromCharCode(payload[i]); + } + + return str; + } + + function decodePayloadToJson(payload) { + return JSON.parse(decodePayloadToString(payload)); + } + ``` + + +
  8. +
  9. Click Add.
  10. +
+
+ +

What the Converter Receives

+ +ThingsBoard passes two variables to the decoder function: + +| Variable | Type | Description | +|----------|------|-------------| +| `payload` | byte array | The raw bytes of the HTTP request body sent by KPN Things. Call `decodeToJson(payload)` to parse it into a structured object. | +| `metadata` | object | Key-value map populated from HTTP request headers and the integration's configured metadata (see **Advanced settings** in the integration). | + +The decoded payload returned by `decodeToJson(payload)` has the following structure: + +```json +{ + "deviceName": "urn:dev:DVNUUID:d74df9c0-c343-4879-9e4d-20483ff1b56d:", + "deviceLabel": "My KPN Device", + "deviceType": "DeviceSimulator(MobilePhoneapp)", + "telemetry": [{ + "ts": 1703251120000, + "values": { + "battery": "34.0", + "temperature": 22.5 + } + }] +} +``` + +ThingsBoard reads `deviceName` to identify or create the device, `deviceType` to assign the device profile, and the `telemetry` array to store time-series data. To rename or filter fields before storage, transform these values in the decoder before returning. + +

Device Identifier

+ +KPN Things identifies each device using a **URN (Uniform Resource Name)** as the `deviceName`. The URN follows the format: + +`urn:dev:DVNUUID:{UUID}:` + +For example: `urn:dev:DVNUUID:d74df9c0-c343-4879-9e4d-20483ff1b56d:` + +On the first uplink, ThingsBoard creates a new device using this URN as its name. Subsequent messages from the same device update the existing device. The URN is stable for the lifetime of the device registration in KPN Things. + +## Create KPN Things Integration in ThingsBoard
    @@ -27,34 +165,33 @@ After integrating KPN Things with ThingsBoard, you can connect, communicate, pro
  1. Uplink data converter:
      -
    • Choose Create new. The default converter uses decodeToJson(payload) — KPN Things sends data pre-formatted in a structure ThingsBoard already understands, so no custom decoding is needed unless you want to transform the fields further.
    • +
    • Click Select existing and choose the KPN Things Uplink Converter created in the previous step.
    • Click Next.
  2. Downlink data converter:
      -
    • Leave the Downlink data converter field empty for now.
    • -
    • Click Skip.
    • +
    • Click Skip — the downlink converter can be configured later if needed.
  3. Connection:
    • Specify your Base URL.
    • -
    • Copy the HTTP endpoint URL — you will need it when configuring the KPN Things destination.
    • +
    • Copy the HTTP endpoint URL — you will need it when configuring the KPN Things destination.
    - See Connection settings for a full description of each parameter. + See Connection settings for a full description of each parameter.
  4. Click Add.
Integrations center → Integrations and click + Add integration. Set Integration type to KPN Things, enter a name, and click Next' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-2.png', alt: 'Add integration wizard — Uplink data converter step: Select existing tab active, KPN Things Uplink Converter selected in the field', caption: 'Click Select existing and choose the KPN Things Uplink Converter created in the previous step, then click Next' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-3.png', alt: 'Add integration wizard — Downlink data converter step: Skip button highlighted', caption: 'Click Skip — the downlink converter can be configured later if needed' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-add-integration-4.png', alt: 'Add integration wizard — Connection step: Base URL set to https://thingsboard.cloud, HTTP endpoint URL shown with a copy button, Add button visible', caption: 'Enter your Base URL, copy the HTTP endpoint URL to paste into the KPN Things destination, and click Add' }, ]} /> ### Connection settings @@ -65,7 +202,7 @@ The base address of the ThingsBoard server, used to construct the HTTP endpoint

Destination shared secret

-Optional secret token used to authenticate KPN Things requests arriving at ThingsBoard. Click the generate icon to create a value, then configure KPN Things to include it in outgoing requests so ThingsBoard can verify the source. +Optional secret token used to authenticate KPN Things requests arriving at ThingsBoard. Learn how to implement the shared secret.

HTTP endpoint URL

@@ -73,150 +210,616 @@ Auto-generated endpoint for this integration. Paste this URL into the KPN Things

Allow downlink

-Enable to allow ThingsBoard to send commands back to devices via KPN Things. When toggled on, additional **Credentials** fields appear: +Enable to allow ThingsBoard to send commands back to devices via KPN Things. When toggled on, a **Credentials** section appears with two fields: -- **GRP tenant id** — the KPN Things tenant identifier -- **API id** — the API client ID used to authenticate ThingsBoard against the KPN Things API +- **API ID** — the API key ID used to authenticate ThingsBoard against the KPN Things API - **API Key** — the corresponding API secret key

Enable security (Headers filter)

-Enable to restrict incoming requests to those carrying a specific HTTP header with a matching value. Click **Add** to define one or more **Header** / **Value** pairs. Requests missing any listed header or carrying an incorrect value are rejected. Use this to validate the `X-Things-Secret` header generated by KPN Things — see [Update integration with security header](#update-integration-with-security-header). +Enable to restrict incoming requests to those carrying a specific HTTP header with a matching value. When toggled on, the section shows **No headers filter** — click **Add** to add a **Header** / **Value** row. Requests missing any listed header or carrying an incorrect value are rejected. Use this to validate the `X-Things-Secret` header generated by KPN Things — see **[Configure KPN Things Webhook Security](#configure-kpn-things-webhook-security)**.

Execute remotely

-When enabled, ThingsBoard generates an **Integration key** and **Integration secret** that allow the integration to run as a separate process outside the ThingsBoard cluster — useful when the integration must reach services not accessible from the ThingsBoard server. +When enabled, ThingsBoard generates an **Integration key** and **Integration secret** (both copyable) that allow the integration to run as a separate process outside the ThingsBoard cluster — useful when the integration must reach services not accessible from the ThingsBoard server.

Advanced settings

-- **Description** — optional text description for this integration -- **Metadata** — key-value pairs injected into every uplink message as `integrationMetadata` in converter scripts +- **Description** — optional free-text description for this integration +- **Metadata** — key-value pairs injected into every uplink message as `integrationMetadata` in converter scripts; click **Add** to define entries + +## KPN Things Platform Setup + +With the ThingsBoard integration created and the HTTP endpoint URL in hand, set up your device and data routes in the KPN Things Portal. This section guides you through device creation, flow configuration, and destination setup. + +### Create and Register a Device + +KPN Things supports multiple device types. For this guide, we use the **Device Simulator** (Web app) to test without physical hardware — no physical IoT device is required. + + +
    +
  1. Go to Things Manager and click My first project to open the project overview.
  2. +
  3. In the Devices row, click Add Device.
  4. +
  5. Select your device type — for this guide, choose Device Simulator (Web app).
  6. +
  7. Enter a device name — for example, My KPN Device — and click Add Device.
  8. +
  9. The device is created — the KPN Internet Network is created toast confirms the setup. Use the browser link or scan the QR code to open the Device Simulator.
  10. +
+
+ +Things Manager and click My first project' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-2-pe.png', alt: 'KPN IoT portal — My first project overview showing Devices row with Add Device button', caption: 'In the Devices row, click Add Device' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-3-pe.png', alt: 'KPN IoT portal Add Device — device type grid with Device Simulator (Web app) selected', caption: 'Select Device Simulator (Web app) as the device type' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-4-pe.png', alt: 'KPN IoT portal Add Device — Name field showing My KPN Device, Barcode field, Add Device button', caption: 'Enter a device name — for example, My KPN Device — and click Add Device' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-5-pe.png', alt: 'KPN IoT portal Device Details page for My KPN Device — KPN Internet Network is created success toast, Open the application section with browser link and QR code', caption: 'The device is created — KPN Internet Network is created toast confirms the setup; open the Device Simulator in your browser or scan the QR code' }, +]} /> + +### Create a Flow + +Flows in KPN Things define how devices route their data. Each device must be assigned to a flow to send and receive data. -## KPN Things setup + +
    +
  1. Go to Flows in the left menu and click My first flow.
  2. +
  3. In the Devices row, click Link Device.
  4. +
  5. Click Link next to the device you created.
  6. +
  7. The device is successfully linked to the flow.
  8. +
+
+ +Flows in the left menu and click My first flow' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-7-pe.png', alt: 'KPN IoT portal — My first flow details page showing Devices row with Link Device button, Data Processing row, and Destinations row', caption: 'In the Devices row, click Link Device' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-8-pe.png', alt: 'KPN IoT portal — Choose a Device to link page showing My KPN Device with Device Simulator type and Active status, Link button highlighted', caption: 'Click Link next to the device you created' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-9-pe.png', alt: 'KPN IoT portal — Devices in My first flow page showing My KPN Device added just now, success toast: The Device has been successfully linked to the Flow', caption: 'The device has been successfully linked to the flow' }, +]} /> + +### Enable Data Processing + +For ThingsBoard to properly decode device payloads, enable the data processing decoder in KPN Things. This converts device-specific formats into standard SenML (Sensor Markup Language) that ThingsBoard understands. + + +
    +
  1. In the Devices in My first flow list, click My KPN Device to open Device Details.
  2. +
  3. Go to the Flows tab to view the flow diagram.
  4. +
  5. In the Decoders section, enable the Decoded ThingsML and raw SenML data toggle. Changes are saved automatically.
  6. +
+
+ +Devices in My first flow list, click My KPN Device' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-11-pe.png', alt: 'KPN IoT portal — Device Details Flows tab showing flow diagram with Decoders section: Decoded ThingsML and raw SenML data toggle disabled, Encoders section: SenML data toggle enabled', caption: 'Go to the Flows tab — the Decoded ThingsML and raw SenML data decoder is disabled by default' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-12-pe.png', alt: 'KPN IoT portal — Device Details Flows tab showing flow diagram with Decoded ThingsML and raw SenML data toggle now enabled', caption: 'Enable the Decoded ThingsML and raw SenML data toggle — changes are saved automatically' }, +]} /> -Open the KPN Things Portal and log in to your account. +### Create a ThingsBoard Destination + +A destination in KPN Things specifies where to route device data. Create a ThingsBoard destination directly from the flow diagram — it will be linked to the flow automatically. + + +
    +
  1. On the Flows tab of My KPN Device, click Connect destination in the flow diagram.
  2. +
  3. Click + Add new Destination — the destination list is empty.
  4. +
  5. Find ThingsBoard in the destination type grid and click Choose ThingsBoard.
  6. +
  7. Enter a Destination Name — for example, My ThingsBoard Instance.
  8. +
  9. + Fill in Connection Details: +
      +
    • Paste the HTTP endpoint URL copied from the ThingsBoard integration.
    • +
    • In the Security Header section, the Header is pre-filled as X-Things-Secret — click Generate to create the token value. Save this value — you will need it when configuring the ThingsBoard integration security header.
    • +
    +
  10. +
  11. Click Add ThingsBoard Destination — the destination is created and automatically linked to the flow.
  12. +
  13. Return to the Flows tab of My KPN Device to verify the complete pipeline — the flow diagram now shows the device, the enabled decoder, and the active ThingsBoard destination all connected.
  14. +
+
+ +Flows tab, click Connect destination in the flow diagram' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-15-pe.png', alt: 'KPN IoT portal — Choose a Destination to link page showing empty state with Add new Destination button', caption: 'No destinations exist yet — click + Add new Destination' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-16-pe.png', alt: 'KPN IoT portal — destination type grid showing ThingsBoard card with Choose ThingsBoard button highlighted', caption: 'Find ThingsBoard in the destination type grid and click Choose ThingsBoard' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-17-pe.png', alt: 'KPN IoT portal — Configure your ThingsBoard Destination form showing Destination Name field and Connection Details section with HTTP endpoint URL field and Security Header section', caption: 'Enter a Destination Name and paste the HTTP endpoint URL from the ThingsBoard integration' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-18-pe.png', alt: 'KPN IoT portal — ThingsBoard Destination form showing Security Header section with X-Things-Secret header pre-filled, generated token value, Generate button, and Add ThingsBoard Destination button', caption: 'The Header is pre-filled as X-Things-Secret — click Generate to create the token, save it, then click Add ThingsBoard Destination' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-19-pe.png', alt: 'KPN IoT portal — My ThingsBoard Instance destination detail page showing Processing Active status, Flows linked to My first flow, and success toast: The Destination has been successfully linked to the Flow', caption: 'The destination is created and automatically linked to the flow — status shows Active' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-configure-20-pe.png', alt: 'KPN IoT portal — Device Details Flows tab showing complete pipeline: My KPN Device connected through Decoded ThingsML and raw SenML data decoder to My ThingsBoard Instance destination, all Active', caption: 'The complete flow — device, decoder, and ThingsBoard destination are all connected and active' }, +]} /> + +## Configure KPN Things Webhook Security + +To authenticate incoming messages from KPN Things, add the generated security header to your ThingsBoard integration. This prevents unauthorized devices from sending data to your integration. + + +
    +
  1. In ThingsBoard, go to Integrations center ⇾ Integrations and open the KPN Things integration.
  2. +
  3. Click the pencil icon to enter edit mode.
  4. +
  5. Scroll to Enable security (Headers filter) and toggle it On.
  6. +
  7. Click Add.
  8. +
  9. In the Header field, enter X-Things-Secret.
  10. +
  11. In the Value field, paste the security token generated in KPN Things (from the destination configuration earlier).
  12. +
  13. Click Apply changes.
  14. +
+
+ +Enable security (Headers filter), enter X-Things-Secret as the header, paste the generated token as the value, click Add, then click Apply changes' }, +]} /> + + + +## Test the Integration + +After the integration is created, send a test uplink from the KPN Things Device Simulator and confirm that ThingsBoard received the message, decoded it correctly, and provisioned the device. -### Add a new device +### Send Test Uplink + +Open the KPN Things Device Simulator web app in your internet browser to send a test message to ThingsBoard. -1. Go to the **Things Manager** tab and click **Add new Device**. -2. Choose **Device Simulator**, set a name for your device, and click **Add Device**. -3. Install the **KPN Things Device Simulator** app on your phone. Scan the QR code displayed on screen with the app. Note that the **Shared Secret** is only visible at this step — save it in a secure place. Click **Add Network Info**. -4. KPN Internet Network is created. Click **Finish**. + 1. In the KPN Things portal, open **My KPN Device** and go to the **Application** tab. + 2. Under **Open the application**, click **Open the Device Simulator application in a new tab**. + 3. In the Device Simulator, select the data to send — for example, enable **Battery level**, **Temperature**, and **Location** — and adjust the values if needed. + 4. Click **Send data now**. A **Simulated device data updated successfully** toast confirms the message was forwarded to ThingsBoard. My KPN Device and click Open the Device Simulator application in a new tab' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-test-2-pe.png', alt: 'KPN Things Device Simulator web app — Select data to send screen showing Battery level 34%, Temperature 16.5°C, and Location fields enabled, with Send data now button', caption: 'Select the data fields to send and click Send data now' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-test-3-pe.png', alt: 'KPN Things Device Simulator web app — Simulated device data updated successfully toast notification', caption: 'Simulated device data updated successfully — the message was sent to KPN Things and forwarded to ThingsBoard' }, +]} /> + +### Verify Integration Events + +Go to **Integrations center ⇾ Integrations**, open the **KPN Things integration**, and click the **Events** tab. +Each successfully processed uplink appears as a row with **Type: Uplink** and **Status: OK**. + +Events tab of the KPN Things integration — each received uplink appears with Type: Uplink and Status: OK' }, ]} /> -### Link the device to the flow +### Verify Converter Events + +Go to **Integrations center ⇾ Data converters**, open **KPN Things Uplink Converter**, and click the **Events** tab. +Click an event row to inspect: +- **In** — the decoded JSON payload received from KPN Things: `deviceName`, `deviceLabel`, `deviceType`, and a `telemetry` array with values such as `battery`, `temperature`, `latitude`, `longitude`, and `orientation`. +- **Out** — the converter output passed to ThingsBoard. For the default pass-through converter the output is identical to the input. +- **Metadata** — HTTP request headers forwarded by KPN Things, including `x-things-secret` and `things-message-token`. + +Events tab of the uplink converter to inspect individual message processing results' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-test-6-pe.png', alt: 'KPN Things Uplink Converter In payload — decoded JSON with deviceName, deviceLabel, deviceType, and telemetry values including battery, temperature, latitude, longitude, and orientation', caption: 'The In view shows the decoded payload received from KPN Things before it is passed to ThingsBoard' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-test-7-pe.png', alt: 'KPN Things Uplink Converter Out payload — same decoded JSON structure passed through to ThingsBoard unchanged', caption: 'The Out view shows the converter output — for the default pass-through converter the output is identical to the input' }, + { src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-test-8-pe.png', alt: 'KPN Things Uplink Converter Metadata — HTTP request headers including x-things-secret, things-message-token, and things-plug-uuid', caption: 'The Metadata view shows the HTTP headers forwarded by KPN Things, including the security token and message identifiers' }, +]} /> + +### Verify Device Provisioning + +Go to **Entities ⇾ Devices**. ThingsBoard automatically provisions a new device using the identifier from the uplink payload as the device name on the first message received. Open the device and click the **Latest Telemetry** tab — you should see the values sent by the simulator, such as `battery`, `temperature`, `latitude`, `longitude`, and `orientation`. + +Latest Telemetry tab to verify that the simulator data was received and stored' }, +]} /> + +## Configure Downlink + +Downlink allows ThingsBoard to push commands to KPN Things devices. To enable it, obtain API credentials from the KPN Zakelijk portal, configure the integration for outbound calls, create a downlink converter, and wire up the Rule Chain. + +### Obtain KPN Things API Credentials + +ThingsBoard needs API credentials to authenticate against the KPN Things API when sending downlink messages. Obtain these from the KPN Things portal: -1. Go to **Flows** in the left menu and click the **My first flow** row. -2. Click **Link Device** in the **Devices** row. -3. Click **Link** next to the device you created. -4. The device is successfully linked to the flow. +
    +
  1. Log in to KPN Zakelijk portal.
  2. +
  3. In the left menu, click API keys.
  4. +
  5. Click Add API key.
  6. +
  7. Enter a display name (e.g., ThingsBoard Downlink).
  8. +
  9. Click Add API key.
  10. +
  11. + Copy and save securely: +
      +
    • ID (e.g., bvr1quripwp951d3boos6la5jou7wtqq)
    • +
    • Secret key (e.g., 9ff04a263f6abca124c8ed1c952c7c35ab879c6e31615e72c2dc71889d30a957)
    • +
    +
  12. +
  13. Switch to the Services and roles tab and click Add service.
  14. +
  15. Select KPN Things, then check Things Creator - Admin and Things Manager - Admin.
  16. +
  17. Click Add, then click Save changes to apply the roles to the API key.
  18. +
KPN Things admin portal, then click API keys in the left navigation menu.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-2.png', + alt: 'API Keys page with Add API key button', + caption: 'On the API Keys page, click Add API key to create a new API key.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-3.png', + alt: 'Add API key dialog', + caption: 'Enter a display name, for example ThingsBoard Downlink, optionally provide a description, and click Add API key.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-4.png', + alt: 'API key General tab', + caption: 'Verify that Activate API Key is enabled, then copy the generated ID and Secret key. These values will be used later in the ThingsBoard integration configuration.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-5.png', + alt: 'Services and roles tab', + caption: 'Open the Services and roles tab and click Add service.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-6.png', + alt: 'Add services and roles dialog', + caption: 'Select the KPN Things service, assign the required roles (Things Creator - Admin and Things Manager - Admin), then click Add.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-7.png', + alt: 'Configured API key with assigned services and roles', + caption: 'Confirm that the required service and roles have been added, then click Save changes to finish configuring the API key.', + }, ]} /> -### Enable data processing +### Configure API Credentials in ThingsBoard Integration + +Update the KPN Things integration with the API credentials: -1. Click the **My Device** row to open the Device & Connectivity detail page. -2. Go to the **Flows** tab and click the **My first flow** row. -3. Click **Data Processing** to open the Data Processing details page. -4. Enable the **Decoded ThingsML and raw SenML data** decoder toggle. Your change is saved automatically. +
    +
  1. In ThingsBoard, go to Integrations center ⇾ Integrations.
  2. +
  3. Open the KPN Things integration and click the Edit icon.
  4. +
  5. Scroll down to Allow downlink and toggle it On. Additional Credentials fields appear.
  6. +
  7. + In the Credentials section: +
      +
    • API id: Paste the ID from Step 1
    • +
    • API Key: Paste the Secret key from Step 1
    • +
    +
  8. +
  9. Click Apply changes.
  10. +
KPN Things integration, then click the pencil icon to enter edit mode.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-9.png', + alt: 'KPN Things integration in edit mode with Allow downlink enabled', + caption: 'Enable and configure the Allow downlink option.', + }, ]} /> -### Add a new destination +### Add Downlink Converter + +The downlink converter transforms ThingsBoard commands into the format KPN Things expects. The downlink converter encodes ThingsBoard attribute updates into the SenML format that KPN Things expects. + +The converter output must be a JSON object with the following structure: + +```json +{ + "contentType": "JSON", + "data": "[{\"bn\":\"urn:dev:DVNUUID:c837f568-38e3-4425-b39f-d1a63848414b:\",\"n\":\"temperature\",\"v\":25.0}]", + "metadata": { + "topic": "devices/urn:dev:DVNUUID:c837f568-38e3-4425-b39f-d1a63848414b:/downlink", + "FPort": 1 + } +} +``` + +| Field | Description | +|-------|-------------| +| `contentType` | Encoding of the `data` field: `TEXT`, `JSON`, or `BINARY`. | +| `data` | SenML JSON array serialized as a string. Each entry contains a base name (`bn`) set to the device URN, a measurement name (`n`), and a value (`v`). | +| `metadata.topic` | KPN Things downlink topic constructed from the device URN. | +| `metadata.FPort` | Port identifier sent with the downlink instruction. For LoRaWAN devices this maps to the LoRa frame port; for other device types it may be ignored. | + +For the full encoder function reference, see Downlink data converter. + +
-1. Go to **Destinations** in the left menu and click **Add new Destination**. -2. Find the **ThingsBoard** destination type and click **Choose ThingsBoard**. -3. Enter a name for your destination. -4. Paste the **HTTP endpoint URL** copied from the ThingsBoard integration into the **HTTP endpoint URL** field. -5. In the **Security Header** section, the **Header** name is pre-filled as `X-Things-Secret`. Click **Generate** to create the token value and save it — you will add it to ThingsBoard in the next step to authenticate incoming requests. -6. Click **Add ThingsBoard Destination**. +
    +
  1. Go to Integrations center ⇾ Integrations and open the KPN Things integration.
  2. +
  3. Click the pencil icon to enter edit mode.
  4. +
  5. In the Downlink data converter field, click Create new.
  6. +
  7. + Configure the converter: +
      +
    • Name: Enter KPN Things Downlink Converter
    • +
    • Script language: leave TBEL selected (recommended).
    • +
    +
  8. +
  9. In the converter editor, paste the encoder script below, and click Add.
  10. +
  11. Click Apply changes.
  12. +
+```js maxLines=20 collapsible +/** Encoder **/ + +// Create an empty SenML pack for the downlink payload. +var senmlPack = []; + +// Get the device URN from metadata. +// The deviceName must contain the full KPN Things device URN. +var deviceUrn = metadata['deviceName']; + +// Add the temperature value to the SenML pack if it is present in the message. +if (msg.temperature != null) { + senmlPack.push({ + "bn": deviceUrn, + "n": "temperature", + "v": parseFloat(msg.temperature) + }); +} + +// Return the encoded downlink payload and metadata for the integration. +var result = { + contentType: "JSON", + data: JSON.stringify(senmlPack), + metadata: { + topic: "devices/" + deviceUrn + "/downlink", + FPort: 1 + } +}; + +return result; +``` + + + KPN Things integration, then click the pencil icon to enter edit mode.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-11.png', + alt: 'KPN Things integration in edit mode', + caption: 'Enable the Allow downlink option, then click Create new in the Downlink data converter field.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-12.png', + alt: 'Add KPN Things downlink data converter dialog', + caption: 'The converter type is automatically set to Downlink. Enter a name, for example KPN Things Downlink Converter, paste the encoder function, and click Add.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-13.png', + alt: 'KPN Things integration configured for downlink', + caption: 'Verify that the Downlink data converter is assigned, enter the API ID and API Key from the KPN Things admin portal, then click Apply changes.', + }, ]} /> -### Link the destination to the flow +### Configure the Root Rule Chain + +Configure the Root Rule Chain to forward device attribute updates to the KPN Things integration. + +Two rule nodes are needed: an **originator fields** node that reads the device name from ThingsBoard and injects it into message metadata, and an **integration downlink** node that sends the message to the integration. -1. Go to **Flows ⇾ My first flow** and click **Link Destination** in the **Destinations** row. -2. Click **Link** next to the destination you created. -3. The destination is successfully linked to the flow and its status changes to **Active**. + 1. Open **Rule Chains ⇾ Root Rule Chain**. + 2. In the node panel, search for **originator fields** and drag it onto the canvas. Configure the node: + - **Name** — e.g. `Retrieve Device Name`. + - Under **Originator fields mapping**, set **Source field** to `Name` and **Target key** to `deviceName`. + - Click **Add**. + 3. In the node panel, search for **integration downlink** and drag it onto the canvas. Configure the node: + - **Name** — e.g. `Downlink to KPN Things`. + - **Integration** — select **KPN Things integration**. + - Click **Add**. + 4. Connect the **message type switch** node to the **originator fields** node using the **Attributes Updated** relation. + 5. Connect the **originator fields** node to the **integration downlink** node using the **Success** relation. + 6. Click **Apply changes**. Root Rule Chain edit view, type originator fields in the node search panel and locate it under the Enrichment category.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-15-pe.png', + alt: 'Add rule node originator fields dialog with name Retrieve Device Name, Source field Name, and Target key deviceName', + caption: 'Set the node name to Retrieve Device Name, map Source field Name to Target key deviceName, and click Add.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-16-pe.png', + alt: 'Root Rule Chain node panel with integration downlink search result highlighted under Action category', + caption: 'Type integration downlink in the node search panel and locate it under the Action category.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-17-pe.png', + alt: 'Add rule node integration downlink dialog with name Downlink to KPN Things and KPN Things integration selected', + caption: 'Set the node name to Downlink to KPN Things, select KPN Things integration in the Integration field, and click Add.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-18-pe.png', + alt: 'Completed Root Rule Chain with Retrieve Device Name and Downlink to KPN Things nodes connected via Attributes Updated and Success relations', + caption: 'Connect the message type switch node to Retrieve Device Name via Attributes Updated, then Retrieve Device Name to Downlink to KPN Things via Success. Click Apply changes.', + }, ]} /> -## Update integration with security header +### Test the Downlink -To authenticate incoming requests from KPN Things, add the generated `X-Things-Secret` token as a security header in the ThingsBoard integration. +Trigger a downlink by adding a shared attribute to the device provisioned in **[Send Test Uplink](#send-test-uplink)**: -1. Go to **Integrations center ⇾ Integrations**, open the KPN Things integration, and click the edit icon. -2. Expand **Enable security (Headers filter)** and click **Add**. -3. Enter `X-Things-Secret` in the **Header** field and paste the generated token into the **Value** field. Click **Apply changes**. +
    +
  1. In ThingsBoard, go to Entities ⇾ Devices.
  2. +
  3. Select a KPN device.
  4. +
  5. Go to the Attributes tab.
  6. +
  7. Click + in the Shared attributes section.
  8. +
  9. + Add a test attribute: +
      +
    • Key: temperature
    • +
    • Type: Integer
    • +
    • Value: 25
    • +
    +
  10. +
  11. Click Add. The Rule Chain triggers and sends a downlink message to KPN Things.
  12. +
Shared attributes scope, and add the temperature attribute with the value 25. This triggers the downlink converter and sends the SenML payload to KPN Things.', + }, +]} /> + +### Verify Downlink Delivery + +**Check integration events** + +Go to **Integrations center ⇾ Integrations**, open the KPN Things integration, and click the **Events** tab. A `Downlink` event confirms that ThingsBoard forwarded the message to KPN Things. + +Events tab shows a Downlink event alongside the ATTRIBUTES_UPDATED trigger — both with OK status, confirming the downlink was dispatched.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-21-pe.png', + alt: 'Integration event message detail showing the ATTRIBUTES_UPDATED message payload with temperature value', + caption: 'Click the event row to inspect the message detail — the temperature attribute update that triggered the downlink is visible in the payload.', + }, ]} /> -## Validation +**Check downlink converter events** -### Send an uplink message +Go to **Integrations center ⇾ Data converters**, open **KPN Things Downlink Converter**, and click the **Events** tab. Click an event row to inspect: -Use the KPN Things Device Simulator app on your phone to send a message to ThingsBoard. Tap **Send data now** in the app. +- **In** — the Rule Engine message received by the converter: `msg` contains the attribute payload and `metadata.deviceName` carries the device URN injected by the originator fields node. +- **Out** — the encoded SenML output sent to KPN Things: a JSON array with the device URN as base name and the temperature value. +- **Metadata** — integration and user context injected alongside the message. - +KPN Things Downlink Converter and click the Events tab — a Downlink event confirms the converter was triggered.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-23-pe.png', + alt: 'Downlink converter In panel showing the Rule Engine input message with temperature value and ATTRIBUTES_UPDATED message type', + caption: 'The In panel shows the input message: msg.temperature contains the attribute value and metadata.deviceName carries the device URN.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-24-pe.png', + alt: 'Downlink converter Out panel showing the encoded SenML JSON array with device URN and temperature value', + caption: 'The Out panel shows the SenML payload ready to be sent to KPN Things: a JSON array with the device URN as base name and the temperature measurement.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-25-pe.png', + alt: 'Downlink converter Metadata panel showing integration name, username, and device URN context', + caption: 'The Metadata panel shows the integration context — integration name, user, and the device URN injected by the Originator fields node.', + }, +]} /> + +**Check delivery on KPN Things** + +Open the KPN Things portal, navigate to **Things Manager ⇾ Devices**, and open your device. Click the **Send instruction** tab and scroll down to the **Status Downlink** section — the Temperature message with status **EXECUTING** confirms the downlink reached the device. + +Things Manager ⇾ Devices and click the Send instruction tab.', + }, + { + src: '/src/assets/images/user-guide/integrations/kpn/kpn-things-downlink-27-pe.png', + alt: 'KPN Things portal Status Downlink section showing Temperature: 25 with EXECUTING status and a timestamp', + caption: 'The Status Downlink section shows the Temperature: 25 message with EXECUTING status — the downlink reached KPN Things and was forwarded to the device.', + }, +]} /> + +## Troubleshooting + +This section covers the most common problems encountered when setting up and running the KPN Things integration. Each entry describes the symptom, the most likely cause, and the steps to resolve it. + +

No Uplinks in ThingsBoard

+ +| Symptom | Cause | Fix | +|---------|-------|-----| +| No events on the integration **Events** tab | KPN Things destination is not linked to the flow | In the KPN Things portal, open **Flows ⇾ My first flow** and confirm your ThingsBoard destination appears under **Destinations**. If it is missing, click **Link Destination** and link it. | +| No events on the integration **Events** tab | Device is not linked to the flow | Open **Flows ⇾ My first flow ⇾ Devices** and confirm your device appears. If it is missing, click **Link Device**. | +| No events on the integration **Events** tab | HTTP endpoint URL in the KPN Things destination is incorrect | Open the KPN Things destination configuration and confirm the endpoint URL matches the **HTTP endpoint URL** shown in the ThingsBoard integration settings. Copy-paste the value to avoid typos. | +| No events on the integration **Events** tab | Integration is disabled | Open the KPN Things integration in ThingsBoard, click the **Edit** icon, and confirm **Enable integration** is on. | -After sending, ThingsBoard automatically creates a new device. Go to **Entities ⇾ Devices** — the new KPN device appears with its latest telemetry (e.g. `accelerationX`, `battery`) received from the simulator. +

Uplink Received but Device Not Created

- +| Symptom | Cause | Fix | +|---------|-------|-----| +| Event appears on the integration **Events** tab but no device in **Entities ⇾ Devices** | **Allow create devices or assets** is disabled | Open the integration, click the **Edit** icon, and enable **Allow create devices or assets** in the **Basic settings** step. | +| Integration event shows an error | Uplink converter error | Go to **Integrations center ⇾ Data converters**, open **KPN Things Uplink Converter**, and click the **Events** tab. Inspect the **Error** column of a recent event and fix the converter script accordingly. | -### Check integration events +

Device Created but No Telemetry

-Go to **Integrations center ⇾ Integrations**, select the KPN Things integration, and open the **Events** tab to see the messages consumed by the integration. +| Symptom | Cause | Fix | +|---------|-------|-----| +| Device exists, **Latest Telemetry** tab is empty | **Decoded ThingsML and raw SenML data** decoder is not enabled in KPN Things | In the KPN Things portal, open your device, go to the **Flows** tab, and enable the **Decoded ThingsML and raw SenML data** toggle in the **Decoders** section. Without this, KPN Things forwards raw SenML fields instead of the structured JSON that ThingsBoard expects. | +| Device exists, telemetry keys look like `n`, `u`, or `bn` | **Decoded ThingsML and raw SenML data** decoder is not enabled in KPN Things | Same as above. When the decoder is off, raw SenML field names appear as telemetry keys instead of human-readable names such as `temperature` or `battery`. | +| Device exists, events appear, but no telemetry is stored | Uplink converter returns an unexpected structure | Open **KPN Things Uplink Converter ⇾ Events** and inspect the **Out** panel of a recent event. Confirm the output contains a `telemetry` array with the expected keys. If the converter was customized, compare it against the default pass-through script. | - +

Downlink Not Delivered

+ +| Symptom | Cause | Fix | +|---------|-------|-----| +| Downlink converter **Events** tab is empty after updating a shared attribute | Rule Chain is not configured | In the Root Rule Chain, confirm the **message type switch** node connects to the **Retrieve Device Name** (originator fields) node via the **Attributes Updated** relation, and that **Retrieve Device Name** connects to the **Downlink to KPN Things** (integration downlink) node via **Success**. | +| Converter is triggered but the downlink does not reach KPN Things | **Allow downlink** is off | Open the integration, click the **Edit** icon, and enable **Allow downlink**. | +| Converter is triggered but the downlink does not reach KPN Things | API credentials are wrong or missing the required roles | Open the integration in edit mode, expand **Allow downlink**, and verify the **API id** and **API Key** match the credentials from the KPN Zakelijk portal. Confirm the API key has the **Things Creator - Admin** and **Things Manager - Admin** roles assigned under **Services and roles**. | +| Downlink converter **Events** tab shows an error | Converter script error | Open **KPN Things Downlink Converter ⇾ Events**, click a failed event, and fix the script based on the error message shown. | + +

Security Header Validation Failures

+ +| Symptom | Cause | Fix | +|---------|-------|-----| +| Integration events show authorization errors or uplinks stop after enabling the security filter | Header name or value does not match | Open the integration in edit mode, expand **Enable security (Headers filter)**, and confirm the header name is exactly `X-Things-Secret`. The value must match the token from the KPN Things destination configuration character-for-character — copy-paste it rather than typing manually. | +| Security errors appear after reconfiguring the KPN Things destination | Destination token was regenerated | Clicking **Generate** again in the KPN Things destination issues a new token. Copy the new token and update the **Value** field in the **Enable security (Headers filter)** section of the ThingsBoard integration. | + +

How to Read Debug Events

+ + + 1. Go to **Integrations center ⇾ Integrations**, open the **KPN Things integration**, and click the **Events** tab. + 2. Click an event row to inspect: + + +- **In** — the raw HTTP request body received from KPN Things before processing. +- **Out** — what the converter returned: device name, attributes, and telemetry values passed to ThingsBoard. +- **Error** — error text and stack trace, if processing failed. + +Enable **Debug** mode on both the integration and the uplink converter to capture all incoming messages and conversion results. Starting from ThingsBoard 3.9, full debug events are stored only during the first hour — afterward, only error events are retained. Disable debug mode once the issue is identified. + + -## See also +## See Also -- Integration Overview -- Uplink Converters -- Downlink Converters -- Rule Engine +- Integration Overview +- Uplink Converters +- Downlink Converters +- Rule Engine +- ThingsBoard Expression Language (TBEL)