Magic Poi Product Launch Timeline

We are really getting there this time. Let’s review what we have done so far with Magic Poi and then I will try to make some guesses about when the actual launch will happen!

What is done?

  • test board 1 (some issues)
  • test board 2 (some issues, better than #1)
  • battery monitor upgrade
  • LED strip upgrade
  • parts design and 3d modeling for outer shell
  • battery charger prototyping and testing
  • test board 3 design (ready for order)

Still todo:

  • order test board #3 (this week!)
  • 1-2 weeks until delivery
  • put everything together
  • put the charger together
  • test everything (spin actual poi!)
  • build 3 complete pairs of poi for the 3 founders (Tom, Brett and Dylan)
  • build the code out from “development” version to “full spec”
  • test code
  • finalise design
  • offer “Alpha” boards and full “Magic Poi Alpha” poi for sale to early adopters (target Circus Scientist followers, Patreon supporters get a discount!)
  • refine firmware and server code with feedback from early adopters
  • set up Indigogo campaign
  • marketing and advertising
  • mass production

ETA?

As you can see, we still have a lot to do! A lot hinges on this latest circuit – if it is sound then the rest will not take long. The code doesn’t even need to be finished for us to sell Magic Poi – the old SmartPoi firmware is stable, and works on the new hardware just fine. And you can update to full Magic Poi firmware at any time (OTA update is built in).

Dylan from EnterAction is a qualified plastics engineer, so I have complete confidence that end result is going to be aesthetically very pleasing to look at and use.

Keep following for more updates! A few more months to go?! Now is a good time to sign up on my Patreon – to support my AI coding and hosting costs as we ride the downhill to product launch. All paid supporters will get a hefty discount on the prototype poi when it comes out – and a direct line to give feedback on the features we build in as we grow Magic Poi.

Router Mode Unlocked

Router mode for SmartPoi is where your poi connects to the Router – as opposed to the default method of one poi (main) creating an Access Point and you connecting to that. It is a bit more complicated (you need to find the poi on the network now in order to control them) but has some benefits:

  • Faster Speed
  • More Reliable
  • Less Strain on Main poi
  • Now poi can connect to internet (for upcoming Smart-Magic Poi Bridge)

How to use it?

As part of building the new version of smart-poi-js-utilities (Combined_APP folder) I upgraded the poi mode switching and made a tutorial video.

Many thanks to my Patreon supporters for covering my AI coding and hosting costs – DeepSeek came out with a new model yesterday which made this app even easier to make! You can join them here: https://www.patreon.com/c/CircusScientist for free! Get the latest updates, and be in line to get a discount when the long awaited Magic Poi go on sale (not long now!).

AI Generated Images for POV Poi

I have been saying for some time now that I wanted to train an image generation model on a ton of POV Poi images to make one that I can use for Magic Poi image generation.

“I want an celtic knot image – blue with black background” should ideally generate something usable on the poi. Up until recently tools like Dalle, Stable Diffusion and Midjourney simply weren’t up to the task. The type of image that works on my poi (dark background, primary colours, pixel perfect, small size) just weren’t an option – most pics end up blurry and just look worse than making it yourself in Photoshop*. Don’t even get me started on how annoying the ChatGPT image generator is! “Image needs to have no white, only primary colours” (white image generated) “Zero White PIXELS!!!!” (Still blinds me with glaring white background)

I recently went looking again and actually found some! There is a service aptly named “thereisanaiforthat.com” with a ton of free services listed. I have linked the best ones below.

Some Example Images

Services:

https://free.theresanaiforthat.com/@kadi_228/pattern-generator-srcset

https://free.theresanaiforthat.com/@zurcher/decorative-patterns

More to view here:
https://free.theresanaiforthat.com/pattern-images/

I am not sure, you may need to sign in for these to actually work but all of the ones I linked are free!

I still have that trained image generator for poi pics on my list of things to do, but it seems I may have a better starting point to work from soon, if these projects are anything to go by. The field is advancing rapidly!

*I actually use Krita, open source image editing software with Pixel brush. It’s really good.

The Problem of Timelines

Problem

Definition: A clear, concise statement describing the issue to be addressed, including its scope, context, and constraints. It serves as the foundation for analysis, solution design, or decision-making.

So when I say “Problem” that’s what I mean: an issue to be addressed – the clearer the context the simpler it is to come up with a solution.

By the way, Magic Poi and SmartPoi (open source) have a Patreon Support channel . If you would like to keep track of progress – and optionally contribute (mostly to AI Coding Assistant and Server bills) please join up – you can join for free and get updates about the project, paid members get a discount when we start selling the actual project.

The Problem

TLDR: I am working on the best ways to create, save, fetch and display timed sequences of images for Magic Poi. It’s tricky but I am getting there!

Timelines and Sequences – in terms of Magic Poi:

Timeline: a sequence of images each with an attached time to be displayed. The times start at zero.

Sequence: just the sequence, timed at a regular interval.

So in terms of software, we have a User Interface running JavaScript, connected to a back end running on Python (Flask). The back end database is PostreSQL which actually contains all of the arrays of images and metadata (including ownership and relationships – eg Tom owns x.jpg and shared it with Dylan).

The Poi running C++ needs to connect to the Python server API using http requests (authenticated using JWT, so you don’t get someone else’s images!)

Currently how the flow works is:

  1. User creates timeline and saves – this adds the image ID’s in an array (each image has a number), like [1, 4, 67, 55] and the timeline times in an array (in milliseconds), like [0, 257, 1029, 40005].
  2. The back end saves the timeline image ID’s and times along with metadata (Timeline name, owner, shared with..)
  3. Now the hard part, poi fetch the timeline – after selecting “timeline” using buttons (I have created a nice menu system with 2 buttons – LED colours give indication of position in the menu, long press first button for menu, short press first button to select main menu position, short press second button to select sub-menu)

– this is where the hard part comes in. First of all, we need to know how many timelines the user has, so we need to fetch that in order to proceed. Then the sub-menu needs to have exactly that number of options to choose from. But what if we are not connected to WiFi? I have to have fallback options for every error, including Server errors (maybe the data center went down for maintenance, or I borked something in the Cloud..)

Eventually you get to the point of downloading the images (using the timeline image ID array) and then displaying after all the downloading is done in exact millisecond time, according to the timeline times array.

Also, I want the option to have the images display as a regular sequence (using another button menu option) rather than to exact timing – like the original SmartPoi did it. This is rather simpler to achieve thankfully but we still need to incorporate a new time variable which can be changed on the web interface or using buttons (or the offline on-board web interface, yes there is another one also)

Conclusion

So in case you are still following this – the timeline object is created in JavaScript, stored and served by Postgres DB and Python, and consumed by both JavaScript (web page loading) and C++ (Magic Poi download and display)

Status

Right now I have Magic Poi nested menu system which I am quite pleased with. We just finished testing on the new prototype board and everything works! In terms of software I can download and display one timeline in exact millisecond timing – or select a specific image from that timeline to display individually.

Todo

Still todo is the selection of which timeline – and also adding shared timelines to the list (the ones your friends shared with you using the easy to use right click web menu interface). And optional sequence mode, choose to display image each for 0.5 – 3600 seconds at a time before moving to the next.

Also I still need to add in the Flash storage space checks from SmartPoi (make sure we have enough space for the image files before downloading them!)

Maybe

I might even be able to squeeze in multiple timelines at once on the poi? This would require a way to check the Flash size restraints on the poi from the Server side, to enable calculations of size (some timelines might share images, so we don’t have to download multiple copies, sharing image files between timelines…) Right now I’m not worried about this though!

Also: Streaming! I already did this as a fun test but it requires the poi to be connected to WiFi the whole time. With two cores on S3 chip, one takes care of the downloading of images, the other displays. When an image completes downloading, it is immediately passed over to the other core with some cool memory swap code and displayed – while the next image starts downloading. This opens up many possibilities, and bypasses the restraints inherent in ESP32 Flash memory storage size (no I am not adding an SD card for downloads)

Conclusion

Wow that is a lot of words. Sometimes it is just good to outline the Problem in order to focus and get to the solution – which for me will be fast, efficient and reasonably priced Magic Poi, with versatile Timelines!

Rookie mistake – forgot to pin library versions!

In PlatformIO there is the platformio.ini – a really powerful tool to select versions of libraries from PlatformIO servers, and initialise settings for the whole project.
I recently had a problem where a friend was not able to compile my SmartPoi project – but it worked for me??

Long story short

I re-cloned the project myself (starting clean) and managed to reproduce the same problem my friend was having while compiling. After a lot of head scratching I realised – the libraries in my project were declared like so:

mathieucarbou/ESPAsyncWebServer @ ^3.1.5

However that just tells the compiler to fetch the LATEST version as long as it is above (^) 3.1.5 – and that particular library had a breaking change update. The reason I didn’t have a problem on my local version was because my compiler was just using the cached local version (not bothering to update every time, you can force this by doing “Full Clean” which I don’t tend to do)

Conclusion

Make sure to pin your versions, especially in code you want to share!

My new platformio.ini now has lib_deps that look like this:

ESP32Async/ESPAsyncWebServer @ 3.7.4

Go and get the latest ESP32 SmartPoi now

git clone https://github.com/tomjuggler/SmartPoi-Firmware

cd SmartPoi-Firmware

git checkout -b ElegantOTA_CombinedS3C3_PlatformIO origin/ElegantOTA_CombinedS3C3_PlatformIO  

SmartPoi Controls Android App updated

Android App now available for download!

I finally managed to get this working on *most* of my devices.

When it works, it’s great – upload from your phone/tablet, control with indication of connection, sliders for brighness and more! See previous blog post for details of how this all looks (it’s the same on Android, except for drag-and-drop uploading which is not possible)

DISCLAIMER: Android is a vast collection of different versions and capability devices. I used to do Android apps in the Play Store and gave up, because things break a lot. This app is just a web app inside a container and won’t do anything to your phone but it might not work – especially the uploading part.

Links: Android 12+ devices: https://circusscientist.com/SmartPoiControl_Apr_25.apk

Android 7-10 devices: https://circusscientist.com/SmartPoiControl_Apr_25_Older_Android.a
pk

Android 11 phone: Try both? Neither version works on my Android 11 phone. Actually not sure about Android 8/9/10 either. I tested on Android 7, 11 and 12 only.

And yes, I am aware that I am living in the future (named the app Apr 25 in March).

Thanks to my Patreon supporters!

More people are joining up – it’s free! You don’t have to pay to support me on Patreon, but my paid supporters are helping out a lot, particularly with my AI coding assistant bill. Without AI coding assistance this app wouldn’t be possible, and without my supporters there wouldn’t be money for the api’s.

Patreon supporters (free and paid) get the latest news first! https://www.patreon.com/c/CircusScientist

SmartPoi JS Utilities Update Demo

I just uploaded a full walkthrough of the updates to YouTube. Some functionality is not obvious, but the uploads are faster, and connection is more reliable. Overall I am quite proud of this version.

Next up: port the improvements over to the Android App.

To support my ongoing work on the SmartPoi and Magic Poi projects (and to help me save up for a new Microphone!) please consider contributing to my patreon. https://www.patreon.com/c/CircusScientist.

Shout out to Flávio from my Patreon, this one is for you!

Special Notice:

In the next month or so all of my paid subscribers over on Patreon are going to receive a surprise. I have something that nobody has done before (I checked) but I’m keeping it for them, so now is a good time if you like poi and making stuff, go ahead and join up.

Moving On

TLDR:

Some old Circus Scientist services have to go, in order to move forward with new projects. This is due to Ubuntu Server upgrade (not intentional)

Outline:

There are two ways to look at things in software:

  1. Keep things compatible and working no matter what. I think of this as the “hoarder” mentality (think Microsoft)
  2. Move fast and break things (aka Google)


I guess I try to keep a happy medium, leaning towards the “hoarder” side. Right now though, something is going on that I don’t have any power to change. The Ubuntu Server version 20 which I have most of my “experimental” services on is going EOL in a few months.
I don’t have a choice – I need to upgrade all of my online projects. Sometimes this is as simple as upgrading Ubuntu in-place but due to Python version updates this time it’s impossible. Each service has to be updated and put on a new version of the server – I’m using the latest LTS version, Ubuntu Server 2024.

What is going away

  1. LED Website Indicator. I really love this project, my first fully integrated Web and IOT project. Basically nobody cared except me. I’m going to open source the Arduino code at some point, some parts are already are available on GitHub.
  2. MagicPoi old website. There is already a new version with most of the same functionality (my patreon subscribers have had access to this for a while). This was my first really large Flask website with an api accessible from ESP8266 and is a bit old and insecure now. I have a backup if anyone has data from there that they need to get back, just send me an email and I will sort you out.
  3. AI Site Generation. A fun project that was just for learning purposes really.
  4. Monkey Detector (web version with api). Another learning project, not being used.
  5. K8 Juggling. Very old fun service.
  6. Invisible Deck Practiser. Just a JavaScript version of an Android app (magic).
  7. Other personal sites not related to this blog.

Temporary disruptions

Several other services need to be migrated, this may take up to a week depending on the complexity. Expect disruptions.

  • SmartPoi Downloader
  • The new alpha version of magicpoi site (with api)
  • devsoft.co.za
  • show.circusscientist.com
  • Other personal sites not related to this blog.

Conclusion

Sometimes you have to break things in order to move forward.

Everything that is moving to the new server is going to have proper Python virtual environments with up-to-date libraries. More secure, faster, future proof.