deCONZ + Ikea Starkvind purifier configuration problems

Hi all,

I bought the Starkvind table from Ikea and after many (way too many) issues with deConz and my Raspi4, I finally figured out that it was connected to my RaspBee even though it does not show up in the Phoscon web app. I checked in Phoscom-> Help-> API and I could see the table showing up as two sensors, the purifier and the particulate matter sensor.

But after all that, openHAB did not show it in the Inbox or when scanning for devices. Is the scan/inbox based on the API or based on what the web interface lists?

While I was attempting to use the scan feature, I did see that I could add a device myself and make sure I put the ID in manually. That seems to sort-of work for the sensor when using the AirQualitySensor. I can get the last updated and quality level but not the actual measurement: there is a channel for ppm that is returning null, but the device reports the pm2.5 in a completely different measure: ug/m^3, so maybe some other channel should be there?

For the purifier control, I am not sure which one would be the best to use, even if it is for something basic for the time being, for the purifier control, as I do not see anything that resembles that or a fan control. I tried dimmable light because it has on/off and 1-5 speeds, but it that does not seem to work, the thing shows up as unknown. For AirQualitySensor, the purifier does connect but the channels are completely unrelated so still nothing.

Does anybody have one of those and is using them thru deCONZ? Is a new type of Thing needed? Are the odd-channels because I am configuring it as a certain type instead of having that information somehow detected automatically be openHAB?

For reference, the support for the deconz-rest was added via this request https://github.com/dresden-elektronik/deconz-rest-plugin/issues/5351 and the latest DDF making two separate clusters is reported here Updated DDF for IKEA STARKVIND Air Purifier by ebaauw · Pull Request #7248 · dresden-elektronik/deconz-rest-plugin · GitHub.

Please show the API response from the deconz API. If something is missing, we can add that.

1 Like

Hi!

Just to be sure, the information you are asking about is the DDF from deconz (should be the same as the info from the GitHub issue I linked), logging info from deconz itself related to detection/reporting of this device or logs from openhab-deconz binding? Or something else?

As soon as I get home I’ll try to get some of this info.

Please show the API response from the deconz API.

Was this what you meant?

{
  "schema": "devcap1.schema.json",
  "manufacturername": [
    "$MF_IKEA",
    "$MF_IKEA"
  ],
  "modelid": [
    "STARKVIND Air purifier",
    "STARKVIND Air purifier table"
  ],
  "product": "STARKVIND Air purifier",
  "sleeper": false,
  "status": "Gold",
  "subdevices": [
    {
      "type": "$TYPE_AIR_PURIFIER",
      "restapi": "/sensors",
      "uuid": [
        "$address.ext",
        "0x01",
        "0xfc7d"
      ],
      "fingerprint": {
        "endpoint": "0x01",
        "profile": "0x0104",
        "device": "0x0007",
        "in": [
          "0x0000",
          "0xFC7D"
        ],
        "out": [
          "0x0019"
        ]
      },
      "meta": {
        "values": {
          "config/mode": {
            "off": 0,
            "auto": 1,
            "speed_1": 10,
            "speed_2": 20,
            "speed_3": 30,
            "speed_4": 40,
            "speed_5": 50
          }
        }
      },
      "items": [
        {
          "name": "attr/id"
        },
        {
          "name": "attr/lastannounced"
        },
        {
          "name": "attr/lastseen"
        },
        {
          "name": "attr/manufacturername"
        },
        {
          "name": "attr/modelid"
        },
        {
          "name": "attr/name"
        },
        {
          "name": "attr/productid",
          "parse": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0x0000",
            "at": "0x000A",
            "eval": "Item.val = Attr.val"
          },
          "read": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0x0000",
            "at": "0x000A"
          },
          "refresh.interval": 86400
        },
        {
          "name": "attr/swversion"
        },
        {
          "name": "attr/type"
        },
        {
          "name": "attr/uniqueid"
        },
        {
          "name": "config/filterlifetime",
          "parse": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0002",
            "eval": "Item.val = Attr.val"
          },
          "read": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0002"
          },
          "write": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0002",
            "dt": "0x23",
            "eval": "Item.val"
          },
          "refresh.interval": 360
        },
        {
          "name": "config/ledindication",
          "parse": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0003",
            "eval": "Item.val = !Attr.val"
          },
          "read": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0003"
          },
          "write": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0003",
            "dt": "0x10",
            "eval": "!Item.val"
          },
          "refresh.interval": 360,
          "default": true
        },
        {
          "name": "config/locked",
          "parse": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0005",
            "eval": "Item.val = Attr.val"
          },
          "read": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0005"
          },
          "write": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0005",
            "dt": "0x10",
            "eval": "Item.val"
          },
          "refresh.interval": 360
        },
        {
          "name": "config/mode",
          "values": [
            [
              "off",
              0
            ],
            [
              "auto",
              1
            ],
            [
              "speed_1",
              10
            ],
            [
              "speed_2",
              20
            ],
            [
              "speed_3",
              30
            ],
            [
              "speed_4",
              40
            ],
            [
              "speed_5",
              50
            ]
          ],
          "parse": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0006",
            "script": "starkvind_parse_target_mode.js"
          },
          "read": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0006"
          },
          "write": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0006",
            "dt": "0x20",
            "script": "starkvind_write_target_mode.js"
          },
          "refresh.interval": 360,
          "default": "off"
        },
        {
          "name": "config/on"
        },
        {
          "name": "config/reachable"
        },
        {
          "name": "state/deviceruntime",
          "parse": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0008",
            "eval": "Item.val = Attr.val"
          },
          "read": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0008"
          },
          "refresh.interval": 360
        },
        {
          "name": "state/filterruntime",
          "parse": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0000",
            "eval": "Item.val = Attr.val"
          },
          "read": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0000"
          },
          "refresh.interval": 360
        },
        {
          "name": "state/lastupdated"
        },
        {
          "name": "state/replacefilter",
          "parse": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0001",
            "eval": "Item.val = Attr.val !== 0"
          },
          "read": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0001"
          },
          "refresh.interval": 360
        },
        {
          "name": "state/speed",
          "access": "R",
          "parse": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0007",
            "script": "starkvind_parse_speed.js"
          },
          "read": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0007"
          },
          "refresh.interval": 360,
          "default": 0
        }
      ]
    },
    {
      "type": "$TYPE_PARTICULATEMATTER_SENSOR",
      "restapi": "/sensors",
      "uuid": [
        "$address.ext",
        "0x01",
        "0x042a"

      ],
      "fingerprint": {
        "endpoint": "0x01",
        "profile": "0x0104",
        "device": "0x0007",
        "in": [
          "0x0000",
          "0xFC7D"
        ],
        "out": [
          "0x0019"
        ]
      },
      "items": [
        {
          "name": "attr/id"
        },
        {
          "name": "attr/lastannounced"
        },
        {
          "name": "attr/lastseen"
        },
        {
          "name": "attr/manufacturername",
          "read": {
            "fn": "none"
          }
        },
        {
          "name": "attr/modelid",
          "read": {
            "fn": "none"
          }
        },
        {
          "name": "attr/name"
        },
        {
          "name": "attr/productid",
          "parse": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0x0000",
            "at": "0x000A",
            "eval": "Item.val = Attr.val"
          },
          "read": {
            "fn": "none"
          }
        },
        {
          "name": "attr/swversion",
          "read": {
            "fn": "none"
          }
        },
        {
          "name": "attr/type"
        },
        {
          "name": "attr/uniqueid"
        },
        {
          "name": "cap/measured_value/max",
          "static": 999
        },
        {
          "name": "cap/measured_value/min",
          "static": 0
        },
        {
          "name": "cap/measured_value/quantity",
          "static": "density"
        },
        {
          "name": "cap/measured_value/substance",
          "static": "PM2.5"
        },
        {
          "name": "cap/measured_value/unit",
          "static": "ug/m^3"
        },
        {
          "name": "config/on"
        },
        {
          "name": "config/reachable"
        },
        {
          "name": "state/lastupdated"
        },
        {
          "name": "state/measured_value",
          "parse": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0004",
            "eval": "Item.val = Attr.val"
          },
          "read": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0004"
          },
          "refresh.interval": 360
        },
        {
          "name": "state/pm2_5",
          "deprecated": "2023-09-17",
          "parse": {
            "fn": "zcl:attr",
            "ep": 1,
            "cl": "0xFC7D",
            "mf": "0x117C",
            "at": "0x0004",
            "eval": "Item.val = Attr.val"
          }
        },
        {
          "name": "state/airquality",
          "parse": {
            "fn": "numtostr",
            "srcitem": "state/measured_value",
            "op": "le",
            "to": [
              10,
              "excellent",
              20,
              "good",
              25,
              "moderate",
              50,
              "poor",
              75,
              "unhealthy",
              65535,
              "out of scale"
            ]
          }
        }
      ]
    }
  ],
  "bindings": [
    {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0xFC7D",
      "report": [
        {
          "mf": "0x117C",
          "at": "0x0000",
          "dt": "0x23",
          "min": 1,
          "max": 300,
          "change": "0x00000001"
        },
        {
          "mf": "0x117C",
          "at": "0x0001",
          "dt": "0x20",
          "min": 1,
          "max": 300,
          "change": "0x01"
        },
        {
          "mf": "0x117C",
          "at": "0x0002",
          "dt": "0x23",
          "min": 1,
          "max": 300,
          "change": "0x00000001"
        },
        {
          "mf": "0x117C",
          "at": "0x0003",
          "dt": "0x10",
          "min": 1,
          "max": 300
        },
        {
          "mf": "0x117C",
          "at": "0x0004",
          "dt": "0x21",
          "min": 1,
          "max": 300,
          "change": "0x0001"
        },
        {
          "mf": "0x117C",
          "at": "0x0005",
          "dt": "0x10",
          "min": 1,
          "max": 300
        },
        {
          "mf": "0x117C",
          "at": "0x0006",
          "dt": "0x20",
          "min": 1,
          "max": 300,
          "change": "0x01"
        },
        {
          "mf": "0x117C",
          "at": "0x0007",
          "dt": "0x20",
          "min": 1,
          "max": 300,
          "change": "0x01"
        },
        {
          "mf": "0x117C",
          "at": "0x0008",
          "dt": "0x23",
          "min": 1,
          "max": 300,
          "change": "0x00000001"
        }
      ]
    }
  ]
}

No, You said you see it in the REST API response. That is what I need.

I’m a bit confused, but maybe we are misunderstanding each other. I said the Phoscon web app list them on the API screen, but that screen basically just lists the devices connected and the DDF data. That’s all I see, nothing else, I had not interacted with the API itself, just with the web page.

But I was checking something else yesterday and I think I understand how the deconz API works, so if what is needed is the info when sending a request, I might be able to get it. Would it be something like what to send/what it returns when sending a command to change the speed, for example?

If you call

http://<your deconz host>/api/<API key>/sensors

you see a JSON with all your sensors. It looks like this (one sensor only, formatting improved, you can send the unformatted response with all sensors to me at github@klug.nrw):

 "19": {
    "config": {
      "battery": 72,
      "offset": 0,
      "on": true,
      "reachable": false
    },
    "ep": 1,
    "etag": "0ddb154f4ec11fad8d50102059cfec4f",
    "lastannounced": null,
    "lastseen": "2023-12-03T22:41Z",
    "manufacturername": "LUMI",
    "modelid": "lumi.weather",
    "name": "Multi Sensor Schlafzimmer",
    "state": {
      "humidity": 4635,
      "lastupdated": "2023-12-03T22:24:35.835"
    },
    "swversion": "20191205",
    "type": "ZHAHumidity",
    "uniqueid": "00:15:8d:00:07:3a:81:ba-01-0405"
  }

Info sent for the two sensors the table is reporting. If any more info or testing is needed, let me know!