For years I have been using an old ELV WS 300 PC-II weather station (also known as eQ-3 WS PC-II) to measure temperature and humidity levels in parts of our flat. Mostly to quantify the effectiveness of our airing habits. Something that always annoyed me about the base station is its interface: it has a USB port at the back, and comes with a crummy Windows tool for collecting the data. Not very smart and not very connected. I'm a big fan of Home Assistant, a Python-based smart home / connected home framework, and I already run all of my smart home efforts through that. My credo is: If there's no Home Assistant component for it, it does not exist. In this post I am going to connect the WS 300 (or parts thereof) to Home Assistant using the MQTT protocol.
Until now I stuck to using the USB interface to read the data. There's even a perl script to read from the station, and I adapted it to pipe the data into Home Assistant. Nonetheless it annoyed me being bound to the WS 300: using the USB connection is a bit too hacky and the adaption of the read-out script failed from time to time. And … it's perl.
For a while I have tried building other temperature/humidity sensors myself, using ESP8266 Wifi-connected micro controllers, and DHT22, and BME280 sensors—with mediocre success. Since next heating period is moving closer and closer, I finally want to have a solid solution again, and ditch the WS 300 in it's current form entirely.
Thankfully the WS 300 connects to it's probes via the popular 868 MHz band. It is using a proprietary protocol but that has already been reverse-engineered, and another friendly dude has also published code on GitHub to use an individual 868 MHz receiver for receiving the probe data, and decoding it. I figured it might get me going to disassemble the WS 300 base station, and check out if I could get better access its internal receiver data. And I hit a jackpot: the base station's RF receiver turns out to be a run-of-the-mill RX868-3V sold by ELV, soldered on to the main PCB. It is almost structurally identical to what the lib on GitHub expected to work with. All that's missing is a pull-up pad to disable and enable the receiver entirely. Removing the receiver module was a piece of cake, and the pinout was perfect to create a simple “module” to plug onto the Raspberry Pi.
After I checked the available tool to be working—which it did out of the box—I got to work to turn it into an MQTT daemon. Luckily I worked on a MQTT daemon in Python before, and repeating the effort in C++ wasn't that hard. Just a matter of refreshing my C skills. Which were a bit rusty. Anyhow.
Forked from the original, I created a repository for the RX868 MQTT daemon. On the off-change that someone might benefit from my efforts (which I doubt, since the WS 300 PC-II has been discontinued for quite a while now), have fun with it and drop me a message, if you like!