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!












Disable Internet Explorer Enhanced Security in Citrix Windows8and2012VDIBaseline.vbs script is missing the curly bracket }

Missing curly bracket } in the following section:

‘ Disable Internet Explorer Enhanced Security Enhanced
oShell.RegWrite “HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073\IsInstalled”, 0, “REG_DWORD”
oShell.RegWrite “HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073\IsInstalled”, 0, “REG_DWORD”

I found this typo because i was working on an issue with Vimeo video playback that gives a black screen. IsInstalled needs to be 0 or else Vimeo won’t play videos.

After setting the registry key run the following commands in CMD.

Rundll32 iesetup.dll, IEHardenLMSettings

Rundll32 iesetup.dll, IEHardenUser

Rundll32 iesetup.dll, IEHardenAdmin

IE ESC is now disabled applied for admins and users.

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…

Deleting the registry value ConnectionCenter (Citrix Receiver) to prevent autostart results in a re-install of icawebwrapper.msi

In a managed environment, like SBC, you typically don’t want that the Citrix Receiver is started for every user. To prevent this behavior you delete the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\ConnectionCenter value in registry.

My results with Citrix Receiver 4.2 are a broken Citrix Receiver installation which starts a reinstall of the icawebwrapper msi. The Citrix Receiver is checking the existence of the value ConnectionCenter in te registry. To prevent this from happening you shouldn’t delete the ConnectionCenter value but make it empty!

Story of PVS write cache and performance

Diskperformance PVS Write cache with different scenarios and write cache locations.

I visited the event Dutch Citrix User Group @ Dell Nederland Amsterdam 6-3-2015. It was my first DuCUG event(visitor). Thumbs up for the organization, the positive atmosphere and the superb guest speakers. Jim Moyle was one of the guest speakers at DuCuG. He was talking about diskperformance and PVS and inspired me to test PVS writecache diskperformance.

When you read this article I hope you get a better understanding about write cache locations, the different choices and what it does with diskperformance.

I used Jim Moyle’s article to test the diskperformance of a PVS XA image : The test are with IOmeter

I created a template with tool IOmeter. It represents a VDI workload(4k blocks, 20% seq 80% random, 80% write 20% read). The template is found here(attachment1). If you want to test yourself copy the text, put it in notepad and name it <name>.icf. Or do it yourself and learn IOmeter 🙂


The test environment

Hardware: HP DL360P G8

2 X Xeon E-52690v2, 192GB RAM, 2 x 200GB 6G SATA ME SDD, 2 x 10GB nic


Hypervisor: ESXi/VMware vSphere 5.5. VM: Server 2012 R2, PVS server 7.6, 2 vCPU and 32GB memory.

Target device(Testmachine for IOmeter)

Hypervisor: XenServer 6.2, 6 XA VMs per hypervisor. VM: Golden image with all software installed for a production environment at my current customer.6 vcpu, 30GB memory. 30GB D drive(SSD).SBC, Server 2012 R2, PVS target device 7.6, XA 7.6, RES WM.

The environment is as good as Idle(no load). It’s not in production yet.


 The test results

In the graphs i look at the Total IO per Second and the disk latencies. This two together are a good measurement for disk performance.

Test: 1GB workload against VM with write cache location: ram(4 GB of RAM) with overflow to disk. The 1GB workload will fit in the 4GB RAM. Result is impressive IOPS and a very low latency! How lower latencies are the better it is.



Test: 10GB workload against VM with write cache location: ram(4 GB of RAM) with overflow to disk. The 10GB workload wont fit in the 4GB RAM. So approximately 3.6 GB is in RAM and the other 6,4GB are on disk. Disk performance of the write cache halve if you compare it with 1GB workload. Still pretty impressive.



Test: 10GB workload direct to SSD disk. This is to test disk performance without the penalty of PVS. < 1 ms latency and 28412 IOPS are good.



Test: 10GB workload against VM with write cache location: cache on device harddrive. IOPS and disk latencies are good, but compared against 10GB workload direct to ssd disk there is a 50% performance penalty.

result40 result41

Test: 10GB workload against VM with write cache location: ram(64MB of RAM) with overflow to disk. The 10GB workload wont fit in the 64MB of ram. Ram in this scenario is only used as buffer to disk. Poor performance, only 4923 IOPS and latencies > 3 ms! Disk performance is horrible compared against the write cache in RAM or local device harddrive. Imagine that you have to share the 4923 iops with 6 other XenApp servers on one XenServer host.

result51 result50



You shouldn’t use memory as a buffer(64MB) for the SSD disk with the write cache option RAM with overflow to disk. With write cache option cache on device harddrive you get 293% better IOPS and Latency. If you could keep all the write cache in memory, and you only use the disk for overflow(as a last resort instead of BSoD with pure write cache to memory) the total IOPS is 1293% better and latency is 1250% better!!!

My write cache location choices:

  1. Ram with overflow to disk(No or less overflow).
  2. Cache and device harddrive.

So invest in memory for impressive IOPS or use cache to harddrive with a local SSD! Your end users are happy and get < 30 seconds logon times and superb application response(you will only get this result if there are no other bottlenecks and is optimized by a Citrix consultant 😉 ). So no more visits to the coffee corner…

Still invest in SSDs and not in spinning drives so everything runs smooth. The pagefile, logs, AV Pattern, crash dumps and other persistant stuff needs IOPS and low latency too 🙂 .

Many thanks to Elger van der Avoird for reviewing this article




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…

How to get rid of Personalize and screen resolution in the context menu when you right click the desktop

The powershell script in this article will delete personalize and screen resolution on the context menu(right mouseclick on desktop). this is usefull for VDI or RDS environments. It is only working with software deployment or task sequence deployment in SCCM, because it is designed to run with system account privileges.

Download the word file copy the text to notepad and save the file as <yourname>.ps1