Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- let allGroupMembers = null;
- function getGroupMembers() {
- let groupMembers = {};
- let devsWithGroup = $('zigbee.0.*.groups');
- devsWithGroup.each(function(stateid) {
- if(stateid.indexOf('zigbee.0.info.') === 0) {
- return this;
- }
- let deviceGroups = getState(stateid).val;
- if(!deviceGroups) {
- return this;
- }
- deviceGroups = JSON.parse(deviceGroups);
- if(!deviceGroups) {
- return this;
- }
- let deviceId = stateid.substr(0, stateid.length - 7);
- let groupIdx;
- for(let i = 0; i < deviceGroups.length; i++) {
- groupIdx = 'group_' + deviceGroups[i];
- if(!groupMembers[groupIdx]) {
- groupMembers[groupIdx] = [];
- }
- groupMembers[groupIdx].push(deviceId);
- }
- });
- return groupMembers;
- }
- function checkDeviceGroups(deviceId, attribute, keepMembers) {
- if(!keepMembers) {
- // (re-)read group members
- allGroupMembers = getGroupMembers();
- }
- let groupsToCheck = [];
- log('checkDeviceGroups(' + deviceId + ', ' + attribute + ')', 'debug');
- if(deviceId.indexOf('zigbee.0.group_') === 0) {
- // this is a group
- let groupIdx = deviceId.replace(/^zigbee\.0\./, '');
- for(let m = 0; m < allGroupMembers[groupIdx].length; m++) {
- checkDeviceGroups(allGroupMembers[groupIdx][m], attribute, true);
- }
- } else {
- // this is a device
- let deviceGroups = getState(deviceId + '.groups').val;
- deviceGroups = JSON.parse(deviceGroups);
- for(let i = 0; i < deviceGroups.length; i++) {
- log('Need to check group ' + deviceGroups[i] + ' which I am a member of.', 'debug');
- groupsToCheck.push(deviceGroups[i]);
- }
- }
- for(let i = 0; i < groupsToCheck.length; i++) {
- let group = groupsToCheck[i];
- let groupIdx = 'group_' + group;
- if(!allGroupMembers[groupIdx]) {
- log('Group ' + groupIdx + ' checked has no members. This should not happen.', 'warn');
- } else {
- let sameStates = true;
- let sameStateValue = null;
- let stateValue;
- let curDevice;
- for(let m = 0; m < allGroupMembers[groupIdx].length; m++) {
- curDevice = allGroupMembers[groupIdx][m];
- stateValue = getState(curDevice + '.' + attribute).val;
- if(sameStateValue === null || sameStateValue === stateValue) {
- sameStateValue = stateValue;
- } else {
- sameStates = false;
- break;
- }
- }
- if(sameStates === true && sameStateValue !== null) {
- setState('zigbee.0.' + groupIdx + '.' + attribute, sameStateValue, true);
- log('checkDeviceGroups: All members of ' + groupIdx + ' have same state. Setting group attribute ' + attribute + ' to ' + sameStateValue);
- }
- }
- }
- }
- on({id: /^zigbee\.0\..*\.(state|brightness|transition_time)$/, change: 'any', ack: false}, function(obj) {
- let match = obj.id.match(/^(zigbee\.0\..*)\.(state|brightness|transition_time)$/);
- if(!match) {
- return;
- }
- let deviceId = match[1];
- let deviceAttr = match[2];
- if(deviceAttr === 'state') {
- // handle switch on/off
- if(obj.state.val === true) {
- let curBright = getState(deviceId + '.brightness').val;
- if(curBright < 10) {
- setState(deviceId + '.brightness', 100);
- }
- }
- } else if(deviceAttr === 'brightness') {
- // handle brightness changes
- let curState = getState(deviceId + '.state').val;
- if(obj.state.val < 10 && curState) {
- setState(deviceId + '.state', false); // need ack = false to trigger group check
- } else if(obj.state.val >= 10 && !curState) {
- setState(deviceId + '.state', true); // need ack = false to trigger group check
- }
- }
- checkDeviceGroups(deviceId, deviceAttr);
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement