UNPKG

zigbee-herdsman-converters

Version:

Collection of device converters to be used with zigbee-herdsman

1,301 lines • 79.3 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.definitions = void 0; const node_buffer_1 = require("node:buffer"); const fz = __importStar(require("../converters/fromZigbee")); const constants_1 = require("../lib/constants"); const exposes = __importStar(require("../lib/exposes")); const logger_1 = require("../lib/logger"); const reporting = __importStar(require("../lib/reporting")); const globalStore = __importStar(require("../lib/store")); const utils = __importStar(require("../lib/utils")); const ea = exposes.access; const e = exposes.presets; const NS = "zhc:lixee"; /* Start ZiPulses */ const unitsZiPulses = [ "kWh", "m3", "ft3", "ccf", "US gl", "IMP gl", "BTUs", "L (litre)", "kPA (jauge)", "kPA (absolu)", "kPA (absolu)", "sans unité", "MJ", "kVar", ]; const tzSeMetering = { key: ["divisor", "multiplier", "unitOfMeasure"], convertSet: async (entity, key, value, meta) => { if (key === "unitOfMeasure") { utils.assertString(value, "unitOfMeasure"); const val = unitsZiPulses.indexOf(value); const payload = { 768: { value: val, type: 48 } }; await entity.write("seMetering", payload); await entity.read("seMetering", [key]); return { state: { unitOfMeasure: value } }; } await entity.write("seMetering", { [key]: value, }); return { state: { [key]: value } }; }, // convertGet: async (entity, key, meta) => { // await entity.read('seMetering', [key]); // }, }; const fzZiPulses = { cluster: "seMetering", type: ["attributeReport", "readResponse"], convert: (model, msg, publish, options, meta) => { const payload = {}; if (msg.data.multiplier !== undefined) { payload.multiplier = msg.data.multiplier; } if (msg.data.divisor !== undefined) { payload.divisor = msg.data.divisor; } if (msg.data.unitOfMeasure !== undefined) { const val = msg.data.unitOfMeasure; payload.unitOfMeasure = unitsZiPulses[val]; } return payload; }, }; /* End ZiPulses */ const fzLocal = { lixee_ha_electrical_measurement: { cluster: "haElectricalMeasurement", type: ["attributeReport", "readResponse"], convert: (model, msg, publish, options, meta) => { const result = {}; const elements = [ /* 0x0305 */ "totalReactivePower", /* 0x0306 */ "totalApparentPower", /* 0x0505 */ "rmsVoltage", /* 0x0508 */ "rmsCurrent", /* 0x050A */ "rmsCurrentMax", /* 0x050B */ "activePower", /* 0x050D */ "activePowerMax", /* 0x050E */ "reactivePower", /* 0x050F */ "apparentPower", /* 0x0511 */ "averageRmsVoltageMeasPeriod", /* 0x0905 */ "rmsVoltagePhB", /* 0x0908 */ "rmsCurrentPhB", /* 0x090A */ "rmsCurrentMaxPhB", /* 0x090B */ "activePowerPhB", /* 0x090E */ "reactivePowerPhB", /* 0x090D */ "activePowerMaxPhB", /* 0x090F */ "apparentPowerPhB", /* 0x0911 */ "averageRmsVoltageMeasurePeriodPhB", /* 0x0A05 */ "rmsVoltagePhC", /* 0x0A08 */ "rmsCurrentPhC", /* 0x0A0A */ "rmsCurrentMaxPhC", /* 0x0A0D */ "activePowerMaxPhC", /* 0x0A0E */ "reactivePowerPhC", /* 0x0A0F */ "apparentPowerPhC", /* 0x0A11 */ "averageRmsVoltageMeasPeriodPhC", ]; for (const at of elements) { const at_snake = at .split(/(?=[A-Z])/) .join("_") .toLowerCase(); if (msg.data[at] != null) { result[at_snake] = msg.data[at]; } } return result; }, }, lixee_private_fz: { cluster: "liXeePrivate", // 0xFF66 type: ["attributeReport", "readResponse"], convert: (model, msg, publish, options, meta) => { const result = {}; const elements = [ /* 0x0000 */ "currentTarif", /* 0x0001 */ "tomorrowColor", /* 0x0002 */ "scheduleHPHC", /* 0x0003 */ "presencePotential", /* 0x0004 */ "startNoticeEJP", /* 0x0005 */ "warnDPS", /* 0x0006 */ "warnDIR1", /* 0x0007 */ "warnDIR2", /* 0x0008 */ "warnDIR3", /* 0x0009 */ "motDEtat", /* 0x0200 */ "currentPrice", /* 0x0201 */ "currentIndexTarif", /* 0x0202 */ "currentDate", /* 0x0203 */ "activeEnergyOutD01", /* 0x0204 */ "activeEnergyOutD02", /* 0x0205 */ "activeEnergyOutD03", /* 0x0206 */ "activeEnergyOutD04", /* 0x0207 */ "injectedVA", /* 0x0208 */ "injectedVAMaxN", /* 0x0209 */ "injectedVAMaxN1", /* 0x0210 */ "injectedActiveLoadN", /* 0x0211 */ "injectedActiveLoadN1", /* 0x0212 */ "drawnVAMaxN1", /* 0x0213 */ "drawnVAMaxN1P2", /* 0x0214 */ "drawnVAMaxN1P3", /* 0x0215 */ "message1", /* 0x0216 */ "message2", /* 0x0217 */ "statusRegister", /* 0x0218 */ "startMobilePoint1", /* 0x0219 */ "stopMobilePoint1", /* 0x0220 */ "startMobilePoint2", /* 0x0221 */ "stopMobilePoint2", /* 0x0222 */ "startMobilePoint3", /* 0x0223 */ "stopMobilePoint3", /* 0x0224 */ "relais", /* 0x0225 */ "daysNumberCurrentCalendar", /* 0x0226 */ "daysNumberNextCalendar", /* 0x0227 */ "daysProfileCurrentCalendar", /* 0x0228 */ "daysProfileNextCalendar", ]; const kWhP = options?.kWh_precision ? options.kWh_precision : 0; utils.assertNumber(kWhP); for (const at of elements) { const at_snake = at .split(/(?=[A-Z])/) .join("_") .toLowerCase(); let val = msg.data[at]; if (val != null) { if (val.type !== undefined && val.type === "Buffer") { val = node_buffer_1.Buffer.from(val.data); } if (node_buffer_1.Buffer.isBuffer(val)) { val = val.toString(); // Convert buffer to string } if (typeof val === "string" || val instanceof String) { val = val.replace(/\0/g, ""); // Remove all null chars when str val = val.replace(/\s+/g, " ").trim(); // Remove extra and leading spaces } switch (at) { case "activeEnergyOutD01": case "activeEnergyOutD02": case "activeEnergyOutD03": case "activeEnergyOutD04": val = utils.precisionRound(val / 1000, kWhP); // from Wh to kWh break; case "relais": { // relais is a decimal value representing the bits // of 8 virtual dry contacts. // 0 for an open relay // 1 for a closed relay // relais1 Hot water === legacy dry contact // relais2 Main heater // relais3 Secondary heater // relais4 AC or Heat pump // relais5 EV charge // relais6 Storage or injection // relais7 Unassigned // relais8 Unassigned const relais_breakout = {}; for (let i = 0; i < 8; i++) { relais_breakout[at_snake + (i + 1)] = (val & (1 << i)) >>> i; } result[`${at_snake}_breakout`] = relais_breakout; break; } case "statusRegister": { // val is a String representing hex. // Must convert const valhex = Number(`0x${val}`); const statusRegisterBreakout = {}; // contact sec statusRegisterBreakout.contact_sec = (valhex & 0x1) === 1 ? "ouvert" : "ferme"; // organe de coupure switch ((valhex >>> 1) & 0x7) { case 0: statusRegisterBreakout.organe_coupure = "ferme"; break; case 1: statusRegisterBreakout.organe_coupure = "surpuissance"; break; case 2: statusRegisterBreakout.organe_coupure = "surtension"; break; case 3: statusRegisterBreakout.organe_coupure = "delestage"; break; case 4: statusRegisterBreakout.organe_coupure = "ordre_CPL_Euridis"; break; case 5: statusRegisterBreakout.organe_coupure = "surchauffe_surcourant"; break; case 6: statusRegisterBreakout.organe_coupure = "surchauffe_simple"; break; } // etat cache borne distributeur statusRegisterBreakout.cache_borne_dist = ((valhex >>> 4) & 0x1) === 0 ? "ferme" : "ouvert"; // bit 5 inutilise // surtension sur une des phases statusRegisterBreakout.surtension_phase = (valhex >>> 6) & 0x1; // depassement puissance de reference statusRegisterBreakout.depassement_ref_pow = (valhex >>> 7) & 0x1; // consommateur ou producteur statusRegisterBreakout.producteur = (valhex >>> 8) & 0x1; // sens de l'energie active statusRegisterBreakout.sens_energie_active = ((valhex >>> 9) & 0x1) === 0 ? "positive" : "negative"; // tarif en cours sur le contrat fourniture statusRegisterBreakout.tarif_four = `index_${((valhex >>> 10) & 0xf) + 1}`; // tarif en cours sur le contrat distributeur statusRegisterBreakout.tarif_dist = `index_${((valhex >>> 14) & 0x3) + 1}`; // mode degrade de l'horloge statusRegisterBreakout.horloge = ((valhex >>> 16) & 0x1) === 0 ? "correcte" : "degradee"; // TIC historique ou standard statusRegisterBreakout.type_tic = ((valhex >>> 17) & 0x1) === 0 ? "historique" : "standard"; // bit 18 inutilise // etat sortie communicateur Euridis switch ((valhex >>> 19) & 0x3) { case 0: statusRegisterBreakout.comm_euridis = "desactivee"; break; case 1: statusRegisterBreakout.comm_euridis = "activee sans securite"; break; case 3: statusRegisterBreakout.comm_euridis = "activee avec securite"; break; } // etat CPL switch ((valhex >>> 21) & 0x3) { case 0: statusRegisterBreakout.etat_cpl = "nouveau_deverrouille"; break; case 1: statusRegisterBreakout.etat_cpl = "nouveau_verrouille"; break; case 2: statusRegisterBreakout.etat_cpl = "enregistre"; break; } // synchronisation CPL statusRegisterBreakout.sync_cpl = ((valhex >>> 23) & 0x1) === 0 ? "non_synchronise" : "synchronise"; // couleur du jour contrat TEMPO historique switch ((valhex >>> 24) & 0x3) { case 0: statusRegisterBreakout.tempo_jour = "UNDEF"; break; case 1: statusRegisterBreakout.tempo_jour = "BLEU"; break; case 2: statusRegisterBreakout.tempo_jour = "BLANC"; break; case 3: statusRegisterBreakout.tempo_jour = "ROUGE"; break; } // couleur demain contrat TEMPO historique switch ((valhex >>> 26) & 0x3) { case 0: statusRegisterBreakout.tempo_demain = "UNDEF"; break; case 1: statusRegisterBreakout.tempo_demain = "BLEU"; break; case 2: statusRegisterBreakout.tempo_demain = "BLANC"; break; case 3: statusRegisterBreakout.tempo_demain = "ROUGE"; break; } // preavis pointe mobile switch ((valhex >>> 28) & 0x3) { case 0: statusRegisterBreakout.preavis_pointe_mobile = "AUCUN"; break; case 1: statusRegisterBreakout.preavis_pointe_mobile = "PM1"; break; case 2: statusRegisterBreakout.preavis_pointe_mobile = "PM2"; break; case 3: statusRegisterBreakout.preavis_pointe_mobile = "PM3"; break; } // pointe mobile switch ((valhex >>> 30) & 0x3) { case 0: statusRegisterBreakout.pointe_mobile = "AUCUN"; break; case 1: statusRegisterBreakout.pointe_mobile = "PM1"; break; case 2: statusRegisterBreakout.pointe_mobile = "PM2"; break; case 3: statusRegisterBreakout.pointe_mobile = "PM3"; break; } result[`${at_snake}_breakout`] = statusRegisterBreakout; } } result[at_snake] = val; } } return result; }, }, lixee_metering: { cluster: "seMetering", // 0x0702 type: ["attributeReport", "readResponse"], convert: (model, msg, publish, options, meta) => { const result = {}; const elements = [ /* 0x0000 */ "currentSummDelivered", /* 0x0001 */ "currentSummReceived", /* 0x0020 */ "activeRegisterTierDelivered", /* 0x0100 */ "currentTier1SummDelivered", /* 0x0102 */ "currentTier2SummDelivered", /* 0x0104 */ "currentTier3SummDelivered", /* 0x0106 */ "currentTier4SummDelivered", /* 0x0108 */ "currentTier5SummDelivered", /* 0x010A */ "currentTier6SummDelivered", /* 0x010C */ "currentTier7SummDelivered", /* 0x010E */ "currentTier8SummDelivered", /* 0x0110 */ "currentTier9SummDelivered", /* 0x0112 */ "currentTier10SummDelivered", /* 0x0307 */ "siteId", /* 0x0308 */ "meterSerialNumber", ]; const kWhP = options?.kWh_precision ? options.kWh_precision : 0; for (const at of elements) { const at_snake = at .split(/(?=[A-Z])/) .join("_") .toLowerCase(); const val = msg.data[at]; if (val != null) { result[at_snake] = val; // By default we assign raw value switch (at) { // If we receive a Buffer, transform to human readable text case "meterSerialNumber": case "siteId": if (node_buffer_1.Buffer.isBuffer(val)) { result[at_snake] = val.toString(); } break; case "currentSummDelivered": case "currentSummReceived": case "currentTier1SummDelivered": case "currentTier2SummDelivered": case "currentTier3SummDelivered": case "currentTier4SummDelivered": case "currentTier5SummDelivered": case "currentTier6SummDelivered": case "currentTier7SummDelivered": case "currentTier8SummDelivered": case "currentTier9SummDelivered": case "currentTier10SummDelivered": // @ts-expect-error ignore result[at_snake] = utils.precisionRound(val / 1000, kWhP); // Wh to kWh break; } } } // TODO: Check if all tarifs which doesn't publish "currentSummDelivered" use just Tier1 & Tier2 if (result.current_summ_delivered === 0 && // @ts-expect-error ignore (result.current_tier1_summ_delivered > 0 || result.current_tier2_summ_delivered > 0)) { // @ts-expect-error ignore result.current_summ_delivered = result.current_tier1_summ_delivered + result.current_tier2_summ_delivered; } return result; }, }, }; // we are doing it with exclusion and not inclusion because the list is dynamic (based on zlinky mode), // and change based on that. Just some few attributes are useless, so we exclude them const tarifsDef = { // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` histo_BASE: { fname: "Historique - BASE", currentTarf: "BASE", excluded: ["HCHC", "HCHP", "HHPHC", "EJPHN", "EJPHPM", "BBRHCJB", "BBRHPJB", "BBRHCJW", "BBRHPJW", "BBRHCJR", "BBRHPJR", "DEMAIN", "PEJP"], }, // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` histo_HCHP: { fname: "Historique - HCHP", currentTarf: "HC..", excluded: ["BASE", "EJPHN", "EJPHPM", "BBRHCJB", "BBRHPJB", "BBRHCJW", "BBRHPJW", "BBRHCJR", "BBRHPJR", "DEMAIN", "PEJP"], }, // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` histo_EJP: { fname: "Historique - EJP", currentTarf: "EJP.", excluded: ["BASE", "HCHC", "HCHP", "BBRHCJB", "BBRHPJB", "BBRHCJW", "BBRHPJW", "BBRHCJR", "BBRHPJR", "DEMAIN"], }, // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` histo_BBR: { fname: "Historique - BBR", currentTarf: "BBR", excluded: ["BASE", "HCHC", "HCHP", "EJPHN", "EJPHPM", "PEJP"], }, // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` stand_SEM_WE_LUNDI: { fname: "Standard - Sem WE Lundi", currentTarf: "SEM WE LUNDI", excluded: [ "EASF07", "EASF08", "EASF09", "EASF10", "EASD02", "EASD03", "EASD04", "DPM1", "DPM2", "DPM3", "FPM1", "FPM2", "FPM3", "NJOURF", "NJOURF+1", "PJOURF+1", "PPOINTE1", ], }, // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` stand_SEM_WE_MERCR: { fname: "Standard - Sem WE Mercredi", currentTarf: "SEM WE MERCREDI", excluded: [ "EASF07", "EASF08", "EASF09", "EASF10", "EASD02", "EASD03", "EASD04", "DPM1", "DPM2", "DPM3", "FPM1", "FPM2", "FPM3", "NJOURF", "NJOURF+1", "PJOURF+1", "PPOINTE1", ], }, // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` stand_SEM_WE_VENDR: { fname: "Standard - Sem WE Vendredi", currentTarf: "SEM WE VENDREDI", excluded: [ "EASF07", "EASF08", "EASF09", "EASF10", "EASD02", "EASD03", "EASD04", "DPM1", "DPM2", "DPM3", "FPM1", "FPM2", "FPM3", "NJOURF", "NJOURF+1", "PJOURF+1", "PPOINTE1", ], }, // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` stand_BASE: { fname: "Standard - BASE", currentTarf: "BASE", excluded: [ "EASF03", "EASF04", "EASF05", "EASF06", "EASF07", "EASF08", "EASF09", "EASF10", "EASD02", "EASD03", "EASD04", "DPM1", "DPM2", "DPM3", "FPM1", "FPM2", "FPM3", "NJOURF", "NJOURF+1", "PJOURF+1", "PPOINTE1", ], }, // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` stand_HPHC: { fname: "Standard - Heure Pleine Heure Creuse", currentTarf: "H PLEINE/CREUSE", excluded: [ "EASF03", "EASF04", "EASF05", "EASF06", "EASF07", "EASF08", "EASF09", "EASF10", "EASD03", "EASD04", "DPM1", "DPM2", "DPM3", "FPM1", "FPM2", "FPM3", "NJOURF", "NJOURF+1", "PJOURF+1", "PPOINTE1", ], }, // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` stand_H_SUPER_CREUSES: { fname: "Standard - Heures Super Creuses", currentTarf: "H SUPER CREUSES", excluded: [ "EASF07", "EASF08", "EASF09", "EASF10", "DPM1", "DPM2", "DPM3", "FPM1", "FPM2", "FPM3", "NJOURF", "NJOURF+1", "PJOURF+1", "PPOINTE1", ], }, // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` stand_TEMPO: { fname: "Standard - TEMPO", currentTarf: "TEMPO", excluded: [ "EASF07", "EASF08", "EASF09", "EASF10", "EASD03", "EASD04", "DPM1", "DPM2", "DPM3", "FPM1", "FPM2", "FPM3", "NJOURF", "NJOURF+1", "PJOURF+1", "PPOINTE1", ], }, // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` stand_ZEN_FLEX: { fname: "Standard - ZEN Flex", currentTarf: "ZEN Flex", excluded: [ "EASF05", "EASF06", "EASF07", "EASF08", "EASF09", "EASF10", "EASD03", "EASD04", "DPM1", "DPM2", "DPM3", "FPM1", "FPM2", "FPM3", "NJOURF", "NJOURF+1", "PJOURF+1", ], }, }; const linkyModeDef = { standard: "standard", legacy: "historique", }; const linkyPhaseDef = { single: "single_phase", three: "three_phase", all: "both", }; const clustersDef = { // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` _0xFF66: "liXeePrivate", // 0xFF66 // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` _0x0B04: "haElectricalMeasurement", // 0x0B04 // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` _0x0702: "seMetering", // 0x0702 // biome-ignore lint/style/useNamingConvention: ignored using `--suppress` _0x0B01: "haMeterIdentification", // 0x0B01 }; // full list available on https://github.com/fairecasoimeme/Zlinky_TIC/blob/master/README.md // Properties must be EXACTLY ".split(/(?=[A-Z])/).join('_').toLowerCase()" of att const allPhaseData = [ { cluster: clustersDef._0x0702, att: "currentSummDelivered", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e.numeric("EAST", ea.STATE).withUnit("kWh").withProperty("current_summ_delivered").withDescription("Total active power delivered"), }, { cluster: clustersDef._0x0702, att: "currentSummReceived", reportable: true, report: { change: 100 }, onlyProducer: true, exposes: e.numeric("EAIT", ea.STATE).withUnit("kWh").withProperty("current_summ_received").withDescription("Total active power injected"), }, { cluster: clustersDef._0x0702, att: "currentTier1SummDelivered", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e .numeric("EASF01", ea.STATE) .withUnit("kWh") .withProperty("current_tier1_summ_delivered") .withDescription("Total provider active power delivered (index 01)"), }, { cluster: clustersDef._0x0702, att: "currentTier2SummDelivered", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e .numeric("EASF02", ea.STATE) .withUnit("kWh") .withProperty("current_tier2_summ_delivered") .withDescription("Total provider active power delivered (index 02)"), }, { cluster: clustersDef._0x0702, att: "currentTier3SummDelivered", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e .numeric("EASF03", ea.STATE) .withUnit("kWh") .withProperty("current_tier3_summ_delivered") .withDescription("Total provider active power delivered (index 03)"), }, { cluster: clustersDef._0x0702, att: "currentTier4SummDelivered", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e .numeric("EASF04", ea.STATE) .withUnit("kWh") .withProperty("current_tier4_summ_delivered") .withDescription("Total provider active power delivered (index 04)"), }, { cluster: clustersDef._0x0702, att: "currentTier5SummDelivered", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e .numeric("EASF05", ea.STATE) .withUnit("kWh") .withProperty("current_tier5_summ_delivered") .withDescription("Total provider active power delivered (index 05)"), }, { cluster: clustersDef._0x0702, att: "currentTier6SummDelivered", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e .numeric("EASF06", ea.STATE) .withUnit("kWh") .withProperty("current_tier6_summ_delivered") .withDescription("Total provider active power delivered (index 06)"), }, { cluster: clustersDef._0x0702, att: "currentTier7SummDelivered", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e .numeric("EASF07", ea.STATE) .withUnit("kWh") .withProperty("current_tier7_summ_delivered") .withDescription("Total provider active power delivered (index 07)"), }, { cluster: clustersDef._0x0702, att: "currentTier8SummDelivered", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e .numeric("EASF08", ea.STATE) .withUnit("kWh") .withProperty("current_tier8_summ_delivered") .withDescription("Total provider active power delivered (index 08)"), }, { cluster: clustersDef._0x0702, att: "currentTier9SummDelivered", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e .numeric("EASF09", ea.STATE) .withUnit("kWh") .withProperty("current_tier9_summ_delivered") .withDescription("Total provider active power delivered (index 09)"), }, { cluster: clustersDef._0x0702, att: "currentTier10SummDelivered", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e .numeric("EASF10", ea.STATE) .withUnit("kWh") .withProperty("current_tier10_summ_delivered") .withDescription("Total provider active power delivered (index 10)"), }, { cluster: clustersDef._0x0702, att: "meterSerialNumber", reportable: false, onlyProducer: false, exposes: e.text("ADSC", ea.STATE).withProperty("meter_serial_number").withDescription("Serial Number"), }, { cluster: clustersDef._0x0702, att: "siteId", reportable: false, onlyProducer: false, exposes: e.text("PRM", ea.STATE).withProperty("site_id").withDescription("PRM number"), }, { cluster: clustersDef._0x0B01, att: "availablePower", reportable: false, onlyProducer: false, exposes: e.numeric("PREF", ea.STATE).withUnit("kVA").withProperty("available_power").withDescription("Apparent power of reference"), }, { cluster: clustersDef._0x0B01, att: "powerThreshold", reportable: false, onlyProducer: false, exposes: e.numeric("PCOUP", ea.STATE).withUnit("kVA").withProperty("power_threshold").withDescription("Apparent power threshold"), }, { cluster: clustersDef._0x0B01, att: "softwareRevision", reportable: false, onlyProducer: false, exposes: e.numeric("VTIC", ea.STATE).withProperty("software_revision").withDescription("Customer tele-information protocol version"), }, { cluster: clustersDef._0x0B04, att: "activePower", reportable: true, onlyProducer: false, exposes: e .numeric("CCASN", ea.STATE) .withUnit("W") .withProperty("active_power") .withDescription("Current point of the active load curve drawn"), }, { cluster: clustersDef._0x0B04, att: "activePowerPhB", reportable: true, onlyProducer: false, exposes: e .numeric("CCASN-1", ea.STATE) .withUnit("W") .withProperty("active_power_ph_b") .withDescription("Previous point of the active load curve drawn"), }, { cluster: clustersDef._0x0B04, att: "averageRmsVoltageMeasPeriod", reportable: true, onlyProducer: false, exposes: e .numeric("UMOY1", ea.STATE) .withUnit("V") .withProperty("average_rms_voltage_meas_period") .withDescription("Average RMS voltage (phase 1)"), }, { cluster: clustersDef._0x0B04, att: "totalReactivePower", reportable: true, onlyProducer: true, exposes: e.numeric("ERQ1", ea.STATE).withUnit("VArh").withProperty("total_reactive_power").withDescription("Total reactive power (Q1)"), }, { cluster: clustersDef._0x0B04, att: "reactivePower", reportable: true, onlyProducer: true, exposes: e.numeric("ERQ2", ea.STATE).withUnit("VArh").withProperty("reactive_power").withDescription("Total reactive power (Q2)"), }, { cluster: clustersDef._0x0B04, att: "reactivePowerPhB", reportable: true, onlyProducer: true, exposes: e.numeric("ERQ3", ea.STATE).withUnit("VArh").withProperty("reactive_power_ph_b").withDescription("Total reactive power (Q3)"), }, { cluster: clustersDef._0x0B04, att: "reactivePowerPhC", reportable: true, onlyProducer: true, exposes: e.numeric("ERQ4", ea.STATE).withUnit("VArh").withProperty("reactive_power_ph_c").withDescription("Total reactive power (Q4)"), }, { cluster: clustersDef._0x0B04, att: "rmsCurrent", reportable: true, onlyProducer: false, exposes: e.numeric("IRMS1", ea.STATE).withUnit("A").withProperty("rms_current").withDescription("RMS current"), }, { cluster: clustersDef._0x0B04, att: "rmsVoltage", reportable: true, onlyProducer: false, exposes: e.numeric("URMS1", ea.STATE).withUnit("V").withProperty("rms_voltage").withDescription("RMS voltage"), }, { cluster: clustersDef._0xFF66, att: "activeEnergyOutD01", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e .numeric("EASD01", ea.STATE) .withUnit("kWh") .withProperty("active_energy_out_d01") .withDescription("Active energy withdrawn Distributor (index 01)"), }, { cluster: clustersDef._0xFF66, att: "activeEnergyOutD02", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e .numeric("EASD02", ea.STATE) .withUnit("kWh") .withProperty("active_energy_out_d02") .withDescription("Active energy withdrawn Distributor (index 02)"), }, { cluster: clustersDef._0xFF66, att: "activeEnergyOutD03", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e .numeric("EASD03", ea.STATE) .withUnit("kWh") .withProperty("active_energy_out_d03") .withDescription("Active energy withdrawn Distributor (index 03)"), }, { cluster: clustersDef._0xFF66, att: "activeEnergyOutD04", reportable: true, report: { change: 100 }, onlyProducer: false, exposes: e .numeric("EASD04", ea.STATE) .withUnit("kWh") .withProperty("active_energy_out_d04") .withDescription("Active energy withdrawn Distributor (index 04)"), }, { cluster: clustersDef._0xFF66, att: "currentDate", reportable: false, onlyProducer: false, exposes: e.text("DATE", ea.STATE).withProperty("current_date").withDescription("Current date and time"), }, { cluster: clustersDef._0xFF66, att: "currentIndexTarif", reportable: false, onlyProducer: false, exposes: e.numeric("NTARF", ea.STATE).withProperty("current_index_tarif").withDescription("Current tariff index number"), }, { cluster: clustersDef._0xFF66, att: "currentPrice", reportable: false, onlyProducer: false, exposes: e.text("LTARF", ea.STATE).withProperty("current_price").withDescription("Current supplier price label"), }, { cluster: clustersDef._0xFF66, att: "currentTarif", reportable: false, onlyProducer: false, exposes: e.text("NGTF", ea.STATE).withProperty("current_tarif").withDescription("Supplier pricing schedule name"), }, { cluster: clustersDef._0xFF66, att: "daysNumberCurrentCalendar", reportable: false, onlyProducer: false, exposes: e.numeric("NJOURF", ea.STATE).withProperty("days_number_current_calendar").withDescription("Current day number supplier calendar"), }, { cluster: clustersDef._0xFF66, att: "daysNumberNextCalendar", reportable: false, onlyProducer: false, exposes: e.numeric("NJOURF+1", ea.STATE).withProperty("days_number_next_calendar").withDescription("Next day number supplier calendar"), }, { cluster: clustersDef._0xFF66, att: "daysProfileCurrentCalendar", reportable: false, onlyProducer: false, exposes: e .text("PJOURF+1", ea.STATE) .withProperty("days_profile_current_calendar") .withDescription("Profile of the next supplier calendar day"), }, { cluster: clustersDef._0xFF66, att: "daysProfileNextCalendar", reportable: false, onlyProducer: false, exposes: e.text("PPOINTE1", ea.STATE).withProperty("days_profile_next_calendar").withDescription("Profile of the next check-in day"), }, { cluster: clustersDef._0xFF66, att: "injectedActiveLoadN", reportable: true, onlyProducer: true, exposes: e .numeric("CCAIN", ea.STATE) .withUnit("W") .withProperty("injected_active_load_n") .withDescription("Point n of the withdrawn active load curve"), }, { cluster: clustersDef._0xFF66, att: "injectedActiveLoadN1", reportable: false, onlyProducer: true, exposes: e .numeric("CCAIN-1", ea.STATE) .withUnit("W") .withProperty("injected_active_load_n1") .withDescription("Point n-1 of the withdrawn active load curve"), }, { cluster: clustersDef._0xFF66, att: "injectedVA", reportable: true, onlyProducer: true, exposes: e.numeric("SINSTI", ea.STATE).withUnit("VA").withProperty("injected_v_a").withDescription("Instantaneous apparent power injected"), }, { cluster: clustersDef._0xFF66, att: "injectedVAMaxN", reportable: true, onlyProducer: true, exposes: e.numeric("SMAXIN", ea.STATE).withUnit("VA").withProperty("injected_v_a_max_n").withDescription("Apparent power max. injected n"), }, { cluster: clustersDef._0xFF66, att: "injectedVAMaxN1", reportable: false, onlyProducer: true, exposes: e .numeric("SMAXIN-1", ea.STATE) .withUnit("VA") .withProperty("injected_v_a_max_n1") .withDescription("Apparent power max. injected n-1"), }, { cluster: clustersDef._0xFF66, att: "message1", reportable: false, onlyProducer: false, exposes: e.text("MSG1", ea.STATE).withProperty("message1").withDescription("Message short"), }, { cluster: clustersDef._0xFF66, att: "message2", reportable: false, onlyProducer: false, exposes: e.text("MSG2", ea.STATE).withProperty("message2").withDescription("Message ultra-short"), }, { cluster: clustersDef._0xFF66, att: "relais", reportable: false, onlyProducer: false, exposes: e.numeric("RELAIS", ea.STATE).withProperty("relais"), }, { cluster: clustersDef._0xFF66, att: "startMobilePoint1", reportable: false, onlyProducer: false, exposes: e.numeric("DPM1", ea.STATE).withProperty("start_mobile_point1").withDescription("Start mobile point 1"), }, { cluster: clustersDef._0xFF66, att: "startMobilePoint2", reportable: false, onlyProducer: false, exposes: e.numeric("DPM2", ea.STATE).withProperty("start_mobile_point2").withDescription("Start mobile point 2"), }, { cluster: clustersDef._0xFF66, att: "startMobilePoint3", reportable: false, onlyProducer: false, exposes: e.numeric("DPM3", ea.STATE).withProperty("start_mobile_point3").withDescription("Start mobile point 3"), }, { cluster: clustersDef._0xFF66, att: "statusRegister", reportable: false, onlyProducer: false, exposes: e.text("STGE", ea.STATE).withProperty("status_register").withDescription("Register of Statutes"), }, { cluster: clustersDef._0xFF66, att: "stopMobilePoint1", reportable: false, onlyProducer: false, exposes: e.numeric("FPM1", ea.STATE).withProperty("stop_mobile_point1").withDescription("Stop mobile point 1"), }, { cluster: clustersDef._0xFF66, att: "stopMobilePoint2", reportable: false, onlyProducer: false, exposes: e.numeric("FPM2", ea.STATE).withProperty("stop_mobile_point2").withDescription("Stop mobile point 2"), }, { cluster: clustersDef._0xFF66, att: "stopMobilePoint3", reportable: false, onlyProducer: false, exposes: e.numeric("FPM3", ea.STATE).withProperty("stop_mobile_point3").withDescription("Stop mobile point 3"), }, ].map((x) => { return { ...x, linkyPhase: linkyPhaseDef.all, linkyMode: linkyModeDef.standard }; }); const singlePhaseData = [ { cluster: clustersDef._0x0B04, att: "activePowerMax", reportable: true, onlyProducer: false, exposes: e.numeric("SMAXN", ea.STATE).withUnit("VA").withProperty("active_power_max").withDescription("Apparent power delivered peak"), }, { cluster: clustersDef._0x0B04, att: "apparentPower", reportable: true, onlyProducer: false, exposes: e.numeric("SINSTS", ea.STATE).withUnit("VA").withProperty("apparent_power").withDescription("Immediate apparent power delivered"), }, { cluster: clustersDef._0xFF66, att: "drawnVAMaxN1", reportable: false, onlyProducer: false, exposes: e.numeric("SMAXN-1", ea.STATE).withUnit("VA").withProperty("drawn_v_a_max_n1").withDescription("Apparent power max. draw-off n-1"), }, ].map((x) => { return { ...x, linkyPhase: linkyPhaseDef.single, linkyMode: linkyModeDef.standard }; }); const threePhasesData = [ { cluster: clustersDef._0x0B04, att: "activePowerMax", reportable: true, onlyProducer: false, exposes: e .numeric("SMAXN1", ea.STATE) .withUnit("VA") .withProperty("active_power_max") .withDescription("Apparent power delivered peak (phase 1)"), }, { cluster: clustersDef._0x0B04, att: "activePowerMaxPhB", reportable: true, onlyProducer: false, exposes: e .numeric("SMAXN2", ea.STATE) .withUnit("VA") .withProperty("active_power_max_ph_b") .withDescription("Apparent power delivered peak (phase 2)"), }, { cluster: clustersDef._0x0B04, att: "activePowerMaxPhC", reportable: true, onlyProducer: false, exposes: e .numeric("SMAXN3", ea.STATE) .withUnit("VA") .withProperty("active_power_max_ph_c") .withDescription("Apparent power delivered peak (phase 3)"), }, { cluster: clustersDef._0x0B04, att: "apparentPower", reportable: true, onlyProducer: false, exposes: e .numeric("SINSTS1", ea.STATE) .withUnit("VA") .withProperty("apparent_power") .withDescription("Immediate apparent power delivered (phase 1)"), }, { cluster: clustersDef._0x0B04, att: "apparentPowerPhB", reportable: true, onlyProducer: false, exposes: e .numeric("SINSTS2", ea.STATE) .withUnit("VA") .withProperty("apparent_power_ph_b") .withDescription("Immediate apparent power delivered (phase 2)"), }, { cluster: clustersDef._0x0B04, att: "apparentPowerPhC", reportable: true, onlyProducer: false, exposes: e .numeric("SINSTS3", ea.STATE) .withUnit("VA") .withProperty("apparent_power_ph_c") .withDescription("Immediate apparent power delivered (phase 3)"), }, { cluster: clustersDef._0x0B04, att: "totalApparentPower", reportable: true, onlyProducer: false, exposes: e .numeric("SINSTS", ea.STATE) .withUnit("VA") .withProperty("total_apparent_power") .withDescription("Total immediate apparent power delivered"), }, { cluster: clustersDef._0x0B04, att: "averageRmsVoltageMeasPeriodPhC", reportable: true, onlyProducer: false, exposes: e .numeric("UMOY3", ea.STATE) .withUnit("V") .withProperty("average_rms_voltage_meas_period_ph_c") .withDescription("Average RMS voltage (phase 3)"), }, { cluster: clustersDef._0x0B04, att: "averageRmsVoltageMeasurePeriodPhB", reportable: true, onlyProducer: false, exposes: e .numeric("UMOY2", ea.STATE) .withUnit("V") .withProperty("average_rms_voltage_measure_period_ph_b") .withDescription("Average RMS voltage (phase 2)"), }, { cluster: clustersDef._0x0B04, att: "rmsCurrentPhB", report