aboutsummaryrefslogtreecommitdiff
path: root/_items/homeauto.md
diff options
context:
space:
mode:
Diffstat (limited to '_items/homeauto.md')
-rw-r--r--_items/homeauto.md259
1 files changed, 259 insertions, 0 deletions
diff --git a/_items/homeauto.md b/_items/homeauto.md
new file mode 100644
index 0000000..544cf07
--- /dev/null
+++ b/_items/homeauto.md
@@ -0,0 +1,259 @@
+---
+title: My home automation adventure
+subtitle: How to make your house a shitty utopia
+tags:
+ - home automation
+ - raspberry pi
+ - esp8266
+ - cc2500
+ - microcontrollers
+ - software
+ - hardware
+ - hacking
+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
+
+## 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).
+
+## 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)
+
+The whole solder job was a complete massacre, and I really don't want to show
+it. It does work though, but I had to buy a new soldering station because my
+old soldering iron wasn't really fit for soldering small electronics.
+
+### 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 :^)
+
+The esp is still at the bottom of the case, but getting everything to fit
+inside was so hard that I completely forgot to take pictures. So here's a
+picture of the finished controller mounted under my bed using two small nails:
+
+<figure>
+ <img src="/img/homeauto/finishedcontroller.png"/>
+ <figcaption>Job well done</figcaption>
+</figure>
+
+### 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 onboard 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...
+
+## 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.
+
+I ordered a cc2500 wireless transmitter and receiver, but the seller cancelled
+the order, and now I have to wait a while longer to get one. I'll update this
+article once I've set it up though.
+
+## Toshiba air conditioning unit
+
+I created a small daughter board to connect to the raspberry pi's gpio pins,
+that has an IR phototransistor and IR blaster. This is so I could record and
+replay the IR messages from the remote more easily.
+
+I've spent a solid two days now trying to use my raspberry pi or arduino uno as
+a janky logic analyzer, to capture the IR messages and get the message contents
+manually, but I still haven't succeeded. I have however succeeded in frying the
+IR LED by giving it +5v backwards without any protection, so that's something I
+guess. I'll update this section of the article together with the Philips lamp.
+
+
+To be continued...
+