How to add Starkvind Air Cleaner

Just a short question …
How can I add a IKEA STARKVIND to my Conbee 2. It´s not a light, sensor or switch …
Thanks for your answers :wink:

Here is already a request and you can follow the progress

Moved this topic to deconz - general support.

@Jaym please post in the correct category next time. Thanks :)!

Hi. Today I got my Starkvind purifier. I can see the device in the map (I use a Win10 client). I can also change some settings like “Fan” and i also get the values from the sensor (air quality).
But it will not appear in the Phoscon App and therefor not in the API.
Is there something i have to change?
image

I can only put one screen shot in my first post :wink:

1 Like

But maybe it would be possible to get an working DDF for the device. I tried it, but did not get it run.
This is what i created. But not working

{
  "schema": "devcap1.schema.json",
  "manufacturername": "$MF_IKEA",
  "modelid": "STARKVIND Air purifier table",
  "product": "STARKVIND Air purifier table",
  "sleeper": false,
  "status": "Gold",
  "path": "/devices/starkvind_air_purifier_table.json",
  "subdevices": [
    {
      "type": "$TYPE_AIR_QUALITY_SENSOR",
      "restapi": "/sensors",
      "uuid": [
        "$address.ext",
        "0x01",
        "0x0000"
      ],
      "items": [
        {
          "name": "attr/id"
        },
        {
          "name": "attr/lastannounced"
        },
        {
          "name": "attr/lastseen"
        },
        {
          "name": "attr/manufacturername"
        },
        {
          "name": "attr/modelid"
        },
        {
          "name": "attr/name"
        },
        {
          "name": "attr/swversion"
        },
        {
          "name": "attr/type"
        },
        {
          "name": "attr/uniqueid"
        },
        {
          "name": "config/fanmode",
          "refresh.interval": 5,
          "read": {
            "at": "0x0000",
            "cl": "0x0202",
            "fn": "zcl",
            "mf": "0x117c"
          },
          "parse": {
            "at": "0x0000",
            "cl": "0x0202",
            "ep": 0,
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "config/ledindication",
          "parse": {
            "at": "0x0003",
            "cl": "0xfc7d",
            "ep": 0,
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "config/locked",
          "parse": {
            "at": "0x0005",
            "cl": "0xfc7d",
            "ep": 0,
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "config/on"
        },
        {
          "name": "config/reachable"
        },
        {
          "name": "state/airquality"
        },
        {
          "name": "state/airqualityppb",
          "read": {
            "at": "0x0004",
            "fn": "zcl"
          },
          "parse": {
            "at": "0x0004",
            "cl": "0xfc7d",
            "ep": 0,
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "state/lastupdated"
        },
        {
          "name": "state/on",
          "refresh.interval": 5,
          "parse": {
            "at": "0x0000",
            "cl": "0x0202",
            "ep": 0,
            "eval": "Item.val = Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "state/speed"
        }
      ]
    }
  ]
}

@ebaauw made a attemped already on it.

{
  "schema": "devcap1.schema.json",
  "manufacturername": "$MF_IKEA",
  "modelid": "STARKVIND Air purifier",
  "product": "STARKVIND Air purifier",
  "sleeper": false,
  "status": "Bronze",
  "path": "/devices/starkvind_air_purifier.json",
  "subdevices": [
    {
      "type": "$TYPE_AIR_QUALITY_SENSOR",
      "restapi": "/sensors",
      "uuid": [
        "$address.ext",
        "0x01",
        "0xfc7d"
      ],
      "fingerprint": {
        "profile": "0x0104",
        "device": "0x0007",
        "endpoint": "0x01",
        "in": [
          "0x0000",
          "0x0202",
          "0xFC7D"
        ]
      },
      "items": [
        {
          "name": "attr/id"
        },
        {
          "name": "attr/lastannounced"
        },
        {
          "name": "attr/lastseen"
        },
        {
          "name": "attr/manufacturername"
        },
        {
          "name": "attr/modelid"
        },
        {
          "name": "attr/name"
        },
        {
          "name": "attr/swversion"
        },
        {
          "name": "attr/type"
        },
        {
          "name": "attr/uniqueid"
        },
        {
          "name": "config/ledindication",
          "parse": {
            "at": "0x0003",
            "cl": "0xfc7d",
            "ep": 255,
            "eval": "Item.val = !Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "config/locked",
          "parse": {
            "at": "0x0005",
            "cl": "0xfc7d",
            "ep": 255,
            "eval": "Item.val = Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "config/on"
        },
        {
          "name": "config/reachable"
        },
        {
          "name": "state/airqualityppb",
          "parse": {
            "at": "0x0004",
            "cl": "0xfc7d",
            "ep": 255,
            "eval": "Item.val = Attr.val == 65535 ? undefined : Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "state/airquality",
          "parse": {
            "fn": "numtostr",
            "op": "le",
            "srcitem": "state/airqualityppb",
            "to": [
              65,
              "excellent",
              220,
              "good",
              660,
              "moderate",
              5000,
              "unhealthy",
              65534,
              "out of scale",
              65535,
              "unknown"
            ]
          }
        },
        {
          "name": "state/lastupdated"
        },
        {
          "name": "state/speed",
          "parse": {
            "at": "0x0007",
            "cl": "0xfc7d",
            "ep": 255,
            "eval": "Item.val = Attr.val / 10",
            "fn": "zcl",
            "mf": "0x117c"
          }
        }
      ]
    }
  ]
}

Also see: IKEA Starkvind Air purifier (E2007/E3007) · Issue #5351 · dresden-elektronik/deconz-rest-plugin · GitHub

1 Like

@Mimiix
Thanks for the DDF. But there is something wrong

  • I saved the DDF in a file “starkvind.json”
  • changed from Bronze to Gold
  • Copied it to destination
  • restarted the Deconz GUI
  • deleted the device and readded it
  • applied the DDF with “open” and “Hot reload”
    I can see the sections in the DDF editor, but after leaving the editor and entering again, everything is gone and I have a blank DDF. I have the table version if this makes a difference.

What is the advantage if the device is visible and changeable in the GUI, but not in the API?

The DDF should make it available in the API.

Not sure where this went wrong. AFAIK you shouldnt have to delete and re-add the device.

@TheNON75 what did you do to get this to work?

I did everything. Restarted the GUI and also readded. Now i try to recreate the DDF with the information of yours.

I tried to change some config attributes from 0xFC7D cluster. If i try this, I’m getting an error in Debu

"Could not set attribute","type":608"
 "config": {
        "controlsequence": 0,
        "fanmode": "off",
        "ledindication": true,
        "locked": false,
        "on": true,
        "reachable": true
    }

“controlsequence” is connected with the Attribute 0x006 - Target Mode. I did not find a better coresponding control with the correct format (uint8). Changing in the GUI is possible. Any idea how to get it run?

image

image

That’s boring. How should I provide information if new users are not allowed to put some screenshot in their posts…

Spambots :wink:

I’ve changed the treshhold to 5.

Please await @thenon75 his response, he has it working somewhat but some stuff isn’t as deCONZ need adjustments (see the git issue).

Thx. I’m not a spambot :smiley:
Ok, lets see what he is saying. Meanwhile I’m playing around. Just want to find out, what Bindings are and what I can do with it. But that’s another question.

Hi @HelmutFi ,

I am afk till late(r) tonight, but I can confirm that with ddf many things are possible to add, however some will be read only for the moment.

I can share my ddf later
Until that, this is what I achieved (please note that this approach is a “forced” one, so not everything is as it officially should be)

Hello @TheNON75

I know the link and i also took your template to create a DDF. I also tried to set the “Target Mode”, but as you can read above, i’m getting an error.

I did not share my ddf anywhere yet :wink:
Just few more hours

Ps.: is the error you are referring to the empty ddf?

I meant this

  • config/fanmode off/auto/low/medium/high
  • config/ledindicator (no update is possible atm)
  • config/locked (no update is possible atm)
  • state/airqualityppb
  • state/speed:
  • state/on: to be derived

No, my DDF is not empty.

{
  "schema": "devcap1.schema.json",
  "manufacturername": "$MF_IKEA",
  "modelid": "STARKVIND Air purifier table",
  "product": "STARKVIND Air purifier table",
  "sleeper": false,
  "status": "Gold",
  "path": "/devices/starkvind_air_purifier_table_neu.json",
  "subdevices": [
    {
      "type": "$TYPE_AIR_QUALITY_SENSOR",
      "restapi": "/sensors",
      "uuid": [
        "$address.ext",
        "0x01",
        "0xfc7d"
      ],
      "items": [
        {
          "name": "attr/id"
        },
        {
          "name": "attr/lastannounced"
        },
        {
          "name": "attr/lastseen"
        },
        {
          "name": "attr/manufacturername"
        },
        {
          "name": "attr/modelid"
        },
        {
          "name": "attr/name"
        },
        {
          "name": "attr/swversion"
        },
        {
          "name": "attr/type"
        },
        {
          "name": "attr/uniqueid"
        },
        {
          "name": "config/controlsequence",
          "parse": {
            "at": "0x0006",
            "cl": "0xfc7d",
            "ep": 255,
            "eval": "Item.val = Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "config/fanmode",
          "parse": {
            "at": "0x0000",
            "cl": "0x0202",
            "ep": 255,
            "eval": "Item.val = Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "config/ledindication",
          "parse": {
            "at": "0x0003",
            "cl": "0xfc7d",
            "ep": 255,
            "eval": "Item.val = !Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "config/locked",
          "parse": {
            "at": "0x0005",
            "cl": "0xfc7d",
            "ep": 255,
            "eval": "Item.val = Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "config/on"
        },
        {
          "name": "config/reachable"
        },
        {
          "name": "state/airqualityppb",
          "parse": {
            "at": "0x0004",
            "cl": "0x7c7d",
            "ep": 255,
            "eval": "Item.val = Attr.val == 65535 ? undefined : Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "state/lastupdated"
        },
        {
          "name": "state/speed",
          "parse": {
            "at": "0x0007",
            "cl": "0xfc7d",
            "ep": 255,
            "eval": "Item.val = Attr.val / 10",
            "fn": "zcl",
            "mf": "0x117c"
          }
        }
      ]
    }
  ]
}

That Model ID , is that the same as the Model id in the basic cluster?

Yes it is
image
I created my DDF from scratch as I was not able to use the one you posted here.

here is my ddf. It was created a long time ago and I still consider it as experimental.
I am processing some data outside of deconz (such as the the airquality) and I have transformed some things according to my own needs.
(The data is processed in nodered and sent to homekit)

{
  "schema": "devcap1.schema.json",
  "manufacturername": "$MF_IKEA",
  "modelid": "STARKVIND Air purifier table",
  "vendor": "IKEA of Sweden",
  "product": "STARKVIND Air purifier table",
  "sleeper": false,
  "status": "Bronze",
  "path": "/devices/starkvind_air_purifier_table.json",
  "subdevices": [
    {
      "type": "$TYPE_AIR_QUALITY_SENSOR",
      "restapi": "/sensors",
      "uuid": [
        "$address.ext",
        "0x01",
        "0xfc7d"
      ],
      "items": [
        {
          "name": "attr/id"
        },
        {
          "name": "attr/lastannounced"
        },
        {
          "name": "attr/lastseen"
        },
        {
          "name": "attr/manufacturername"
        },
        {
          "name": "attr/modelid"
        },
        {
          "name": "attr/name"
        },
        {
          "name": "attr/swversion"
        },
        {
          "name": "attr/type"
        },
        {
          "name": "attr/uniqueid"
        },
        {
          "name": "config/devicemode",
          "description": "target mode data, cannot be updated",
          "refresh.interval": 5,
          "read": {
            "at": "0x0006",
            "cl": "0xfc7d",
            "ep": 1,
            "fn": "zcl",
            "mf": "0x117c"
          },
          "parse": {
            "at": "0x0006",
            "cl": "0xfc7d",
            "ep": 1,
            "eval": "Item.val = Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "config/fanmode",
          "description": "off/auto/low/medium/high",
          "refresh.interval": 5,
          "read": {
            "at": "0x0000",
            "cl": "0x0202",
            "ep": 1,
            "fn": "zcl"
          },
          "parse": {
            "at": "0x0000",
            "cl": "0x0202",
            "ep": 1,
            "eval": "Item.val = Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "config/ledindication",
          "description": "Disable LED ... inverted boolean",
          "parse": {
            "at": "0x0003",
            "cl": "0xfc7d",
            "ep": 1,
            "eval": "Item.val = !Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "config/locked",
          "description": "Lock Controls aka Child/Parental lock. Equivalent to pressing the main knob for some seconds",
          "parse": {
            "at": "0x0005",
            "cl": "0xfc7d",
            "ep": 1,
            "eval": "Item.val = Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "config/on"
        },
        {
          "name": "config/reachable"
        },
        {
          "name": "state/airqualityppb",
          "refresh.interval": 5,
          "read": {
            "at": "0x0004",
            "cl": "0xfc7d",
            "ep": 1,
            "fn": "zcl",
            "mf": "0x117c"
          },
          "parse": {
            "at": "0x0004",
            "cl": "0xfc7d",
            "ep": 1,
            "eval": "Item.val = Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "state/alarm",
          "description": "Replace filter",
          "refresh.interval": 3600,
          "read": {
            "at": "0x0001",
            "cl": "0xfc7d",
            "ep": 1,
            "fn": "zcl",
            "mf": "0x117c"
          },
          "parse": {
            "at": "0x0001",
            "cl": "0xfc7d",
            "ep": 1,
            "eval": "Item.val = Attr.val",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "state/on",
          "description": "if state/speed is larger than 0 then true, else false",
          "refresh.interval": 5,
          "read": {
            "at": "0x0007",
            "cl": "0xfc7d",
            "ep": 1,
            "fn": "zcl",
            "mf": "0x117c"
          },
          "parse": {
            "at": "0x0007",
            "cl": "0xfc7d",
            "ep": 1,
            "eval": "Item.val = Attr.val > 0 ? true : false",
            "fn": "zcl",
            "mf": "0x117c"
          }
        },
        {
          "name": "state/speed",
          "refresh.interval": 5,
          "read": {
            "at": "0x0007",
            "cl": "0xfc7d",
            "ep": 1,
            "fn": "zcl",
            "mf": "0x117c"
          },
          "parse": {
            "at": "0x0007",
            "cl": "0xfc7d",
            "ep": 1,
            "eval": "Item.val = Attr.val / 10",
            "fn": "zcl",
            "mf": "0x117c"
          }
        }
      ]
    }
  ]
}