Example: React on Variable changes via driver code

1.Open from driver view : My - Driver - > File/Code

2.Now go down to method "start" and replace this method with:


/**
 * This function is called as soon the device is connected
 */
start:function(){
  
  //some debugging message
  console.log('started Marantz',this);
  
  //Example:  we subscribe on variable changes, globally
  this.subscribe("onDriverVariableChanged");
  
  //Example, specify the event handler explizit
  //this.subscribe("onDriverVariableChanged",this.onDriverVariableChanged);
  
}

3.Now insert the event handler:


onDriverVariableChanged:function(evt){
          
  //grab the variable
  var variable = evt.item;
  
  //grab the xblox scope
  var blockScope = variable.scope;
  
  //abort if is not ours, we also receive here variable changes from other devices
  // notice:  we use != instead of !== 
  //          this is because we compare 2 object pointers and not two primitive's values
  if(blockScope != this.blockScope){
    return;
  }
  
  //Example: make some special effort for variable "Volume"
  if(variable.name ==="Volume"){
    console.info("Volume changed : " + variable.value);
  }
  
  
  //Example: abort if it is not a certain variable
  if(variable.name !=="value"){
    console.warn("skip variable " + variable.name);
    return;
  }
  
  //Example: print something in console
  console.log('onDriverVariableChanged '  + variable.name + ' new value:' + variable.value);
  
  
  //Example: do something with the variable
  var value = "" + variable.value; //important, build a new string
  value++;
  
  //Example: call a command 
  if(value ==='whatever'){
    this.callCommand("Command Name");
  }
  
  //Example: store it in another variable
  if(value ==='whatever'){
    this.setVariable("the other variable's name ",value);
  }  

}

4.Now re-connect the device (Toggle "Enabled") to see you code running. Since the driver method "start" is only called once, you need to do this every time you changed the code. This is a special case only with event handlers.

5.Your entire code file should look like this now:

define([
    "dcl/dcl"
], function (dcl) {
    return dcl(null, {
        updatePower: function (value) {
            value = value || this.getVariable('value');
            var out = 0;
            if (value.indexOf('@PWR:') != -1) {
                var _pw = value.split(':')[1];
                if (!isNaN(_pw)) {
                    this.setVariable('PowerState', _pw == 2 ? 'on' : 'off');
                    out = _pw;
                }
            }
            return out;
        },
        updateVolume: function (value) {
            value = value || this.getVariable('value');

            var out = 0;
            if (value.indexOf('MV') != -1 && value.indexOf('MVMAX') == -1) {
                var _volume = value.substring(2, value.length);
                _volume = parseInt(_volume.substring(0, 2));
                if (!isNaN(_volume)) {
                    this.setVariable('Volume', _volume);
                    out = _volume;
                } else {
                    return null;
                }
            } else {
                return null;
            }
            return out;
        },
        onMessage: function (data) {

            var message = data.message;
            this.updateVolume(message);
            this.updatePower(message);

            if (data.message.indexOf('MVMAX') != -1) {
                return;
            }
            /*
             this.log('warn', 'Marantz', message + ' PowerState: ' + this.getVariable('PowerState'), {
             some: 'extra',
             message: data
             });
             */
        },
        onDriverVariableChanged: function (evt) {

            //grab the variable
            var variable = evt.item;

            //grab the xblox scope
            var blockScope = variable.scope;

            //abort if is not ours, we also receive here variable changes from other devices
            // notice:  we use != instead of !== 
            //          this is because we compare 2 object pointers and not two primitive's values
            if (blockScope != this.blockScope) {
                return;
            }

            //Example: make some special effort for variable "Volume"
            if (variable.name === "Volume") {
                console.info("Volume changed : " + variable.value);
            }


            //Example: abort if it is not a certain variable
            if (variable.name !== "value") {
                console.warn("skip variable " + variable.name);
                return;
            }

            //Example: print something in console
            console.log('onDriverVariableChanged ' + variable.name + ' new value:' + variable.value);


            //Example: do something with the variable
            var value = "" + variable.value; //important, build a new string
            value++;

            //Example: call a command 
            if (value === 'whatever') {
                this.callCommand("Command Name");
            }

            //Example: store it in another variable
            if (value === 'whatever') {
                this.setVariable("the other variable's name ", value);
            }


        },
        /**
         * This function is called as soon the device is connected
         */
        start: function () {

            //some debugging message
            console.log('started Marantz', this);

            //Example:  we subscribe on variable changes, globally
            this.subscribe("onDriverVariableChanged");

            //Example, specify the event handler explizit
            //this.subscribe("onDriverVariableChanged",this.onDriverVariableChanged);

        }
    });
});