A brilliant exercise in over-engineering that perfectly captures the "because I can" spirit of the Linux community. It’s a masterclass in protocol reverse-engineering that turns a simple timepiece into a functional extension of a declarative OS.
Deep Dive
Prerequisite Knowledge
- No data available.
Where to go next
- No data available.
Deep Dive
My Casio Watch Controls NixOS Now || Noctalia Plugin
Added:I was my Japanese lesson and I came across a weird word deni deni deni jish and this is a small translator that people used to have. This got me interested. So I started googling and found this weird small devices from Casio for example and that's how I kind of got onto the brand of Casio. My plan was to get one of those and put Nix on it. But then I found out Casio has also these weird but genius watches that you saw in Back to the Future and many other places. So, I got this. This is my new Casio watch and it has Bluetooth. So, my idea is use Bluetooth to pair it to my laptop, create an Noctalia plugin, and control my laptop with my watch. Let's get into it. [music] By the way, the setup guide and a demo is at the end. But first, I want to show you how this actually got built. As I said, I got a Casio ABL 100WE because it has Bluetooth. So, the idea was simple.
Could this become a tiny stream deck for my Linux desktop? Not a smartwatch app, no notifications, no step counter or whatever, just a simple button press on the watch that makes my desktop do something. The first step was research.
I did not want to reverse engineer the entire watch from zero if the community already had useful pieces. The watch speaks Bluetooth low energy. So, Python with Bleke looked like the cleanest way to talk to it from Linux. Then I found the G-Shock API which already contains Casio's protocol pieces. That was the important part. I could use the existing protocol knowledge instead of guessing every packet. On the desktop side, I wanted this to feel native to my desktop. So, the target was Noctalia. A plug-in could own the UI, the state, and the action mapping and the desktop commands. So the first architecture was simple. Bleak talks B. G-Shock API helps with the Casio protocol. A Python helper turns watch behavior into trigger names.
And Noctalia maps those trigger names to actions. With all the pieces on the table, I made the most reasonable and completely wrong assumption. Surely this behaves like a tiny Bluetooth keyboard.
In my head, I would pair it once, leave a small demon running, and bind each button to whatever I wanted. In pseudo code, the whole project was basically watch button lower right for example and then run launcher. That would have been the Linux dream. A quiet process, a few clean events, and endless things to map them to. So I paired the watch, opened the locks, pressed low, right, and waited for a beautiful stream of button events. But I did not get one. The watch connected, exchanged something, and disappeared again. This is great for battery life, but slightly inconvenient for my plan. So instead of writing more code, I started to watch the connection itself. The locks made the situation more interesting. Pairing worked. B discovery worked. I could exchange packets. But then the watched closed the connection immediately. When I pressed the right control, it would appear again, have another tiny conversation, and leave. At first, that looks flaky, like a service that keeps on crashing.
But compared with the way Casia's phone app talks to the watch, the pattern makes sense. This watch is not trying to sit online like a keyboard. It wakes up, starts a conversation, finishes its job, and goes back to being a watch. The useful clue was the disconnect. It was not an error at the end of the lock. It was the period at the end of a transaction. That changed the question from how do I keep this connected to what can I learn during this few seconds when it is here? Once I followed the rhythm, the protocol started to make sense to me. The helper waits quietly.
Then the watch starts a conversation.
The helper connects, performs the app info handshake, checks why the watch called, and prints one clean result, and then the connection closes again. So for example, if I press the lower right button, that single line was the first real breakthrough. I could reliably identify a short lower right action. The long lower right finder action and a long lower left action. They are not generic key codes from every physical button, but there are useful repeatable signals. This is enough that I could open a launcher, control media, or kickover command on my computer. From the desktop's point of view, it just received an event that it can actually use. Now, I want to stop the Python helper from becoming one giant script that knows about Bluetooth. my desktop, the launcher, and probably my wallpaper, too. The clean Linux answer was a plain text boundary. So, Python deals with the weird hardware side and writes outputs.
For example, ready, state connected, press lower, right, and it never should say open the launcher, and it never receives permission to run a shell command. It only reports the facts from Bluetooth. Noctalia then reads those outputs, shows the current state, decides what they mean on this machine.
So for example, today the lower right can open the launcher. Tomorrow it could pause music without touching the Bluetooth code underneath. One process describes what happens and another one owns the policy. Of course, hardware always has opinions. Bleak gave me the connection and G-Shock API gave me a map of the protocol. But this exact AL100WE still has a couple of surprises. The time sync was one a broader library path send a follow-up command that this model did not appreciate. The fix was wonderfully unspectacular. I just send a smaller current time packet that it actually needs and then stop sending anything else. The app infant check was another part. Skip it and the trigger can be ambiguous. Perform it in the right order and the same interaction becomes reliable. Once the terminal output became boring, I wanted to give this project a proper home inside of Noctalia. So let's take a look how we can add the plug-in. As you can see, it's already added in here. You can do is add source here. Then give it some name and add the GitHub link. I suggest though that you clone it down onto your PC. Give it a name and give it the path to your file because it's just safer in case somebody changes something that you don't know about and you don't want to change. Just have it on your own terms.
Also important if you have the plug-in cloned, you have to be on this level and don't go into Casio deck because you need this catalog. To be visible to the plug-in manager. All right. Once this is added, you can go into the bar, for example, scroll down a little, and in here you can add a widget. Search for Casio. This is the Casio deck, and it's added as you can see here. Next, you can go to the desktop. But because the plug-in API is not yet available for me at least, or maybe I just didn't find it. This dropdown here is not what I wanted it to be. So, I created a desktop widget, which you can go here to desktop, then click toggle editor. Here in the dropown, you can see Casio deck.
Click on the plus and it's added. You could also make it bigger if you want.
That's how you set it up. So once we have the widget ready, we see that you can stop listening, but just keep that on if you want to. We have some connection information. If you have multiple watches, you could change to them, but they're not yet implemented.
Then we have locks. You have the functions that you can change. It's a little bit out of bounds here. What the presses do. So the short lower right accepts teams calls. The long lower right mutes the whole audio and the long lower left locks the display. About is just some explanation and my YouTube channel if you want to visit it. Now let's get into pairing. We click on pair. We press and load left of the watch and keep pressing it. Now it tries to connect and as you can see a pop-up appeared. It connected.
Now let's test the button the short lower left. Before we test it we can now see that it has the watch. It has the address of it and it can now listen to it. It's not an active connection. So, it just listens to a Bluetooth signal from that watch. If we look at the locks, we can see if we press the lower left once, something happened. There is no teams call to accept. So, press the lower right button and that made the function screenshot. So, we just make a screenshot. Screenshot saved. That's nice. Now, let's try to lock the screen with it. We have to press the lower left for that. That takes quite a while to actually send a signal. So, you just have to hold it. But that's just because the Casio watches are not that fast.
It's connected now. And it should lock the screen. Wonderful. If we go quickly through it, this is just the overview where you can see what's happening, how many presses that it recognized, errors, and so on. In the connection, there is not much to do. We have the parrot state, the listener, and the watches that maybe somebody else or maybe if I get another watch could implement this.
And we have the locks. You can go through them. It's just to see if it actually works or not for you. Um, you can also push an info button just to see if everything is still working. So, it sends a notification. Then we have the functions which probably are out of bounds because I just resized it. The functions are still very experimental.
Lock works, screenshot works, muting audio works, but you can test them.
There are different things like I tried a lot with teams. So if you get a team's calls at work, you can just accept or decline with your watch and such things.
Well, I guess that's all for today.
Thank you so much for watching. If you want to use it, feel free to. If you want to make some issues or open anything up, I am happy for any support that I get on this. This was more of an experimental plugin that I tried. If I get the support to make a proper dropdown, I will. If you have any ideas for me, feel free to tell me. Leave a comment, subscribe, and like. And I hope to see you next time. Have a good morning, evening, and goodbye.
[music]
Related Videos

TOP 15 Data compression Interview Questions and Answers 2019 Part-2 | Data compression | Wisdom jobs
wisdomjobs
281 views•2019-06-28

CTS 158: 802.11w Management Frame Protection
ClearToSend
4K views•2019-02-04

NDSS 2019 Send Hardest Problems My Way: Probabilistic Path Prioritization for Hybrid Fuzzing
NDSSSymposium
496 views•2019-04-02

How realistic is Cities: Skylines?
CityBeautiful
159K views•2019-02-14

GUIs & TUIs: Choosing a User Interface for Your Python Project | Real Python Podcast
realpython
2K views•2025-04-04

The OSI Model - Explained by Example
hnasr
225K views•2019-05-12

Cloud Computing - Introduction
elithecomputerguy
98K views•2019-10-07

From Traveler's Dilemma to Dynamic Routing | Demystifying Networking
IITBombayJuly
5K views•2019-08-04
Trending

WOW! Judge TURNS THE TABLES on Trump in His OWN $10B LAWSUIT!!!
MeidasTouch
197K views•2026-07-23

Playstation NO DISC/NO BUY Fight Is Over...
DavidJaffeGames
4K views•2026-07-23

Steam and Xbox Just Dropped The Hammer On PlayStation
OhNoItsAlexx
9K views•2026-07-23

Americans Confused in Australia for 17 Minutes Straight
IWrocker
17K views•2026-07-23