[Gelöst] SONOFF TRVZB in deCONZ und HUEDevice angelernt.

Begonnen von romakrau, 16 Januar 2024, 18:01:27

Vorheriges Thema - Nächstes Thema

romakrau

Hallo zusammen,
ich habe ein Heizkörperventil von Sonoff mittels ConbbeII in FHEM eingebunden.

Internals:
   CFGFN     
   DEF        sensor 60 300 IODev=deCONZ
   FUUID      65a68142-f33f-e93f-a69e-463f8d3b16235592
   FVERSION   31_HUEDevice.pm:0.267300/2022-11-21
   ID         S60
   IODev      deCONZ
   NAME       WZ.Thermostat
   NR         11181
   STATE      Temperatur: 20.0
   TYPE       HUEDevice
   eventCount 66
   has_events 1
   manufacturername SONOFF
   modelid    TRVZB
   name       WZ.Thermostat
   on         1
   reachable  1
   swversion  1.1.1
   type       ZHAThermostat
   uniqueid   0c:ae:5f:ff:fe:ac:21:63-01-0201
   READINGS:
     2024-01-16 14:14:42   IODev           deCONZ
     2024-01-16 17:36:15   battery         100
     2024-01-16 17:36:15   batteryPercent  100
     2024-01-16 17:36:15   heatsetpoint    20.0
     2024-01-16 17:36:15   lastseen        2024-01-16T16:36Z
     2024-01-16 17:36:15   mode            heat
     2024-01-16 17:36:15   reachable       1
     2024-01-16 17:56:37   temperature     20.7
   helper:
     devtype    S
     reachable  0
     state     
     update_timeout 1
     configList:
       regex:
         HASH(0x55ba48cca8)
     json:
       e          changed
       id         60
       r          sensors
       source     event
       t          event
       uniqueid   0c:ae:5f:ff:fe:ac:21:63-01-0201
       state:
         lastupdated 2024-01-16T16:56:37.515
         temperature 2070
     setList:
Attributes:
   configList /heatsetpoint (.*)/:perl:{'{"heatsetpoint":'. $VALUE1 * 100 .'}'}
   event-on-change-reading temperature:0.2
   group      HUEDevice
   model      TRVZB
   room       HUEDevice
   stateFormat Temperatur: heatsetpoint

Leider erscheinen keine weiteren Readings und/oder Möglichkeiten z.B. ein Offset zu setzen oder den Öffnunsggrad zu erkennen. Hat jemand weitergehnde Erfahrungen mit dem Ventil?

Gruss
Roman


Beta-User

...kann aber sein, dass man für calibration ein gepatchtes HUEdevice braucht (es gab neulich eine Anfrage, in attrTemplate hatte ich es afair vorsorglich eingebaut.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

romakrau

Bei Z2M fand ich folgende Einstellungen für das TRVZB. Vielleicht kann ja jemand damit etwas anfangen bzw. mir Tips geben wie ich eine Erweiterung der Einstellungen vornehmen kann.

   {
        zigbeeModel: ['TRVZB'],
        model: 'TRVZB',
        vendor: 'SONOFF',
        description: 'Zigbee thermostatic radiator valve',
        exposes: [
            e.climate()
                .withSetpoint('occupied_heating_setpoint', 4, 35, 0.5)
                .withLocalTemperature()
                .withLocalTemperatureCalibration(-7.0, 7.0, 0.2)
                .withSystemMode(['off', 'auto', 'heat'], ea.ALL, 'Mode of the thermostat')
                .withRunningState(['idle', 'heat'], ea.STATE_GET),
            e.battery(),
            e.battery_low(),
        ],
        fromZigbee: [
            fz.thermostat,
            fz.battery,
        ],
        toZigbee: [
            tz.thermostat_local_temperature,
            tz.thermostat_local_temperature_calibration,
            tz.thermostat_occupied_heating_setpoint,
            tz.thermostat_system_mode,
            tz.thermostat_running_state,
        ],
        ota: ota.zigbeeOTA,
        extend: [
            binary({
                name: 'child_lock',
                cluster: 0xFC11,
                attribute: {ID: 0x0000, type: 0x10},
                description: 'Enables/disables physical input on the device',
                valueOn: ['LOCK', 0x01],
                valueOff: ['UNLOCK', 0x00],
            }),
            binary({
                name: 'open_window',
                cluster: 0xFC11,
                attribute: {ID: 0x6000, type: 0x10},
                description: 'Automatically turns off the radiator when local temperature drops by more than 1.5°C in 4.5 minutes.',
                valueOn: ['ON', 0x01],
                valueOff: ['OFF', 0x00],
            }),
            numeric({
                name: 'frost_protection_temperature',
                cluster: 0xFC11,
                attribute: {ID: 0x6002, type: 0x29},
                description: 'Minimum temperature at which to automatically turn on the radiator, ' +
                    'if system mode is off, to prevent pipes freezing.',
                valueMin: 4.0,
                valueMax: 35.0,
                valueStep: 0.5,
                unit: '°C',
                scale: 100,
            }),
            numeric({
                name: 'idle_steps',
                cluster: 0xFC11,
                attribute: {ID: 0x6003, type: 0x21},
                description: 'Number of steps used for calibration (no-load steps)',
                access: 'STATE_GET',
            }),
            numeric({
                name: 'closing_steps',
                cluster: 0xFC11,
                attribute: {ID: 0x6004, type: 0x21},
                description: 'Number of steps it takes to close the valve',
                access: 'STATE_GET',
            }),
            numeric({
                name: 'valve_opening_limit_voltage',
                cluster: 0xFC11,
                attribute: {ID: 0x6005, type: 0x21},
                description: 'Valve opening limit voltage',
                unit: 'mV',
                access: 'STATE_GET',
            }),
            numeric({
                name: 'valve_closing_limit_voltage',
                cluster: 0xFC11,
                attribute: {ID: 0x6006, type: 0x21},
                description: 'Valve closing limit voltage',
                unit: 'mV',
                access: 'STATE_GET',
            }),
            numeric({
                name: 'valve_motor_running_voltage',
                cluster: 0xFC11,
                attribute: {ID: 0x6007, type: 0x21},
                description: 'Valve motor running voltage',
                unit: 'mV',
                access: 'STATE_GET',
            }),
        ],
        configure: async (device, coordinatorEndpoint, logger) => {
            const endpoint = device.getEndpoint(1);
            await reporting.bind(endpoint, coordinatorEndpoint, ['hvacThermostat']);
            await reporting.thermostatTemperature(endpoint);
            await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
            await reporting.thermostatSystemMode(endpoint);
            await endpoint.read('hvacThermostat', ['localTemperatureCalibration']);
            await endpoint.read(0xFC11, [0x0000, 0x6000, 0x6002, 0x6003, 0x6004, 0x6005, 0x6006, 0x6007]);
        },
    },

In dem CONBEE DDF File habe ich derzeit folgende Definition:

{
  "schema": "devcap1.schema.json",
  "manufacturername": "SONOFF",
  "modelid": "TRVZB",
  "vendor": "SONOFF",
  "product": "TRVZB Thermostat",
  "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"
        ]
      },
      "meta": {
        "values": {
          "config/mode": {"off": 0, "auto": 1, "heat": 4}
        }
      },
      "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",
          "awake": true,
          "parse": {
            "at": "0x0021",
            "cl": "0x0001",
            "ep": 1,
            "eval": "Item.val = Attr.val / 2;",
            "fn": "zcl:attr"
          },
          "read": {
            "fn": "none"
          }
        },
        {
          "name": "config/checkin"
        },
        {
          "name": "config/heatsetpoint",
          "refresh.interval": 3660
        },
        {
          "name": "config/mode",
          "refresh.interval": 3660,
          "read": {
            "at": "0x001C",
            "cl": "0x0201",
            "ep": 1,
            "fn": "zcl:attr"
          },
          "parse": {
            "at": "0x001C",
            "cl": "0x0201",
            "ep": 1,
            "eval": "if (Attr.val == 0) { Item.val = 'off' } else if (Attr.val == 1) { Item.val = 'auto' } else if (Attr.val == 4) { Item.val = 'heat' };",
            "fn": "zcl:attr"
          },
          "write": {
            "at": "0x001C",
            "cl": "0x0201",
            "dt": "0x10",
            "ep": 1,
            "eval": "if (Item.val == 'off') { 0 } else if (Item.val == 'auto') { 1 } else if (Item.val == 'heat') { 4 };",
            "fn": "zcl:attr"
          },
          "default": "heat"
        },
        {
          "name": "config/offset",
          "refresh.interval": 3660,
          "read": {
            "at": "0x0010",
            "cl": "0x0201",
            "ep": 1,
            "fn": "zcl:attr"
          },
          "parse": {
            "at": "0x0010",
            "cl": "0x0201",
            "ep": 1,
            "eval": "Item.val = Attr.val * 10;",
            "fn": "zcl:attr"
          },
          "write": {
            "at": "0x0010",
            "cl": "0x0201",
            "dt": "0x28",
            "ep": 1,
            "eval": "Item.val / 10;",
            "fn": "zcl:attr"
          },
          "range": [-250, 250],
          "default": 0
        },
        {
          "name": "config/on"
        },
        {
          "name": "config/reachable"
        },
        {
          "name": "state/lastupdated"
        },
        {
          "name": "state/temperature",
          "refresh.interval": 3660,
          "parse": {
            "at": "0x0000",
            "cl": "0x0201",
            "ep": 1,
            "eval": "Item.val = Attr.val;",
            "fn": "zcl:attr"
          },
          "read": {
            "at": "0x0000",
            "cl": "0x0201",
            "ep": 1,
            "fn": "zcl:attr"
          }
        }
      ]
    }
  ],
  "bindings": [
    {
      "bind": "unicast",
      "src.ep": 1,
      "dst.ep": 1,
      "cl": "0x0001",
      "report": [
        {
          "at": "0x0021",
          "dt": "0x20",
          "min": 3600,
          "max": 43200,
          "change": "0x00000002"
        }
      ]
    },
    {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0x0201",
      "report": [
        {
          "at": "0x0000",
          "dt": "0x29",
          "min": 60,
          "max": 300,
          "change": "0x00000064"
        },
        {
          "at": "0x0012",
          "dt": "0x29",
          "min": 1,
          "max": 3600,
          "change": "0x00000001"
        },
        {
          "at": "0x001C",
          "dt": "0x30",
          "min": 1,
          "max": 3600
        }
      ]
    }
  ]
}

Gruss Roman

Beta-User

Das war der Beitrag bzgl. HUEDevice-Patch:
https://forum.fhem.de/index.php?msg=1296620

Ich unterstelle, dass deconz auch bemüht ist, alle Thermostate in der API möglichst einheitlich zu gestalten, von daher bitte testen, ob das klappt.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

romakrau

Das Ganze lies sich noch um das Setzen eines Offset-Wertes erweitern.

configList /offset (.*)/:perl:{'{"offset":'. $VALUE1 * 100 .'}'}
Allerdings ist die Regelung so ungenau das die eingestellten Werte um +- 1 Grad übersteuert werden. Ein Wert den man durchaus körperlich wahrnimmt. Ist für mich nicht akzeptabel da die einfachen Thermostaten vom Discounter besser regeln.

Daher habe ich eine Rücksendung eingeleitet.

Danke für die Hilfe und Gruß
Roman