I created a system to show advertising content on in-branch digital displays.
With over 40 branches spread throughout Utah and Idaho, a credit union needed a way to manage and display advertisements on digital advertising displays from one location. While researching vendors who provide that service, the costs were going to be very high at around $500 per month per location. The credit union also had some unique needs such as advertising current mortgage rates (which change very frequently). They also wanted to feature employees who work at each location.
I was asked to create a system that would display advertisements on TVs in every branch.
Video and Static Image Support
The system can play both video and static images (single or in a slideshow).
The entire system can be managed from one central location.
Real-Time Rate Information
The system displays current rates for mortgages, money market accounts, certificates of deposit (also known as CDs), and more.
Content can be scheduled to display at one location, a group of locations, or all locations.
Content can be scheduled to display at certain times of day and days of the week. It can also be set to start and stop playing on a certain date and time.
Content can be weighted so it will display more or less often than other content scheduled to play at the same time.
Change Content by Location
Some content can change graphical elements based on the location it is playing at. For example, the content element that displays mortgage rates shows an image and name of the person at the location to speak to about a mortgage.
Current weather conditions and a short-term forecast specific to that exact location are displayed.
News headlines and a brief summary of the article are gathered from various news sources and are displayed on the screen. The news headlines are specific to the location. For example, locations in Southern Utah see headlines from Southern Utah news sources. Eastern Idaho locations see headlines from Eastern Idaho news sources.
Stock index for the Dow, NASDAQ, and S&P are shown on the screen.
The screen layouts are configurable in the management system. A screen's layout can be changed on demand without needing to restart the client device. It can also support any resolution that the client's video card will support.
If a client device stops working for any reason, the system will alert a prefined list of email addresses.
Once content is requested to be displayed on a screen, it is downloaded from the central server or a nearby caching server. Once it is downloaded to the client device, it stays cached for a pre-determined amount of time (usually several days) to save bandwidth.
Every time a client plays a certain piece of content, the client reports that data back to the main server so reports can be generated.
I was the only developer on this project. I worked with two Senior Vice Presidents to gather requirements for this project. I then created the entire system myself at all layers including database (SQL Server), back end (C#, WCF, Entity Framework), and front end (WPF). With one other person, I personally went to each branch location (I believe there were only around 20 branches initially) and mounted the TVs on the walls. I installed the computers driving the TVs and ran some of the cabling.
After gathering the requirements, I created a Git repository on the local Git server. Then I created a new Visual Studio solution and a SQL database. I created the database schema in SSMS and generated the Entity Framework database context. Then I created the service layer and implemented that in a WCF project (which was common at the time).
For the weather data, I created separate projects to abstract that system so it could be swapped out if it needed to be. This came in handy as we have changed it about 3 times since.
For the news headlines, I created a separate project that could load the list of news sources from a database. Then a console program was created to run on a set schedule that would make an RSS or Atom call to each news source and pull in only new news articles that were not pulled in previously. I also added a filter to remove any articles with certain keywords we don’t want to display to the customers. The news articles are stored in the central database so each endpoint system doesn’t need to make a call to the news website to get articles (and they are restricted from doing that anyway).
Current mortgage, certificate, and money market rates were already available via an API that I had created previously on the credit union’s website. So that was easy to implement into the system. The rates are only loaded on the central server and are cached so each endpoint system doesn’t need to make a call to the API.
Stock index data handled in a way that is similar to the news headlines. It is in its own separate project which can be (and has been) swapped out as providers change.
For ads to be displayed on the screen, I created some custom WPF user controls. One displays video content. One displays one or more images in a sequence. Others display mortgage rates, certificate rates, money market rates, etc.
I created another user control that manages which controls are to be displayed on the screen. When content is available from the central server, the control loads the appropriate user control type (video, static image, etc.), supplies it with the data it needs, and tells it to prepare to be displayed.
If there is a control that is currently displaying, it waits for that control to finish playing. Then the system hides that user control and displays the new user control signals it to start playing.
Each endpoint player system makes a call to the central server after each content control is playing to tell the server what it last played and ask what it should play next. Therefore, the central server can schedule content for every display on demand in real time.
The system has been successfully displaying advertisements to customers since 2012. The flexible architecture of the system has allowed it to be upgraded with many new features over the years. Since launch, it has displayed 660 unique content elements hundreds of thousands of times. It is currently installed in 40 locations.