J'ai joué un peu avec mes différents modules aqara et comme annoncé dans la doc du plugin, le support n'est pas tout a fait complet du coup j'ai fouillé un peu et j'ai commencé à intégrer la librairie zigbee-shepherd-converters. C'est prometteur !
J'ai commencé par integrer la librairie dans le script d'install des dependances:
sudo npm install git+
https://github.com/Koenkk/zigbee-shephe ... git#master
J'ai un peu honte car j'ai repompé le code de
https://github.com/ioBroker/ioBroker.zigbee ... Mais voila ce que ca donne :
Ajout en début de fichier openzigbeed.js :
Et en fin de fichier (ca c'est que j'ai honteusement recopié ... et très legerement modifié ... )
Code : Tout sélectionner
function onDevEvent(type, devId, message, data) {
switch (type) {
case 'interview':
// Jeedom.log.debug('Device ' + devId + ' try to connect ' + JSON.stringify(data));
// logToPairing('Interview state: step ' + data.currentEp + '/' + data.totalEp + '. progress: ' + data.progress + '%', true);
break;
case 'msg':
Jeedom.log.debug('Device ' + devId + ' incoming event:' + JSON.stringify(message));
// Map Zigbee modelID to vendor modelID.
const mModel = deviceMapping.findByZigbeeModel(data.modelId);
let payload = {};
if (message.hasOwnProperty('linkquality')) {
payload.linkquality = message.linkquality;
}
if (message.hasOwnProperty('available')) {
payload.available = message.available;
}
Jeedom.log.debug('Publish ' + JSON.stringify(payload));
publishToState(devId.substr(2), data.modelId, mModel, payload);
break;
default:
Jeedom.log.debug('Device ' + devId + ' emit event ' + type + ' with data:' + JSON.stringify(message.data));
// ignore if remaining time is set in event, cause that's just an intermediate value
if (message.data.data && message.data.data.remainingTime) {
Jeedom.log.debug('Found remaining time ' + message.data.data.remainingTime + ', so skip event');
return;
}
// Map Zigbee modelID to vendor modelID.
const modelID = data.modelId;
const mappedModel = deviceMapping.findByZigbeeModel(modelID);
// Find a conveter for this message.
const cid = data.cid;
if (!mappedModel) {
Jeedom.log.error('Unknown device model ' + modelID + ' emit event ' + type + ' with data:' + JSON.stringify(message.data));
return;
}
let converters = mappedModel.fromZigbee.filter(c => c.cid === cid && (
(c.type instanceof Array) ? c.type.includes(type) : c.type === type));
if (!converters.length && type === 'readRsp') {
converters = mappedModel.fromZigbee.filter(c => c.cid === cid && (
(c.type instanceof Array) ? c.type.includes('attReport') : c.type === 'attReport'));
}
if (!converters.length) {
Jeedom.log.debug(
`No converter available for '${mappedModel.model}' with cid '${cid}' and type '${type}'`
);
return;
}
converters.forEach((converter) => {
const publish = (payload) => {
// Don't cache messages with click and action.
const cache = !payload.hasOwnProperty('click') && !payload.hasOwnProperty('action');
Jeedom.log.debug('Publish ' + JSON.stringify(payload));
if (payload) {
publishToState(devId.substr(2), modelID, mappedModel, payload);
}
};
//collectOptions(devId.substr(2), modelID, (options) => {
// const payload = converter.convert(mappedModel, message, publish, options);
const payload = converter.convert(mappedModel, message, publish, null);
if (payload) {
// Add device linkquality.
if (message.linkquality) {
payload.linkquality = message.linkquality;
}
publish(payload);
}
//});
});
break;
}
}
function publishToState(devId, modelID, model, payload) {
//TODO ajout code pour envoyer à jeedom
}
Puis j'appelle ce bout de code lors de la reception des messages (j'ai gardé les anciennes notifications pour l'instant)
Code : Tout sélectionner
case 'attReport':
case 'devChange':
msg.data.jeedom_value = Zigbee.getDataValue(msg.data)
if(msg.data.jeedom_value === null){
return;
}
var endpointDesc = msg.endpoints[0].getSimpleDesc();
Jeedom.com.add_changes(msg.endpoints[0].getIeeeAddr()+'::'+endpointDesc.epId+'::'+msg.data.cid,msg.data);
//break;
default:
// We dont handle messages without endpoints.
if (!msg.endpoints) {
Jeedom.log.debug('Message without endpoints!');
return;
}
const device = msg.endpoints[0].device;
if (!device) {
Jeedom.log.debug('Message without device!');
return;
}
// We can't handle devices without modelId.
if (!device.modelId) {
Jeedom.log.debug('Message without modelId!');
return;
}
// After this point we cant handle msg without cid anymore.
if (msg.data.cid === undefined) {
Jeedom.log.debug('Message without data cluster!');
return;
}
onDevEvent(msg.type, device.ieeeAddr, msg, {
cid: msg.data.cid,
modelId: device.modelId,
});
break;
Du coup pour l'instant ca fait que logguer ... et remonte pas dans jeedom mais j'arrive a avoir les niveaux de batteries de tout mes modules xiaomi :
Code : Tout sélectionner
[2019-05-18 05:10:17][DEBUG] : Publish {"battery":100,"voltage":3005,"linkquality":34}
[2019-05-18 05:11:42][DEBUG] : Publish {"battery":86,"voltage":2975,"linkquality":115}
[2019-05-18 05:32:43][DEBUG] : Publish {"battery":62,"voltage":2935,"linkquality":28}
[2019-05-18 05:35:40][DEBUG] : Publish {"battery":100,"voltage":3025,"linkquality":2}
J'ai les multi clicks de mon bouton xiaomi lumi.sensor_switch.aq2
Code : Tout sélectionner
[2019-05-17 17:29:58][DEBUG] : Publish {"click":"single","linkquality":5}
[2019-05-17 17:30:05][DEBUG] : Publish {"click":"double","linkquality":5}
[2019-05-17 17:30:10][DEBUG] : Publish {"click":"triple","linkquality":5}
Le capteur de presence xiaomi lumi.sensor_motion.aq2 qui ne renvoie pas le no_motion de lui même, renvoie un no_motion grace à la librairie:
Code : Tout sélectionner
[2019-05-18 07:59:13][DEBUG] : Publish {"occupancy":true,"linkquality":34}
[2019-05-18 08:00:43][DEBUG] : Publish {"occupancy":false}
Le capteur de temperature xiaomi lumi.weather marche toujours :
Code : Tout sélectionner
[2019-05-18 08:04:12][DEBUG] : Publish {"temperature":14.59,"humidity":63.61,"pressure":985.9,"linkquality":115}
Le capteur d'ouverture de porte xiaomi aussi lumi.sensor_magnet.aq2:
Code : Tout sélectionner
[2019-05-18 08:09:53][DEBUG] : Publish {"contact":true,"linkquality":23}
[2019-05-18 08:09:54][DEBUG] : Publish {"contact":false}
Mon cube xiaomi lumi.sensor_cube s'est mis a marcher
Code : Tout sélectionner
[2019-05-17 17:59:12][DEBUG] : Publish {"action":"flip90","from_side":3,"to_side":4,"linkquality":28}
[2019-05-17 17:59:20][DEBUG] : Publish {"action":"flip90","from_side":4,"to_side":0,"linkquality":28}
[2019-05-17 17:59:31][DEBUG] : Publish {"action":"flip180","side":5,"linkquality":28}
[2019-05-17 17:59:43][DEBUG] : Publish {"action":"tap","side":3,"linkquality":28}
[2019-05-17 18:00:36][DEBUG] : Publish {"action":"slide","side":3,"linkquality":28}
[2019-05-17 18:01:11][DEBUG] : Publish {"action":"rotate_right","angle":121.4,"linkquality":28}
[2019-05-17 18:01:22][DEBUG] : Publish {"action":"rotate_left","angle":-14.01,"linkquality":28}
[2019-05-17 18:01:40][DEBUG] : Publish {"action":"fall","linkquality":31}
et le capteur de vibration lumi.vibration.aq1
Code : Tout sélectionner
[2019-05-17 18:03:41][DEBUG] : Publish {"action":"vibration","linkquality":28}
[2019-05-17 18:41:50][DEBUG] : Publish {"action":"tilt","angle":5,"linkquality":31}
[2019-05-17 18:41:55][DEBUG] : Publish {"angle_x":1,"angle_y":77,"angle_z":13,"angle_x_absolute":89,"angle_y_absolute":13,"linkquality":26}
Il me reste a faire la même chose pour l'envoie des commandes ... ce qui permettra de s'affranchir des specificitées de chaque objet côté jeedom (par exemple l'adresse pour les commandes des ampoules Hue sont 11 contre celle ikea à 1 et j'en sais rien pour les autres ...)
Et de modifier côté jeedom pour prendre en compte les nouveau message ... mais je ne me rends pas trop compte si c'est difficile ou pas car je connais aussi bien le moteur de Jeedom que le nodejs ... niveau connaissance 0/100
Cette librairie gere les groupes ... ca permettra aussi de grouper des ampoules par exemples et d'envoyer des ordres groupé !