BUVA Boxstream mechanical ventilation. Hacked an API to it.

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 was 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 webinterface to support it. any request will respond with the simple webinterface.

I'm using our NEEO but 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 "Type SSID here"
#define STAPSK  "Type Password Here"
#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();
}
Reply
Reply Oldest first
  • Oldest first
  • Newest first
  • Active threads
  • Popular
Like1 Follow