Skip to content

Instantly share code, notes, and snippets.

@ralmn
Last active June 5, 2024 19:54
Show Gist options
  • Save ralmn/02de46e193bf111062f15be07d3e9bd2 to your computer and use it in GitHub Desktop.
Save ralmn/02de46e193bf111062f15be07d3e9bd2 to your computer and use it in GitHub Desktop.
Lixee ZLinky_TIC - Zigbee2MQTT

Intégration du Lixee ZLinky_TIC dans Zigbee2MQTT

Le module Zlinky_TIC est maintenant intégré officillement dans Zigbee2MQTT grâce au travail de @vk496 !

Pour archives :

Information

Le temps que je fininalise l'intégration, et que je la propose en PR sur le dépot de zigbee2mqtt pour qu'elle soit intégré officiellement voici une 1er version de l'intégration que vous pouvez ajouter manuellement.

En cas de problème, merci de les indiquer en commentaire ou sur twitter @ralmn45

Depot avec toutes les infos : https://github.com/fairecasoimeme/Zlinky_TIC Achat du module : https://lixee.fr/produits/37-zigate-usb-ttl-3770014375148.html

Instruction

  1. Dans le dossier de votre configuration de zigbee2mqtt, creer un dossier avec converters
  2. Placer le fichier lixee.js dans le dossier converters
  3. Dans le fichier configuration.yaml ajouter:
external_converters:
  - converters/lixee.js
  1. Relancer zigbee2mqtt

A faire avant de proposer l'intégration

  • Faire ajouter dans Z2M le cluster custom (merci @vk496 Koenkk/zigbee-herdsman#464)
  • Traduire en anglais les descriptions
  • Voir si tous les champs sont necessaires
  • Mettre un minimum sur l'option measurement_poll_interval

ChangeLog

  • 5 decembre 2021
    • 21h20
      • Ajout des traduction (merci @Gael67350 :) )
  • 4 decembre 2021
    • 00h17
      • Correction PTEC (utilisation du nom de l'attribut)
  • 3 decembre 2021
    • 21h27
      • Options measurement_poll_interval :
        • Minimum a 60
        • Prise en compte du changement sans reboot Z2M
      • Tentative de bind 2 endpoint
  • 15 nov 2021
    • 21h56
      • Correction pour PTEC qui a un attribut qui n'est pas dans la lib ni dans la norme 🤔
    • 18h55
    • Configuration des attributs reportable en async sans blocage.
  • 13 nov 2021
    • 22h20
      • Remise des valeurs filtré ;) mais en desactivant le reportable
    • 19h06
      • Retrait de toutes les versions
      • Test avec des reportings
      • Retrait des options => recup tout le temps des valeurs
      • Retrait de certainnes valeurs (SMAXN*, EASF,, UMOY)
  • 10 nov 2021
    • 18h55
      • Ajout d'un lixee3.js avec des options pour limité la récupération d'info quand c'est pas necessaire. ATTENTION : il faut restart z2m pour qu'une options soit prise en compte pour le moment !
  • 08 nov 2021
    • 18h22
      • Corrige les données null dans le lixee2.js
    • 15h50
      • Ajout d'un lixee2.js avec l'ensemble des valeurs
  • 07 nov 2021
    • 12h40
      • Ajout des index HP HC
    • 14h05
      • Inversion index HP / HC
    • 16h05
      • Fusion HC/HP dans l'index energy
  • 06 nov 2021
    • 1ere versions
/*
CETTE INTEGRATION NEST PLUS SUPPORTER ! MERCI D'UTILISER L'INTEGRATION OFFICILELLE
*/
const exposes = require('zigbee-herdsman-converters/lib/exposes');
const reporting = require('zigbee-herdsman-converters/lib/reporting');
const globalStore = require('zigbee-herdsman-converters/lib/store');
const { repInterval } = require('zigbee-herdsman-converters/lib/constants');
const { precisionRound, postfixWithEndpointName } = require('zigbee-herdsman-converters/lib/utils');
const e = exposes.presets;
const ea = exposes.access;
const options_measurement_poll_interval = exposes.numeric(`measurement_poll_interval`, ea.SET).withValueMin(60).withDescription(`This device does not support reporting electric measurements so it is polled instead. The default poll interval is 120 seconds. Min value is 60 seconds`);
// full list available on https://github.com/fairecasoimeme/Zlinky_TIC/blob/master/README.md
// Thanks for the translation of the descriptions to @Gael67350 (https://github.com/Gael67350)
let dataReportable = [
{"name":"PAPP","unit":"VA","clusterId":2820,"attributId":1295,"description":"Apparent power","cluster":"haElectricalMeasurement","attribut":"apparentPower","standard":false,"reportable":true,"onetime":false},
{"name":"IINST","unit":"A","clusterId":2820,"attributId":1288,"description":"RMS current","cluster":"haElectricalMeasurement","attribut":"rmsCurrent","standard":false,"reportable":true,"onetime":false},
{"name":"IINST1","unit":"A","clusterId":2820,"attributId":1288,"description":"RMS current (phase 1)","cluster":"haElectricalMeasurement","attribut":"rmsCurrent","standard":false,"reportable":true,"onetime":false},
{"name":"IINST2","unit":"A","clusterId":2820,"attributId":2312,"description":"RMS current (phase 2)","cluster":"haElectricalMeasurement","attribut":"rmsCurrentPhB","standard":false,"reportable":true,"onetime":false},
{"name":"IINST3","unit":"A","clusterId":2820,"attributId":2568,"description":"RMS current (phase 3)","cluster":"haElectricalMeasurement","attribut":"rmsCurrentPhC","standard":false,"reportable":true,"onetime":false},
{"name":"EAST","unit":"Wh","clusterId":1794,"attributId":0,"description":"Total active power delivered","cluster":"seMetering","attribut":"currentSummDelivered","standard":true,"reportable":true,"onetime":false},
{"name":"EASF10","unit":"Wh","clusterId":1794,"attributId":274,"description":"Total provider active power delivered (index10)","cluster":"seMetering","attribut":"currentTier10SummDelivered","standard":true,"reportable":true,"onetime":false},
{"name":"EASF01","unit":"Wh","clusterId":1794,"attributId":256,"description":"Total provider active power delivered (index 01)","cluster":"seMetering","attribut":"currentTier1SummDelivered","standard":true,"reportable":true,"onetime":false},
{"name":"EASF02","unit":"Wh","clusterId":1794,"attributId":258,"description":"Provider active power delivered (index 02)","cluster":"seMetering","attribut":"currentTier2SummDelivered","standard":true,"reportable":true,"onetime":false},
{"name":"EASF03","unit":"Wh","clusterId":1794,"attributId":260,"description":"Provider active power delivered (index 03)","cluster":"seMetering","attribut":"currentTier3SummDelivered","standard":true,"reportable":true,"onetime":false},
{"name":"EASF07","unit":"Wh","clusterId":1794,"attributId":268,"description":"Provider active power delivered (index 07)","cluster":"seMetering","attribut":"currentTier7SummDelivered","standard":true,"reportable":true,"onetime":false},
{"name":"EASF09","unit":"Wh","clusterId":1794,"attributId":272,"description":"Provider active power delivered (index 09)","cluster":"seMetering","attribut":"currentTier9SummDelivered","standard":true,"reportable":true,"onetime":false},
{"name":"EASF04","unit":"Wh","clusterId":1794,"attributId":262,"description":"Provider active power delivered (index 04)","cluster":"seMetering","attribut":"currentTier4SummDelivered","standard":true,"reportable":true,"onetime":false},
{"name":"EASF05","unit":"Wh","clusterId":1794,"attributId":264,"description":"Provider active power delivered (index 05)","cluster":"seMetering","attribut":"currentTier5SummDelivered","standard":true,"reportable":true,"onetime":false},
{"name":"EASF06","unit":"Wh","clusterId":1794,"attributId":266,"description":"Provider active power delivered (index 06)","cluster":"seMetering","attribut":"currentTier6SummDelivered","standard":true,"reportable":true,"onetime":false},
{"name":"EASF08","unit":"Wh","clusterId":1794,"attributId":270,"description":"Provider active power delivered (index 08)","cluster":"seMetering","attribut":"currentTier8SummDelivered","standard":true,"reportable":true,"onetime":false},
{"name":"CCASN","unit":"W","clusterId":2820,"attributId":1291,"description":"Current point of the active load curve drawn","cluster":"haElectricalMeasurement","attribut":"activePower","standard":true,"reportable":true,"onetime":false},
{"name":"SMAXN","unit":"VA","clusterId":2820,"attributId":1293,"description":"Apparent power delivered peak","cluster":"haElectricalMeasurement","attribut":"activePowerMax","standard":true,"reportable":true,"onetime":false},
{"name":"SMAXN1","unit":"VA","clusterId":2820,"attributId":1293,"description":"Apparent power delivered peak (phase 1)","cluster":"haElectricalMeasurement","attribut":"activePowerMax","standard":true,"reportable":true,"onetime":false},
{"name":"SMAXN2","unit":"VA","clusterId":2820,"attributId":2317,"description":"Apparent power delivered peak (phase 2)","cluster":"haElectricalMeasurement","attribut":"activePowerMaxPhB","standard":true,"reportable":true,"onetime":false},
{"name":"SMAXN3","unit":"VA","clusterId":2820,"attributId":2573,"description":"Apparent power delivered peak (phase 3)","cluster":"haElectricalMeasurement","attribut":"activePowerMaxPhC","standard":true,"reportable":true,"onetime":false},
{"name":"CCASN-1","unit":"W","clusterId":2820,"attributId":2315,"description":"Previous point of the active load curve drawn","cluster":"haElectricalMeasurement","attribut":"activePowerPhB","standard":true,"reportable":true,"onetime":false},
{"name":"SINSTS","unit":"VA","clusterId":2820,"attributId":1295,"description":"Immediate apparent power delivered","cluster":"haElectricalMeasurement","attribut":"apparentPower","standard":true,"reportable":true,"onetime":false},
{"name":"SINSTS1","unit":"VA","clusterId":2820,"attributId":1295,"description":"Immediate apparent power delivered (phase 1)","cluster":"haElectricalMeasurement","attribut":"apparentPower","standard":true,"reportable":true,"onetime":false},
{"name":"SINSTS2","unit":"VA","clusterId":2820,"attributId":2319,"description":"Immediate apparent power delivered (phase 2)","cluster":"haElectricalMeasurement","attribut":"apparentPowerPhB","standard":true,"reportable":true,"onetime":false},
{"name":"SINSTS3","unit":"VA","clusterId":2820,"attributId":2575,"description":"Immediate apparent power delivered (phase 3)","cluster":"haElectricalMeasurement","attribut":"apparentPowerPhC","standard":true,"reportable":true,"onetime":false},
{"name":"UMOY1","unit":"V","clusterId":2820,"attributId":1297,"description":"Average RMS voltage (phase 1)","cluster":"haElectricalMeasurement","attribut":"averageRmsVoltageMeasPeriod","standard":true,"reportable":true,"onetime":false},
{"name":"UMOY3","unit":"V","clusterId":2820,"attributId":2577,"description":"Average RMS voltage (phase 3)","cluster":"haElectricalMeasurement","attribut":"averageRmsVoltageMeasPeriodPhC","standard":true,"reportable":true,"onetime":false},
{"name":"UMOY2","unit":"V","clusterId":2820,"attributId":2321,"description":"Average RMS voltage (phase 2)","cluster":"haElectricalMeasurement","attribut":"averageRmsVoltageMeasurePeriodPhB","standard":true,"reportable":true,"onetime":false},
{"name":"ERQ2","unit":"VArh","clusterId":2820,"attributId":1294,"description":"Total reactive power (Q2)","cluster":"haElectricalMeasurement","attribut":"reactivePower","standard":true,"reportable":true,"onetime":false},
{"name":"ERQ3","unit":"VArh","clusterId":2820,"attributId":2318,"description":"Total reactive power (Q3)","cluster":"haElectricalMeasurement","attribut":"reactivePowerPhB","standard":true,"reportable":true,"onetime":false},
{"name":"ERQ4","unit":"VArh","clusterId":2820,"attributId":2574,"description":"Total reactive power (Q4)","cluster":"haElectricalMeasurement","attribut":"reactivePowerPhC","standard":true,"reportable":true,"onetime":false},
{"name":"IRMS1","unit":"A","clusterId":2820,"attributId":1288,"description":"RMS current (phase 1)","cluster":"haElectricalMeasurement","attribut":"rmsCurrent","standard":true,"reportable":true,"onetime":false},
{"name":"IRMS2","unit":"A","clusterId":2820,"attributId":2312,"description":"RMS current (phase 2)","cluster":"haElectricalMeasurement","attribut":"rmsCurrentPhB","standard":true,"reportable":true,"onetime":false},
{"name":"IRMS3","unit":"A","clusterId":2820,"attributId":2568,"description":"RMS current (phase 3)","cluster":"haElectricalMeasurement","attribut":"rmsCurrentPhC","standard":true,"reportable":true,"onetime":false},
{"name":"URMS1","unit":"V","clusterId":2820,"attributId":1285,"description":"RMS voltage (phase 1)","cluster":"haElectricalMeasurement","attribut":"rmsVoltage","standard":true,"reportable":true,"onetime":false},
{"name":"URMS2","unit":"V","clusterId":2820,"attributId":2309,"description":"RMS voltage (phase 2)","cluster":"haElectricalMeasurement","attribut":"rmsVoltagePhB","standard":true,"reportable":true,"onetime":false},
{"name":"URMS3","unit":"V","clusterId":2820,"attributId":2565,"description":"RMS voltage (phase 3)","cluster":"haElectricalMeasurement","attribut":"rmsVoltagePhC","standard":true,"reportable":true,"onetime":false},
{"name":"ERQ1","unit":"VArh","clusterId":2820,"attributId":773,"description":"Total reactive power (Q1)","cluster":"haElectricalMeasurement","attribut":"totalReactivePower","standard":true,"reportable":true,"onetime":false},
{"name":"EAIT","unit":"Wh","clusterId":1794,"attributId":1,"description":"Total active power injected","cluster":"seMetering","attribut":"currentSummReceived","standard":true,"reportable":true,"onetime":false},
];
let dataNonReportable = [
{"name":"BASE","unit":"Wh","clusterId":1794,"attributId":0,"description":"Base index","cluster":"seMetering","attribut":"currentSummDelivered","standard":false,"reportable":false,"onetime":false},
{"name":"PMAX","unit":"W","clusterId":2820,"attributId":1293,"description":"Three-phase power peak","cluster":"haElectricalMeasurement","attribut":"activePowerMax","standard":false,"reportable":false,"onetime":false},
{"name":"IMAX","unit":"A","clusterId":2820,"attributId":1290,"description":"RMS current peak","cluster":"haElectricalMeasurement","attribut":"rmsCurrentMax","standard":false,"reportable":false,"onetime":false},
{"name":"IMAX1","unit":"A","clusterId":2820,"attributId":1290,"description":"RMS current peak (phase 1)","cluster":"haElectricalMeasurement","attribut":"rmsCurrentMax","standard":false,"reportable":false,"onetime":false},
{"name":"IMAX2","unit":"A","clusterId":2820,"attributId":2314,"description":"RMS current peak (phase 2)","cluster":"haElectricalMeasurement","attribut":"rmsCurrentMaxPhB","standard":false,"reportable":false,"onetime":false},
{"name":"IMAX3","unit":"A","clusterId":2820,"attributId":2570,"description":"RMS current peak (phase 3)","cluster":"haElectricalMeasurement","attribut":"rmsCurrentMaxPhC","standard":false,"reportable":false,"onetime":false},
{"name":"ISOUSC","unit":"A","clusterId":2817,"attributId":13,"description":"Subscribed intensity level","cluster":"haMeterIdentification","attribut":"availablePower","standard":false,"reportable":false,"onetime":false},
{"name":"VTIC","unit":"-","clusterId":2817,"attributId":10,"description":"Customer tele-information protocol version","cluster":"haMeterIdentification","attribut":"softwareRevision","standard":true,"reportable":false,"onetime":true},
{"name":"PTEC","unit":"-","clusterId":1794,"attributId":32,"description":"Current pricing period","cluster":"seMetering","attribut":"activeRegisterTierDelivered","standard":false,"reportable":false,"onetime":false},
{"name":"HCHC","unit":"Wh","clusterId":1794,"attributId":256,"description":"HCHC index","cluster":"seMetering","attribut":"currentTier1SummDelivered","standard":false,"reportable":false,"onetime":false},
{"name":"EJPHN","unit":"Wh","clusterId":1794,"attributId":256,"description":"EJPHN index","cluster":"seMetering","attribut":"currentTier1SummDelivered","standard":false,"reportable":false,"onetime":false},
{"name":"BBRHCJB","unit":"Wh","clusterId":1794,"attributId":256,"description":"BBRHCJB index","cluster":"seMetering","attribut":"currentTier1SummDelivered","standard":false,"reportable":false,"onetime":false},
{"name":"BBRHCJW","unit":"Wh","clusterId":1794,"attributId":260,"description":"BBRHCJW index","cluster":"seMetering","attribut":"currentTier3SummDelivered","standard":false,"reportable":false,"onetime":false},
{"name":"BBRHCJR","unit":"Wh","clusterId":1794,"attributId":264,"description":"BBRHCJR index","cluster":"seMetering","attribut":"currentTier5SummDelivered","standard":false,"reportable":false,"onetime":false},
{"name":"ADC0","unit":"-","clusterId":1794,"attributId":776,"description":"Serial Number","cluster":"seMetering","attribut":"meterSerialNumber","standard":false,"reportable":false,"onetime":true},
{"name":"HCHP","unit":"Wh","clusterId":1794,"attributId":258,"description":"HCHP index","cluster":"seMetering","attribut":"currentTier2SummDelivered","standard":false,"reportable":false,"onetime":false},
{"name":"EJPHPM","unit":"Wh","clusterId":1794,"attributId":258,"description":"EJPHPM index","cluster":"seMetering","attribut":"currentTier2SummDelivered","standard":false,"reportable":false,"onetime":false},
{"name":"BBRHPJB","unit":"Wh","clusterId":1794,"attributId":258,"description":"BBRHPJB index","cluster":"seMetering","attribut":"currentTier2SummDelivered","standard":false,"reportable":false,"onetime":false},
{"name":"BBRHPJW","unit":"Wh","clusterId":1794,"attributId":262,"description":"BBRHPJW index","cluster":"seMetering","attribut":"currentTier4SummDelivered","standard":false,"reportable":false,"onetime":false},
{"name":"BBRHPJR","unit":"Wh","clusterId":1794,"attributId":266,"description":"BBRHPJR index","cluster":"seMetering","attribut":"currentTier6SummDelivered","standard":false,"reportable":false,"onetime":false},
{"name":"ADSC","unit":"-","clusterId":1794,"attributId":776,"description":"Secondary meter address","cluster":"seMetering","attribut":"meterSerialNumber","standard":true,"reportable":false,"onetime":true},
{"name":"PREF","unit":"kVA","clusterId":2817,"attributId":13,"description":"Apparent power of reference (PREF)","cluster":"haMeterIdentification","attribut":"availablePower","standard":true,"reportable":false,"onetime":false},
{"name":"PCOUP","unit":"kVA","clusterId":2817,"attributId":14,"description":"Apparent power threshold (PCOUP)","cluster":"haMeterIdentification","attribut":"powerThreshold","standard":true,"reportable":false,"onetime":false},
{"name":"PRM","unit":"-","clusterId":1794,"attributId":775,"description":"PRM","cluster":"seMetering","attribut":"siteId","standard":true,"reportable":false,"onetime":true},
];
// All attributes avaialables
let data = [
...dataReportable,
...dataNonReportable
];
function extractAttribute(cluster, nonReportableOnly){
let attributes = (nonReportableOnly ? dataNonReportable : data).filter(item => item.cluster === cluster);
return attributes
.filter(a => a.onetime == false)
.map(i => i.attribut)
.filter(a=>a != null)
.filter((value, index, self) => self.indexOf(value) === index); // Unique attributs
}
// For HomeAssistant
const indexEnergy = () => exposes.numeric('energy', ea.STATE).withUnit('Wh').withDescription('Index Base').withProperty('currentSummDelivered');
// Generate all metrics from attributs list
let exposesData = data.map(item => {
if(item.unit != null && item.unit != '-' && item.unit != ''){
return exposes.numeric(item.name, ea.STATE).withDescription(item.description).withProperty(item.attribut).withUnit(item.unit);
}else{
return exposes.text(item.name, ea.STATE).withDescription(item.description).withProperty(item.attribut);
}
}).filter(e => e != null);
function parsingResponse(model, msg, entries) {
let payload = {}
console.log(msg.cluster, msg.type);
for (let entry in msg.data) {
if(msg.data[entry] != null){
const val = msg.data[entry]
if(typeof(val) == "number"){
payload[postfixWithEndpointName(entry, msg, model)] = precisionRound(val, 2)
}else {
payload[postfixWithEndpointName(entry, msg, model)] = val;
}
}
}
console.log(payload, msg.data);
return payload;
}
const haMeterIdentificationFZ = {
cluster: 'haMeterIdentification',
type: ['attributeReport', 'readResponse', 'write'],
convert: (model, msg, publish, options, meta) => {
return parsingResponse(model, msg, extractAttribute('haMeterIdentification', false))
}
};
const haElectricalMeasurementFZ = {
cluster: 'haElectricalMeasurement',
type: ['attributeReport', 'readResponse', 'write'],
convert: (model, msg, publish, options, meta) => {
return parsingResponse(model, msg, extractAttribute('haElectricalMeasurement', false))
}
};
const seMeteringFZ = {
cluster: 'seMetering',
type: ['attributeReport', 'readResponse', 'write'],
convert: (model, msg, publish, options, meta) => {
let payload = parsingResponse(model, msg, extractAttribute('seMetering', false))
// merging of off-peak and peak hour meter
if (payload['currentSummDelivered'] == 0 && (payload['currentTier1SummDelivered'] > 0 || payload['currentTier2SummDelivered'] > 0)) {
payload['currentSummDelivered'] = payload['currentTier1SummDelivered'] + payload['currentTier2SummDelivered'];
}
return payload;
}
};
function createChunk(array, chunkSize) {
let R = [];
for (let i = 0; i < array.length; i += chunkSize) {
R.push(array.slice(i, i + chunkSize));
}
return R;
}
// Read attributs when are not reportable
async function poll(endpoint) {
console.log("POLL ");
// let attrs = extractAttribute('haMeterIdentification', true);
// await endpoint.read('haMeterIdentification', attrs);
// let chunks = [
// [
// "rmsCurrent",
// "rmsCurrentPhB",
// "rmsCurrentPhC",
// ],
// [
// "apparentPower",
// // ],
// // [
// "activePower",
// "activePowerPhB",
// ],
// [
// "apparentPowerPhB",
// "apparentPowerPhC",
// ],
// [
// "reactivePower",
// "reactivePowerPhB",
// "reactivePowerPhC",
// ],
// [
// "rmsVoltage",
// "rmsVoltagePhB",
// "rmsVoltagePhC",
// // ],
// // [
// "totalReactivePower"
// ]
// ];
attrs = extractAttribute('haElectricalMeasurement', true).sort((a, b)=> a.localeCompare(b));
let chunks = createChunk(attrs, 5);
for(let chunk of chunks)
await endpoint.read('haElectricalMeasurement', chunk);
// attrs = extractAttribute('seMetering', true).sort((a, b)=> a.localeCompare(b));
// chunks = [
// [
// "currentSummDelivered",
// "currentTier1SummDelivered",
// "currentTier2SummDelivered",
// "currentTier3SummDelivered",
// // ],
// // [
// //"meterSerialNumber",
// "ptec", // 32
// // ],
// // [
// "currentSummReceived",
// //"siteId"
// ]
// ];
// let othersAttrs = attrs.filter(a => !chunks[0].includes(a));
// if(othersAttrs.length > 0)
// chunks.push(othersAttrs);
attrs = extractAttribute('seMetering', true).sort((a, b)=> a.localeCompare(b));
chunks = createChunk(attrs, 5);
for(let chunk of chunks)
await endpoint.read('seMetering', chunk);
}
const definition = {
zigbeeModel: ['ZLinky_TIC'],
model: 'ZLinky_TIC',
vendor: 'LiXee',
description: 'Lixee ZLinky',
fromZigbee: [haMeterIdentificationFZ, seMeteringFZ, haElectricalMeasurementFZ],
toZigbee: [],
exposes: [indexEnergy(), ...exposesData],
configure: async (device, coordinatorEndpoint, logger) => {
const SW1_ENDPOINT = 1;
const endpoint = device.getEndpoint(SW1_ENDPOINT);
// ZLinky don't emit divisor and multiplier
endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', { acCurrentDivisor: 1, acCurrentMultiplier: 1 });
endpoint.saveClusterAttributeKeyValue('seMetering', { divisor: 1, multiplier: 1 });
reporting.bind(endpoint, coordinatorEndpoint, ['haElectricalMeasurement']).then(() => {}).catch(e => {
logger.error(`ZLINKY_TIC : failed to bind haElectricalMeasurement ${e.message}`);
});
reporting.bind(endpoint, coordinatorEndpoint, ['seMetering']).then(() => {}).catch(e => {
logger.error(`ZLINKY_TIC : failed to bind haElectricalMeasurement ${e.message}`);
});
for(let reportable of dataReportable){
logger.debug(`ZLINKY_TIC: Start configure reporting for ${reportable.name} (${reportable.cluster}/${reportable.attribut}).`);
//await endpoint.read(reportable.cluster, [reportable.attribut]);
endpoint.configureReporting(reportable.cluster || reportable.clusterId,
[{
attribute: reportable.attribut || reportable.attributId,
minimumReportInterval: 1,
maximumReportInterval: repInterval.MINUTES_5,
reportableChange: 1,
}]).then(() => {
logger.debug(`ZLINKY_TIC: ${reportable.name} (${reportable.cluster}/${reportable.attribut}) report successfully configured.`);
}).catch(e => { // Bug on firmware v1.0.0 (2021 11 01) -> Some attributs reportable cannot be configured
logger.warning(`ZLINKY_TIC: Failed to configure reporting for ${reportable.name} (${reportable.cluster}/${reportable.attribut}). Adding in polling attributs list.`)
dataNonReportable.push(reportable);
});
}
for(let data of dataNonReportable.filter(d => d.cluster).filter(d => d.attribut).filter(d => d.onetime)){
console.log(data.cluster, data.attribut);
endpoint.read(data.cluster, [data.attribut]);
}
},
options: [options_measurement_poll_interval],
onEvent: async (type, data, device, options) => {
const endpoint = device.getEndpoint(1);
const intervalDefined = globalStore.hasValue(device, 'interval');
if (type === 'stop') {
clearInterval(globalStore.getValue(device, 'interval'));
globalStore.clearValue(device, 'interval');
} else if (!intervalDefined) {
// periodic scan for non-reportable attributs
const seconds = options && options.measurement_poll_interval ? options.measurement_poll_interval : 120;
const interval = setInterval(async () => {
try {
await poll(endpoint);
} catch (error) {/* Do nothing*/ }
}, seconds * 1000);
globalStore.putValue(device, 'interval', interval);
globalStore.putValue(device, 'interval_seconds', seconds);
try{
await poll(endpoint);
}catch(e){ }
}else{
if(intervalDefined){
const seconds = options && options.measurement_poll_interval ? options.measurement_poll_interval : 120;
const defined_seconds = globalStore.getValue(device, 'interval_seconds');
if(seconds != defined_seconds){
clearInterval(globalStore.getValue(device, 'interval'));
const interval = setInterval(async () => {
try {
await poll(endpoint);
} catch (error) {/* Do nothing*/ }
}, seconds * 1000);
globalStore.putValue(device, 'interval', interval);
globalStore.putValue(device, 'interval_seconds', seconds);
}
}
}
},
endpoint: (dev) => {
return {
'haElectricalMeasurement': 1, 'seMetering': 1, 'haMeterIdentification': 1, 'default': 1
}
}
};
module.exports = definition;
@SilentT19
Copy link

SilentT19 commented Oct 11, 2022 via email

@dan73800
Copy link

dan73800 commented Jun 4, 2024

Bonjour à tous

Je me permets de déterrer ce post car j'ai intégré récemment un Lixee TIC dans Z2M 1.37.1, puis 1.38.0 avec Jeedom et je constate des erreurs qui remontent toutes les 5mn dans les logs.
J'ai un Sonoff ZDongle-E en version 7.4.3 et tous mes équipements fonctionnent sans problème.
Au niveau de Z2M et de Jeedom toutes les valeurs de mon Lixee remontent parfaitement.
Je suis sur l'offre Tempo en mode "Standard" et mon Lixee est dans la dernière version.

{ "active_energy_out_d01": 16786.2, "active_energy_out_d02": 6968.7, "active_energy_out_d03": 4163, "active_energy_out_d04": 8154.4, "active_power": 430, "active_power_max": 6, "active_power_max_ph_b": 1193, "active_power_max_ph_c": 774, "active_power_ph_b": 376, "apparent_power": 11, "apparent_power_ph_b": 316, "apparent_power_ph_c": 141, "available_power": 15, "average_rms_voltage_meas_period": 235, "average_rms_voltage_meas_period_ph_c": 237, "average_rms_voltage_measure_period_ph_b": 235, "current_date": "E240604121121", "current_index_tarif": 2, "current_price": "HP BLEU", "current_summ_delivered": 36072.4, "current_tarif": "TEMPO", "current_tier10_summ_delivered": 0, "current_tier1_summ_delivered": 11072, "current_tier2_summ_delivered": 17765.8, "current_tier3_summ_delivered": 1947.7, "current_tier4_summ_delivered": 2983.2, "current_tier5_summ_delivered": 1096.8, "current_tier6_summ_delivered": 1206.8, "current_tier7_summ_delivered": 0, "current_tier8_summ_delivered": 0, "current_tier9_summ_delivered": 0, "days_number_current_calendar": 0, "days_number_next_calendar": 0, "days_profile_current_calendar": "", "days_profile_next_calendar": "", "drawn_v_a_max_n1": 10, "drawn_v_a_max_n1_p2": 2330, "drawn_v_a_max_n1_p3": 483, "last_seen": "2024-06-04T10:12:31.339Z", "linkquality": 136, "message1": "PAS DE MESSAGE", "message2": "", "meter_serial_number": "041976444246", "power_threshold": 15, "relais": 0, "relais_breakout": { "relais1": 0, "relais2": 0, "relais3": 0, "relais4": 0, "relais5": 0, "relais6": 0, "relais7": 0, "relais8": 0 }, "rms_current": 0, "rms_current_ph_b": 1, "rms_current_ph_c": 1, "rms_voltage": 235, "rms_voltage_ph_b": 235, "rms_voltage_ph_c": 238, "site_id": "19637481907633", "software_revision": 2, "start_mobile_point1": 0, "start_mobile_point2": 0, "start_mobile_point3": 0, "status_register": "013A4401", "status_register_breakout": { "cache_borne_dist": "ferme", "comm_euridis": "activee avec securite", "contact_sec": "ouvert", "depassement_ref_pow": 0, "etat_cpl": "nouveau_verrouille", "horloge": "correcte", "organe_coupure": "ferme", "pointe_mobile": "AUCUN", "preavis_pointe_mobile": "AUCUN", "producteur": 0, "sens_energie_active": "positive", "surtension_phase": 0, "sync_cpl": "non_synchronise", "tarif_dist": "index_2", "tarif_four": "index_2", "tempo_demain": "UNDEF", "tempo_jour": "BLEU", "type_tic": "standard" }, "stop_mobile_point1": 0, "stop_mobile_point2": 0, "stop_mobile_point3": 0, "total_apparent_power": 470, "update": { "installed_version": 13, "latest_version": 13, "state": "idle" }, "device": { "applicationVersion": 5, "dateCode": "20230214", "friendlyName": "Lixee Garage", "hardwareVersion": 1, "ieeeAddr": "0x00158d0005d2a667", "manufacturerID": 4151, "manufacturerName": "LiXee", "model": "ZLinky_TIC", "networkAddress": 50360, "powerSource": "Mains (single phase)", "softwareBuildID": "4000-0013", "stackVersion": 2, "type": "Router", "zclVersion": 3 } }

Les logs remontent des erreur du type " no converter available for..." et ce toutes les 5mn ce qui pollue très rapidement :

25846|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'meter_serial_number' ("") 25847|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'active_power' ("") 25848|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_tier1_summ_delivered' ("") 25849|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'active_power_ph_b' ("") 25850|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_tier2_summ_delivered' ("") 25851|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_date' ("") 25852|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'apparent_power' ("") 25853|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'start_mobile_point1' ("") 25854|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_tier3_summ_delivered' ("") 25855|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'start_mobile_point2' ("") 25856|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_tier4_summ_delivered' ("") 25857|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'start_mobile_point3' ("") 25858|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'apparent_power_ph_b' ("") 25859|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'active_energy_out_d01' ("") 25860|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_tier5_summ_delivered' ("") 25861|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'active_energy_out_d02' ("") 25862|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_tier6_summ_delivered' ("") 25863|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'active_energy_out_d03' ("") 25864|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'apparent_power_ph_c' ("") 25865|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'active_energy_out_d04' ("") 25866|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_index_tarif' ("") 25867|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'tomorrow_color' ("") 25868|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_tier7_summ_delivered' ("") 25869|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_price' ("") 25870|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_tier8_summ_delivered' ("") 25871|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_tier9_summ_delivered' ("") 25872|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_tier10_summ_delivered' ("") 25873|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_summ_delivered' ("") 25874|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'stop_mobile_point1' ("") 25875|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'stop_mobile_point2' ("") 25876|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'stop_mobile_point3' ("") 25877|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'rms_current_ph_b' ("") 25878|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'rms_current_ph_c' ("") 25879|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'message1' ("") 25880|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'message2' ("") 25881|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'days_number_current_calendar' ("") 25882|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'days_number_next_calendar' ("") 25883|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'power_threshold' ("") 25884|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'days_profile_current_calendar' ("") 25885|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'days_profile_next_calendar' ("") 25886|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'site_id' ("") 25887|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'relais' ("") 25888|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'total_apparent_power' ("") 25889|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'active_power_max' ("") 25890|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'drawn_v_a_max_n1' ("") 25891|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'active_power_max_ph_b' ("") 25892|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'drawn_v_a_max_n1_p2' ("") 25893|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'active_power_max_ph_c' ("") 25894|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'drawn_v_a_max_n1_p3' ("") 25895|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'status_register' ("") 25896|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'average_rms_voltage_meas_period' ("") 25897|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'average_rms_voltage_measure_period_ph_b' ("") 25898|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'average_rms_voltage_meas_period_ph_c' ("") 25899|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'rms_voltage' ("") 25900|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'rms_voltage_ph_b' ("") 25901|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'rms_voltage_ph_c' ("") 25902|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'software_revision' ("") 25903|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'warn_d_p_s' ("") 25904|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'schedule_h_p_h_c' ("") 25905|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'rms_current' ("") 25906|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'rms_current_max' ("") 25907|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'available_power' ("") 25908|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'MOTDETAT' ("") 25909|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'current_tarif' ("") 25910|[2024-06-04 12:00:19] �[31merror�[39m: z2m: No converter available for 'active_register_tier_delivered' ("")

Alors que ces valeurs sont bien présentes et remontées.

Sauriez-vous me dire ce qui peut générer ces logs et surtout comment y remédier ?
@ralmn : vous qui êtes à l'origine du converter lixee.js, peut-être saurez-vous m'orienter vers une piste de résolution ?
D'avance merci pour vos suggestions.

@batchmanfr
Copy link

Bonjour,
J'ai déjà eu ce type d'erreur en changeant les paramètres du Lixee "à chaud".
Le pb avait été résolu de mémoire avec la procédure suivante :

  • Désappairer le Lixee (forcer la suppression via Z2M)
  • Redémarrer Z2M
  • Réappairer le Lixee
    A tester avant d'aller plus loin...
    Florian

@dan73800
Copy link

dan73800 commented Jun 4, 2024

@batchmanfr Merci pour le retour, mais hélas j'ai déjà testé de supprimer et réinclure, mais c'est hélas sans effet. Les erreurs dans les logs persistent malgré tout.
Par acquis de conscience je viens de le refaire en redémarrant Z2M entre temps, mais ça ne change rien.

@ralmn
Copy link
Author

ralmn commented Jun 4, 2024

J'ai eu des problèmes similaire... La mise a jour de mon Z2M sur le tag latest-dev (il est déployé via docker) a réglé le probleme...

@dan73800
Copy link

dan73800 commented Jun 4, 2024

Merci @ralmn d'avoir pris le temps de me faire un retour.
Je ne suis pas familier avec les termes employés sur Github, mais dois-je comprendre que un Z2M last-dev est en quelque sorte une version béta, voir alpha ?
Si c'est le cas je vais patienter et attendre une mise à jour officielle. Dans la mesure où tout fonctionne hormis ces logs trop bavards, cela n'a rien de vital.

@ralmn
Copy link
Author

ralmn commented Jun 4, 2024

C'est l'image docker qui est basé sur la version en cours de développement. Cependant elle semble correspondre avec la 1.38.0 sortie il y a 3j...
Tu as vérifié si tu avais pas un external converters qui rentrerais en conflit avec la configuration de z2m ?

@dan73800
Copy link

dan73800 commented Jun 4, 2024

En tout cas je n'ai rien installé délibérément faute de connaissances. J'ai installé Z2M 1.37.1 début Mai, c'était ma première installation, donc tout est natif. J'ai mis à jour à la sortie de la 1.38.0 pensant que cela pourrait corriger, mais vraisemblablement ce n'est pas le cas.
S'il y a un ou des converters en place, ce sont ceux fournis d'office.

@ralmn
Copy link
Author

ralmn commented Jun 5, 2024

Ton ZLinky_TIC est sur quelle version ?

@dan73800
Copy link

dan73800 commented Jun 5, 2024

Je suppose que c'est la dernière en date puisqu'une mise à jour OTA m'a été proposée dès l'appairage

image

Concernant les convertisseurs externes, j'ai regardé de plus près et il n'y en a qu'un de spécifié dans le dossier:
/var/www/html/plugins/z2m/core/class/../config/converters/Danfoss/icon.js
D'ailleurs pourquoi Danfoss ?? Je n'ai pas d'équipements de ce type.

Le début de ce fichier contient:

const fz = require('zigbee-herdsman-converters/converters/fromZigbee'); const tz = require('zigbee-herdsman-converters/converters/toZigbee'); const exposes = require('zigbee-herdsman-converters/lib/exposes'); const reporting = require('zigbee-herdsman-converters/lib/reporting'); const constants = require('zigbee-herdsman-converters/lib/constants'); const {} = require('zigbee-herdsman-converters/lib/modernExtend'); const e = exposes.presets; const ea = exposes.access;

Tout le reste semble consacré à Danfoss.
Est-ce normal ? Manquerait-il des informations dans ce fichier ? Est-il stocké au bon endroit ?
Pourtant c'est une installation classique qui a été poussée par défaut, je n'ai pas spécifié quoi que ce soit manuellement.

@ralmn
Copy link
Author

ralmn commented Jun 5, 2024

Tout semble bon...
La j'ai pas d'idée de pourquoi tu as ces problèmes...
Tu peux me prendre une capture des paramètre que tu as sur le devices ? (les 2 onglets paramètres de mémoire j'ai pas mon z2m sous la main)

@dan73800
Copy link

dan73800 commented Jun 5, 2024

Après ce n'est pas vraiment un problème de fonctionnement, juste de logs.

Le premier onglet "Paramètres" là où il y a le friendly name, il n'y a rien de coché

image

Seuls les paramètres spécifiques ont été renseignés en conformité avec mon contrat:

image

Quant à l'onglet "Expose" tout est OK et toutes les infos remontent bien, aussi bien dans Z2M que dans Jeedom

@ralmn
Copy link
Author

ralmn commented Jun 5, 2024

ça semble bon... Après tu peux essayer de faire un reconfig (image) du device... mais si non j'ai pas d'idée...

@dan73800
Copy link

dan73800 commented Jun 5, 2024

Ça aussi j'ai essayé, mais sans davantage de succès.
En tout cas merci d'avoir répondu et d'avoir pris du temps pour essayer de résoudre ce problème.
Je vais attendre une prochaine version qui peut être le résoudra.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment