How to: Internet of Things from A-Z..

Huh, come again? Sending data from microcontrollers to an ingestion platform, storing the data in the cloud and presenting it on a website?

Yip; but it is not that difficult… In fact, transmitting data by radio technology is old, microcontrollers are old, the cloud is…..Something different then we are used to 😉

What do we want to do? Measuring tempature, humidity and / or other things, sending the data trough our Internet of things device, store the data and make some graphs of it (or give an alert, trigger some other actions, etc etc). Of course this goes automatically keeping the dashboard up to date each time new data comes in.

So, to visualize things;


Step 1. Out IoT device, in this case an Arduino Autonomo with a lithium battery, solar panel and a few sensors send data through a lora module (microchip RN2483, 868 MHz)* Let’s go through the simplified “code” (Written in C).



So, at the end of the loop we get de sensor data in an array of bytes which we send trough as one single string of hexadecimal values. For example FF16FF23. We know that the second byte (16 hex) is the value of our temperature sensor, the 4th byte is the humidity in hexadecimal.

* US friends; you have to the use RN2903 model on 915 MHz.

Step 2. The data is transmitted by LoRa (low power, long range). LoRa is a radio technology developed by Semtech and it enables communication between lora (end) devices and LoRa sites. Because of it’s long range (max.) 15 km and low power consumption (remember, it sends only bytes), it is very useful in areas where no connectivity / energy source is available: ideal for IoT.

Step 3. The data received by the LoRa Sites is transferred to the ‘operator’ in this case KPN. The data can be transferred directly to the customer (without seeing the ‘payload’) or ‘decrypted’. The result is a JSON template with information -> including our payload: FF16FF23.


The picture above shows the Octolu trigger where the data is ‘delivered’.

Step 4. We need to check if our payload is correct and readable before we do anything else; that is where Citrix Octoblu comes in place: Check 1 – Is there any data in our payload? 2 – Get the right value for each sensor (new variable) 3 – convert the hex values to decimal values. 4 Make a new JSON with the added sensor values. 5 Send it to Azure (rest api / http post).


Step 5. There are many how to’s to capture IoT data in Azure; what I used is an Event Hub with a Stream Analytics job. Tip; use the Reddog service bus executable to create the SAS signature.

The streaming job gets the data out of the Event hub and pushes it to my KPN Power BI environment… The last thing doesn’t need explanation.


That’s all, I know, there is much more to it… But I hope that this article gives you a little more insight. Maybe, if there is enough animo & I have some time left, I could blog some more about each step.

Hope you liked it & thanks for reading!












How to set default keyboard settings for a user in a Windows remote desktop session.

This problem had me going for a few hours.. Setting the right keyboard, language settings and Internet explorer 11 spell check for a user when he logs on.

Normal behavior is that the RDS ( Citrix ) session inherits the keyboard settings from the client, but what if we don’t (or can’t) control the endpoint device? Or users falling asleep on their keyboard and touching ALT + SHIFT : -).

This is what we wanted:

  1. Ignore the client keyboard settings at all time.
  2. Set the right keyboard layout and default language, characters etc etc.
  3. Set the correct language auto correct in Internet Explorer 11


This can’t be fixed after the user logon due to the fact that Windows only checks these settings during logon..

This is how we dit it:

  1. Set the key (REG_DWORD) IgnoreRemoteKeyboardLayout to 1 in the HKLM\System\CurrentControlSet\Control\Keyboard Layout\
  1. Create a mandatory profile (there are many how to’s on the web) and adjust the following keys after mounting the MANPROF:

HU\MANPROF\Control Panel\International

I replaced the whole key and subkeys by exporting it from a freshly adjusted user, watch carefully when importing it back again to the man Prof because of the location of the import!

Export : [HKEY_CURRENT_USER\Control Panel\International]



[HKEY_USERS\MANDATORY\Control Panel\International]



                [HKEY_CURRENT_USER\Control Panel\International\User Profile\nl-NL]

                [HKEY_USERS\MANDATORY\Control Panel\International\User Profile\en-US]


Also adjust the following keys and set a list of the keyboards you want to add, in my case it was dutch with a us int keyboard.

(For a list of the available keyboards check your RDS server: HKEY Local Machine\System\CurrentControlSet\Control\Keyboard Layouts\)

HU\MANPROF\Keyboard Layout\Preload\

Type: REG_SZ

Name: 1

Value: 00000413

HU\MANPROF\Keyboard Layout\Substitutes\

Type: REG_SZ

Name: 00000413

Value: 00020409

  1. This should be fixed by step 1 and 2. When my users log on they get the Dutch language with an US International keyboard and the spell check is set to Dutch in IE11.

And.. Maybe you want to delete the keys in HU\MANPROF\Keyboard Layout\Toggle\ for the users who fall alsleep : )

last note: GPP did not do the trick…

File type association kills pdf view functionality in Internet Explorer 11

Expected behavior when hovering over a pdf file in IE11 is that the PDF is shown without a click. But in our environment, when previewing a Adobe Acrobat file in IE 11 on server 2012 r2, we got the following screen.


If we want to Open, Save or Save As….

No, we don’t. We want a preview, as expected!

After investigating the issue, we found out that file type association kills the preview function. In our case, a Workspace Manager that manages the file type association  .PDF

The Workspace Manager replaces the file type assocation and manages which application and the order of applications associated. Disabling the application wasn’t enough, all the file type associations with .PDF had to be deleted before the preview function was back…