New version of Plantower PMS5003

We recently found that there is a new design of the Plantower device that we were not aware of and have been supplied with lately. It has all the same markings on the outside but a new PCB on the inside. We identified a way to id these new devices in the field both from the PA firmware (with a future update) or directly in the data they provide now.

These devices use a new MCU (microcontroller) and may be a result of a new design originating from hardware availability and COVID supply line issues for Plantower. This is just speculation because we have not been told anything as to why.

The readings for this new design differ in that below 16ug/m3 of PM2.5, the readings get less and less when compared to the previous design and can be 50% or more lower. The particle counts are a little different too. Plantower told us that the 0.3um counts were divided by three, so this is one way to identify these new devices. 0.3 counts / 0.5 counts = < 2 for new style hardware and > 3 for old.

I have attached test results comparing the two designs (blue lines in the attached graphs are the new ones).


Thanks for sharing the information and the data comparisons. So a future FW update will apply some kind of conversion/calibration to measurements from these new boards?

1 Like

We are working out how to deal with this properly, including the following:

  • Testing the new variant and comparing it against FEM sensors (Federal reference methods)
  • Considering a “flag” on the API to indicate which laser counter generated the data
  • “correcting” the particulate counts for 0.3 microns

I welcome discussion on this subject here.


Personally, I would prefer some kind of flag on data generated by this variant of the sensor. Then any analyst could apply (or not) some correction or conversion. In reality, the differences are small and only at lower values.

But for public consumption of data, it might be nice if what was displayed on the map was already “converted.” I know that in our community, people ask (on FB) why a lot of the sensors read lower than others. When I try to explain that the difference is neglible, and due to new hardware, people lose trust in the measurements. And even though I state that the differences are really negligible and only in the low range, people still lose trust. Which is funny because it seems to me that the average consumer of the map data really just wants to see green-yellow-red-purple. But when they do see a difference of 3 or 4 at values below 20, they still start to wonder about data quality.


Thanks for this detailed explanation! I’ll have more thoughts soon, I’m sure, but my main reflection on this topic is that it would be really valuable to have the calibration in place as the default for the map – old monitors and new monitor readings are adjusted so that you can look at them all on the same map and one part of town doesn’t look less polluted than another part of town.


One other question about this: Does the US EPA conversion on the PurpleAir map make the new Plantower readings more or less accurate?

We will need to wait for the results of the evaluations to be sure. Since the new laser counters are only different in low numbers, any AQI above 50 (yellow) will likely not be affected.


Thanks for this info. This might explain why I have received two different pms5003 sensors over the last few months from different vendors (for personal projects) which both gave readings of zero for pm2.5 in scenarios where older sensors were registering low values (3 or 4 ug/M3). The older sensors tied in very closely with my PurpleAir so I assumed I was just unlucky and that the two new ones were bad sensors, but its possible this was due to the new sensor design.

Have you noticed this at all with other models at all e.g pms6003 sensors used in the latest PurpleAir?

So far, this new hardware is only present in the PMS5003, but we will be on the lookout for anything strange in the 6003’s.

1 Like

I now have a way to determine if the sensor has the new PMS5003 (looking at the ratio of 0.3 counts to 0.5 counts). But can you boil down the correction to apply to them, to get actual PM2.5? I know you’re working on official updates, including via the South Coast AQMD, but is there a rough equation to make the adjustment, that can be produced from the graphed data you’ve provided as part of this thread, i.e. form of a line equation

y = mx + b


y = the correct 2.5
m is the gain
x is the sensor 2.5
b is the b-intercept (think college algebra!).

That way, I’d have a means to correct local (and far) meters that I know are with the new PMS5003, to get an actual indication of pollution, rather than the optimistic one these new Plantower-based sensors often provide.


I would not be able to tell you how to correct them yet. What we are playing with, is the following:
If the 0.3 / 0.5 ratio is less than two, multiply the 0.3 counts by three and then use the ALT CF=3 conversion. We use Object as inputs to this function for various reasons but you don’t have to.

    //p03 is the 0.3um count
    //p05 is the 0.5um count
    //p10 is the 1.0um count
    //p25 is the 2.5um count
    public static final double CF_3 = 3.0;

      public static Object pm25alt(final Object p03, final Object p05, final Object p10, final Object p25, final Double cf) {
        if (p03 == null || p05 == null || p10 == null || p25 == null) {
          return null;
        if (!Numbers.isNumeric(p03.toString()) 
            || !Numbers.isNumeric(p05.toString()) 
            || !Numbers.isNumeric(p10.toString()) 
            || !Numbers.isNumeric(p25.toString())) {
          return null;
        double p1 = Double.parseDouble(p03.toString());
        double p2 = Double.parseDouble(p05.toString());
        double p3 = Double.parseDouble(p10.toString());
        double p4 = Double.parseDouble(p25.toString());
        if (p1 / p2 < 2) {
            //System.out.println("Tripling..." + p1 + " / " + p2 + " = " + (p1 / p2));
            p1 = p1 * 3;
        double m1 = getMass(p1 - p2, 0.3,  0.5);
        double m2 = getMass(p2 - p3, 0.5,  1.0);
        double m3 = getMass(p3 - p4, 1.0,  2.5);
        //var m4 = getMass(p4 - p5, 2.5,  5.0);
        //var m5 = getMass(p5 - p6, 5.0, 10.0);
        //var pm1 = m1 + m2;
        double pm25 = m1 + m2 + m3;
        //var pm10 = m1 + m2 + m3 + m4 + m5;
        return pm25 * (cf == null ? CF_3 : cf);


      private static double getMass(final double countDl, final double d, final double e) {
        double densityGCm3 = 1.0;
        double geometricMeanUm = Math.sqrt(d * e);
        double volume = countDl * Math.PI * Math.pow(geometricMeanUm, 3) / 6.0;
        return volume * densityGCm3 / 100.0;

isNumeric (a check if the object is a number) is as follows:

  private static final Pattern PATTERN = Pattern.compile("^(-?0|-?[1-9]\\d*)(\\.\\d+)?(E\\d+)?$");

  public static boolean isNumeric(final String value) {
    return value != null && PATTERN.matcher(value).matches();

This may or may not be useful to you!


I just ran across this “new” Plantower change. This is almost exactly what I feared could happen when limited to the “black box” CF1 or CF_ATM algorithms. That is, the change could be made and there would be no way to determine the effect of the change. How do we know there was not one or more changes made in the last five years or so?

I would like to study this in more detail. Can I buy two PA-II monitors which are known to represent the new changed design?

Also what about the effect, if any, on the PA-I monitor (PMS 1003)?. In this case, I have never operated a PA-I monitor, so if there is an effect, I would want two new PA-I monitors and two “old” PA-I monitors?

Finally, why do you mention the 6003? Are some PurpleAir monitors using that?

Thanks. Not quite as simple as a line equation :slight_smile: but complex by necessity. I write software, so can figure out what you posted. I thought to put into an Excel spreadsheet, but appears that could be a bit too involved for that.


Lance, the change also affects the particle count outputs. Your ALT method helps to reduce the effect and we are working on adding the ability to do the X 3 to the 0.3um counts where needed on the affected conversion and other layers.

The only change we have seen so far is the PMS5003. The 6003 is a new version that seems to be unaffected and we are using them on the new PA-II-FLEX. The PA-II-FLEX is currently with SCAQMD’s AQSPEC program for evaluation.

I would be happy to send you samples of the new devices, please email us at with your shipping info and we will get those to you.

Robert, as you probably know, you can create functions in Excel so it may work there too with some changes to syntax.

Adrian –

Many thanks for the offer but it will be better if I just buy the instruments. I in fact guessed that the Flex would have the new 6003 so I ordered two a few hours ago. I couldn’t find the sensor model listed in the PurpleAir description.

Lance, just so you know, the FLEX has as you say, the 6003’s and they perform the same as the “old” 5003’s. It is some newer version of hardware inside the 5003’s that exhibits this behavior and it was those I was offering to send you.

Oh, Adrian, thank you for that. I assumed the 6003 would also have the “new” 5003 change. In that case, I would like to make sure I get the “new” 5003s. I still would like to pay for them. If I order them directly, will I be certain to get the “new” versions? I’ll send in an order now and try to cancel the Flex order.

Regarding the question: “One other question about this: Does the US EPA conversion on the PurpleAir map make the new Plantower readings more or less accurate?”

That is a difficult question to address. If you would like to learn more about the US EPA correction equation, I recommend these two websites for info: Technical Approaches for the Sensor Data on the AirNow Fire and Smoke Map | US EPA
Sensor data cleaning and correction: Application on the AirNow Fire and Smoke Map | Science Inventory | US EPA

1 Like

Did Purple Air alter their correction for this issue? I’m asking because we have about 50 of these monitors that all appear to have the new MCU. I’m not concerned about the issue itself, since we correct all of our data anyway (based on collocations with FEM and FRM monitors), but we do use a combination of data pulled from the API and SD data. I’m assuming any correction applied to data from the API would not be reflected in the SD data?