I've written weeknotes internally for some time. These notes rarely see the light of day but there's inevitably some nuggets of semi-interesting and/or tediously technical minutia that might be interesting to share. That leads us here - Weeknotes for the week of June 10-16th.

This week was focused on the wrap up of an interactive kiosk installation for an event in Singapore. The actual event only runs for a few days, so a focus has been on portability and minimising the required hardware on-site.


Shameless plug - We build these types of interactive installations and experimental events for customers worldwide, and we're really good at it. You should check it out : https://dnb-atlas.com/


Device Fleet Management in Vue with a simple heartbeat

The main application running on the kiosks is a VueJS web app, installed as a PWA on the individual tablets. This pairs up to web-views running on a media server, which outputs to a large LED wall.

In this case there are multiple tablets on site, and they will be hot swapped out during the event.

During the actual event - the only visible UI on the tablets is the kiosk application, so we needed an easy way to pro-actively debug and check the state of all the devices without having to physically check each one by one.

For that we built up a quick fleet management system within the app. Each instance of the web app has a built in heartbeat that's emitted via a web-socket to our management system, and exposes a few helper utility functions.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/686f8c90-6776-42a6-918b-2c487ab64574/Screenshot_2019-06-17_11.34.38.png

Instances send a heartbeat every 5 seconds with a payload that looked something like:

{
	msg: 'heartbeat',
	id: '{instance_id}',
	state: '{current_view}'
	meta: { ... }
}

Adding in the Battery API

The tablets running the kiosk application run over wifi, and aren't plugged in during the event. We're running 2 full sets of tablets, one on the show floor, while the other set is charged behind the scenes.