Home automation

I added some temperature sensors around my house.

 Temperature sensor, $4/ea on aliexpress
Temperature sensor, $4/ea on aliexpress

The sensors run on AAA battery, and periodically transmit the temperature on zigbee, a radio protocol in similar frequencies as Wifi. The signals get received by a USB dongle designed to receive and transmit zigbee.

 A raspberry pi listens to zigbee using a USB dongle
A raspberry pi listens to zigbee using a USB dongle

This is connected to a raspberry pi running zigbee2mqtt. The messages get sent to an mqtt broker via wifi. mqtt is a pub/sub protocol that runs over the internet. Any computer on my LAN can then be notified of temperature updates, by asking the mqtt broker to send them updates.

I wrote a small server which stays on all the time, listening to updates and recording changes to a database. It also generates reports periodically.

I think my database format is mildly interesting, in that it's designed to use a fixed amount of space. Anyone who wants to see the technical details, can check the github repo, specifically this file.

Temperatures can be seen in celsius or fahrenheit online. An example in Fahrenheit is below.

    Current Temperature
    last updated: 2024-11-07 8:34pm

    Sensor                        Temperature  Humidity    Last update
    Outside - Front                51.51°F      69.86%     1 minutes ago
    Outside - Back                 64.26°F      99.99%     22 hours, 49 min ago
    Upstairs - Dining Room         69.67°F      53.24%     0 minutes ago
    Upstairs - Bedroom - Za3k      71.35°F      60.15%     21 minutes ago
    Upstairs - Bedroom - Master    68.90°F      58.11%     4 minutes ago
    Upstairs - Kitchen             71.20°F      50.50%     6 minutes ago
    Upstairs - Garage              65.55°F      60.65%     2 minutes ago
    Basement - HVAC/Server         68.02°F      51.27%     3 minutes ago
    Basement - Workshop            67.10°F      52.91%     14 minutes ago

    -------------

    Hourly Temperature
    last updated: 2024-11-07 8:34pm

                    outside    inside     
    2024-11-07  8am    54.49°F    69.44°F   
    2024-11-07  9am    53.81°F    69.04°F   
    [...]
    2024-11-07  6pm    56.11°F    69.86°F   
    2024-11-07  7pm    53.53°F    69.65°F   

    -------------

    Historical highs and lows
    last updated: 2024-11-07 8:34pm

                outside             inside              
    2024-11-07    51.51 -  64.15°F    67.06 -  81.54°F   
    2024-11-06    61.21 -  71.24°F    68.36 -  81.18°F   
    [...]
    2024-10-10    49.39 -  60.89°F    67.59 -  77.49°F   

    -------------

    Code: https://github.com/za3k/temp-monitor

Having tested out zigbee and mqtt, I felt ready for my actual use case -- curtains. I live across the street from a major parking lot, and they have floodlights on all night. To sleep, I need blackout curtains. The problem is, it's pretty hard to wake up with blackout curtains drawn.

My solution was to get some smart curtains, and have them automatically go down at the end of the day, and go up in the morning.

 Smart curtains from IKEA
Smart curtains from IKEA

This worked fine, after I got the curtains set up. I've completely forgotten about them, which is exactly how I like my home automation--I want to never think about it. For more about how to set up IKEA smart curtains, see my notes. It comes with 6 manuals.

blinds controls my blinds via the computer, and mqtt2mqtt allows my IKEA remote to control them too. cron and heliocron automatically open and close the curtains on a timer.


I worked on monitoring power usage via my circuit breaker with current transformers and the circuitsetup ESP32 energy meter but it's currently stalled. The main problem is that I can't fit the CTs into my circuit breaker. If I get it working, I'll post an update.

Tagged ,

Hack-a-Day, Day 02: Acrylic Soma Cube (FAILED)

 The Soma Cube is a 3D, tetris-like puzzle -- picture credit 2ndlook.nl
The Soma Cube is a 3D, tetris-like puzzle -- picture credit 2ndlook.nl

Today I tried to design a laser-cut set of Soma cube pieces. The pieces (shown above) are (conceptually, and sometimes actually) made of 3D blocks glued together.

I've seen a particular style of joinery for acryllic, called finger joints. Those looked easy to cut and easy to put together (if hard to design).

 Acrylic box made with finger joints -- photo credit txoof
Acrylic box made with finger joints -- photo credit txoof

I wrote a python script that takes a description of a piece, like this:

Piece E
xx x-
x- --
-- --

And draws all the flat faces I need to cut.

 Flat faces for the soma cube
Flat faces for the soma cube

I was already running far behind, time-wise. I ran out of time before I could get the joinery working. Honestly, I don't think I'm very close, either.

 Finger joins drawn incorrectly with turtle graphics
Finger joins drawn incorrectly with turtle graphics

How to do a three-piece corner join was especially confusing me.

Tagged

Repulsive Dots

Lately I’ve been messing about in Godot, a framework for making video games (similar to Unity).

I wanted to make a 3D game. In my game, you live in a geodesic dome, and can’t go outside, because mumble mumble mumble poisonous atmosphere?.

A geodesic dome, I learned, is related to the icosahedron, or d20 from RPGs.

A simple dome is the top half of the icosahedron. As they get more complex, you divide each triangle into more and more smaller triangles.

Icosahedron getting more and more detailed. Geodesic domes are the top half of each sphere.
Icosahedron getting more and more detailed. Geodesic domes are the top half of each sphere.

So to make a nice geodesic dome, we could find one (I failed), make one in Blender (too hard), or use some math to generate one in Godot. And to do that math, we need to know the list of 20 icosahedron faces. Which basically just needs the list of the 12 vertices!

Now, obviously you could look up the vertices, but I thought of a more fun way. Let’s put 12 points on a sphere, make them all repel each other (think magnetically, I guess), and see where on the sphere they slide to. Maybe they will all be spaced out evenly in the right places. Well, here’s what it looks like:

So… kinda? It was certainly entertaining.

By the way, the correct coordinates for the vertices of an icosahedron inside a unit sphere are:

  • the top at (0, 1, 0)
  • the bottom at (0, -1, 0)
  • 10 equally spaced points around a circle. they alternate going up and down below the center line.
    (±1/√5, sin(angle), cos(angle)) [projected onto the sphere]
Tagged , ,

Even more URI handlers in Linux

Sometimes Linux wants to open files. I mostly use the command line, so I wrote some helper programs to open things in terminals.

  • open-text-file opens your default text editor in a terminal. I set it as my program to open all text files.
  • open-directory opens a terminal with that working directory. I set it as my program to open all directories.

They’re both available in short-programs. Both default to xterm.

Tagged

URI handlers in Linux

When you click an email address, it automatically opens in your email client. But I don’t have an email client, I use webmail. I wrote a custom handler for Linux.

First write a program to open mailto links. Mailto links look like “mailto:me@mail.com” or maybe even “mailto:me@mail.com?subject=mysubject&body=mybody“. Test it by hand on a few links. Mine (mailto-opener) composes a new message using my webmail.

Next, write a desktop file for the opener. Here’s one:

#/usr/local/share/applications/mailto-opener.desktop 
[Desktop Entry]
Type=Application
Name=mailto: link opener (github.com/za3k/short-programs)

# The executable of the application, possibly with arguments.
Exec=/home/zachary/.projects/short-programs/mailto-opener %u

Note the %u in the Exec= line. That’s required.

Now update your system mimetype database. On my Arch Linux install, I run

xdg-mime default mailto-opener.desktop x-scheme-handler/mailto

Finally, restart your browser. Really. Firefox and Chromium/Chrome both cache mimetype openers.


A related opener I added recently was for magnet links, such as are popularly used for bittorrent.

~ $ cat /usr/local/share/applications/transmission-remote.desktop 
[Desktop Entry]
Type=Application
Name=transmission-remote magnet link opener
Exec=transmission-remote <TRANSMISSION INSTANCE> -a

transmission-remote is the name of a command-line Linux program. It connects to an instance of Tranmission (a popular torrent client) running on another machine.

Tagged

Zorchpad update: first 3d print

I’ve been designing a keyboard and case for the zorchpad.

There are four pieces in the first iteration.

A top bottom base, to enclose the keyboard electronics.

A keyboard plate. The keys fit into the holes here. You type on the top, electronics go in the bottom.

A top plate. You see the screens, and switches through the cutouts. Otherwise, it keeps the behind-the-scenes wiring out of sight.

And finally, the top piece.

Here are the pieces in correct position. In the top will be the screens and battery. The bottom is a keyboard you type on. The whole things is meant to fold on a hinge, much like a laptop.

The same pieces, spread out.

There were many, many problems with the first design and the first print. I’ll talk about them (and my fixes) in my next post.

Tagged

Zorchpad keyboard update

The Zorchpad needs a custom keyboard. Its power budget is only 1mW, and there’s just nothing available in that range. So, I need to make a custom keyboard. I started reading up on how to make your own–especially the electronics.

I don’t know how to make a PCB:

PCB from HacKeyboard
PCB from HacKeyboard

Or how to attach headers to the inside of an existing keyboard, which looks like this–:

Mapping the Innards of a Keyboard : 7 Steps (with Pictures) - Instructables

But I found a project called GOLEM with an excellent guide to making your own keyboard. Here is their wiring:

GOLEM Macropad
GOLEM Macropad

I can do that! They got me out of a major rut.


Their advice walks you through how to do a small keyboard in a cardboard plate. I did a few keys, gauged the effort, and decided to use my 3D printer. Cutting out 50-60 keys precisely by hand doesn’t sound easy. Worse, if you mess up, you have to start over. In plastic, I can’t mess up halfway, and the spacers to support the keyboard can be part of the print.

Above, I’m designing a “sampler” keyboard in CAD (OpenSCAD). I want to iron out problems in my process before I try a full-size keyboard. Below, Prusa-Slic3r is slicing the finished model for my 3D printer to print.

Here’s the finished sampler keyboard:

Currently I’m waiting on keycaps and switches ordered from China, and then I’ll put together my finished keyboard. But I have been making some progress in the meantime. Here’s the layout I’m going to try.

And I’ve started streaming some development of a case and keyboard on Twitch (Tue/Thu 12pm noon, EDT). Feel free to join! Anyone can watch, but you need an account to chat.

Tagged ,

Zorchpad Update: Cardboard mockup, mk1

I’ve gotten to the point in Zorchpad development where I’d like to see how the whole thing fits together and if there will be any insurmountable problems. We’re still trying to figure out some things like–will it have one screen or two? What form factor will it be? Will the keyboard fold in half? So I put together a cardboard model.

This model has:

  • A power switch. I’m assuming the very first prototype will run on battery, not solar like the final one.
  • Two memory-in-pixel screens (total power usage: 0.001 W)
  • One e-ink display (total power usage: variable/unknown)
  • An apollo3 artemis board, which includes RAM, CPU, microphone, and BTLE (not pictured, total power usage about 0.0005 W)
  • One flash chip (not pictured, power usage variable)
  • A battery slot. I’m using AAA for my convenience (Holds: 3000 joules = ~20 days power)
  • An audio jack for headphones
  • A microSD slot
  • A custom keyboard (total power usage: variable/unknown)
    The keyboard is closely modeled off a standard one, for now.

Immediately, a few problems pop out:

  • It’s fairly long. This will stick out of my pocket. This is with very closely spaced keys on a somewhat reduced keyboard.
  • There’s not really a great place to put solar panels. It’s has almost zero free space, plus there’s going to be a lot of wiring. Are we going to drill holes through the solar panel to let wires pass through? Also, I really haven’t been able to figure out how many cm2 of solar we need.
  • It’s hard to get the screen to stay propped up on my cardboard model. I’d like a solution that doesn’t use hinges, since those tend to loosen over time.

My next step will probably be to make a custom working keyboard. Then, I’ll make an entire working zorchpad. Both will be either cardboard or 3d-printed (whichever is easier).

Tagged