aboutsummaryrefslogtreecommitdiff
path: root/posts/homeauto.md
diff options
context:
space:
mode:
authorlonkaars <loek@pipeframe.xyz>2021-08-17 13:31:26 +0200
committerlonkaars <loek@pipeframe.xyz>2021-08-17 13:31:26 +0200
commitee4c1a8135b3560c036790512c86f30088d75268 (patch)
treedd2f17d141e4d3a1c59e81f587cfabe42525ab77 /posts/homeauto.md
parentbb420a94eb3b35c61f276b66c91f3f17ca2b07e8 (diff)
WIP home automation article
Diffstat (limited to 'posts/homeauto.md')
-rw-r--r--posts/homeauto.md229
1 files changed, 229 insertions, 0 deletions
diff --git a/posts/homeauto.md b/posts/homeauto.md
new file mode 100644
index 0000000..2eddde3
--- /dev/null
+++ b/posts/homeauto.md
@@ -0,0 +1,229 @@
+[meta]: <title> (My home automation adventure)
+[meta]: <subtitle> (How to make your house a shitty utopia)
+[meta]: <author> (Loek)
+[meta]: <date> (August 17 2021)
+[meta]: <tags> (home automation, raspberry pi, software, hardware, hacking)
+[meta]: <cover> (/img/homeauto.png)
+
+Home automation is cool, but it can also be scary. I want to try to convert my
+existing bedroom lights into 'smart' lights that I can control using a home
+automation system.
+
+I've tried two home automation systems so far: homebridge and home assistant.
+Homebridge isn't really an automation system. It's meant to add unsupported
+devices to *homekit*, but doesn't work with anything other than apple devices.
+I've also tried (and am currently using) home assistant. It's a complete
+replacement for the homekit ecosystem, and it can do basically anything, as
+long as you're patient enough...
+
+The devices I'm going to try to automate are:
+
+- A random bluetooth RGB/white lamp I bought a couple years back
+- An RGB strip under my bed my mom got me for christmas
+- A gen 1 Philips LivingColors lamp from 2008
+- My Toshiba RAS-M10GKV-E2 air conditioning unit
+
+## The bluetooth RGB lamp
+
+This lamp is apparently another Chinese product that gets rebranded and sold
+under different names. I bought mine as the "[Shada led's
+light](http://leds-lightpro.com/node/4368)" (no the apostrophe isn't a typo).
+
+When scanning for bluetooth devices using `bluetoothctl` on Linux, it shows up
+as an LE device called "Beken LED".
+
+I don't remember what search term I used when searching for it's bluetooth
+protocol, but I landed on [this page](https://wiki.fhem.de/wiki/BEKEN_iLedBlub)
+from a german website about home automation, where it's called the "BEKEN
+iLedBulb". It documents which Bluetooth LE characteristics you need to write to
+for the lamp to change color.
+
+The lamp has both [iOS](https://apps.apple.com/us/app/leds-light/id1058642950)
+and
+[android](https://play.google.com/store/apps/details?id=com.shada.ledslight&hl=en_US&gl=US)
+apps available, though only the iOS app seemed to work.
+
+### Writing a homebridge plugin
+
+When I started out with this home automation business, I used homebridge
+because I didn't know about home assistant yet. Developing plugins for
+homebridge is actually pretty easy (after figuring out [how to get the plugin
+to load](https://github.com/homebridge/homebridge/issues/2958)). The
+documentation is pretty good, and it has typescript integration for maximum
+/comfy/-ness.
+
+Because HomeKit doesn't support RGBW or RGBWW lights (lights that have both rgb
+and dedicated white diodes), I chose to display them as seperate rgb and white
+lamps inside the home app.
+
+[The plugin](https://www.npmjs.com/package/homebridge-beken) is pretty janky,
+and requires some manual setup, but it worked very consistently for the single
+week I used it for.
+
+### Converting the homebridge plugin to home assistant
+
+Now that I could control a single bulb using the home app and siri, I needed
+more. The homebridge website allows for turning devices on/off, but doesn't
+allow color changes. I also liked the idea of controlling the lights using my
+phone, which runs android.
+
+Home assistant was the solution, so I went ahead and installed [home assistant
+core](https://www.home-assistant.io/installation/linux#install-home-assistant-core)
+on the Raspberry Pi 3B+ I'm using as a dedicated home automation hub.
+
+Upon opening it for the first time, I noticed it was much slower than
+homebridge, but that's because it was installing a bunch of other stuff in the
+background. After waiting for the background tasks to complete, I was greeted
+with a very nice web interface. There were also already devices that I could
+integrate immediately, like the downstairs chromecasts, and my Jellyfin server.
+
+Now I had to figure out how to write a plugin for home assistant. There's some
+concepts in the home assistant ecosystem that I didn't quite understand, which
+made searching where to start harder.
+
+**Integrations** are like plugins, they allow you to *integrate* an unsupported
+device into home assistant. Integrations create **devices** which create
+**entities** (device properties). Certain entity types can only be read (like
+`sensor`), and others can also be updated / written to (lights).
+
+The documentation for creating entity integrations is pretty poopy, and I
+mostly used other plugins on GitHub as reference material. The home assistant
+plugin code is available on
+[GitHub](https://github.com/lonkaars/homeassistant-beken) and [my personal git
+server](https://git.pipeframe.xyz/lonkaars/homeassistant-beken/about).
+
+## The RGB gamer bed
+
+I was originally planning to control this strip using IR remote emulation, but
+I remembered a friend of mine still had an esp8266 laying around. So I went the
+extra mile and wanted to try to create a new driver board for the strip
+instead.
+
+### Opening the original driver
+
+![](/img/homeauto/controller_original.jpg)
+
+![](/img/homeauto/opening_controller.jpg)
+
+![](/img/homeauto/open_controller.jpg)
+
+![](/img/homeauto/controller_board.jpg)
+
+### Making a custom driver board
+
+**I AM NOT AN ELECTRICIAN**. I looked on the internet, and I think this is just
+a simple board with some mosfets and flash memory for storing the 6 custom
+colors. The mosfets are the 3 big squares labeled Q1, Q2 and Q3. The way the
+strip works is it gets +12v though the black wire, and then lights up when you
+ground any combination of the red, green, and blue wires. The strip dims using
+pulse width modulation. The mosfets act like an electronic switch, and control
+the grounding of the colored wires.
+
+I'm going to salvage the mosfets, and barrel plug from the original driver
+board, and resolder them on a perfboard with the esp8266 so I can control them
+over WiFi. The schematic I'm using comes from
+[instructables](https://www.instructables.com/WiFi-Controlled-RGB-LED-Strip-With-ESP8266/).
+
+![](/img/homeauto/schematic.png)
+
+--- photo of thing in breadboard ---
+
+--- photo of thing in perfboard ---
+
+### Beautiful dremel work
+
+I wanted to use the original enclosure instead of a tupperware container this
+time, so I used my dad's dremel to create holes for the esp to fit.
+
+![](/img/homeauto/shittydremel.png)
+
+![](/img/homeauto/espfit.png)
+
+As you can see I did a great job :^)
+
+--- photo of perfboard in case ---
+
+### ESP firmware
+
+The firmare I wrote for the esp is available on
+[GitHub](https://github.com/lonkaars/esp8266-rgbstrip) and [my git
+server](https://git.pipeframe.xyz/lonkaars/esp8266-rgbstrip/about), along with
+the home assistant plugin
+([GitHub](https://github.com/lonkaars/hass-esp8266-rgbstrip),
+[cgit](https://git.pipeframe.xyz/lonkaars/hass-esp8266-rgbstrip/about)). I used
+the [espressif ESP8266_RTOS_SDK](https://github.com/espressif/ESP8266_RTOS_SDK)
+toolchain with gnu make as my build system.
+
+It just connects to your specified wifi network under your specified hostname,
+and listens on port 80 for regular http requests. Here's how to use it without
+the home assistant plugin:
+
+```bash
+# get color
+curl http://hostname/
+
+# set color rrggbb color (hex)
+curl -X POST -d "0000ff" http://hostname/
+```
+
+Some cool features this firmare has are:
+
+- Linearly interpolated color transitions with customizable transition and step
+ duration
+- Brightness curve correction (makes difference in brightness more pronounced
+ at higher brightness levels by using a parabolic curve)
+
+I'm not sure if the more popular [ESPHome](https://esphome.io/) firmare has
+these features, but I wanted to have a go at writing my own firmare anyways.
+
+### Safety
+
+Because the esp8266 is a pretty basic microcontroller, it doesn't use https or
+ssl for encryption. To protect from people in my house wanting to control my
+lights, I used the raspberry pi's on board wifi module to create a hidden
+private isolated wifi network for this, and all future IoT devices in my
+bedroom. I'm using `hostapd` to create the wifi network, and `dnsmasq` for
+assigning ip addresses and hostname resolution. Here's the config file for
+`dnsmasq`:
+
+```
+no-resolv
+interface=wlan0
+dhcp-range=10.0.0.1,10.0.0.16,24h
+server=8.8.8.8
+```
+
+And here's `hostapd`'s config file:
+
+```bash
+# common settings
+interface=wlan0
+driver=nl80211
+ssid=network_name_here
+hw_mode=g
+channel=1
+macaddr_acl=0
+auth_algs=1
+ignore_broadcast_ssid=1
+wpa=2
+wpa_passphrase=network_password_here
+wpa_key_mgmt=WPA-PSK
+rsn_pairwise=CCMP
+
+# raspberry pi 3b+ specific settings
+ieee80211n=1 # 802.11n support
+wmm_enabled=1 # QoS support
+ht_capab=[HT40+][SHORT-GI-20][DSSS_CCK-40]
+```
+
+Very complicated stuff...
+
+## The Philips LivingColors lamp
+
+[This](http://www.knutsel.org/2009/01/01/livingcolors-1st-generation/) article
+describes all the research that went into reverse-engineering the lamp.
+
+## The Toshiba air conditioning unit
+
+IR remote emulation with LIRC
+