Centralite Pearl 3 Thermostat not presenting all HVAC modes in Home Assistant

Lol, too late, if your problem is just the missing binding, no need to open a new post for that, was not the attribute 0x001C ?

Ha… :slight_smile: Sorry, this is my first time posting…

Yes, but i actually had already set it for min 1 max 300… No dice…

So, for the entire period after installing and pairing my Cetralite thermostat, it has always worked with Deconz. The issue is between Deconz and my home assistant. The Home assistant and the Deconz, are each on their own raspberry pi. Deconz is running v2.15.0-beta, and home assistant is running core-2022.4.1.

Beginning before the DDF change i made yesterday evening, the home assistant could turn on heat, turn it off, set the temperature, and view the current temperature. However, the HA could not set cool, see the fan status, or turn it on. It did receive the running state though - that is when the house reached the preset temperature, the heater remained in teh heat mode, but the running mode correctly stated that it was off…

After looking at this thread, i made the following changes to the ddf of the centralite:

  • changed the status from draft to gold.
  • The config/mode was already there - probably from me playing around with it for the 3 months I’ve had it.
  • I added the config/fanmode.
  • added config/controlsequence - no real reason for it.
  • Saved
  • Selected hot reload

Shortly after that, I saw in Home assistant that the cool and fan options appeared, so now i can set the mode to cool, and manipulate the target temperature - just in time for the heat and humidity that come each late spring and summer!

What i am missing is the ability for home assistant to see updates. If i set the temp to say 68 degrees Fahrenheit, once the temp in the house reaches the targe temp, the thermostat will properly shutoff, but the Home Assistant will not get that notification, and keep indicating that the house is still cooling.

Interesting thing is that before i made the changes to the ddf, the home assistant was updated when the thermostat stopped heating because the house was at the correct temperature.

with respect to 0x00C1 - I think that attribute describes the mode the thermostat is currently in. My thinking is that the home assistant needs to see one of the two running mode attributes - either 0x001e, or 0x0029? They seem to describe what the thermostat is currently doing. What do you think?

here is my Preview, in case you were wandering:

  "schema": "devcap1.schema.json",
  "manufacturername": "Centralite",
  "modelid": "3157100",
  "product": "3157100",
  "sleeper": false,
  "status": "Gold",
  "path": "/devices/3157100.json",
  "subdevices": [
      "type": "$TYPE_THERMOSTAT",
      "restapi": "/sensors",
      "uuid": [
      "fingerprint": {
        "profile": "0x0104",
        "device": "0x0301",
        "endpoint": "0x01",
        "in": [
      "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/battery",
          "parse": {
            "at": "0x0020",
            "cl": "0x0001",
            "cppsrc": "power_configuration.cpp:44",
            "ep": 255,
            "eval": "const vmin = 20.0; const vmax = 30.0; let bat = Attr.val; if (bat > vmax) { bat = vmax; } else if (bat < vmin) { bat = vmin; } bat = ((bat - vmin) / (vmax - vmin)) * 100; if (bat > 100) { bat = 100; } else if (bat <= 0)  { bat = 1; } Item.val = bat;"
          "name": "config/controlsequence"
          "name": "config/coolsetpoint",
          "default": 0
          "name": "config/fanmode",
          "default": "auto"
          "name": "config/heatsetpoint",
          "default": 0
          "name": "config/locked"
          "name": "config/mode",
          "default": "off"
          "name": "config/offset",
          "default": -12
          "name": "config/on"
          "name": "config/reachable"
          "name": "config/temperature"
          "name": "state/lastupdated"
          "name": "state/on",
          "description": "True when device is on; false when off.",
          "refresh.interval": 5
          "name": "state/temperature",
          "description": "The current temperature in °C &times; 100.",
          "default": 0

Thank you

Was strange you miss some field, there is already a PR with fan and coolsetpoint, Improve support for Centralite pearl thermostat (3157100) by SwoopX · Pull Request #3651 · dresden-elektronik/deconz-rest-plugin · GitHub

But nevermind, effectively it’ s an auto generated DDF, so all binding are missing. If I m right value are updated in the API, but only if you ask them using deconz.

From the code this device use as binding (and there are so much of them, attributeId is the attribute, other values are min, max, and change))
For thermostat cluster

            rq.attributeId = 0x0000;        // Local Temperature
            rq.minInterval = 1;
            rq.maxInterval = 600;
            rq.reportableChange16bit = 20;

            rq2.attributeId = 0x0011;        // Occupied cooling setpoint
            rq2.minInterval = 1;
            rq2.maxInterval = 600;
            rq2.reportableChange16bit = 50;

            rq3.attributeId = 0x0012;        // Occupied heating setpoint
            rq3.minInterval = 1;
            rq3.maxInterval = 600;
            rq3.reportableChange16bit = 50;

            rq4.attributeId = 0x0029;        // Thermostat running state
            rq4.minInterval = 1;
            rq4.maxInterval = 600;
            rq4.reportableChange16bit = 0xffff;

            rq5.attributeId = 0x001C;        // Thermostat mode
            rq5.minInterval = 1;
            rq5.maxInterval = 600;
            rq5.reportableChange8bit = 0xff;

For the Fan cluster

            rq.attributeId = 0x0000;        // Fan mode
            rq.minInterval = 1;
            rq.maxInterval = 600;

for the Thermostat configuration UI cluster

            rq.attributeId = 0x0001;       // Keypad Lockout
            rq.minInterval = 1;
            rq.maxInterval = 43200;

And from the power configuration cluster

            rq.attributeId = 0x0020;   // battery voltage
            rq.minInterval = 3600;
            rq.maxInterval = 3600;

FYI, I upgraded deCONZ in HA tonight (6.13.0) that bought with it deCONZ 2.15.3 which I see has the PR you mentioned. Sadly, I still do not see cooling mode and cannot set the modes as before.

I unpaired and re-paired the thermostat to be sure but for the moment, I’m still in the same place.

  - heat
  - 'off'
min_temp: 7
max_temp: 35
current_temperature: 21.9
temperature: 30
offset: 0
locked: false
friendly_name: Thermostat David
supported_features: 1

Any chance you could do a quick video on how you edited and saved the DDF to get it to work? Learning curve is a bit steep for a hardware guy like myself!

What does the REST api show?

I’ll have a look tomorrow and report back. Very late in NZ now :slight_smile:

I should be in bed! :yum: Here you go. This is after I edited the DDF and added config/coolsetpoint and config/fanmode. Cool still not showing up though but fan is now.

{"config":{"battery":80,"controlsequence":null,"coolsetpoint":1600,"fanmode":"auto","heatsetpoint":3000,"locked":false,"mode":null,"offset":0,"on":false,"reachable":true},"ep":1,"etag":"57d5f5f2d50fb9579f8042aea57e9ae1","lastannounced":null,"lastseen":"2022-05-02T12:50Z","manufacturername":"CentraLite","modelid":"3157100-E","name":"Thermostat David","state":{"lastupdated":"2022-05-02T12:51:41.470","on":true,"temperature":2138},"type":"ZHAThermostat","uniqueid":"00:0d:6f:00:05:5b:7e:a2-01-0201"}


I m seing “coolsetpoint”:1600 on the json, it s not that that trigger the cool mode ?

This is what Home Assistant says. Still can’t turn the unit on or off and no cool.

hvac_modes: heat, off
min_temp: 7
max_temp: 35
fan_modes: smart, auto, high, medium, low, on, off
current_temperature: 21.4
temperature: 26
fan_mode: on
offset: 0
locked: false
friendly_name: Thermostat David
supported_features: 9

At least have fan mode now even though I can’t set it.

I am not sure if Home Assistant is able to use HVAC mode “cool”, that’s why i am asking what the RestAPI reflects. @Robban can you answer that?

Should the coolsetpoint show the extended parse and read information like the heatsetpoint does? See my screenshots above.

This is what Home Assistant integration looks at to be able to determine cooling support

First it checks if mode is available

Then it checks that coolsetpoint exists in config

Ok, so perhaps just a “synchronisation” issue ?
The device was created in the API after the HA integration.

  • First it checks if mode is available
  • Then it checks that coolsetpoint exists in config

Seem fine now

  "config": {
    "battery": 80,
    "controlsequence": null,
    "coolsetpoint": 1600,
    "fanmode": "auto",
    "heatsetpoint": 3000,
    "locked": false,
    "mode": null,
    "offset": 0,
    "on": false,
    "reachable": true
  "ep": 1,
  "etag": "57d5f5f2d50fb9579f8042aea57e9ae1",
  "lastannounced": null,
  "lastseen": "2022-05-02T12:50Z",
  "manufacturername": "CentraLite",
  "modelid": "3157100-E",
  "name": "Thermostat David",
  "state": {
    "lastupdated": "2022-05-02T12:51:41.470",
    "on": true,
    "temperature": 2138
  "type": "ZHAThermostat",
  "uniqueid": "00:0d:6f:00:05:5b:7e:a2-01-0201"

But why "mode "is still null ? The bindind is done for this attribute ? 0x001C

In your example mode is null, which would make the if-statement fail

OK, I’m getting somewhere. I added ‘off’ as the default for mode using DDF and now I have cool mode!! Awesome.

{"config":{"battery":80,"coolsetpoint":1300,"fanmode":"auto","heatsetpoint":2600,"locked":false,"mode":"off","offset":0,"on":true,"reachable":true},"ep":1,"etag":"1578b811bb0947f2e040a487b1847839","lastannounced":null,"lastseen":"2022-05-02T22:06Z","manufacturername":"CentraLite","modelid":"3157100-E","name":"Thermostat David","state":{"lastupdated":"2022-05-02T22:05:27.391","on":false,"temperature":1828},"type":"ZHAThermostat","uniqueid":"00:0d:6f:00:05:5b:7e:a2-01-0201"}

I can now set cool/heat in HA and have that reflected on the panel but the reverse does not happen. If I change the mode on the panel, this is not updated in HA. Prior to messing with the DDF, the setpoint was the only thing that was working but like @lgbrownjr, this has now stopped.

Do HA get an event that says config.mode has changed when you do this?

Thanks, but where would I look for that? I removed the panel and re-added it and now HA is updated when I set the mode on the thermostat but not the reverse. If the thermostat is in cooling and I turn it off from HA, nothing happens. If I change the mode on the thermostat, HA is now updating. I also see the setpoint changing and oddly that is in both directions.

Where is the best place to track activity? The deCONZ add-on logs?

[EDIT] Seems I’m getting confused as I have two identical thermostats. One works HA to thermostat and the second one, the other way around; thermostat to HA. Go figure.

When I change the mode on the thermostat, I do see activity (below) in the deCONZ add-on logs even though HA itself does not update the mode state.

22:10:07:478 ZCL attribute report 0x000D6F00055B7EA2 for cluster: 0x0201, ep: 0x01, frame control: 0x08, mfcode: 0x0000 
22:10:07:806 ZCL attribute report 0x00158D00032D3B74 for cluster: 0x0006, ep: 0x01, frame control: 0x18, mfcode: 0x0000

I have no clue how to read deconz logs :slight_smile:

Its better to enable debug logging for HA integration on HA side to see what is received in home assistant.