dresden-elektronik / deconz-rest-plugin

deCONZ REST-API plugin to control ZigBee devices
BSD 3-Clause "New" or "Revised" License
1.9k stars 503 forks source link

Schneider Electric Room Thermostat #7795

Closed Feldi1606 closed 5 months ago

Feldi1606 commented 5 months ago

Is there already an existing issue for this?

Product name

Schneider Electric CCTFR6400

Manufacturer

Schneider Electric

Model identifier

Thermostat

Device type to add

Sensor

Node info

Bildschirmfoto vom 2024-05-28 23-41-05

Endpoints and clusters

Bildschirmfoto vom 2024-05-28 23-43-55

Basic

Bildschirmfoto vom 2024-05-28 23-52-48 Bildschirmfoto vom 2024-05-28 23-53-13

Further relevant clusters

Bildschirmfoto vom 2024-05-29 00-02-33

Bildschirmfoto vom 2024-05-28 23-57-33

Bildschirmfoto vom 2024-05-28 23-58-03

Bildschirmfoto vom 2024-05-28 23-58-30

Bildschirmfoto vom 2024-05-28 23-59-23 Bildschirmfoto vom 2024-05-28 23-59-47

Feldi1606 commented 5 months ago

Hello can anyone issue a DDF for this device or tell me which DDF might work? And is it possible to peer this room thermostat with the heating thermostat so that the two can communicate directly? And I would also like to set up weekly programs. Unfortunately I haven't found any instructions or syntax on how to do this yet. I assume that the Cluster 0201 thermostat should be used for this.

SwoopX commented 5 months ago

Hi there.

Unfortunately, the screenshots indicate that the clusters have not been read properly. This page explains how to read clusters. Please take new ones and update the issue accordingly. Thanks a lot!

SwoopX commented 5 months ago

If you update to the latest deconz version released yesterday, you should be able to get a draft DDF already by right clicking on the node and selecting the DDF editor entry. That is always a good starting point.

The device seems to be ale to communicate directly with thermostats, as it holds the grey thermostat client cluster, presumably allowing to set temperatures remotely. Schedules, however, cannot be set on this device.

Feldi1606 commented 5 months ago

Bildschirmfoto vom 2024-05-29 12-59-45 Bildschirmfoto vom 2024-05-29 13-00-21 Bildschirmfoto vom 2024-05-29 13-01-21 Bildschirmfoto vom 2024-05-29 13-02-33 Bildschirmfoto vom 2024-05-29 13-03-07 Bildschirmfoto vom 2024-05-29 13-03-50 Bildschirmfoto vom 2024-05-29 13-04-42 Bildschirmfoto vom 2024-05-29 13-05-37 Bildschirmfoto vom 2024-05-29 13-06-22 Bildschirmfoto vom 2024-05-29 13-07-38 Bildschirmfoto vom 2024-05-29 13-08-24 Bildschirmfoto vom 2024-05-29 13-09-15 Bildschirmfoto vom 2024-05-29 13-09-34

Feldi1606 commented 5 months ago

So I hope all the screenshots are correct now. Unfortunately, the instructions do not say what you have to pay attention to with the clusters. What can I do with the DDF draft? Should I upload it somewhere?

Smanar commented 5 months ago

If you can copy/paste the "Draft", yes it can be usefull, but now too late ^^ Can try this DDF, based on another Schneider thermostat

{
  "schema": "devcap1.schema.json",
  "manufacturername": "Schneider Electric",
  "modelid": "Thermostat",
  "product": "CCTFR6400",
  "sleeper": false,
  "status": "Gold",
  "subdevices": [
    {
      "type": "$TYPE_THERMOSTAT",
      "restapi": "/sensors",
      "uuid": [
        "$address.ext",
        "0x01",
        "0x0201"
      ],
      "fingerprint": {
        "profile": "0x0104",
        "device": "0x0301",
        "endpoint": "0x01",
        "in": [
          "0x0000",
          "0x0201"
        ]
      },
      "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/heatsetpoint"
        },
        {
          "name": "config/unoccupiedheatsetpoint"
        },
        {
          "name": "config/mode"
        },
        {
          "name": "config/offset"
        },
        {
          "name": "config/on"
        },
        {
          "name": "config/reachable"
        },
        {
          "name": "state/lastupdated"
        },
        {
          "name": "state/on",
          "parse": {
            "at": "0x0008",
            "cl": "0x0201",
            "ep": 1,
            "eval": "Item.val = Attr.val > 3;",
            "fn": "zcl:attr"
          },
          "read": {
            "fn": "none"
          }
        },
        {
          "name": "config/locked",
          "refresh.interval": 3660
        },
        {
          "name": "state/temperature"
        }
      ]
    },
      {
         "type":"$TYPE_TEMPERATURE_SENSOR",
         "restapi":"/sensors",
         "uuid":[
            "$address.ext",
            "0x01",
            "0x0402"
         ],
         "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/offset"
            },
            {
               "name":"config/on"
            },
        {
          "name": "config/battery",
          "awake": true,
          "read": {
            "at": "0x0021",
            "cl": "0x0001",
            "ep": 1,
            "fn": "zcl:attr"
          },
          "parse": {
            "at": "0x0021",
            "cl": "0x0001",
            "ep": 1,
            "eval": "Item.val = Attr.val / 2",
            "fn": "zcl:attr"
          },
          "refresh.interval": 86400
        },
            {
               "name":"config/reachable"
            },
            {
               "name":"state/lastupdated"
            },
            {
               "name":"state/temperature"
            }
         ]
      },
      {
         "type":"$TYPE_HUMIDITY_SENSOR",
         "restapi":"/sensors",
         "uuid":[
            "$address.ext",
            "0x01",
            "0x0405"
         ],
         "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/offset"
            },
            {
               "name":"config/on"
            },
            {
               "name":"config/reachable"
            },
        {
          "name": "config/battery",
          "awake": true,
          "read": {
            "at": "0x0021",
            "cl": "0x0001",
            "ep": 1,
            "fn": "zcl:attr"
          },
          "parse": {
            "at": "0x0021",
            "cl": "0x0001",
            "ep": 1,
            "eval": "Item.val = Attr.val / 2",
            "fn": "zcl:attr"
          },
          "refresh.interval": 86400
        },
            {
               "name":"state/lastupdated"
            },
            {
               "name":"state/humidity"
            }
         ]
      }
  ],
  "bindings": [
    {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0x0001",
      "report": [
        {
          "at": "0x0021",
          "dt": "0x20",
          "min": 60,
          "max": 3600,
          "change": "0x01"
        }
      ]
    },
      {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0x0201",
      "report": [
        {
          "at": "0x0000",
          "dt": "0x29",
          "min": 60,
          "max": 300,
          "change": "0x00000032"
        },
        {
          "at": "0x0012",
          "dt": "0x29",
          "min": 1,
          "max": 300,
          "change": "0x00000001"
        },
        {
          "at": "0x0008",
          "dt": "0x20",
          "min": 60,
          "max": 3600,
          "change": "0x00000001"
        }
      ]
    },
    {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0x0402",
      "report": [
        {
          "at": "0x0000",
          "dt": "0x29",
          "min": 60,
          "max": 300,
          "change": "0x00000032"
        }
      ]
    },
    {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0x0405",
      "report": [
        {
          "at": "0x0000",
          "dt": "0x21",
          "min": 60,
          "max": 300,
          "change": "0x00000032"
        }
      ]
    }
  ]
}
Feldi1606 commented 5 months ago

The DDF works so far. But what I've noticed is that I can't see any battery or humidity values. And the heatsetpoint is not displayed analogously to the device. How can I help you fix this Problems.

SwoopX commented 5 months ago

@Feldi1606 Can you please share the initially auto generated DDF here to have a fresh and good start? The suggested DDF above creates more issues than it actually solves, exposing lots of functionality the device does not offer. I assume Smanar had a bad day or posted any wrong version.

Smanar commented 5 months ago

I assume Smanar had a bad day or posted any wrong version.

Not realy, have made a copy/paste of this one https://github.com/dresden-elektronik/deconz-rest-plugin/blob/master/devices/elko/thermostat_16_a.json but you are right, this DDf is not compatible at all, no cluster 0x0201 ....

Edit: Have just see the cluster 0x0201 is as output cluster and not input.

So this device is not a thermostat, but a "Remote for thermostat", here I don't see what we can do with this device, except bind it with a real thermostat .... Can you describe the device pls ? This device is able to store value if it work on stand alone mode ?

The DDF works so far. But what I've noticed is that I can't see any battery or humidity values. And the heatsetpoint is not displayed analogously to the device

Have corrected the humidity sensor. For the battery I have a problem, your device don't use the attribute 0x0021 (battery level in percent) but 0x0020 (battery voltage) ATM you have 31, it s full voltage ? (So 3 Volt) The Thermostat sensor will not work with my DDF for the moment, I have let it in the DDF because we will probably use it later.

Feldi1606 commented 5 months ago

Hello Yes, exactly the device is basically an external temperature and humidity measuring instrument and a remote control to control the temperature of one or I think even several ITRVs and also to change the mode. I'm attaching a link to the device. https://merten.de/produkt/cctfr6400-wiser-raumthermostat-mit-display.html

The device is powered by 2 AA batteries with 1.5V so 3V should be suitable. But I can already see the attribute 0x0021 in deconz and it currently says 100, see screenshot Bildschirmfoto vom 2024-05-30 20-52-20

I think you don't need the automatically generated DDF or have I done something wrong?

{
  "schema": "devcap1.schema.json",
  "manufacturername": "Schneider Electric",
  "modelid": "Thermostat",
  "product": "Thermostat",
  "sleeper": false,
  "status": "Draft",
  "path": "/devices/Schneider/thermostat.json",
  "subdevices": []
}
SwoopX commented 5 months ago

I think you don't need the automatically generated DDF or have I done something wrong?

Hm, I would have expected some more but agreed, that is not exactly helpful 🙂

Smanar commented 5 months ago

The value was "0" on your previous capture .... Have added the battery support on the previous DDF, but still need the thermostat part.

Feldi1606 commented 5 months ago

are you okay with that?

Bildschirmfoto vom 2024-05-31 21-12-32 Bildschirmfoto vom 2024-05-31 21-12-58

Feldi1606 commented 5 months ago

Is it correct that I see the room thermostat once under thermostats and once under sensors? The battery status is now shown to me as 50% even though Deconz says 100%. And the humidity value could be output without any decimal places. It is currently sending a lot of data with very small changes of 0.01%

Smanar commented 5 months ago

The battery status is now shown to me as 50% even though Deconz says 100%

My bad "eval": "Item.val = Attr.val / 2",

Just need to remove the /2

And the humidity value could be output without any decimal places. It is currently sending a lot of data with very small changes of 0.01%

Can set min/max/change here

      "cl": "0x0405",
      "report": [
        {
          "at": "0x0000",
          "dt": "0x21",
          "min": 60,
          "max": 300,
          "change": "0x00000032"
        }

Is it correct that I see the room thermostat once under thermostats and once under sensors?

On phoscon ?

But the problem is for the ZHAThermostat. SwoopX have removed it but I m seing you can send request to it like for classic thermostat using manufacturer specific cluster (from Z2M)

Action (enum)

Triggered action (e.g. a button click). Value can be found in the published state on the action property. It's not possible to read (/get) or write (/set) this value. The possible values are: screen_sleep, screen_wake, button_press_plus_down, button_press_center_down, button_press_minus_down. Climate

This climate device supports the following features: occupied_heating_setpoint, local_temperature, pi_heating_demand.

occupied_heating_setpoint: Temperature setpoint. To control publish a message to topic zigbee2mqtt/FRIENDLY_NAME/set with payload {"occupied_heating_setpoint": VALUE} where VALUE is the °C between 4 and 30. Reading (/get) this attribute is not possible.
pi_heating_demand: Position of the valve (= demanded heat) where 0% is fully closed and 100% is fully open. To control publish a message to topic zigbee2mqtt/FRIENDLY_NAME/set with payload {"pi_heating_demand": VALUE} where VALUE is the % between 0 and 100. Reading (/get) this attribute is not possible.

But not sure it's something usefull, better for automation to control direclty the TRV for exemple than the remote.