I saw flip dots (also called flip discs) last year for the first time and instantly knew I needed some in my life. If you’re not familiar with them, check out how they work!
The particular model I have is the ALFAZETA XY5, which may be the easiest way to get up and running, but certainly not the least expensive.
After getting the board, all you need is:
24V power supply
Something that talks over RS485 (in my case I used an ESP8266 connected to a MAX3485 board)
Their documentation that defines the controller data protocol
I plan to write in more detail how it all works, but for this demo the stack is:
It felt good to complete this project that’s been on my list for quite some time. The main goal was to scrape the values from my modem’s status page and pipe them into InfluxDB, which feeds Grafana. Not only could I look at data trends, but I could receive alerts if certain values exceeded an acceptable threshold.
Overall this is a straightforward process:
Pull in the HTML from the status page (which happens to not need any authentication, making it even easier)
Parse the tables we care about (Downstream and Upstream) using XPaths
Munge the data into something suitable for InfluxDB
Insert the data into InfluxDB
Query the InfluxDB data from Grafana
I knew I wanted to use Python for the project, so I first looked into Scrapy. After wrapping my mind around it (somewhat) I gave it a go and actually had a working solution… but it felt way over engineered and at times inflexible for what I wanted. I threw 90% of that solution away and went with a simpler script.
What I landed on was something that’s custom and lightweight, but extendable in case someone has a different status page or wants to use an alternative to InfluxDB.
Another fun project from a few weekends ago: Wrapping the Adafruit GFX in Objective C and bridging to Swift for some neat 8-bit effects!
The most interesting component of this project so far has been building a Swift closure that is executed in C as a const void *. This was new territory for me and a lot of fun to figure out!
It’s been possible to boot a Raspberry Pi from an SSD for a while now, but the process didn’t seem to have the full blessing from the Raspberry Pi Foundation. This changed recently when they announced their beta firmware to officially support it.
It was pretty painless to get it working, so here’s how I did it. Some notes up front:
The SSD I used was a spare Samsung EVO 250GB I had from a retired machine
I connected the SSD directly to the USB 3 port
I went with the headless version of Raspberry Pi OS (formerly known as Raspbian), but this should work with any of them
Since my RPi was already running off an SD card I wanted to be able to plug in the USB drive and do this all from my couch. I only had to get up once, and that was to take out the SD card on the final reboot!
Don’t blindly follow these instructions unless this post is only a few days old! Things are bound to change – this is beta software. Do it at your own risk. If a step has something in [brackets], you need to figure out your particular value.
I know I talk about Grafana way too much, but it’s such a cool tool. Installing Telegraf on Linux gets me about 80% of what I want, but on macOS (via Homebrew) it’s lacking even more.
Note: I use InfluxDB as my Telegraf output.
The Telegraf part
To get values for my Mac’s CPU temperature, GPU temperature, and fan speed, here’s what I did:
Add the following executable inputs to Telegraf’s config in /usr/local/etc/telegraf.conf
# CPU temperature from iStats - https://github.com/Chris911/iStats
# Note - this would need to be adjusted for multiple CPUs
# Key was discovered as TC0P
[[inputs.exec]]
commands = ["/usr/local/bin/istats cpu --value-only"]
timeout = "5s"
name_override = "cpu_temperature_mac"
data_format = "value"
data_type = "float"
# GPU temperature from iStats - https://github.com/Chris911/iStats
# Note - this would need to be adjusted for multiple GPUs
# Key was discovered as TCGc
[[inputs.exec]]
commands = ["/usr/local/bin/istats scan TCGc --value-only"]
timeout = "5s"
name_override = "gpu_temperature_mac"
data_format = "value"
data_type = "float"
# Fan speed from iStats - https://github.com/Chris911/iStats
# Note - this would need to be adjusted for multiple fans
[[inputs.exec]]
commands = ["/usr/local/bin/istats fan speed --value-only"]
timeout = "5s"
name_override = "fan_speed"
data_format = "value"
data_type = "integer"
The Grafana part
Some caveats to this approach:
This was on a 2019 i9 iMac with a single processor, GPU, and fan and won’t automatically work for all machines. You’d need to run iStats to see what all keys and values appear for your particular Mac.
It would be better if the CPU and GPU stats all played nice with the same measurement names Linux uses so we wouldn’t have to have multiple Grafana queries. I may do this in the future, but right now this was easy to implement with my RPi, PC, Mac, and Linux boxes.
At work we’re primarily using Zoom for meetings while we’re in remote mode. Due to the recent problems found in their desktop software, I run it only on my iPad to provide a little more security (thanks to iPadOS’ sandboxed environment), plus the front facing camera on my iPad Pro is superior to my iMac and MacBook Pro’s.
The first issue I found with this setup was that I wanted to get the iPad into a position more perpendicular like a web cam, rather than the angled up shot below my face. I don’t think anyone wants to look up my nose unless I’m on a telehealth call, so I ordered this flexible stand for about $25 from Amazon and got it mounted:
Trying to bend this thing will give you a workout.
So far so good, until my first meeting. I wanted to follow conference call etiquette by muting myself when I wasn’t speaking, but it was a pain to reach and manually tap the mute button every time. Plus, although the flexible arm is super strong, it’s still going to wobble wildly if you touch the iPad and your video is going to show that.
Was there a way I could toggle muting myself without touching the iPad? After a quick Google search, the answer was YES!
The attached keyboard (Smart Keyboard Folio, Magic Keyboard) didn’t make any sense in this case, but a Bluetooth keyboard would be perfect!
Logical answer
The logical answer is to connect up a Bluetooth keyboard and hit Command + Shift + A when you want to toggle muting your mic, and you’re done. That’s it.
I’m not totally logical
Of course, the route I chose was different. I have enough keyboards on my desk, I really just want one button to do one thing.
This is as if the user pressed “shift + caps lock”, and then “shift + a” at the same time, then released. Now the Zoom app was getting the proper command from a Bluetooth “keyboard”.
Hardware
This setup is virtually identical to what I have here, it’s just a different button.
The USB cable coming in is only for power, and if I had the Adafruit Feather version on hand I would’ve used that with a battery so the box would be totally wireless.