IKEA Vindriktning Air Quality Sensor

Thanks @Habbie for confirming that it should work with 3,3V.
@Mahko_Mahko yes I did, the device and the fan.

I think I have a dead on arrival device. I have re-attached it to the normal device and there it also stays green all the time. As described before probably there does not take place any communication.

I think I will get a new one, once it is available again …

I can confirm from tests that it will stay green if the sensor is dead… sorry to hear you experienced that with everything connected.

You could grab one of these instead?

AU $6.07 5%OFF | PMS5003 PMS7003 PMS7003T PMS5003ST PMS3003 PMSA003 Sensor Module PM2.5 Air Particle Dust Digital Temperature and Humidity Laser

To be honest I don’t think it’s dead, all 3 units I have work when attached to the original Ikea pcb, I analyzed the signals with an oscilloscope, and it looks fine, when I attach it to an ESP8266 I don’t get a signal back from the sensor. Connecting it back to the Ikea pcb, it works again. The data the ESP sends and what the Ikea MCU sends also look identical. It’s really weird.

edit: add pictures of scope attached to ikea pcb

measured directly on the pins of the connector

measured at the test pads, it looks like the scope has issues decoding the messages send and received

Hi Meinereiner, I have the exact same problem as you. I use the pm1006 sensor together with ESP32-WROOM with the following ESPhome code. So I got some debug information.


  rx_pin: ${pm1006_pin_tx}
  tx_pin: ${pm1006_pin_rx}
  baud_rate: 9600
    direction: BOTH
    dummy_receiver: false
      delimiter: "\n"
      - lambda: UARTDebug::log_string(direction, bytes);

  - platform: pm1006
      id: pm2_5_value
      name: "${node_name} PM2.5"
    update_interval: 20s

According to the code on GitHub, the sensor should send the following request: 0x11, 0x02, 0x0B, 0x01, 0xE1
But it seems to send the character “v” instead of 0x0B.
See my log today.

[20:37:10][V][pm1006:024]: sending measurement request
[20:37:10][D][uart_debug:158]: >>> "\x11\x02\v\x01\xE1"
[20:37:10][V][pm1006:038]: Byte 0 of received data frame is invalid.
[20:37:10][V][pm1006:038]: Byte 0 of received data frame is invalid.
[20:37:10][V][pm1006:038]: Byte 0 of received data frame is invalid.
[20:37:10][V][pm1006:038]: Byte 0 of received data frame is invalid.
[20:37:10][V][pm1006:038]: Byte 0 of received data frame is invalid.
[20:37:10][V][component:199]: Component pm1006.sensor took a long time for an operation (0.05 s).
[20:37:10][V][component:200]: Components should block for at most 20-30ms.
[20:37:10][D][uart_debug:158]: <<< "\x11\x02\v\x01\xE1"
[20:37:10][VV][scheduler:185]: Running interval 'update' with interval=60000 last_execution=1102 (now=61105)
[20:37:10][V][sensor:074]: 'IKEA PM2.5 24h average': Received new state nan
[20:37:10][VV][sensor.filter:014]: Filter(0x3ffb2c44)::input(nan)
[20:37:10][VV][sensor.filter:183]: SlidingWindowMovingAverageFilter(0x3ffb2c44)::new_value(nan) -> 0.000000
[20:37:10][VV][sensor.filter:195]: SlidingWindowMovingAverageFilter(0x3ffb2c44)::new_value(nan) SENDING
[20:37:10][VV][sensor.filter:021]: Filter(0x3ffb2c44)::output(0.000000) -> SENSOR
[20:37:10][D][sensor:125]: 'IKEA PM2.5 24h average': Sending state 0.00000 µg/m³ with 1 decimals of accuracy
[20:37:10][V][text_sensor:016]: 'IKEA Air Quality Index': Received new state Bad
[20:37:10][D][text_sensor:067]: 'IKEA Air Quality Index': Sending state 'Bad'
[20:37:10][VV][api.service:174]: send_text_sensor_state_response: TextSensorStateResponse {
  key: 252667721
  state: 'Bad'
  missing_state: NO

@Habbie, could you please confirm that I am proceeding correctly in finding the error?
Thank you so much.

I have also tried using an external component, but also without success.

  - source: github://pr#2214
      - pm1006
1 Like

It is sending \v, not v. If you look at ASCII - Wikipedia, you’ll note that \v is in fact 0x0B.

Your UART reports sending the command. Then it also reports receiving the command, which should not happen. The pm1006 should receive the command, and send a response; then your UART should report that it receives the response (which starts with 0x16 0x11 0x0B). This looks like a wiring problem.

1 Like

Thank you very much for your time and for your explanation. I don’t know where the mistake could have been. I haven’t changed anything since last night, and when I turned it back on today, everything works great.
Probably an old IT trick called rebooting helped.

Here is a photo of my IKEA Vindriktning Air Quality Sensor


That’s a nice cut for the lcd display. Can you share some more photos how you fitted things inside and how have you cut that hole?

It’s not a hole in the original cover, but a new part, printed on a 3D printer. I uploaded the model to PrusaPrinters a little while ago.

Inside the box is PCB from Czech makers - LáskaKit.


@TataGEEK nice that you got it working.

One others thing that I recognized: in have another one which I’m using with the original PCB attach and just reading the UART. I had also some struggles with the esp32 but since I was using RXD2 and giving the UART a name which I added in the sensor as well, at least this pm1006 was working.

Maybe that is on help for anybody …

It is really nice. Kudos to them.

I paste here a link just for reference to others:

What sensor do you have attached to yours? Is that the CO2 sensor from the website? That is a really steep choice for 1418 CZK…
Then what is your final bill at the end? Around 3000 CZK? Does it worth it?
The PM1006 makes it cheap and unreliable but the other equipment seems to be at a different level compared to the PM1006. Nice work!

1 Like

Here’s a side by side of three PM2.5 sensors I have.

  • A PM1006 from my Air Purifier
  • A sensor from my Xiaomi Air Purifier (type unknown to me)
  • A PMS7003

If I take 65% of the PM1006 I get in range of the other two.

1 Like

Why is that so blocky? I have an older Xiaomi Airpurifier and that reports when the value changes, even in a few seconds.

Not sure.

For my pms7003 I actually implemented some life extension routines.

Maybe they have done the same?

Thanks for adding the link. As a newbie, I can only add a limited amount of links and images to a post.

Yes, I used a high quality and expensive Sensirion CO2 sensor combined with a very inaccurate PM1006. It really doesn’t seem like a good idea. I will probably place the CO2 sensor completely outside the box. The sensor has a thermometer and hygrometer integrated in it, and measures 5°C higher because it is placed directly above the ESP. When you flash new firmware, the temperature will increase by 8°C for a short time.

I will probably place the CO2 sensor in a separate unit and get the data for the display from Home Assistant.

I fell for that trap too with a DIY device as a lot of people do the first time it seems.

As quick mitigation, I found that calibration (like in my charts a few posts up), can get temp within 1% (which is probably ok for most use cases) and humidity back to useful values too (~ ± 5%).

Apparently heat can come from and be transmitted by a number of sources (for example via the wires).

I think i found the issue with some devices not working when using them without the IKEA MCU.
I contacted Cubic about this sensor, and their engineer told that when the sensor doesn’t receive a request within 5s after boot it will go into PWM mode. (This information is missing in the translated datasheet of the PM1006, but it is actually the same as the PM1006K)

With that information I attached the scope to it when booting, and I noticed that immediately when the data lines become high ESPHome sends the request, so that got me thinking it might be that some sensors may require a little more startup time to be able to read the requests.
I added the following automation to my config and now it’s working!

    priority: 240
      - uart.write:
          id: ikea #id of the uart bus used for the PM1006
          data: [0x11, 0x02, 0x0B, 0x01, 0xE1]

@Habbie can you confirm when the first data request is being send to the sensor?

And @Meinereiner can you maybe also try if this automation can make the “dead” sensor alive again?
I don’t have more sensors to test this “fix” on and I’m curious if it really is that simple.


How often does the sensor send out data?

I’m trying to build this thing, but I don’t get any data from the sensor. My Wemos Mini D1 is powered from the original PCB. The wemos works correctly. I have also attached a mhz19 co2 sensor. This one works fine too (update every 60s). The fan is also powered from the wemos. The fan works too.

I’ve connected the 2nd from the left pad to D3 on the Wemos. This should be correct, right? I have even replaced the wire and soldered it again, but still no succes.

Never mind. I tried another pin D5 and then it worked fine. I guess D3 is one of those special pins.

1 Like

I’ve had the Vinketering running for a couple months now. But lately, occasionally it’s giving very low (stable) values. Like 1-2ug/m3. Before, it never went below 5-6.
I don’t have an air purifier or similar.

Does anyone experience the same with this sensor?

Yes, have experienced the exact same. But have also seen the stable readings go back up. I think that this is due to the air quality of the outside air that is influencing the air inside your home, which can change over time?