I recently disassembled my Philips AC0830 Air Purifier only to find the as of yet unsupported PM1003PH sensor in that thing. With the datasheet and LLMs it wasn’t too hard to figure out how it works, so I thought I’d share the custom component I let the ai overlords create in case anyone else wants to know how much pollution their Philips air purifier actually detects:
Funny enough, the readings are consistently approximatly 5 times higher than on the Ikea vindiktrig aka PM1006 sensor, but their peaks do at least align.
edit: funny enough you can get the 5V, PWM, GND and even UART RX/TX from the testpoints on the sensor to run an ESP32. Works quite well for me.
CAUTION: it outputs 4.5V so you will need a voltage divider circuit for both UART TX and the PWM output (I used 1k/2.2k which works for PWM, but I could not get the UART to work properly - maybe the 3V3 from the ESP is not high enough and I didn’t bother with a logic level shifter).
Thanks for the contribution, friend. I’m trying to use this with the pm1003ph found in a Blue air purifier. I soldiered it up to an esp8266. With UART debugging enabled, I get this:
[22:11:08][D][pm1003ph:099]: Sending UART request
[22:11:08][W][pm1003ph:105]: Timeout waiting for response
[22:11:09][E][uart:015]: Reading from UART timed out at byte 0!
[22:11:09][D][uart_debug:158]: >>> "\x11\x02\v\x01\xE1"
… which makes me think it gives up too quickly. Is there a way to make it more patient?
hey i want to do the same but could make it yet because i have no resistors. you mentioned that the values aare not correct 5times higher and the problem is, that the sensor output raw data that has to be calculated first according to the datasheet from that sensor. the pm1006 does calculate it on board. so in this case it should be possible to uart sniff it, do the right calculation in the esphome external component and get an air quality sensor for home assistant. the peaks are the same so thats why they allign. the phillips mainboard does the calculation in its propriatary firmware. and to try to control it with uart swithc modes etc will result in bus conflict. i will share the code later and you can try please? basically both sensor work similar so technically it works for you when using the 1006driver.
the sensor needs a command signal to make it answer with the value, so the only thing required is
tx from sensor to rx from esp
also voltage need to be divided according to datasheet
i have not opened the device yet just saw from the opening that inside is uart connector.
◆PWM communication:
PWM communication description:
-Pulse width: 1ms~1000ms
-Low level duty ratio: low pulse time T1+T2+T3+…+Tn/PWM cycle To(30s)(%)
-The sensor will output PWM signal after powered on
◆UART communication
UART level range
-UART RX: 0~4.5V data input
-UART TX: 0~4.5V data output
UART configuration
-Data bit: 8
-Stop bit: 1
-Parity bit: no
-Baud rate: 9600bps
◆Read measuring result of particles:
Send: 11 02 0B 01 E1
Response:16 11 0B DF1-DF4 DF5-DF8 DF9-DF12 DF13 DF14 DF15 DF16[CS]
Description: The value(n) = DF3*256+DF4
Note: DF1-DF2 is reserved, DF5-DF16 is reserved
(n=PWM duty ratio *1000, It is the average of the 70s)
The UART output value is equivalent to the average value of the 70s after the PWM output value’s duty ratio * 1000.