Close
0%
0%

Making an old Air Purifier smart

adding the Phillips AC4014 to a Home Assistant network

Public Chat
Similar projects worth following
The Phillips AC4014 is certainly not the newest model of an air purifier, but I have some of them and they still work perfectly fine. Filters are readily available, so I wanted to integrate them into my Home Assistant smart home system.
One requirement was that it could still be used as originally intended, the other that I want to keep the hack as minimal invasive as possible.

After trying to understand the original electronics I decided to simply add a galvanic separated circuit. Two relays are added to the contacts of the original switches for the on/off button and for the fan speed. 

Since the Air Purifier can still be operated also manually, there is the need to measure its status. I used a transistor to set a GPIO high if the AP is on.

With these 2 switches and the sensor to identify its status, rules in node red can easily be created to have air quality measurement, or time based rules to automate the use of the Air Purifier.

As microcontroller I'm using an ESP32. Its inexpensive and ESPHome makes it super easy to integrate it into your smart home network.

mount_plate.3mf

3mf - 29.23 kB - 11/12/2021 at 08:36

Download

esp32_box.3mf

3mf - 17.58 kB - 11/12/2021 at 08:36

Download

  • 1 × ESP32 development board 30 pin I used this one because I had laying it around, any ESP32 should do
  • 2 × 1 Channel 5V Relay module or 1 two channel Relay module
  • 1 × 2N2222 Transistor
  • 1 × 10K Ω Resistor
  • 1 × 1K Ω Resistor

View all 6 components

  • Example node

    Anton11/20/2021 at 00:34 0 comments

    An example for a node red implementation:

    in Home assistant I've added a dropdown under "helpers":

    with that in place, I can select between "manual" which simply does only what is selected on the air purifier or on HA (on/off, fan speed), "automatic" which uses air quality measurement as a criteria for on/off and fan speed or "time" which turns the AP on and off at a specific time at a specific fan speed.

    here is the node:

    [
        {
            "id": "0bdc4f11ed52dc5d",
            "type": "tab",
            "label": "Air Purifier 3",
            "disabled": false,
            "info": "",
            "env": []
        },
        {
            "id": "5e0fa840110275e8",
            "type": "api-call-service",
            "z": "0bdc4f11ed52dc5d",
            "name": "on/off",
            "server": "1bb0d825.3e7398",
            "version": 3,
            "debugenabled": false,
            "service_domain": "switch",
            "service": "toggle",
            "entityId": "switch.air_3_on_off",
            "data": "",
            "dataType": "jsonata",
            "mergecontext": "",
            "mustacheAltTags": false,
            "outputProperties": [],
            "queue": "none",
            "x": 970,
            "y": 820,
            "wires": [
                [
                    "ba87b75e6fefc6fe"
                ]
            ]
        },
        {
            "id": "d08272d7bfb1789e",
            "type": "inject",
            "z": "0bdc4f11ed52dc5d",
            "name": "",
            "props": [
                {
                    "p": "payload"
                },
                {
                    "p": "topic",
                    "vt": "str"
                }
            ],
            "repeat": "10",
            "crontab": "",
            "once": false,
            "onceDelay": 0.1,
            "topic": "",
            "payload": "",
            "payloadType": "date",
            "x": 190,
            "y": 120,
            "wires": [
                [
                    "7ce007c55044a93b"
                ]
            ]
        },
        {
            "id": "32d95505345eeb3c",
            "type": "switch",
            "z": "0bdc4f11ed52dc5d",
            "name": "switch on: \\n <10, <=20, <=50, >=100",
            "property": "payload",
            "propertyType": "msg",
            "rules": [
                {
                    "t": "lt",
                    "v": "10",
                    "vt": "num"
                },
                {
                    "t": "lte",
                    "v": "20",
                    "vt": "num"
                },
                {
                    "t": "lte",
                    "v": "50",
                    "vt": "num"
                },
                {
                    "t": "gte",
                    "v": "100",
                    "vt": "num"
                }
            ],
            "checkall": "false",
            "repair": false,
            "outputs": 4,
            "x": 170,
            "y": 960,
            "wires": [
                [
                    "69d3c175ae98a9a6"
                ],
                [
                    "228bd948a665d7bc"
                ],
                [
                    "d630f8370ece3b7e"
                ],
                [
                    "805c6911af7286e6"
                ]
            ]
        },
        {
            "id": "8758ba24542abccb",
            "type": "api-current-state",
            "z": "0bdc4f11ed52dc5d",
            "name": "get measurement \\n 10pm sensor",
            "server": "1bb0d825.3e7398",
            "version": 2,
            "outputs": 2,
            "halt_if": "0",
            "halt_if_type": "num",
            "halt_if_compare": "gte",
            "entity_id": "sensor.particulate_matter_10_0um_concentration",
            "state_type": "num",
            "blockInputOverrides": false,
            "outputProperties": [
                {
                    "property": "payload",
                    "propertyType": "msg",
                    "value": "",
                    "valueType": "entityState"
                },
                {
                    "property": "data",
                    "propertyType": "msg",
                    "value": "",
                    "valueType": "entity"
                }
            ],
            "x": 210,
            "y": 580,
            "wires": [
                [
                    "32d95505345eeb3c"
                ],
                []
            ]
        },
        {
            "id": "69d3c175ae98a9a6",
            "type": "change",
            "z": "0bdc4f11ed52dc5d",
            "name": "change to 1",
            "rules": [
                {
                    "t": "set",
                    "p": "payload",
                    "pt": "msg",
                    "to": "1",
                    "tot": "num"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 390,
            "y": 900,
            "wires": [
                [
                    "6d0cd96036706e97"
                ]
            ]
        },
        {
            "id": "228bd948a665d7bc",
            "type": "change",
            "z": "0bdc4f11ed52dc5d",
            "name": "change to 2",
            "rules": [
                {
                    "t": "set",
                    "p": "payload",
                    "pt": "msg",
                    "to": "2",
                    "tot": "num"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 390,
            "y": 940,
            "wires": [
                [
                    "6d0cd96036706e97"
                ]
            ]
        },
        {
            "id": "d630f8370ece3b7e",
            "type": "change",
            "z": "0bdc4f11ed52dc5d",
            "name": "change to 3",
            "rules": [
                {
                    "t": "set",
                    "p": "payload",
                    "pt": "msg",
                    "to": "3",
                    "tot": "num"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 390,
            "y": 980,
            "wires": [
                [
                    "6d0cd96036706e97"
                ]
            ]
        },
        {
            "id": "6d0cd96036706e97",
            "type": "rbe",
            "z": "0bdc4f11ed52dc5d",
            "name": "",
            "func": "rbe",
            "gap": "",
            "start": "",
            "inout": "out",
            "septopics": true,
            "property": "payload",
            "x": 570,
            "y": 960,
            "wires": [
                [
                    "6f75c4d6d13132f8"
                ]
            ]
        },
        {
            "id": "6f75c4d6d13132f8",
            "type": "switch",
            "z": "0bdc4f11ed52dc5d",
            "name": "",
            "property": "payload",
            "propertyType": "msg",
            "rules": [
                {
                    "t": "eq",
    ...
    Read more »

View project log

  • 1
    Preparing the AC4014

    remove the filters and all the screws:

    you can now easily remove the back cover.

    Inside you find the electronics in the top part:

  • 2
    Building the additional electronics

    In order to have a galvanic isolated component, I decided to control the on/off and fan switches with relays and the air purifier status (on/off) with a transistor that sets a GPIO of the ESP high. I found it minimal invasive and it really works very well.

    I soldered the few components for the status switch on a perf board which can be stored underneath the ESP32.

  • 3
    Assembling the electronics​

    You can use the 3d printed mount bracket or you can also hot-glue the components in the air purifier cover. 

    The 3d printed bracket consists of 2 parts: the mount plate and the electronics box.

    Mount the relays with 2.5mm screws and nuts, put the status electronics in the box, connect everything and put the ESP32 on top of the box. Fix it with 2.5mm screws and nuts.

    I did not use a 5V supply from the AC4014 boards, but added an AC-DC converter (5V 700mA) which I connected to the main power and mounted onto the mount plate with a zip tie. The ESP32 is powered through the 5V pin.

    Follow the schematics and solder the connections to the AC4014 boards as indicated by the numbers:

View all 4 instructions

Enjoy this project?

Share

Discussions

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates