IKEA Vindriktning Air Quality Sensor

I had the same problem, the pads went loose, so my idea is to connect the 3 cables directly to the sensor, so can you provide me the layout order of the black cables that i can connect?

thanks

Has anyone used the M5Stack in this sensor? I’m wondering if I could use this and also make it a bluetooth proxy with ESPHome??

I’ve used an m5stamp

I see in this thread several comments that instead of ESP8266 we can use also ESP32.
I have D1 Mini ESP32 but how hard I try, I can’t find wiring or configuration examples for ESP32.
I noticed warning about not to exceed 3,3V with ESP32, but I really would appreciate clear wiring schema, not to burn down something.
Seems @Habbie has built ESP32 version, please advise where to find some project examples

On the ESP32, you can use almost any pin you like. See UART Bus — ESPHome

1 Like

I also had the idea to put motion sensor like somebody did, but decided it would be to much cable mess inside with the esp and screen:)
This is esp 8266 + tasmota mega + SSD1306 oled

10 Likes

I made a descriptive summary of how I finally got control over my IKEA STARKVIND from Home Assistant. In case anyone else would like to check it out - you’ll find a PDF on OneDrive here:

If you have access to a 3d printer, there is this nice front case replacement with a place for the SSD1306 OLED: Printables

2 Likes

I think that you posted this in the wrong topic.

As this one is about the Vindriktning air quality sensor from IKEA and its DIY hack. It is neither the air purifier, neither zigbee, especially not DeConz.

Otherwise, posting your finding in a post and not in a PDF is more appreciated in the forum.

Excuse me. It won’t happen again.

Has anyone ever experienced Vindriktning’s measurement results drifting off over time (see below) until I reset the Vindriktning (drops back to normal in the graph below)?


What I found odd, looking at the graph

  1. The drift could be set back to zero but always started again after I re-starting the entire Vindriktning
  2. The drift was triggered by spikes (spikes lead to increasing baselines by just 1 or 2 um, which, over time, cause the sensor to drift away)
  3. At first I thought I’m looking at a problem with the ESP, but I got exactly the same results also with a different ESP
  4. To be absolutely sure that it’s not the ESP messing with the Vindriktning’s internal hardware, I disconnected the ESP completely. Still same drift, but had to wait for ~10 days for the measurement results turning the LED turned from green to orange.

Faulty hardware? Or has anyone else experienced the same? Can’t be that “connecting the ESP” damages he Vindriktning?

What I also found odd: From what I read online, there’s hardly any “calibration-intelligence” in the Vindriktning, but looking at the graph there has to be?

Just saw this… Interesting how it evolves… :slight_smile:

8 Likes


i wonder when some of these commercial products using this filter / mesh textile, it also purify the measured air or with other words faking the measurements.

I don’t thinks so. It is not a HEPA filter and all small particles can go through

Just some update on the drift: I got another Vindriktning and did the same ESP-hack. Same result: The result drifts off, not as fast as with the first Vindriktning, but it still does, and is reset with a reboot (very narrow area on the far right).

Anyone else experiencing this? Any way to stop this?

For those allowing the fan to run 100% of the time, the main issue is that the fan will fail sooner, the sensor will get dirty sooner (which will affect its function) and the noise generated by the fan may increase over time as it deteriorates mechanically. For me, these are all good reasons to ensure the fan is turned off when not needed. A simple GPIO line and a transistor can do that. The big issue I am having is the very limited space inside the case, and the fact I would like to include a temperature sensor. The ESP and the PM1006 both generate heat which skew the temperature measurements. The fan itself doesn’t do much with regards to temperature unless you put the sensor in the top section… but heat also rises so I am not sure that is the best place to put the sensor either. Has anyone found a good solution that doesn’t include a software error correction (don’t like this option as the delta is likely not fixed).

Pictures showing the source of heat in the Vindriktning:

Fan:

The sensor itself:

I forgot to take pictures that included the ESP but that too had a spot around 30C

1 Like


My config Ikea Vindriktning Air Quality Sensor + BME680 Sensor + ESP8266 d1 mini:

Vindriktning === ESP8266 d1 mini GPIOS:
5V - 5V
GND - GND
REST - D2 GPIO4

BME680 === ESP8266 d1 mini:
VCC - 3.3V
GND - GND
SDO - GND
SCL - D6 GPIO 12
SDA - D7 GPIO 13

substitutions:
  name: multisensor
  friendly_name: "MultiSensor Air"
 
esphome:
  name: "${name}"
  platform: ESP8266
  board: d1_mini
 
# Enable logging
logger:
 
# Enable Home Assistant API
api:
web_server:
  port: 80
  local: true
  ota: false
 
ota:
  safe_mode: true
  password: "put yours on"
 
wifi:
  ssid: put yours on
  password: "put yours on"
  use_address: 192.168.x.xxx
 
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "MultiSensor Hotspot"
    password: 'put yours on'
 
captive_portal: 
 
# BME680 sensor
i2c:
  scl: GPIO12 #D6
  sda: GPIO13 #D7
  scan: True
  id: bus_a
 
bme680_bsec:
  address: 0x76
  sample_rate: ulp
 
# Ikea Vindriktning PM2.5 sensor
uart:
  rx_pin: D2
  baud_rate: 9600
 
sensor:
  - platform: pm1006
    pm_2_5:
      name: "Particles PM2.5"
      id: pm_2_5
      accuracy_decimals: 2
      filters:
        - sliding_window_moving_average:
            window_size: 50
            send_every: 10
      disabled_by_default: false
      internal: false
# BME680 sensor
  - platform: bme680_bsec
    temperature:
      name: "Temperature"
      accuracy_decimals: 2
      filters:
        offset: -2
      disabled_by_default: false
      internal: false
    pressure:
      name: "Pressure"
      accuracy_decimals: 2
      unit_of_measurement: "mmHg"
      filters:
         - multiply: 0.75006375541921
      disabled_by_default: false
      internal: false
    humidity:
      name: "Humidity"
      accuracy_decimals: 2
      disabled_by_default: false
      internal: false
    gas_resistance:
      name: "Gas Resistance"
      accuracy_decimals: 2
      disabled_by_default: false
      internal: false
    iaq:
      name: "IAQ"
      id: iaq
      accuracy_decimals: 2
      disabled_by_default: false
      internal: false
    co2_equivalent:
      name: "CO2 Equivalent"
      accuracy_decimals: 2
      disabled_by_default: false
      internal: false
    breath_voc_equivalent:
      name: "Breath VOC Equivalent"
      accuracy_decimals: 2
      disabled_by_default: false
      internal: false
  - platform: uptime
    name: "Uptime"
    disabled_by_default: false
    internal: false
 
text_sensor:
  - platform: bme680_bsec
    iaq_accuracy:
      name: "IAQ Accuracy"
      disabled_by_default: false
      internal: false
 
  - platform: wifi_info
    ip_address:
      name: "IP address"
      disabled_by_default: false
      internal: false
 
  - platform: template
    name: "IAQ Classification"
    disabled_by_default: false
    internal: false
    icon: "mdi:checkbox-marked-circle-outline"
    lambda: |-
      if ( int(id(iaq).state) <= 50) {
        return {"Excellent"};
      }
      else if (int(id(iaq).state) >= 51 && int(id(iaq).state) <= 100) {
        return {"Good"};
      }
      else if (int(id(iaq).state) >= 101 && int(id(iaq).state) <= 150) {
        return {"Lightly polluted"};
      }
      else if (int(id(iaq).state) >= 151 && int(id(iaq).state) <= 200) {
        return {"Moderately polluted"};
      }
      else if (int(id(iaq).state) >= 201 && int(id(iaq).state) <= 250) {
        return {"Heavily polluted"};
      }
      else if (int(id(iaq).state) >= 251 && int(id(iaq).state) <= 350) {
        return {"Severely polluted"};
      }
      else if (int(id(iaq).state) >= 351) {
        return {"Extremely polluted"};
      }
      else {
        return {"error"};
      }
# Ikea Vindriktning PM2.5 sensor
  - platform: template
    name: "PM2.5 Classification"
    disabled_by_default: false
    internal: false
    icon: "mdi:blur"
    lambda: |-
      if ( int(id(pm_2_5).state) <= 25) {
        return {"Excellent"};
      }
      else if (int(id(pm_2_5).state) >= 26 && int(id(pm_2_5).state) <= 50) {
        return {"Good"};
      }
      else if (int(id(pm_2_5).state) >= 51 && int(id(pm_2_5).state) <= 100) {
        return {"Polluted"};
      }
      else if (int(id(pm_2_5).state) >= 101 && int(id(pm_2_5).state) <= 300) {
        return {"Heavily polluted"};
      }
      else if (int(id(pm_2_5).state) >= 301) {
        return {"Extremely polluted"};
      }
      else {
        return {"error"};
      }
button:
  - platform: restart
    id: restart_button
    name: "Restart
6 Likes

the sensor will get dirty sooner (which will affect its function) and the noise generated by the fan may increase over time as it deteriorates mechanically.

This is excatly what was happening to mine. It was making a loud noise. When I inspected the components inside the case, there were lint on the black mesh and the fan top (where the label is) had some dirt as well. I blew it off with air spray. Tested with it before mounting it back on and the noise was gone. The fan seems ok when I spun it. It will probably happen again down the road.

For me, these are all good reasons to ensure the fan is turned off when not needed.

The OP has tested the sensor with the fan being completely turned off, but the reading off.

A simple GPIO line and a transistor can do that.
Do you have image to show how it looks like and what gpio pin used?

I am using a ESP8266 d1 mini and would like to use a light photocell. Since the A0 pin is taken, is there an alternative pin or solution?

The article talks about variable speed but you can also just use it for on/off. When the sensor is not measuring, then ideally the fan would be off. When ready to measure, fan should be turned on and after a few seconds take the measurement if software allows this level of control. I am using a PMS5003 and with that similar sensor it can be done (no need for transistor though with that sensor).