<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.2">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2026-03-19T20:11:45+00:00</updated><id>/feed.xml</id><title type="html">Will Tatam</title><subtitle>Blog of Will Tatam</subtitle><entry><title type="html">Decentralised Ticketing, scalability and architectural decisions</title><link href="/ai/2026/03/19/Inventory.html" rel="alternate" type="text/html" title="Decentralised Ticketing, scalability and architectural decisions" /><published>2026-03-19T11:12:16+00:00</published><updated>2026-03-19T11:12:16+00:00</updated><id>/ai/2026/03/19/Inventory</id><content type="html" xml:base="/ai/2026/03/19/Inventory.html"><![CDATA[<p>Mother’s day weekend 2026 marks 20 years since I asked the question “Why should collaboration require centralised control of ticket inventory and surrender of control of your inventory to a ticket agent. Could we not flip it so the Fringe box office aggregated all the inventory available from all the venues that participate in the Fringe?”</p>

<p>This one idea then became the key feature of the VIA Ticketing System from Red61, shaping both the company and the business relationships their clients could form.</p>

<p>This enabled the inventory owners to both regain full control of their inventory, eliminate the single point of failure that was outside of your company’s control, while simultaneously allowing an unlimited number of other organisations to sell tickets on your behalf, using either allocations or full real-time access to your availability</p>

<p>Initally this was just the larger venues being able to cross-sell and run their own ticket agency, then also adopted by the Edinburgh Festival Fringe Society (EFFS) in 2009. This has allowed the Fringe to massively increase both the number of tickets sold by their box office agency as well as the total number of tickets sales grow. Red61’s solution has also been able to scale far futher than the old system to allow many more venue operators to be able to have this control of their ticketing and sales opertunities, so there are now more than tripple the numbers of connected systems. This ties in closely with the EFFS mission to facilitate any one to be part of the festival, no matter how big or small your venue.</p>

<p>This came many years ahead of attempts to allow the London West End theatres to move away from fixed allocations of seats and is still more advanced than the current solutions used.</p>

<p>This system has now sold tens of millions tickets! When your browse sites like edfringe.com, you experience a unified set of shows to purchase from, for the whole festival, with most tickets for sale right up to the start if the show - great for those last minute inpluse buys after being given a flier for a show starting in 15 mins!</p>

<p>By designing the system with this concept of realtime aggregation, rather than replication, this required leaning into performance and resilience as key aspects of the system. This gives benefit not only to when using this distributed approach, but also as part of a more traditional box office setup.</p>

<p>Cache, cache and cache some more! The fastest code is the code that doesn’t run at all. If you can fetch data from a cache, this both makes the system more responsive, but critically WAY more scalable. One of the questions I got asked by box office staff was “why is the ticketing system faster when we are really busy, than in the morning when there isn’t much happening” - this was due to the cache warming up as the day progressed. Fundamentally computers can’t really multitask, just switch between tasks quickly, the more they have to switch, the worse they perform. For example, trying to read two different files from different parts of the hard disk, the read head can’t be in two places at the same time, so you lose a lot of time moving back and forth between the two conflicting positions. Other operations suffer too, like the very small caches inside the CPU, so it’s only only physical items that lead to the concurrency performance hit.</p>

<p>So the magic of correctly implemented caching is that instead of your load growing with the number of requests and response times rising exponentially with concurrency, you load will only rise until you are doing the number of computations to calculate each value of the time period of the cache period. For example, if you have a cache of 15mins then you will never run this code more that 4 times in a hour, whereas a busy website might be requesting that data many times per minute or even second. No matter how well you optimise that code, if you are running for each request, the more requests, the more concurrency, so the slower you run, so the more likely you are running concurrently … etc</p>

<p>For resiliency, it’s critical that the customer arriving at the theatre can always get their ticket or scan their e-ticket to see the show, so even when the systems can’t talk to each other, they need to gracefully degrade while still meeting operational needs. This does require some level of data duplication, but only immutable data, so no worries about replication.</p>

<p>It’s all too easy to gloss over architectural decisions in software design, I especially worry that the rise of AI coding will means less attention is given to it - the AI (currently) always says yes and will try and work around the limitations, rather than suggesting that this is going to be a nightmare bloat of code that would take a human weeks or months to write and perhaps you need to go back to the drawing board and come up with a more elegant solution.</p>]]></content><author><name></name></author><category term="AI" /><summary type="html"><![CDATA[Mother’s day weekend 2026 marks 20 years since I asked the question “Why should collaboration require centralised control of ticket inventory and surrender of control of your inventory to a ticket agent. Could we not flip it so the Fringe box office aggregated all the inventory available from all the venues that participate in the Fringe?”]]></summary></entry><entry><title type="html">Etsy Shop Launch</title><link href="/etsy/2024/03/04/Etsy-Launch.html" rel="alternate" type="text/html" title="Etsy Shop Launch" /><published>2024-03-04T11:12:16+00:00</published><updated>2024-03-04T11:12:16+00:00</updated><id>/etsy/2024/03/04/Etsy-Launch</id><content type="html" xml:base="/etsy/2024/03/04/Etsy-Launch.html"><![CDATA[<p>I’ve launched my <a href="https://MilliWattUK.etsy.com">Etsy Shop</a></p>]]></content><author><name></name></author><category term="Etsy" /><summary type="html"><![CDATA[I’ve launched my Etsy Shop]]></summary></entry><entry><title type="html">Linux Usability</title><link href="/linux,opensource/2023/12/05/Linux-Everywhere.html" rel="alternate" type="text/html" title="Linux Usability" /><published>2023-12-05T11:12:16+00:00</published><updated>2023-12-05T11:12:16+00:00</updated><id>/linux,opensource/2023/12/05/Linux-Everywhere</id><content type="html" xml:base="/linux,opensource/2023/12/05/Linux-Everywhere.html"><![CDATA[<p>For many years we measured how usable Linux was based on its use as a desktop PC, but what as computers swap from desktop PC to smartphones, tablets etc.</p>

<p>I would argue that Linux has become the ultimate user-friendly operating system, in the sense that most users are unaware of its use. Most home wifi routers are running Linux and so is every Android mobile phone or tablet</p>

<p>Yes you can use Linux on the desktop, but most of what you are actually using it’s Linux, it’s a whole suite of Open Source sofware. Your desktop enviomnent might be Gnome or KDE for example. Similarly, Android uses Linux to deal with all the interactions with the hardware, but they layer over the top of that an interface designed to meet the needs of a phone.</p>]]></content><author><name></name></author><category term="Linux,Opensource" /><summary type="html"><![CDATA[For many years we measured how usable Linux was based on its use as a desktop PC, but what as computers swap from desktop PC to smartphones, tablets etc.]]></summary></entry><entry><title type="html">Source code is not a substitute for documentation</title><link href="/esp-now/2023/10/31/espnow.html" rel="alternate" type="text/html" title="Source code is not a substitute for documentation" /><published>2023-10-31T11:12:16+00:00</published><updated>2023-10-31T11:12:16+00:00</updated><id>/esp-now/2023/10/31/espnow</id><content type="html" xml:base="/esp-now/2023/10/31/espnow.html"><![CDATA[<p>The double edged sword of open source development.</p>

<p>It is wonderful that with open source software you can go and look and see exactly how something is written, but all too often developers then use this as an excuse for not writing documentation.</p>

<p>When help is requested, too often the response is just to “look at the sourcecode”.</p>

<p>I appreciate that when coding for fun or at least where you don’t have the pressure of someone demanding documentation of the interface between your closed-source software and your clients’ own development that it’s easy to skip this work, that your code is such high quality of course others will find out what they need just by reading; This is true to some extent, but definitely relied on too heavily.</p>

<p>Take my recent experience with ESPHome, part of the Home Assistant ecosystem. On the one hand it’s an awesome project, allowing non technical users to build and manage custom firmware for their IoT devices from their browser with just a few snippets of YAML. Only a few years ago trying to build C++ code for embedded devices would have been a complex setup including cross platform compilers etc.</p>

<p>There are a selection of components available in the main distribution and systems in place to either pull in components from additional repositories or even build a custom component by writing small snippets of C code within the YAML file itself.</p>

<p>Technically awesome, but documention massively lacking. For example, under the information about certain component types it gives you an example of how to build your own class to implement a sensor. What the example fails to show however is what includes you need to actually make this code compile. Is that a big issue to solve, no. Would an experienced developer know that you need to have an #include, of course. What is not documented at all is how esphome.h is dynamical generated.</p>

<p>This leads to some very odd behaviours, for example if you start writing your own external component, you are implementing a text_sensor. If you just add the repository, but don’t actually reference text_sensor in your config to read the value back, your code will fail to compile. You can correct for this by adding some extra code to a python script, but that isn’t referenced in that part of the docs.</p>

<p>A much better example is this article about how to use ESP-NOW https://randomnerdtutorials.com/esp-now-esp32-arduino-ide/</p>

<p>It gives clear information about what the capabilities and use cases are, the code examples are complete and it explains each section clearly</p>]]></content><author><name></name></author><category term="ESP-NOW" /><summary type="html"><![CDATA[The double edged sword of open source development.]]></summary></entry><entry><title type="html">Patience and the power of Open Source</title><link href="/balboagl/2023/05/19/Control.html" rel="alternate" type="text/html" title="Patience and the power of Open Source" /><published>2023-05-19T11:12:16+00:00</published><updated>2023-05-19T11:12:16+00:00</updated><id>/balboagl/2023/05/19/Control</id><content type="html" xml:base="/balboagl/2023/05/19/Control.html"><![CDATA[<p>So about 5 years ago I started considering if my skills with the Arduino platform were strong enough to consider having my hottub into an IoT device.</p>

<p>Now I’ve tinkered with electronics much of my life, a friend once joked “It’s not a party till Will’s got his soldering iron out” in reference to my tendency to have brought some LED creation to many a house party. That said, I’m much more skilled in software than electronics, so taking on the total blackbox challenge of how the hot tub control unit and the topside panel communicate felt beyond me.</p>

<p>Some years on and now in a different house with a different hottub, the idea surfaces again, though this time with a greater motivation than simply a having the tub ready for my return home after extended trip away; Now the motivation is that my energy supplier have a tariff where the rate changes every 30 minutes and I want to only heat the tub when the price is right.</p>

<p>I search and find that newer hot tubs from the same manufacturer do now come with WiFi control via mobile app and this has been reverse engineered. Not only this, but they have also then discovered the top panels communicate with RS485 and that the very expensive WiFi adapter is actually just a glorified RS485 to TCP/IP bridge, so by reverse engineering the app they also understand the internal communication bus.</p>

<p>Excited my this discovery I start testing the different connector on my own controller from the previous generation. The good news is that I discover this also uses RS485, the bad news is that the protocol is totally different.</p>

<p>Now had I been alone, I might have given up, but thanks to helpful assistance of other users with different controllers I got enough assistance to start the reverse engineering process. As this was a very new area for me to be working in I tried to be as open as possible with my progress in the hope that others might be able to offer advice and support, which some did.</p>

<p>I then gained my first user who had the same control unit as me so he started testing my code and making a few discoveries of his own. Quite some time later a new developer discovered my research. They clearly were more familiar with the electronics side, but armed with my research tha they were able to develop their own code to not only read the status of the tub but also fully replicate the control provided my the topside panel with a combination of code running on an ESP32 and an iOS app.</p>

<p>While they have not chosen to Open Source their own work fully, they were able to share sufficient code and information to allow me to also send control commands.</p>

<p>I have now achieved my aim of not only checking on the state of the hot tub from the comfort of the sofa, but now it moves between eco mode and full running based on the energy price right now. While all my electricity is 100% green, the tub only heats when the price is lowest, which is also when the total UK energy mix is also greenest, so I’m not triggering gas peaker plant usage by those not on s green tariff either.</p>

<p>I haven’t automated this bit yet, but sometimes the price actually goes negative so it would make sense to also raise the target temperature to the maximum 40C so that I’m paid to heat during that overnight period and won’t then need any suplimentary heating during the day - it can drift back down to 38.5C</p>

<p>None of this would have been possible without both the freely available tools like the excellent Home Assistant, but also the fundamental mindset of the Open Source community and it’s desire to share knowledge and the work they produce for the benefit of all.</p>]]></content><author><name></name></author><category term="BalboaGL" /><summary type="html"><![CDATA[So about 5 years ago I started considering if my skills with the Arduino platform were strong enough to consider having my hottub into an IoT device.]]></summary></entry><entry><title type="html">Use the source Luke</title><link href="/deevstock,/qlc,/oss/2023/04/28/QLC-PR.html" rel="alternate" type="text/html" title="Use the source Luke" /><published>2023-04-28T11:12:16+00:00</published><updated>2023-04-28T11:12:16+00:00</updated><id>/deevstock,/qlc,/oss/2023/04/28/QLC-PR</id><content type="html" xml:base="/deevstock,/qlc,/oss/2023/04/28/QLC-PR.html"><![CDATA[<p>I’m a long-term fan of Open-source Software, while it’s not suitable for all software dev as there is sometimes a need for closed commercial software, it really can be useful in so many ways</p>

<p>I have been using a project called <a href="https://www.qlcplus.org/">QLC+</a> for the last 5+ years as my lighting desk for Deevstock and have found it ideal for my needs, both in terms of feature set, but also given Deevstock is a not for profit event, paying for a lighting desk hire with the multiple universe support, control from my mobile etc would take a large part of the entire lighting budget. What we have been able to do however is make a financial donation to the author.</p>

<p>While getting ready for this year’s festival I came across a detail as to how the functions wizard feature works that were causing issues for me as I was trying to do simultaneous development of both my own lighting fixtures and also building the Virtual Console to control them. As QLC+ is not only free but open source, I was able to crack open the source, find the bit that I wished to change, create my only build right there with the new behaviour and create a pull request back to QLC+ to give back to the project</p>]]></content><author><name></name></author><category term="Deevstock," /><category term="QLC," /><category term="OSS" /><summary type="html"><![CDATA[I’m a long-term fan of Open-source Software, while it’s not suitable for all software dev as there is sometimes a need for closed commercial software, it really can be useful in so many ways]]></summary></entry><entry><title type="html">Realtime audio data over DMX</title><link href="/deevstock/milliwatt/2023/04/07/FFT-DMX.html" rel="alternate" type="text/html" title="Realtime audio data over DMX" /><published>2023-04-07T11:12:16+00:00</published><updated>2023-04-07T11:12:16+00:00</updated><id>/deevstock/milliwatt/2023/04/07/FFT-DMX</id><content type="html" xml:base="/deevstock/milliwatt/2023/04/07/FFT-DMX.html"><![CDATA[<p>For the normal Deevstock operation I run Line-In to my fixtures to ensure highest quality and minimise latency.</p>

<p>However, now I’ve written the <a href="https://GitHub.com/netmindz/WLED-sync">WLED-Sync</a>, a library that allows me to listen for WLED Audio Sync data, which contains 8bit FFT data, I can merge e1.31 and the WLED data together by assigning FFT bands to DMX addresses I wasn’t using to create a single wired DMX stream that I pass over to my Teensy</p>]]></content><author><name></name></author><category term="Deevstock" /><category term="MilliWatt" /><summary type="html"><![CDATA[For the normal Deevstock operation I run Line-In to my fixtures to ensure highest quality and minimise latency.]]></summary></entry><entry><title type="html">Deevstock 2023 - Prep Begins</title><link href="/deevstock,/milliwatt/2023/04/04/DeevstockPrep.html" rel="alternate" type="text/html" title="Deevstock 2023 - Prep Begins" /><published>2023-04-04T11:12:16+00:00</published><updated>2023-04-04T11:12:16+00:00</updated><id>/deevstock,/milliwatt/2023/04/04/DeevstockPrep</id><content type="html" xml:base="/deevstock,/milliwatt/2023/04/04/DeevstockPrep.html"><![CDATA[<p>Normally I try and space my prep work for the lighting sytems/installations I design and build for Deevstock over the course of the year, but this time I’m doing it all in April as I knew I’d have the month free as I’m changing jobs.</p>

<p>On the one hand it’s lovey to have this dedicated time, rather than trying to do after a long day in work or over the weekend; however I’m going to need to keep in mind that I only have a few weeks, so need to be very focused, espeically when it comes to priortising tasks that might require me to order parts for</p>]]></content><author><name></name></author><category term="Deevstock," /><category term="MilliWatt" /><summary type="html"><![CDATA[Normally I try and space my prep work for the lighting sytems/installations I design and build for Deevstock over the course of the year, but this time I’m doing it all in April as I knew I’d have the month free as I’m changing jobs.]]></summary></entry><entry><title type="html">WLED - Recent code contributions</title><link href="/wled/2023/03/28/WLED.html" rel="alternate" type="text/html" title="WLED - Recent code contributions" /><published>2023-03-28T11:12:16+00:00</published><updated>2023-03-28T11:12:16+00:00</updated><id>/wled/2023/03/28/WLED</id><content type="html" xml:base="/wled/2023/03/28/WLED.html"><![CDATA[<p>I have been contributing recently with the WLED project, mainly on audio responsive features.</p>

<h2 id="audio-responsive-palettes"><a href="https://mm.kno.wled.ge/moonmodules/release-notes-v0.14.0-b1/#audioreactive-palettes">Audio Responsive Palettes</a></h2>
<p>While WLED had a usermod that provides a selection of effects where the pattern itself is based on the audio input, I have created dynmaic colour palettes that are based on the audio data. This has the effect of making almost every pre-exitings non-audio effect now become audio responsive; you can also combine the existing patterns with the new audio palettes for even greater effect.</p>

<h2 id="es8338-support"><a href="https://github.com/MoonModules/WLED/pull/5">ES8338 Support</a></h2>
<p>This is the chip used on the ESP 32 AudioDev board, so bringing support for this chip and it’s use on this board will allow users just getting started with WLED to have a widely availiable, single board solution ready to go, rather than needing to find the right setup for their specific mic and microcontroller setup or builing a line-in circuit from scratch.</p>

<h2 id="dmx-input"><a href="https://github.com/MoonModules/WLED/pull/28">DMX Input</a></h2>
<p>WLED has great support for Art-Net and e1.31/sACN, the use of these time senative protocols over wifi can often cause issue. You can connect ethernet adapaters to the ESP32 microcontrolller, but for situations where you are using WLED in conjuction with traditional DMX lighting fixures, I have added support to control WLED from traditional wired DMX</p>]]></content><author><name></name></author><category term="WLED" /><summary type="html"><![CDATA[I have been contributing recently with the WLED project, mainly on audio responsive features.]]></summary></entry><entry><title type="html">WLED-Sync</title><link href="/wled/2022/10/22/WLED-sync.html" rel="alternate" type="text/html" title="WLED-Sync" /><published>2022-10-22T11:12:16+00:00</published><updated>2022-10-22T11:12:16+00:00</updated><id>/wled/2022/10/22/WLED-sync</id><content type="html" xml:base="/wled/2022/10/22/WLED-sync.html"><![CDATA[<p>I have been working on a number of FastLED based lighting projects over the last 7 years and many of them have involved audio responsivity. This has been using both the wonderfully simple to use MSGEQ7 and also my on FFT in code on the Teensy platform.</p>

<p>As I’m getting more involved with <a href="https://mm.kno.wled.ge/">WLED</a>, I wanted to migrate my existing projects from my own propetrory protocol over to one that would be compatible with WLED. I therefore created <a href="https://github.com/netmindz/WLED-sync">WLED-Sync</a> to allow anyone to be able to both send and receive WLED compatible audio sync data in their own projects</p>]]></content><author><name></name></author><category term="WLED" /><summary type="html"><![CDATA[I have been working on a number of FastLED based lighting projects over the last 7 years and many of them have involved audio responsivity. This has been using both the wonderfully simple to use MSGEQ7 and also my on FFT in code on the Teensy platform.]]></summary></entry></feed>