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
Erste Anlaufstelle: https://www.zigbee2mqtt.io/devices/TRVZB.html
...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.
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
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.
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