zigbee-herdsman-converters 25.108.0 → 25.110.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/devices/custom_devices_diy.d.ts.map +1 -1
  3. package/dist/devices/custom_devices_diy.js +8 -0
  4. package/dist/devices/custom_devices_diy.js.map +1 -1
  5. package/dist/devices/danfoss.js +1 -1
  6. package/dist/devices/danfoss.js.map +1 -1
  7. package/dist/devices/domraem.d.ts.map +1 -1
  8. package/dist/devices/domraem.js +8 -1
  9. package/dist/devices/domraem.js.map +1 -1
  10. package/dist/devices/ikea.d.ts.map +1 -1
  11. package/dist/devices/ikea.js +108 -1
  12. package/dist/devices/ikea.js.map +1 -1
  13. package/dist/devices/lincukoo.d.ts.map +1 -1
  14. package/dist/devices/lincukoo.js +2 -1
  15. package/dist/devices/lincukoo.js.map +1 -1
  16. package/dist/devices/moes.d.ts.map +1 -1
  17. package/dist/devices/moes.js +251 -6
  18. package/dist/devices/moes.js.map +1 -1
  19. package/dist/devices/muller_licht.d.ts.map +1 -1
  20. package/dist/devices/muller_licht.js +7 -0
  21. package/dist/devices/muller_licht.js.map +1 -1
  22. package/dist/devices/nous.js +2 -2
  23. package/dist/devices/nous.js.map +1 -1
  24. package/dist/devices/onesti.d.ts.map +1 -1
  25. package/dist/devices/onesti.js +74 -16
  26. package/dist/devices/onesti.js.map +1 -1
  27. package/dist/devices/philips.d.ts.map +1 -1
  28. package/dist/devices/philips.js +63 -16
  29. package/dist/devices/philips.js.map +1 -1
  30. package/dist/devices/shelly.d.ts.map +1 -1
  31. package/dist/devices/shelly.js +18 -0
  32. package/dist/devices/shelly.js.map +1 -1
  33. package/dist/devices/slacky_diy.d.ts.map +1 -1
  34. package/dist/devices/slacky_diy.js +322 -9
  35. package/dist/devices/slacky_diy.js.map +1 -1
  36. package/dist/devices/somfy.js +1 -1
  37. package/dist/devices/somfy.js.map +1 -1
  38. package/dist/devices/tuya.d.ts.map +1 -1
  39. package/dist/devices/tuya.js +58 -2
  40. package/dist/devices/tuya.js.map +1 -1
  41. package/dist/devices/yale.d.ts.map +1 -1
  42. package/dist/devices/yale.js +8 -1
  43. package/dist/devices/yale.js.map +1 -1
  44. package/dist/devices/yandex.d.ts.map +1 -1
  45. package/dist/devices/yandex.js +2 -4
  46. package/dist/devices/yandex.js.map +1 -1
  47. package/dist/devices/zemismart.d.ts.map +1 -1
  48. package/dist/devices/zemismart.js +34 -0
  49. package/dist/devices/zemismart.js.map +1 -1
  50. package/dist/lib/constants.d.ts.map +1 -1
  51. package/dist/lib/constants.js +1 -0
  52. package/dist/lib/constants.js.map +1 -1
  53. package/dist/lib/modernExtend.d.ts +2 -1
  54. package/dist/lib/modernExtend.d.ts.map +1 -1
  55. package/dist/lib/modernExtend.js +3 -2
  56. package/dist/lib/modernExtend.js.map +1 -1
  57. package/dist/lib/types.d.ts +1 -1
  58. package/dist/lib/types.d.ts.map +1 -1
  59. package/dist/models-index.json +1 -1
  60. package/package.json +3 -3
@@ -1285,7 +1285,7 @@ exports.definitions = [
1285
1285
  whiteLabel: [tuya.whitelabel("Tuya", "iH-F8260", "Universal smart IR remote control", ["_TZ3290_gnl5a6a5xvql7c2a", "_TZ3290_785fbxik"])],
1286
1286
  },
1287
1287
  {
1288
- fingerprint: tuya.fingerprint("TS0049", ["_TZ3000_cjfmu5he", "_TZ3000_mq4wujmp", "_TZ3000_5af5r192"]),
1288
+ fingerprint: tuya.fingerprint("TS0049", ["_TZ3000_cjfmu5he", "_TZ3000_mq4wujmp", "_TZ3000_5af5r192", "_TZ3000_ogjpfoyn"]),
1289
1289
  model: "ZWV-YC",
1290
1290
  vendor: "Moes",
1291
1291
  description: "Water valve",
@@ -1608,11 +1608,12 @@ exports.definitions = [
1608
1608
  },
1609
1609
  },
1610
1610
  {
1611
- fingerprint: tuya.fingerprint("TS0601", ["_TZE204_xtrnjaoz", "_TZE200_xtrnjaoz"]),
1611
+ fingerprint: tuya.fingerprint("TS0601", ["_TZE204_xtrnjaoz", "_TZE200_xtrnjaoz", "_TZE284_8whfphjv"]),
1612
1612
  model: "GM25TEQ-TYZ-2/25",
1613
1613
  vendor: "Moes",
1614
1614
  description: "Roller Shade Blinds Motor for 38mm Tube",
1615
1615
  extend: [tuya.modernExtend.tuyaBase({ dp: true })],
1616
+ whiteLabel: [tuya.whitelabel("Tuya", "GM35TEQ-TYZ-2/25", "Roller Shade Blinds Motor for 38mm Tube", ["_TZE284_8whfphjv"])],
1616
1617
  exposes: [
1617
1618
  e.cover_position().setAccess("position", ea.STATE_SET),
1618
1619
  e.enum("motor_direction", ea.STATE_SET, ["forward", "back"]).withDescription("Set the motor direction"),
@@ -1815,16 +1816,16 @@ exports.definitions = [
1815
1816
  fromZigbee: [tuya.fz.on_off_action, fz.battery, tuya.fz.datapoints],
1816
1817
  toZigbee: [],
1817
1818
  configure: tuya.configureMagicPacket,
1818
- exposes: [e.battery(), e.action(["1_single", "1_double", "1_hold"])],
1819
+ exposes: [e.battery(), e.action(["single", "double", "hold"])],
1819
1820
  meta: {
1820
1821
  tuyaDatapoints: [
1821
1822
  [
1822
1823
  1,
1823
1824
  "action",
1824
1825
  tuya.valueConverterBasic.lookup({
1825
- "1_single": 0,
1826
- "1_double": 1,
1827
- "1_hold": 2,
1826
+ single: 0,
1827
+ double: 1,
1828
+ hold: 2,
1828
1829
  }),
1829
1830
  ],
1830
1831
  ],
@@ -1905,5 +1906,249 @@ exports.definitions = [
1905
1906
  ],
1906
1907
  },
1907
1908
  },
1909
+ {
1910
+ fingerprint: tuya.fingerprint("TS0601", ["_TZE284_rlytpmij"]),
1911
+ model: "ZHT-S01",
1912
+ vendor: "Moes",
1913
+ description: "Zigbee wall thermostat (air/internal temperature priority)",
1914
+ extend: [tuya.modernExtend.tuyaBase({ dp: true, forceTimeUpdates: true, timeStart: "1970" })],
1915
+ exposes: (device, options) => {
1916
+ // Helper for schedule exposes
1917
+ const exposesLocalSchedule = {
1918
+ hour: (name) => e.numeric(name, ea.STATE_SET).withValueMin(0).withValueMax(23),
1919
+ minute: (name) => e.numeric(name, ea.STATE_SET).withValueMin(0).withValueMax(59),
1920
+ program_temperature: (name) => e.numeric(name, ea.STATE_SET).withUnit("°C").withValueMin(5).withValueMax(35),
1921
+ };
1922
+ // Build weekly programming expose (6 weekday periods + 2 weekend periods)
1923
+ const weeklyProgramExpose = e
1924
+ .composite("weekly_programming", "weekly_programming", ea.STATE_SET)
1925
+ .withDescription("Time of day and setpoint in weekly programming mode");
1926
+ for (let i = 1; i <= 6; i++) {
1927
+ weeklyProgramExpose
1928
+ .withFeature(exposesLocalSchedule.hour(`weekdays_program_${i}_hour`))
1929
+ .withFeature(exposesLocalSchedule.minute(`weekdays_program_${i}_minute`))
1930
+ .withFeature(exposesLocalSchedule.program_temperature(`weekdays_program_${i}_temperature`));
1931
+ }
1932
+ for (let i = 1; i <= 2; i++) {
1933
+ weeklyProgramExpose
1934
+ .withFeature(exposesLocalSchedule.hour(`weekend_program_${i}_hour`))
1935
+ .withFeature(exposesLocalSchedule.minute(`weekend_program_${i}_minute`))
1936
+ .withFeature(exposesLocalSchedule.program_temperature(`weekend_program_${i}_temperature`));
1937
+ }
1938
+ return [
1939
+ // Child lock
1940
+ e.child_lock(),
1941
+ // System mode separate expose (clearer in UI)
1942
+ e
1943
+ .enum("system_mode", ea.STATE_SET, ["off", "heat"])
1944
+ .withDescription("Thermostat system mode (device enabled/disabled)"),
1945
+ // Main climate control
1946
+ e
1947
+ .climate()
1948
+ .withPreset(["manual", "auto", "eco"])
1949
+ .withRunningState(["idle", "heat"], ea.STATE)
1950
+ .withSystemMode(["off", "heat"], ea.STATE)
1951
+ .withSetpoint("current_heating_setpoint", 5, 35, 0.5, ea.STATE_SET)
1952
+ .withLocalTemperature(ea.STATE) // DP 117 (Air/Internal sensor)
1953
+ .withLocalTemperatureCalibration(-9, 9, 1, ea.STATE_SET),
1954
+ // Floor temperature (secondary sensor)
1955
+ e
1956
+ .numeric("floor_temperature", ea.STATE)
1957
+ .withUnit("°C")
1958
+ .withDescription("Temperature from floor sensor (secondary)"),
1959
+ // Valve state
1960
+ e
1961
+ .binary("valve_state", ea.STATE, "OPEN", "CLOSED")
1962
+ .withDescription("Valve state"),
1963
+ // Sensor selection
1964
+ e
1965
+ .enum("sensor", ea.STATE_SET, ["internal", "external", "both"])
1966
+ .withDescription("Temperature sensor selection"),
1967
+ // Temperature scale
1968
+ e
1969
+ .enum("temperature_scale", ea.STATE_SET, ["celsius", "fahrenheit"])
1970
+ .withDescription("Temperature scale (WARNING: converter only supports Celsius datapoints)"),
1971
+ // Backlight - FIXED: Using numeric strings like working version
1972
+ e
1973
+ .enum("backlight_brightness", ea.STATE_SET, [0, 20, 50, 100])
1974
+ .withDescription("Backlight brightness percentage"),
1975
+ // Antifreeze
1976
+ e
1977
+ .binary("antifreeze", ea.STATE_SET, "OFF", "ON")
1978
+ .withDescription("Antifreeze mode"),
1979
+ // Temperature limits
1980
+ e
1981
+ .numeric("min_temperature_limit", ea.STATE_SET)
1982
+ .withValueMin(5)
1983
+ .withValueMax(20)
1984
+ .withValueStep(1)
1985
+ .withUnit("°C")
1986
+ .withDescription("Minimum temperature limit"),
1987
+ e
1988
+ .numeric("max_temperature_limit", ea.STATE_SET)
1989
+ .withValueMin(30)
1990
+ .withValueMax(70)
1991
+ .withValueStep(1)
1992
+ .withUnit("°C")
1993
+ .withDescription("Maximum temperature limit"),
1994
+ // Temperature hysteresis/deadzone
1995
+ e
1996
+ .numeric("deadzone_temperature", ea.STATE_SET)
1997
+ .withUnit("°C")
1998
+ .withValueMin(0.5)
1999
+ .withValueMax(3.0)
2000
+ .withValueStep(0.5)
2001
+ .withDescription("Temperature hysteresis/deadzone"),
2002
+ // ECO mode temperature
2003
+ e
2004
+ .numeric("eco_temperature", ea.STATE_SET)
2005
+ .withUnit("°C")
2006
+ .withValueMin(5)
2007
+ .withValueMax(35)
2008
+ .withValueStep(1)
2009
+ .withDescription("ECO mode temperature setting"),
2010
+ // Program mode
2011
+ e
2012
+ .enum("program_mode", ea.STATE_SET, ["off", "weekend", "single_break", "no_day_off"])
2013
+ .withDescription("Weekly programming mode type"),
2014
+ // Weekly schedule programming (at the end)
2015
+ weeklyProgramExpose,
2016
+ ];
2017
+ },
2018
+ meta: {
2019
+ tuyaDatapoints: [
2020
+ [
2021
+ 1,
2022
+ "system_mode",
2023
+ {
2024
+ from: (value) => (value === true ? "heat" : "off"),
2025
+ to: (value) => value === "heat",
2026
+ },
2027
+ ],
2028
+ [
2029
+ 2,
2030
+ "preset",
2031
+ tuya.valueConverterBasic.lookup({
2032
+ auto: tuya.enum(0),
2033
+ manual: tuya.enum(1),
2034
+ eco: tuya.enum(2),
2035
+ }),
2036
+ ],
2037
+ [
2038
+ 3,
2039
+ "backlight_brightness",
2040
+ tuya.valueConverterBasic.lookup({
2041
+ 0: tuya.enum(0),
2042
+ 20: tuya.enum(1),
2043
+ 50: tuya.enum(2),
2044
+ 100: tuya.enum(3),
2045
+ }),
2046
+ ],
2047
+ [19, "local_temperature_calibration", tuya.valueConverter.localTemperatureCalibration],
2048
+ [
2049
+ 32,
2050
+ "sensor",
2051
+ tuya.valueConverterBasic.lookup({
2052
+ internal: tuya.enum(0),
2053
+ external: tuya.enum(1),
2054
+ both: tuya.enum(2),
2055
+ }),
2056
+ ],
2057
+ [39, "child_lock", tuya.valueConverter.lockUnlock],
2058
+ [
2059
+ 46,
2060
+ "temperature_scale",
2061
+ tuya.valueConverterBasic.lookup({
2062
+ celsius: tuya.enum(0),
2063
+ fahrenheit: tuya.enum(1),
2064
+ }),
2065
+ ],
2066
+ [
2067
+ 47,
2068
+ "running_state",
2069
+ tuya.valueConverterBasic.lookup({
2070
+ heat: tuya.enum(0),
2071
+ idle: tuya.enum(1),
2072
+ }),
2073
+ ],
2074
+ [
2075
+ 47,
2076
+ "valve_state",
2077
+ tuya.valueConverterBasic.lookup({
2078
+ OPEN: tuya.enum(0),
2079
+ CLOSED: tuya.enum(1),
2080
+ }),
2081
+ ],
2082
+ // === STANDARD SENSOR MAPPING (AIR/INTERNAL PRIORITY) ===
2083
+ [117, "local_temperature", tuya.valueConverter.divideBy10],
2084
+ [101, "floor_temperature", tuya.valueConverter.divideBy10],
2085
+ // ========================================================
2086
+ [
2087
+ 103,
2088
+ "antifreeze",
2089
+ {
2090
+ from: (value) => (value === true ? "ON" : "OFF"),
2091
+ to: (value) => value === "ON",
2092
+ },
2093
+ ],
2094
+ [
2095
+ 104,
2096
+ "program_mode",
2097
+ tuya.valueConverterBasic.lookup({
2098
+ off: tuya.enum(0),
2099
+ weekend: tuya.enum(1),
2100
+ single_break: tuya.enum(2),
2101
+ no_day_off: tuya.enum(3),
2102
+ }),
2103
+ ],
2104
+ [106, "deadzone_temperature", tuya.valueConverter.divideBy10],
2105
+ [107, "eco_temperature", tuya.valueConverter.raw],
2106
+ [111, "current_heating_setpoint", tuya.valueConverter.divideBy10],
2107
+ [114, "max_temperature_limit", tuya.valueConverter.divideBy10],
2108
+ [116, "min_temperature_limit", tuya.valueConverter.divideBy10],
2109
+ [
2110
+ 108,
2111
+ "weekly_programming",
2112
+ {
2113
+ from: (value) => {
2114
+ // Decode schedule from device (24 bytes: 6 weekday periods + 2 weekend periods)
2115
+ const arr = Array.isArray(value) ? value : Array.from(value);
2116
+ const result = {};
2117
+ // 6 weekday periods (18 bytes)
2118
+ for (let i = 0; i < 6; i++) {
2119
+ result[`weekdays_program_${i + 1}_hour`] = arr[i * 3 + 0];
2120
+ result[`weekdays_program_${i + 1}_minute`] = arr[i * 3 + 1];
2121
+ result[`weekdays_program_${i + 1}_temperature`] = arr[i * 3 + 2];
2122
+ }
2123
+ // 2 weekend periods (6 bytes)
2124
+ for (let i = 0; i < 2; i++) {
2125
+ result[`weekend_program_${i + 1}_hour`] = arr[18 + i * 3 + 0];
2126
+ result[`weekend_program_${i + 1}_minute`] = arr[18 + i * 3 + 1];
2127
+ result[`weekend_program_${i + 1}_temperature`] = arr[18 + i * 3 + 2];
2128
+ }
2129
+ return result;
2130
+ },
2131
+ to: (entityValue) => {
2132
+ // Encode schedule to send to device
2133
+ const arr = [];
2134
+ // 6 weekday periods
2135
+ for (let i = 1; i <= 6; i++) {
2136
+ arr.push(entityValue[`weekdays_program_${i}_hour`] ?? 0);
2137
+ arr.push(entityValue[`weekdays_program_${i}_minute`] ?? 0);
2138
+ arr.push(entityValue[`weekdays_program_${i}_temperature`] ?? 16);
2139
+ }
2140
+ // 2 weekend periods
2141
+ for (let i = 1; i <= 2; i++) {
2142
+ arr.push(entityValue[`weekend_program_${i}_hour`] ?? 0);
2143
+ arr.push(entityValue[`weekend_program_${i}_minute`] ?? 0);
2144
+ arr.push(entityValue[`weekend_program_${i}_temperature`] ?? 16);
2145
+ }
2146
+ return arr;
2147
+ },
2148
+ },
2149
+ ],
2150
+ ],
2151
+ },
2152
+ },
1908
2153
  ];
1909
2154
  //# sourceMappingURL=moes.js.map