Skip to content

Commit 9b4969c

Browse files
feat(add): Avatto ME168 - CR fixes
1 parent 152a2e7 commit 9b4969c

File tree

2 files changed

+46
-59
lines changed

2 files changed

+46
-59
lines changed

src/devices/tuya.ts

+39-36
Original file line numberDiff line numberDiff line change
@@ -5518,13 +5518,12 @@ const definitions: DefinitionWithExtend[] = [
55185518
},
55195519
},
55205520
{
5521-
fingerprint: tuya.fingerprint('TS0601', ['_TZE200_ybsqljjg' /* model: 'ME168', vendor: 'AVATTO' */]),
5522-
model: 'TS0601_thermostat_5',
5523-
vendor: 'Tuya',
5521+
fingerprint: tuya.fingerprint('TS0601', ['_TZE200_ybsqljjg']),
5522+
model: 'AVATTO_ME168',
5523+
vendor: 'AVATTO',
55245524
description: 'Thermostatic radiator valve',
55255525
fromZigbee: [tuya.fz.datapoints],
55265526
toZigbee: [tuya.tz.datapoints],
5527-
whiteLabel: [tuya.whitelabel('AVATTO', 'AVATTO_ME168', 'Thermostatic radiator valve', ['_TZE200_ybsqljjg'])],
55285527
onEvent: tuya.onEventSetTime,
55295528
configure: tuya.configureMagicPacket,
55305529
ota: true,
@@ -5533,9 +5532,8 @@ const definitions: DefinitionWithExtend[] = [
55335532
//! to fix as the exposed format is bitmap
55345533
e.numeric('error', ea.STATE).withDescription('If NTC is damaged, "Er" will be on the TRV display.'),
55355534
e.child_lock().withCategory('config'),
5536-
55375535
e
5538-
.enum('running_mode', ea.STATE, ['auto', 'manual', 'off', 'eco', 'comfort', 'rapid'])
5536+
.enum('running_mode', ea.STATE, ['auto', 'manual', 'off', 'eco', 'comfort', 'boost'])
55395537
.withDescription('Actual TRV running mode')
55405538
.withCategory('diagnostic'),
55415539
e
@@ -5546,13 +5544,11 @@ const definitions: DefinitionWithExtend[] = [
55465544
.withSetpoint('current_heating_setpoint', 4, 35, 1, ea.STATE_SET)
55475545
.withLocalTemperature(ea.STATE)
55485546
.withLocalTemperatureCalibration(-30, 30, 1, ea.STATE_SET),
5549-
55505547
e
55515548
.binary('window_detection', ea.STATE_SET, 'ON', 'OFF')
55525549
.withDescription('Enables/disables window detection on the device')
55535550
.withCategory('config'),
55545551
e.window_open(),
5555-
55565552
e
55575553
.binary('frost_protection', ea.STATE_SET, 'ON', 'OFF')
55585554
.withDescription(
@@ -5569,7 +5565,6 @@ const definitions: DefinitionWithExtend[] = [
55695565
'again.',
55705566
)
55715567
.withCategory('config'),
5572-
55735568
e
55745569
.numeric('boost_time', ea.STATE_SET)
55755570
.withUnit('min')
@@ -5578,45 +5573,65 @@ const definitions: DefinitionWithExtend[] = [
55785573
.withValueMax(255)
55795574
.withCategory('config'),
55805575
e.numeric('boost_timeset_countdown', ea.STATE).withUnit('min').withDescription('Boost time remaining'),
5581-
55825576
e.eco_temperature().withValueMin(5).withValueMax(35).withValueStep(1).withCategory('config'),
55835577
e.comfort_temperature().withValueMin(5).withValueMax(35).withValueStep(1).withCategory('config'),
5584-
55855578
...tuya.exposes
55865579
.scheduleAllDays(ea.STATE_SET, '06:00/21.0 08:00/16.0 12:00/21.0 14:00/16.0 18:00/21.0 22:00/16.0')
55875580
.map((text) => text.withCategory('config')),
55885581
],
55895582
meta: {
55905583
tuyaDatapoints: [
5591-
// mode (RW Enum [0=auto, 1=manual, 2=off, 3=eco, 4=comfort, 5=rapid])
5592-
[2, null, tuya.valueConverter.thermostatME168_systemModeAndPreset(null)],
5593-
[2, 'preset', tuya.valueConverter.thermostatME168_systemModeAndPreset('preset')],
5594-
[2, 'system_mode', tuya.valueConverter.thermostatME168_systemModeAndPreset('system_mode')],
5595-
5584+
// mode (RW Enum [0=auto, 1=manual, 2=off, 3=eco, 4=comfort, 5=boost])
5585+
[
5586+
2,
5587+
null,
5588+
tuya.valueConverter.thermostatSystemModeAndPresetMap(
5589+
{
5590+
0: {device_mode: 'auto', system_mode: 'auto', preset: 'none'},
5591+
1: {device_mode: 'manual', system_mode: 'heat', preset: 'none'},
5592+
2: {device_mode: 'off', system_mode: 'off', preset: 'none'},
5593+
3: {device_mode: 'eco', system_mode: 'heat', preset: 'eco'},
5594+
4: {device_mode: 'comfort', system_mode: 'heat', preset: 'comfort'},
5595+
5: {device_mode: 'boost', system_mode: 'heat', preset: 'boost'},
5596+
},
5597+
null,
5598+
),
5599+
],
5600+
[
5601+
2,
5602+
'system_mode',
5603+
tuya.valueConverter.thermostatSystemModeAndPresetMap(null, {
5604+
auto: new tuya.Enum(0), // auto
5605+
heat: new tuya.Enum(1), // manual
5606+
off: new tuya.Enum(2), // off
5607+
}),
5608+
],
5609+
[
5610+
2,
5611+
'preset',
5612+
tuya.valueConverter.thermostatSystemModeAndPresetMap(null, {
5613+
none: new tuya.Enum(1), // manual
5614+
eco: new tuya.Enum(3), // eco
5615+
comfort: new tuya.Enum(4), // comfort
5616+
boost: new tuya.Enum(5), // boost
5617+
}),
5618+
],
55965619
// work_state (RO Enum [0=opened, 1=closed])
55975620
[3, 'running_state', tuya.valueConverterBasic.lookup({heat: tuya.enum(0), idle: tuya.enum(1)})],
5598-
55995621
// temp_set (RW Integer, 40-350 C, scale 1 step 10)
56005622
[4, 'current_heating_setpoint', tuya.valueConverter.divideBy10],
5601-
56025623
// temp_current (RO Integer, -0-500 C, scale 1 step 10)
56035624
[5, 'local_temperature', tuya.valueConverter.divideBy10],
5604-
56055625
// battery_percentage (RO, Integer, 0-100 %, scale 0 step 1)
56065626
[6, 'battery', tuya.valueConverter.raw],
5607-
56085627
// child_lock (RW Boolean)
56095628
[7, 'child_lock', tuya.valueConverter.lockUnlock],
5610-
56115629
//! load_status (RW, Enum, range [0=closed, 1=opened]) - Non-functional
56125630
// [13, 'load_status', tuya.valueConverterBasic.lookup({CLOSE: tuya.enum(0), OPEN: tuya.enum(1)})],
5613-
56145631
// window_check (RW Boolean)
56155632
[14, 'window_detection', tuya.valueConverter.onOff],
5616-
56175633
// window_state (RO Enum, range [0=opened, 1=closed])
56185634
[15, 'window_open', tuya.valueConverter.trueFalseEnum0],
5619-
56205635
// week_program_13_(1-7) (RW Raw, maxlen 128, special binary-in-base64 format)
56215636
[28, 'schedule_monday', tuya.valueConverter.thermostatScheduleDayMultiDPWithDayNumber(1, 6)],
56225637
[29, 'schedule_tuesday', tuya.valueConverter.thermostatScheduleDayMultiDPWithDayNumber(2, 6)],
@@ -5625,40 +5640,28 @@ const definitions: DefinitionWithExtend[] = [
56255640
[32, 'schedule_friday', tuya.valueConverter.thermostatScheduleDayMultiDPWithDayNumber(5, 6)],
56265641
[33, 'schedule_saturday', tuya.valueConverter.thermostatScheduleDayMultiDPWithDayNumber(6, 6)],
56275642
[34, 'schedule_sunday', tuya.valueConverter.thermostatScheduleDayMultiDPWithDayNumber(7, 6)],
5628-
56295643
//? error (RO Bitmap, maxlen 2, label [0x=low_battery, x0=sensor_fault]?)
56305644
[35, null, tuya.valueConverter.errorOrBatteryLow],
5631-
56325645
// frost (RW Boolean)
56335646
[36, 'frost_protection', tuya.valueConverter.onOff],
5634-
56355647
//! rapid_switch (RW Boolean) - Non-functional
56365648
// [37, 'rapid_switch', tuya.valueConverter.onOff],
5637-
56385649
//! rapid_countdown (RW Integer, 1-12 h, scale 0 step 1) - Non-functional
56395650
// [38, 'rapid_countdown', tuya.valueConverter.raw],
5640-
56415651
// scale_switch (RW Boolean)
56425652
[39, 'scale_protection', tuya.valueConverter.onOff],
5643-
56445653
// temp_correction (RW Integer, -10-10 C, scale 0 step 1)
56455654
[47, 'local_temperature_calibration', tuya.valueConverter.localTempCalibration2],
5646-
56475655
// comfort_temp (RW Integer, 100-250 C, scale 1 step 10)
56485656
[101, 'comfort_temperature', tuya.valueConverter.divideBy10],
5649-
56505657
//! switch (RW Boolean) - Non-functional
56515658
// [102, 'switch', tuya.valueConverter.onOff],
5652-
56535659
// rapid_time_set (RW Integer, 0-180 min, scale 0 step 1)
56545660
[103, 'boost_time', tuya.valueConverter.raw],
5655-
56565661
// heating_countdown (RO Integer, 0-3600 min, scale 0 step 1)
56575662
[104, 'boost_timeset_countdown', tuya.valueConverter.countdown],
5658-
56595663
// eco_temp (RW Integer, 100-200 C, scale 1 step 10)
56605664
[105, 'eco_temperature', tuya.valueConverter.divideBy10],
5661-
56625665
//! eco (RW Boolean) - Non-functional
56635666
// [106, 'eco', tuya.valueConverter.onOff],
56645667
],

src/lib/tuya.ts

+7-23
Original file line numberDiff line numberDiff line change
@@ -1529,34 +1529,18 @@ export const valueConverter = {
15291529
return data;
15301530
},
15311531
},
1532-
thermostatME168_systemModeAndPreset: (toKey: string) => {
1532+
/** @param toMap the key is 'system_mode' or 'preset' related value */
1533+
thermostatSystemModeAndPresetMap: (
1534+
fromMap: {[modeId: number]: {device_mode: string; system_mode: string; preset: string}},
1535+
toMap: {[key: string]: Enum},
1536+
) => {
15331537
return {
15341538
from: (v: string) => {
15351539
utils.assertNumber(v, 'system_mode');
1536-
const modeMap: {[mode: number]: {name: string; system_mode: string; preset: string}} = {
1537-
0: {name: 'auto', system_mode: 'auto', preset: 'none'},
1538-
1: {name: 'manual', system_mode: 'heat', preset: 'none'},
1539-
2: {name: 'off', system_mode: 'off', preset: 'none'},
1540-
3: {name: 'eco', system_mode: 'heat', preset: 'eco'},
1541-
4: {name: 'comfort', system_mode: 'heat', preset: 'comfort'},
1542-
5: {name: 'rapid', system_mode: 'heat', preset: 'boost'},
1543-
};
1544-
return {running_mode: modeMap[v].name, preset: modeMap[v].preset, system_mode: modeMap[v].system_mode};
1540+
return {running_mode: fromMap[v].device_mode, system_mode: fromMap[v].system_mode, preset: fromMap[v].preset};
15451541
},
15461542
to: (v: string) => {
1547-
const presetLookup = {
1548-
none: new Enum(1), // manual
1549-
eco: new Enum(3), // eco
1550-
comfort: new Enum(4), // comfort
1551-
boost: new Enum(5), // rapid
1552-
};
1553-
const systemModeLookup = {
1554-
auto: new Enum(0), // auto
1555-
heat: new Enum(1), // manual
1556-
off: new Enum(2), // off
1557-
};
1558-
const lookup = toKey === 'preset' ? presetLookup : systemModeLookup;
1559-
return utils.getFromLookup(v, lookup);
1543+
return utils.getFromLookup(v, toMap);
15601544
},
15611545
};
15621546
},

0 commit comments

Comments
 (0)