zigbee-herdsman-converters 25.115.0 → 25.116.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 (43) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/converters/fromZigbee.d.ts.map +1 -1
  3. package/dist/converters/fromZigbee.js +10 -0
  4. package/dist/converters/fromZigbee.js.map +1 -1
  5. package/dist/converters/toZigbee.d.ts +4 -0
  6. package/dist/converters/toZigbee.d.ts.map +1 -1
  7. package/dist/converters/toZigbee.js +36 -4
  8. package/dist/converters/toZigbee.js.map +1 -1
  9. package/dist/devices/ecodim.d.ts.map +1 -1
  10. package/dist/devices/ecodim.js +9 -0
  11. package/dist/devices/ecodim.js.map +1 -1
  12. package/dist/devices/halemeier.d.ts.map +1 -1
  13. package/dist/devices/halemeier.js +8 -1
  14. package/dist/devices/halemeier.js.map +1 -1
  15. package/dist/devices/ikea.js +3 -3
  16. package/dist/devices/ikea.js.map +1 -1
  17. package/dist/devices/index.d.ts.map +1 -1
  18. package/dist/devices/index.js +2 -0
  19. package/dist/devices/index.js.map +1 -1
  20. package/dist/devices/inovelli.d.ts.map +1 -1
  21. package/dist/devices/inovelli.js +283 -47
  22. package/dist/devices/inovelli.js.map +1 -1
  23. package/dist/devices/lds.d.ts.map +1 -1
  24. package/dist/devices/lds.js +7 -0
  25. package/dist/devices/lds.js.map +1 -1
  26. package/dist/devices/slacky_diy.d.ts.map +1 -1
  27. package/dist/devices/slacky_diy.js +230 -260
  28. package/dist/devices/slacky_diy.js.map +1 -1
  29. package/dist/devices/sunricher.d.ts.map +1 -1
  30. package/dist/devices/sunricher.js +1 -2
  31. package/dist/devices/sunricher.js.map +1 -1
  32. package/dist/devices/tis_control.d.ts +3 -0
  33. package/dist/devices/tis_control.d.ts.map +1 -0
  34. package/dist/devices/tis_control.js +47 -0
  35. package/dist/devices/tis_control.js.map +1 -0
  36. package/dist/devices/tuya.d.ts.map +1 -1
  37. package/dist/devices/tuya.js +64 -2
  38. package/dist/devices/tuya.js.map +1 -1
  39. package/dist/lib/legacy.d.ts.map +1 -1
  40. package/dist/lib/legacy.js +12 -1
  41. package/dist/lib/legacy.js.map +1 -1
  42. package/dist/models-index.json +1 -1
  43. package/package.json +1 -1
@@ -39,7 +39,6 @@ const tz = __importStar(require("../converters/toZigbee"));
39
39
  const exposes = __importStar(require("../lib/exposes"));
40
40
  const m = __importStar(require("../lib/modernExtend"));
41
41
  const reporting = __importStar(require("../lib/reporting"));
42
- const globalStore = __importStar(require("../lib/store"));
43
42
  const utils = __importStar(require("../lib/utils"));
44
43
  //import {logger} from "../lib/logger";
45
44
  const e = exposes.presets;
@@ -780,6 +779,40 @@ const energyResetExtend = {
780
779
  };
781
780
  },
782
781
  };
782
+ function electricityDeviceModel(args) {
783
+ const { name, lookup, cluster, attribute, zigbeeCommandOptions } = args;
784
+ const attributeKey = utils.isString(attribute) ? attribute : attribute.ID;
785
+ const access = ea[args.access ?? "ALL"];
786
+ const mExtend = m.enumLookup(args);
787
+ const toZigbee = [
788
+ {
789
+ key: [name],
790
+ convertSet: access & ea.SET
791
+ ? async (entity, key, value, meta) => {
792
+ const payloadValue = utils.getFromLookup(value, lookup);
793
+ const payload = utils.isString(attribute)
794
+ ? { [attribute]: payloadValue }
795
+ : { [attribute.ID]: { value: payloadValue, type: attribute.type } };
796
+ const ep = utils.determineEndpoint(entity, meta, cluster);
797
+ await ep.write(cluster, payload, zigbeeCommandOptions);
798
+ await ep.read("seMetering", ["divisor", "multiplier"]);
799
+ await ep.read("haElectricalMeasurement", ["acPowerDivisor", "acPowerMultiplier"]);
800
+ await ep.read("haElectricalMeasurement", ["acCurrentDivisor", "acCurrentMultiplier"]);
801
+ await ep.read("haElectricalMeasurement", ["acVoltageDivisor", "acVoltageMultiplier"]);
802
+ return { state: { [key]: value } };
803
+ }
804
+ : undefined,
805
+ convertGet: access & ea.GET
806
+ ? async (entity, key, meta) => {
807
+ await utils
808
+ .determineEndpoint(entity, meta, cluster)
809
+ .read(cluster, [attributeKey], zigbeeCommandOptions);
810
+ }
811
+ : undefined,
812
+ },
813
+ ];
814
+ return { ...mExtend, toZigbee, isModernExtend: true };
815
+ }
783
816
  const electricityMeterExtend = {
784
817
  elMeter: () => {
785
818
  const exposes = [
@@ -798,24 +831,14 @@ const electricityMeterExtend = {
798
831
  e.numeric("device_measurement_preset", ea.ALL).withDescription("Measurement Period").withValueMin(1).withValueMax(255),
799
832
  ];
800
833
  const toZigbee = [
801
- {
802
- key: ["energy_tier_1", "energy_tier_2", "energy_tier_3", "energy_tier_4"],
803
- convertGet: async (entity, key, meta) => {
804
- await entity.read("seMetering", [
805
- "currentTier1SummDelivered",
806
- "currentTier2SummDelivered",
807
- "currentTier3SummDelivered",
808
- "currentTier4SummDelivered",
809
- ]);
810
- },
811
- convertSet: async (entity, key, value, meta) => {
812
- return await null;
813
- },
814
- },
834
+ tz.currenttier1summdelivered,
835
+ tz.currenttier2summdelivered,
836
+ tz.currenttier3summdelivered,
837
+ tz.currenttier4summdelivered,
815
838
  {
816
839
  key: ["model_name"],
817
840
  convertGet: async (entity, key, meta) => {
818
- await entity.read("seMetering", [attrElCityMeterModelName]);
841
+ await entity.read("seMetering", ["deviceName"]);
819
842
  },
820
843
  convertSet: async (entity, key, value, meta) => {
821
844
  return await null;
@@ -833,7 +856,7 @@ const electricityMeterExtend = {
833
856
  {
834
857
  key: ["date_release"],
835
858
  convertGet: async (entity, key, meta) => {
836
- await entity.read("seMetering", [attrElCityMeterDateRelease]);
859
+ await entity.read("seMetering", ["dateRelease"]);
837
860
  },
838
861
  convertSet: async (entity, key, value, meta) => {
839
862
  return await null;
@@ -852,7 +875,7 @@ const electricityMeterExtend = {
852
875
  key: ["device_address_preset"],
853
876
  convertSet: async (entity, key, value, meta) => {
854
877
  const device_address_preset = value;
855
- await entity.write("seMetering", { [attrElCityMeterAddressPreset]: { value: device_address_preset, type: 0x23 } });
878
+ await entity.write("seMetering", { deviceAddress: device_address_preset });
856
879
  return { readAfterWriteTime: 250, state: { device_address_preset: value } };
857
880
  },
858
881
  },
@@ -860,7 +883,7 @@ const electricityMeterExtend = {
860
883
  key: ["device_password_preset"],
861
884
  convertSet: async (entity, key, value, meta) => {
862
885
  const device_password_preset = value.toString();
863
- await entity.write("seMetering", { [attrElCityMeterPasswordPreset]: { value: device_password_preset, type: 0x41 } });
886
+ await entity.write("seMetering", { devicePassword: device_password_preset });
864
887
  return { readAfterWriteTime: 250, state: { device_password_preset: value } };
865
888
  },
866
889
  },
@@ -868,128 +891,23 @@ const electricityMeterExtend = {
868
891
  key: ["device_measurement_preset"],
869
892
  convertSet: async (entity, key, value, meta) => {
870
893
  const device_measurement_preset = value;
871
- await entity.write("seMetering", { [attrElCityMeterMeasurementPreset]: { value: device_measurement_preset, type: 0x20 } });
894
+ await entity.write("seMetering", { readPeriod: device_measurement_preset });
872
895
  return { readAfterWriteTime: 250, state: { device_measurement_preset: value } };
873
896
  },
874
897
  convertGet: async (entity, key, meta) => {
875
- await entity.read("seMetering", [attrElCityMeterMeasurementPreset]);
898
+ await entity.read("seMetering", ["readPeriod"]);
876
899
  },
877
900
  },
878
901
  ];
879
902
  const fromZigbee = [
903
+ fz.metering,
880
904
  {
881
905
  cluster: "seMetering",
882
906
  type: ["attributeReport", "readResponse"],
883
907
  convert: (model, msg, publish, options, meta) => {
884
908
  const result = {};
885
- if (msg.data.divisor !== undefined) {
886
- const energyDivisor = msg.data.divisor;
887
- globalStore.putValue(meta.device, "energyDivisor", energyDivisor);
888
- result.e_divisor = energyDivisor;
889
- }
890
- return result;
891
- },
892
- },
893
- {
894
- cluster: "seMetering",
895
- type: ["attributeReport", "readResponse"],
896
- convert: (model, msg, publish, options, meta) => {
897
- const result = {};
898
- if (msg.data.multiplier !== undefined) {
899
- const energyMultiplier = msg.data.multiplier;
900
- globalStore.putValue(meta.device, "energyMultiplier", energyMultiplier);
901
- result.e_multiplier = energyMultiplier;
902
- }
903
- return result;
904
- },
905
- },
906
- {
907
- cluster: "seMetering",
908
- type: ["attributeReport", "readResponse"],
909
- convert: (model, msg, publish, options, meta) => {
910
- const result = {};
911
- if (msg.data.currentTier1SummDelivered !== undefined) {
912
- let energyDivisor = globalStore.getValue(meta.device, "energyDivisor");
913
- let energyMultiplier = globalStore.getValue(meta.device, "energyMultiplier");
914
- if (energyDivisor === undefined) {
915
- energyDivisor = 1;
916
- }
917
- if (energyMultiplier === undefined) {
918
- energyMultiplier = 1;
919
- }
920
- const data = msg.data.currentTier1SummDelivered;
921
- result.energy_tier_1 = (data / energyDivisor) * energyMultiplier;
922
- }
923
- return result;
924
- },
925
- },
926
- {
927
- cluster: "seMetering",
928
- type: ["attributeReport", "readResponse"],
929
- convert: (model, msg, publish, options, meta) => {
930
- const result = {};
931
- if (msg.data.currentTier2SummDelivered !== undefined) {
932
- let energyDivisor = globalStore.getValue(meta.device, "energyDivisor");
933
- let energyMultiplier = globalStore.getValue(meta.device, "energyMultiplier");
934
- if (energyDivisor === undefined) {
935
- energyDivisor = 1;
936
- }
937
- if (energyMultiplier === undefined) {
938
- energyMultiplier = 1;
939
- }
940
- const data = msg.data.currentTier2SummDelivered;
941
- result.energy_tier_2 = (data / energyDivisor) * energyMultiplier;
942
- }
943
- return result;
944
- },
945
- },
946
- {
947
- cluster: "seMetering",
948
- type: ["attributeReport", "readResponse"],
949
- convert: (model, msg, publish, options, meta) => {
950
- const result = {};
951
- if (msg.data.currentTier3SummDelivered !== undefined) {
952
- let energyDivisor = globalStore.getValue(meta.device, "energyDivisor");
953
- let energyMultiplier = globalStore.getValue(meta.device, "energyMultiplier");
954
- if (energyDivisor === undefined) {
955
- energyDivisor = 1;
956
- }
957
- if (energyMultiplier === undefined) {
958
- energyMultiplier = 1;
959
- }
960
- const data = msg.data.currentTier3SummDelivered;
961
- result.energy_tier_3 = (data / energyDivisor) * energyMultiplier;
962
- }
963
- return result;
964
- },
965
- },
966
- {
967
- cluster: "seMetering",
968
- type: ["attributeReport", "readResponse"],
969
- convert: (model, msg, publish, options, meta) => {
970
- const result = {};
971
- if (msg.data.currentTier4SummDelivered !== undefined) {
972
- let energyDivisor = globalStore.getValue(meta.device, "energyDivisor");
973
- let energyMultiplier = globalStore.getValue(meta.device, "energyMultiplier");
974
- if (energyDivisor === undefined) {
975
- energyDivisor = 1;
976
- }
977
- if (energyMultiplier === undefined) {
978
- energyMultiplier = 1;
979
- }
980
- const data = msg.data.currentTier4SummDelivered;
981
- result.energy_tier_4 = (data / energyDivisor) * energyMultiplier;
982
- }
983
- return result;
984
- },
985
- },
986
- {
987
- cluster: "seMetering",
988
- type: ["attributeReport", "readResponse"],
989
- convert: (model, msg, publish, options, meta) => {
990
- const result = {};
991
- if (msg.data[attrElCityMeterModelName] !== undefined) {
992
- const data = msg.data[attrElCityMeterModelName];
909
+ if (msg.data.deviceName !== undefined) {
910
+ const data = msg.data.deviceName;
993
911
  result.model_name = data.toString();
994
912
  }
995
913
  return result;
@@ -1012,8 +930,8 @@ const electricityMeterExtend = {
1012
930
  type: ["attributeReport", "readResponse"],
1013
931
  convert: (model, msg, publish, options, meta) => {
1014
932
  const result = {};
1015
- if (msg.data[attrElCityMeterDateRelease] !== undefined) {
1016
- const data = msg.data[attrElCityMeterDateRelease];
933
+ if (msg.data.dateRelease !== undefined) {
934
+ const data = msg.data.dateRelease;
1017
935
  result.date_release = data.toString();
1018
936
  }
1019
937
  return result;
@@ -1051,18 +969,114 @@ const electricityMeterExtend = {
1051
969
  type: ["readResponse"],
1052
970
  convert: (model, msg, publish, options, meta) => {
1053
971
  const result = {};
1054
- if (msg.data[attrElCityMeterMeasurementPreset] !== undefined) {
1055
- const data = Number.parseInt(msg.data[attrElCityMeterMeasurementPreset], 10);
1056
- result.device_measurement_preset = data;
972
+ if (msg.data.readPeriod !== undefined) {
973
+ result.device_measurement_preset = msg.data.readPeriod; //data;
1057
974
  }
1058
975
  return result;
1059
976
  },
1060
977
  },
1061
978
  ];
979
+ const configure = [
980
+ async (device, coordinatorEndpoint, definition) => {
981
+ const endpoint1 = device.getEndpoint(1);
982
+ await endpoint1.read("seMetering", ["currentTier1SummDelivered"]);
983
+ await endpoint1.read("seMetering", ["currentTier2SummDelivered"]);
984
+ await endpoint1.read("seMetering", ["currentTier3SummDelivered"]);
985
+ await endpoint1.read("seMetering", ["currentTier4SummDelivered"]);
986
+ await endpoint1.read("seMetering", ["meterSerialNumber"]);
987
+ await endpoint1.read("seMetering", ["deviceName"]);
988
+ await endpoint1.read("seMetering", ["readPeriod"]);
989
+ await endpoint1.read("seMetering", ["deviceModel"]);
990
+ await endpoint1.read("seMetering", ["dateRelease"]);
991
+ await endpoint1.read("seMetering", ["remainingBattLife", "status"]);
992
+ await reporting.bind(endpoint1, coordinatorEndpoint, ["seMetering"]);
993
+ await endpoint1.configureReporting("seMetering", [
994
+ {
995
+ attribute: "currentTier1SummDelivered",
996
+ minimumReportInterval: 0,
997
+ maximumReportInterval: 3600,
998
+ reportableChange: 0,
999
+ },
1000
+ ]);
1001
+ await endpoint1.configureReporting("seMetering", [
1002
+ {
1003
+ attribute: "currentTier2SummDelivered",
1004
+ minimumReportInterval: 0,
1005
+ maximumReportInterval: 3600,
1006
+ reportableChange: 0,
1007
+ },
1008
+ ]);
1009
+ await endpoint1.configureReporting("seMetering", [
1010
+ {
1011
+ attribute: "currentTier3SummDelivered",
1012
+ minimumReportInterval: 0,
1013
+ maximumReportInterval: 3600,
1014
+ reportableChange: 0,
1015
+ },
1016
+ ]);
1017
+ await endpoint1.configureReporting("seMetering", [
1018
+ {
1019
+ attribute: "currentTier4SummDelivered",
1020
+ minimumReportInterval: 0,
1021
+ maximumReportInterval: 3600,
1022
+ reportableChange: 0,
1023
+ },
1024
+ ]);
1025
+ await endpoint1.configureReporting("seMetering", [
1026
+ {
1027
+ attribute: "currentSummDelivered",
1028
+ minimumReportInterval: 0,
1029
+ maximumReportInterval: 3600,
1030
+ reportableChange: 0,
1031
+ },
1032
+ ]);
1033
+ await endpoint1.configureReporting("seMetering", [
1034
+ {
1035
+ attribute: "status",
1036
+ minimumReportInterval: 0,
1037
+ maximumReportInterval: 3600,
1038
+ reportableChange: 0,
1039
+ },
1040
+ ]);
1041
+ await endpoint1.configureReporting("seMetering", [
1042
+ {
1043
+ attribute: "remainingBattLife",
1044
+ minimumReportInterval: 0,
1045
+ maximumReportInterval: 3600,
1046
+ reportableChange: 0,
1047
+ },
1048
+ ]);
1049
+ await endpoint1.configureReporting("seMetering", [
1050
+ {
1051
+ attribute: "meterSerialNumber",
1052
+ minimumReportInterval: 0,
1053
+ maximumReportInterval: 3600,
1054
+ reportableChange: 0,
1055
+ },
1056
+ ]);
1057
+ await endpoint1.configureReporting("seMetering", [
1058
+ {
1059
+ attribute: "dateRelease",
1060
+ minimumReportInterval: 0,
1061
+ maximumReportInterval: 3600,
1062
+ reportableChange: 0,
1063
+ },
1064
+ ]);
1065
+ await endpoint1.configureReporting("seMetering", [
1066
+ {
1067
+ attribute: "deviceName",
1068
+ minimumReportInterval: 0,
1069
+ maximumReportInterval: 3600,
1070
+ reportableChange: 0,
1071
+ },
1072
+ ]);
1073
+ },
1074
+ ];
1062
1075
  return {
1063
1076
  exposes,
1064
1077
  fromZigbee,
1065
1078
  toZigbee,
1079
+ configure,
1066
1080
  isModernExtend: true,
1067
1081
  };
1068
1082
  },
@@ -1347,73 +1361,51 @@ exports.definitions = [
1347
1361
  model: "Electricity Meter TLSR8258",
1348
1362
  vendor: "Slacky-DIY",
1349
1363
  description: "Electricity Meter via optical port",
1350
- configure: async (device, coordinatorEndpoint, logger) => {
1351
- const endpoint1 = device.getEndpoint(1);
1352
- await endpoint1.read("seMetering", ["remainingBattLife", "status", attrElCityMeterMeasurementPreset]);
1353
- await endpoint1.read("seMetering", ["divisor"]);
1354
- await endpoint1.read("seMetering", ["multiplier"]);
1355
- await endpoint1.read("seMetering", ["currentTier1SummDelivered"]);
1356
- await endpoint1.read("seMetering", ["currentTier2SummDelivered"]);
1357
- await endpoint1.read("seMetering", ["currentTier3SummDelivered"]);
1358
- await endpoint1.read("seMetering", ["currentTier4SummDelivered"]);
1359
- await endpoint1.read("seMetering", ["currentSummDelivered"]);
1360
- await endpoint1.read("seMetering", ["meterSerialNumber"]);
1361
- await endpoint1.read("seMetering", [attrElCityMeterMeasurementPreset]);
1362
- await endpoint1.read("seMetering", [attrElCityMeterModelName]);
1363
- // await endpoint1.read("haElectricalMeasurement", ["acVoltageDivisor"]);
1364
- // await endpoint1.read("haElectricalMeasurement", ["acVoltageMultiplier"]);
1365
- // await endpoint1.read("haElectricalMeasurement", ["rmsVoltage"]);
1366
- // await endpoint1.read("haElectricalMeasurement", ["acCurrentDivisor"]);
1367
- // await endpoint1.read("haElectricalMeasurement", ["acCurrentMultiplier"]);
1368
- // await endpoint1.read("haElectricalMeasurement", ["instantaneousLineCurrent"]);
1369
- // await endpoint1.read("haElectricalMeasurement", ["acPowerDivisor"]);
1370
- // await endpoint1.read("haElectricalMeasurement", ["acPowerMultiplier"]);
1371
- // await endpoint1.read("haElectricalMeasurement", ["apparentPower"]);
1372
- await reporting.bind(endpoint1, coordinatorEndpoint, ["seMetering", "haElectricalMeasurement", "genDeviceTempCfg"]);
1373
- const payload_tier1 = [{ attribute: { ID: 0x0100, type: 0x25 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 }];
1374
- await endpoint1.configureReporting("seMetering", payload_tier1);
1375
- const payload_tier2 = [{ attribute: { ID: 0x0102, type: 0x25 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 }];
1376
- await endpoint1.configureReporting("seMetering", payload_tier2);
1377
- const payload_tier3 = [{ attribute: { ID: 0x0104, type: 0x25 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 }];
1378
- await endpoint1.configureReporting("seMetering", payload_tier3);
1379
- const payload_tier4 = [{ attribute: { ID: 0x0106, type: 0x25 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 }];
1380
- await endpoint1.configureReporting("seMetering", payload_tier4);
1381
- await reporting.currentSummDelivered(endpoint1, { min: 0, max: 300, change: 0 });
1382
- const payload_status = [{ attribute: { ID: 0x0200, type: 0x18 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 }];
1383
- await endpoint1.configureReporting("seMetering", payload_status);
1384
- const payload_battery_life = [
1385
- { attribute: { ID: 0x0201, type: 0x20 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 },
1386
- ];
1387
- await endpoint1.configureReporting("seMetering", payload_battery_life);
1388
- const payload_serial_number = [
1389
- { attribute: { ID: 0x0308, type: 0x41 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 },
1390
- ];
1391
- await endpoint1.configureReporting("seMetering", payload_serial_number);
1392
- const payload_date_release = [
1393
- { attribute: { ID: attrElCityMeterDateRelease, type: 0x41 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 },
1394
- ];
1395
- await endpoint1.configureReporting("seMetering", payload_date_release);
1396
- const payload_model_name = [
1397
- { attribute: { ID: attrElCityMeterModelName, type: 0x41 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 },
1398
- ];
1399
- await endpoint1.configureReporting("seMetering", payload_model_name);
1400
- // await reporting.rmsVoltage(endpoint1, {min: 0, max: 300, change: 0});
1401
- // const payload_current = [
1402
- // {attribute: {ID: 0x0501, type: 0x21}, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0},
1403
- // ];
1404
- // await endpoint1.configureReporting("haElectricalMeasurement", payload_current);
1405
- // await reporting.apparentPower(endpoint1, {min: 0, max: 300, change: 0});
1406
- const payload_temperature = [
1407
- { attribute: { ID: 0x0000, type: 0x29 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 },
1408
- ];
1409
- await endpoint1.configureReporting("genDeviceTempCfg", payload_temperature);
1410
- },
1411
1364
  extend: [
1365
+ m.deviceAddCustomCluster("seMetering", {
1366
+ ID: 0x0702,
1367
+ attributes: {
1368
+ deviceModel: {
1369
+ ID: attrElCityMeterModelPreset,
1370
+ type: 0x30,
1371
+ write: true,
1372
+ max: 0xff,
1373
+ },
1374
+ deviceAddress: {
1375
+ ID: attrElCityMeterAddressPreset,
1376
+ type: 0x23,
1377
+ write: true,
1378
+ max: 0xffffffff,
1379
+ },
1380
+ readPeriod: {
1381
+ ID: attrElCityMeterMeasurementPreset,
1382
+ type: 0x20,
1383
+ write: true,
1384
+ max: 0xff,
1385
+ },
1386
+ dateRelease: {
1387
+ ID: attrElCityMeterDateRelease,
1388
+ type: 0x41,
1389
+ },
1390
+ deviceName: {
1391
+ ID: attrElCityMeterModelName,
1392
+ type: 0x41,
1393
+ },
1394
+ devicePassword: {
1395
+ ID: attrElCityMeterPasswordPreset,
1396
+ write: true,
1397
+ type: 0x41,
1398
+ },
1399
+ },
1400
+ commands: {},
1401
+ commandsResponse: {},
1402
+ }),
1412
1403
  m.deviceTemperature(),
1413
1404
  m.electricityMeter(),
1414
1405
  electricityMeterExtend.elMeter(),
1415
- m.enumLookup({
1406
+ electricityDeviceModel({
1416
1407
  name: "device_model_preset",
1408
+ access: "STATE_SET",
1417
1409
  lookup: {
1418
1410
  no_device: 0,
1419
1411
  "KASKAD-1-MT (MIRTEK)": 1,
@@ -1426,7 +1418,7 @@ exports.definitions = [
1426
1418
  "NARTIS-I100": 8,
1427
1419
  },
1428
1420
  cluster: "seMetering",
1429
- attribute: { ID: attrElCityMeterModelPreset, type: 0x30 },
1421
+ attribute: "deviceModel",
1430
1422
  description: "Device Model",
1431
1423
  }),
1432
1424
  ],
@@ -1437,79 +1429,57 @@ exports.definitions = [
1437
1429
  model: "ElectricityMeter-ABC-DIY",
1438
1430
  vendor: "Slacky-DIY",
1439
1431
  description: "Three phase Electricity Meter via optical port",
1440
- configure: async (device, coordinatorEndpoint, logger) => {
1441
- const endpoint1 = device.getEndpoint(1);
1442
- await endpoint1.read("seMetering", ["remainingBattLife", "status", attrElCityMeterMeasurementPreset]);
1443
- await endpoint1.read("seMetering", ["divisor"]);
1444
- await endpoint1.read("seMetering", ["multiplier"]);
1445
- await endpoint1.read("seMetering", ["currentTier1SummDelivered"]);
1446
- await endpoint1.read("seMetering", ["currentTier2SummDelivered"]);
1447
- await endpoint1.read("seMetering", ["currentTier3SummDelivered"]);
1448
- await endpoint1.read("seMetering", ["currentTier4SummDelivered"]);
1449
- await endpoint1.read("seMetering", ["currentSummDelivered"]);
1450
- await endpoint1.read("seMetering", ["meterSerialNumber"]);
1451
- await endpoint1.read("seMetering", [attrElCityMeterMeasurementPreset]);
1452
- await endpoint1.read("seMetering", [attrElCityMeterModelName]);
1453
- // await endpoint1.read("haElectricalMeasurement", ["acVoltageDivisor"]);
1454
- // await endpoint1.read("haElectricalMeasurement", ["acVoltageMultiplier"]);
1455
- // await endpoint1.read("haElectricalMeasurement", ["rmsVoltage"]);
1456
- // await endpoint1.read("haElectricalMeasurement", ["acCurrentDivisor"]);
1457
- // await endpoint1.read("haElectricalMeasurement", ["acCurrentMultiplier"]);
1458
- // await endpoint1.read("haElectricalMeasurement", ["instantaneousLineCurrent"]);
1459
- // await endpoint1.read("haElectricalMeasurement", ["acPowerDivisor"]);
1460
- // await endpoint1.read("haElectricalMeasurement", ["acPowerMultiplier"]);
1461
- // await endpoint1.read("haElectricalMeasurement", ["apparentPower"]);
1462
- await reporting.bind(endpoint1, coordinatorEndpoint, ["seMetering", "haElectricalMeasurement", "genDeviceTempCfg"]);
1463
- const payload_tier1 = [{ attribute: { ID: 0x0100, type: 0x25 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 }];
1464
- await endpoint1.configureReporting("seMetering", payload_tier1);
1465
- const payload_tier2 = [{ attribute: { ID: 0x0102, type: 0x25 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 }];
1466
- await endpoint1.configureReporting("seMetering", payload_tier2);
1467
- const payload_tier3 = [{ attribute: { ID: 0x0104, type: 0x25 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 }];
1468
- await endpoint1.configureReporting("seMetering", payload_tier3);
1469
- const payload_tier4 = [{ attribute: { ID: 0x0106, type: 0x25 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 }];
1470
- await endpoint1.configureReporting("seMetering", payload_tier4);
1471
- await reporting.currentSummDelivered(endpoint1, { min: 0, max: 300, change: 0 });
1472
- const payload_status = [{ attribute: { ID: 0x0200, type: 0x18 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 }];
1473
- await endpoint1.configureReporting("seMetering", payload_status);
1474
- const payload_battery_life = [
1475
- { attribute: { ID: 0x0201, type: 0x20 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 },
1476
- ];
1477
- await endpoint1.configureReporting("seMetering", payload_battery_life);
1478
- const payload_serial_number = [
1479
- { attribute: { ID: 0x0308, type: 0x41 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 },
1480
- ];
1481
- await endpoint1.configureReporting("seMetering", payload_serial_number);
1482
- const payload_date_release = [
1483
- { attribute: { ID: attrElCityMeterDateRelease, type: 0x41 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 },
1484
- ];
1485
- await endpoint1.configureReporting("seMetering", payload_date_release);
1486
- const payload_model_name = [
1487
- { attribute: { ID: attrElCityMeterModelName, type: 0x41 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 },
1488
- ];
1489
- await endpoint1.configureReporting("seMetering", payload_model_name);
1490
- // await reporting.rmsVoltage(endpoint1, {min: 0, max: 300, change: 0});
1491
- // const payload_current = [
1492
- // {attribute: {ID: 0x0501, type: 0x21}, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0},
1493
- // ];
1494
- // await endpoint1.configureReporting("haElectricalMeasurement", payload_current);
1495
- // await reporting.apparentPower(endpoint1, {min: 0, max: 300, change: 0});
1496
- const payload_temperature = [
1497
- { attribute: { ID: 0x0000, type: 0x29 }, minimumReportInterval: 0, maximumReportInterval: 300, reportableChange: 0 },
1498
- ];
1499
- await endpoint1.configureReporting("genDeviceTempCfg", payload_temperature);
1500
- },
1501
1432
  extend: [
1433
+ m.deviceAddCustomCluster("seMetering", {
1434
+ ID: 0x0702,
1435
+ attributes: {
1436
+ deviceModel: {
1437
+ ID: attrElCityMeterModelPreset,
1438
+ type: 0x30,
1439
+ write: true,
1440
+ max: 0xff,
1441
+ },
1442
+ deviceAddress: {
1443
+ ID: attrElCityMeterAddressPreset,
1444
+ type: 0x23,
1445
+ write: true,
1446
+ max: 0xffffffff,
1447
+ },
1448
+ readPeriod: {
1449
+ ID: attrElCityMeterMeasurementPreset,
1450
+ type: 0x20,
1451
+ write: true,
1452
+ max: 0xff,
1453
+ },
1454
+ dateRelease: {
1455
+ ID: attrElCityMeterDateRelease,
1456
+ type: 0x41,
1457
+ },
1458
+ deviceName: {
1459
+ ID: attrElCityMeterModelName,
1460
+ type: 0x41,
1461
+ },
1462
+ devicePassword: {
1463
+ ID: attrElCityMeterPasswordPreset,
1464
+ write: true,
1465
+ type: 0x41,
1466
+ },
1467
+ },
1468
+ commands: {},
1469
+ commandsResponse: {},
1470
+ }),
1502
1471
  m.deviceTemperature(),
1503
1472
  m.electricityMeter({ threePhase: true }),
1504
1473
  electricityMeterExtend.elMeter(),
1505
- m.enumLookup({
1474
+ electricityDeviceModel({
1506
1475
  name: "device_model_preset",
1476
+ access: "STATE_SET",
1507
1477
  lookup: {
1508
1478
  no_device: 0,
1509
1479
  "NARTIS-I300": 1,
1510
1480
  },
1511
1481
  cluster: "seMetering",
1512
- attribute: { ID: attrElCityMeterModelPreset, type: 0x30 },
1482
+ attribute: "deviceModel",
1513
1483
  description: "Device Model",
1514
1484
  }),
1515
1485
  ],