Homey Community Forum

[HOWTO] BUVA Boxstream Mechanical ventilation hack


#1

We own a BUVA Boxstream mechanical ventilation system in our home that i wanted to automate. There is a 0-10V sensor that could be used with a simple 0-10V zigbee, zwave or 433Mhz module but you can’t use the RF module at the same time when using a 0-10V module. my goal wat to have the system automated and at the same time keeping the wall remotes.

We had a spare remote laying around that i opened up.

While looking for images i noticed some websites dare to ask €100+ for this thing. lol.

The PCB inside is easy to remove and houses a 3V battery.
I’ve used a multimeter to check voltages on the buttons and found that the normal state of a button is 0Volt and a High state of 3Volt. Hurray! the remote is ideal with a arduino type board.

I used a wemos D1 mini (or clone) It has a 3.3v output and can trigger 3.3v on it’s D pins.

Here is the overview of the schematic i used.

Here is the endresult:

I have build a simple bit of code to automate it and a simple web app to support it.
any request will respond with the simple webinterface

The following URL’s can be called from any device to controll the ventilation system:

Webinterface:
http://[IP Address]/

Mode 1:
http://[IP Address]/mode1

Mode 2:
http://[IP Address]/mode2

Mode 3:
http://[IP Address]/mode3

Mode Time:
http://[IP Address]/modeT

Mode Time x2:
http://[IP Address]/modeT2

Pairing:
http://[IP Address]/pairing

Webinterface:

Source Code:
Change your WiFi SSID and Password to make it work.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

#ifndef STASSID
#define STASSID "MY SSID"
#define STAPSK  "MY PASSWORD"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

ESP8266WebServer server(80);

void httpDefaultResponce() {
  digitalWrite(D4, 0);
  server.send(200, "text/html", "<html><head></head><body><b>Control</b><br><a href=\"/mode1\">Set Mode: 1</a><br><a href=\"/mode2\">Set Mode: 2</a><br><a href=\"/mode3\">Set Mode: 3</a><br><a href=\"/modeT\">Set Mode: 4 15 Minutes</a><br><a href=\"/modeT2\">Set Mode: 4 30 Minutes</a><br><br><br><b>Pairing<b><br>The ventilation motor allows pairing only in the first 10 minutes after getting power.<br>To pair a remote, disconnect the power cable and then reconnect the power cable of the ventilation motor.<br><a href=\"/pairing\">Start pairing.</a></body></html>");
  digitalWrite(D4, 1);
}

void cleanStates() {
  digitalWrite(D0, 0);
  digitalWrite(D1, 0);
  digitalWrite(D2, 0);
  digitalWrite(D3, 0);
}

void setup(void) {
  pinMode(D0, OUTPUT);
  digitalWrite(D0, 0);
  pinMode(D1, OUTPUT);
  digitalWrite(D1, 0);
  pinMode(D2, OUTPUT);
  digitalWrite(D2, 0);
  pinMode(D3, OUTPUT);
  digitalWrite(D3, 0);
  pinMode(D4, OUTPUT);
  digitalWrite(D4, 1);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  digitalWrite(D1, 1);
  if (MDNS.begin("esp8266")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", httpDefaultResponce);
  
  server.on("/mode1", []() {
    httpDefaultResponce();
    digitalWrite(D1, 1);
    delay(200);
    cleanStates();
  });

  server.on("/mode2", []() {
    httpDefaultResponce();
    digitalWrite(D2, 1);
    delay(200);
    cleanStates();
  });

  server.on("/mode3", []() {
    httpDefaultResponce();
    digitalWrite(D3, 1);
    delay(200);
    cleanStates();
  });

  server.on("/modeT", []() {
    httpDefaultResponce();
    digitalWrite(D0, 1);
    delay(200);
    cleanStates();
  });

  server.on("/modeT2", []() {
    httpDefaultResponce();
    digitalWrite(D0, 1);
    delay(2500);
    cleanStates();
  });

  server.on("/pairing", []() {
    httpDefaultResponce();
    digitalWrite(D0, 1);
    digitalWrite(D1, 1);
    delay(7000);
    cleanStates();
  });

  server.onNotFound(httpDefaultResponce);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
  MDNS.update();
}