For anyone who wants to jump ship early or just be prepared I present Tronbyt. Here are my two repos for managing your tidbyt without the tidbyt backend. They consist of the custom firmware and a web app.
The custom firmware must be flashed to your tidbyt with platformio. The wifi creds and image_url are hard coded into the firmware before flashing. GitHub - tavdog/tronbyt-firmware-http: A community supported firmware for the Tidbyt hardware 🤓
The web app is designed to be run with docker compose on a local server but will also run happily on the internet although HTTPS is NOT supported. GitHub - tavdog/tronbyt-server
This is a pull only system. The Tronbyt device will pull the webp from the server and the server will render the app if needed before delivering the webp to the device. After the devices waits the app cycle interval it will pull again and the server will deliver the next app in the app list.
The web app has a web insterface for the user to add devices and apps and configure them with the build in web interface of pixlet. The reason docker is used here is to ensure pixlet is installed and working properly.
When an app is added to a device in the web app it is the responsibility of the user to pick a sane app refresh interval. The app will be rendered on this interval so be careful not to set it too short or you might max out some api limits or get your ip blocked.
Any apps using the secrets module will not work on this system. Tidbyt authored apps are not available either. I have ported the xscreensaver app over not need secrets module.
If there is interest I may stand up a publicly available instance of the web app for people who don’t want to mess with docker.
Thanks for setting this up… unfortunately, I haven’t been able to get it running.
The firmware is being flashed successfully, but when I run the monitor I see “HTTP_CLIENT: invalid host” in the log:
I (2061) wifi:idx:0 (ifx:0, 80:da:13:b6:01:a6), tid:0, ssn:0, winSize:64
I (2088) wifi:AP’s beacon interval = 102400 us, DTIM period = 2
I (3059) esp_netif_handlers: sta ip: 192.168.4.17, mask: 255.255.255.0, gw: 192.168.4.1
I (3060) wifi station: got ip:192.168.4.17
I (3062) wifi station: connected to ap SSID:net459301 password:Anchor@459!
W (3070) URL: Keyword ‘next’ not found in URL.
W (3075) main: Main Loop Start E (3080) HTTP_CLIENT: invalid host
Guru Meditation Error: Core 0 panic’ed (LoadProhibited). Exception was unhandled.
That’s super weird. I don’t know why a certain model would have different pins. But go into display.cpp and check the defines where the color pins are set. Here is a chnage that I made early on that you could try changing to see if that fixes it the color mapping problem.
Perfect! That worked! All colors are back to normal! THANKS!!
Now I have my devices pulling from a locally-pixlet-generated webp! Woo Hoo!
(I think I am correct that a locally running pixlet does not connect to the Tidbyt backend servers to generate a webp, right?)
The only other thing that I would LOVE would be the ability to force a device to request a new webp on demand.
I realize that the Tidbyt device requests a new webp at the specified interval, and that is mostly fine, but I use the Tidbyt to display messages from my home automation system (Hubitat) and it would be awesome to somehow trigger the devices to get a new webp when something happens (on demand).
Is there any way to do that?
Again, thanks for your help in getting me up and running!
To have a force push would require the device to run a small http server or have a websocket connection to a server. The other possibility is to use the mqtt version of the firmware which is directly controlled by the commands send over mqtt. I am working on an api to allow for HA to pushed images to the tronbyt-server but that’s still updated via polling and not push. Immediate pushes do seem to be very popular so I’ll think about adding that feature.
Are you certain the flash succeeded on the refurb ? I have one of those units and it requires a button press to get it to flash at all.
What does the FAIL look like when you try to flash it with the normal pin definitions ?
Here are the SUCCESS details when flashing the refurb unit with the updated values in display.cpp:
Writing at 0x0010f9fc… (95 %)
Writing at 0x001154cb… (97 %)
Writing at 0x0011ab04… (100 %)
Wrote 1093488 bytes (672332 compressed) at 0x00010000 in 11.3 seconds (effective 776.6 kbit/s)…
Hash of data verified.
Leaving…
Hard resetting via RTS pin…
========================= [SUCCESS] Took 26.89 seconds =========================
Environment Status Duration
tidbyt SUCCESS 00:00:26.887
========================= 1 succeeded in 00:00:26.887 =========================
…but the colors are incorrect.
And here are the FAIL results when using the updated values in display.cpp:
Archiving .pio/build/tidbyt/libe72/libwebp.a
Indexing .pio/build/tidbyt/libe72/libwebp.a
Linking .pio/build/tidbyt/firmware.elf
/Users/michaelcreamer/.platformio/packages/toolchain-xtensa-esp32/bin/…/lib/gcc/xtensa-esp32-elf/8.4.0/…/…/…/…/xtensa-esp32-elf/bin/ld: .pio/build/tidbyt/src/displayGen2.o: in function display_initialize': /Users/michaelcreamer/tronbyt/src/displayGen2.cpp:42: multiple definition of display_initialize’; .pio/build/tidbyt/src/display.o:/Users/michaelcreamer/tronbyt/src/display.cpp:42: first defined here
/Users/michaelcreamer/.platformio/packages/toolchain-xtensa-esp32/bin/…/lib/gcc/xtensa-esp32-elf/8.4.0/…/…/…/…/xtensa-esp32-elf/bin/ld: .pio/build/tidbyt/src/displayGen2.o: in function display_set_brightness': /Users/michaelcreamer/tronbyt/src/displayGen2.cpp:84: multiple definition of display_set_brightness’; .pio/build/tidbyt/src/display.o:/Users/michaelcreamer/tronbyt/src/display.cpp:84: first defined here
/Users/michaelcreamer/.platformio/packages/toolchain-xtensa-esp32/bin/…/lib/gcc/xtensa-esp32-elf/8.4.0/…/…/…/…/xtensa-esp32-elf/bin/ld: .pio/build/tidbyt/src/displayGen2.o: in function display_draw': /Users/michaelcreamer/tronbyt/src/displayGen2.cpp:92: multiple definition of display_draw’; .pio/build/tidbyt/src/display.o:/Users/michaelcreamer/tronbyt/src/display.cpp:92: first defined here
/Users/michaelcreamer/.platformio/packages/toolchain-xtensa-esp32/bin/…/lib/gcc/xtensa-esp32-elf/8.4.0/…/…/…/…/xtensa-esp32-elf/bin/ld: .pio/build/tidbyt/src/displayGen2.o: in function display_clear': /Users/michaelcreamer/tronbyt/src/displayGen2.cpp:106: multiple definition of display_clear’; .pio/build/tidbyt/src/display.o:/Users/michaelcreamer/tronbyt/src/display.cpp:106: first defined here
/Users/michaelcreamer/.platformio/packages/toolchain-xtensa-esp32/bin/…/lib/gcc/xtensa-esp32-elf/8.4.0/…/…/…/…/xtensa-esp32-elf/bin/ld: .pio/build/tidbyt/src/displayGen2.o: in function display_shutdown': /Users/michaelcreamer/tronbyt/src/displayGen2.cpp:86: multiple definition of display_shutdown’; .pio/build/tidbyt/src/display.o:/Users/michaelcreamer/tronbyt/src/display.cpp:86: first defined here
collect2: error: ld returned 1 exit status
*** [.pio/build/tidbyt/firmware.elf] Error 1
========================= [FAILED] Took 76.79 seconds ========================= EnvironmentStatusDuration
displayGen2.cpp shouldn’t be in there. It’s got duplicate definitions of display.cpp and so it’s complaining. pio will compile any cpp files it finds so making that copy caused the problem.
New updates: The Tronbyt server now responds to API requests just like the Tidbyt backend. This means you can use curl to push app images to the Tronbyt server, and they will appear on your Tronbyt device.