Your Universal Remote Control Center
RemoteCentral.com
RS-232 & IP Control Forum - View Post
Up level
Up level
The following page was printed from RemoteCentral.com:

Login:
Pass:
 
 

Original thread:
Post 5 made on Thursday March 21, 2024 at 19:05
Fiasco
Senior Member
Joined:
Posts:
July 2009
1,282
var ZonePro = function() {
    var module = {
        system        : "",
        model        : "",
        join        : -1,
        feedback        : "",
        debug        : 1,
        disco           : ["ff","ff"],
        zone1          : ["00","00","00","00"],
        zone2          : ["00","00","00","00"],
        zone3          : ["00","00","00","00"],
        zone4          : ["00","00","00","00"],
        buffer        : [],
                node        : ["8A"],  // 640m default node is 138/8A
                framestart     : ["F0", "64"],
                framecount    : ["00"],
                version        : ["01"],
                address        : ["AB", "CD"],  // Pick a hex address to identify yourself to the zonepro  
                recipient    : ["FF", "FF"],
                zone1join    : 0,
                zone2join    : 0,
                zone3join    : 0,
                zone4join    : 0,
    };
  
// Output 1 Address 20 0 5 1
// Output 2 Address 21 1 5 1
// Output 3 Address 22 2 5 1
// Output 4 Address 23 3 5 1
// zonepro node address 48
// router 1 id 27 b0 16 b1 0 b2 5 b3 1 posb0 0 posb1 5
// router 2 id 27 b0 17 b1 1 b2 5 b3 1 posb0 1 posb1 5
// router 3 id 27 b0 18 b1 2 b2 5 b3 1 posb0 2 posb1 5
// router 4 id 27 b0 19 b1 3 b2 5 b3 1 posb0 3 posb1 5
// msgid 0113 subscribeall
// msgid 0114 unsubscribeall
// msgid 9001 recall scene
// msgid 0100 multisvset
// msgid 0000 disco
// msgid 0004 info
// msgid 0103 get message
// msgid 011e get object list
// flags bit 0 reqack
// flags bit 1 ack
// flags bit 2 info
// flags bit 3 error
// flags bit 4 event
// flags bit 8-15 hop count


//Frame Start UBYTE 0x64
//Frame Count UBYTE 0x00
//VERSION UBYTE 0x01
//LEN ULONG Length of entire packet (not including FS FC, CS)
//SRC UWORD:ULONG [Device : Object]
//DEST UWORD:ULONG [Device : Object]
//MSG_ID UWORD Specific type of command issued
//FLAGS UWORD (there is no guaranteed bit)
//(Payload)
//Checksum UBYTE CCITT-8 (over FS, FC, Header, Payload)
//     [FRAMESTART]    [FRAMECOUNT]    [VERSION]    [LEN]            [SRC.RTE]    [NODE]    [DEST.RTE]    [MSGID]        [FLAGS]        [PAYLOAD]    [CHECKSUM]
// F0    64        00        01        00,00,00,1B    00,33     01,05,00,15    00,8A    01,05,00,15    01,00,00,00,00,01,00,02,01    01        7B


    module.setup = function(system, feedback, node, debug) {
                module.system = system;
                module.feedback = feedback;
                module.node = node.toString(16);
                module.node = "8A";
                module.debug = debug;
            module.log("Setup System " + system + " Feedback " + feedback + " DBXNode " + node + " Debug " + debug );
          
    };
  
  
    // in zone pro designer, select the RTE and hit ctrl+shift+o to get the 4 address numbers (b0, b1, b2, b3) and call the RTE functions to assign them.
    module.setupRTE = function( rte, array ) {
        // create the base join number for GUI elements
        var joinnumber = "";
        for ( var i = 0; i < array.length; i++ ) {
            joinnumber = joinnumber + array[i];
        }
        module.log("RTE" + rte + " " + "Mute Join Number " + joinnumber);

        // convert address to hex
        for ( var i = 0; i < array.length; i++ ) {
            array[i] = array[i].toString(16);
            // pad hex value with leading 0 if necessary
            if ( array[i].length < 2 ) {
                array[i] = "0" + array[i];
            }
        }
        // assign it to the zones

        switch (rte) {
            case 1:
                module.zone1 = array.reverse();
                module.log("Setup RTE1 " + module.zone1 );
                module.zone1join = joinnumber;
            break;
            case 2:
                module.zone2 = array.reverse();
                module.log("Setup RTE2 " + module.zone2 );
                module.zone2join = joinnumber;
            break;
            case 3:
                module.zone3 = array.reverse();
                module.log("Setup RTE3 " + module.zone3 );
                module.zone3join = joinnumber;
            break;
            case 4:
                module.zone4 = array.reverse();
                module.log("Setup RTE4 " + module.zone4 );
                module.zone4join = joinnumber;
            break;  
            default:
                module.log("ERROR - invalid RTE number should be 1-4");
            break;
        }
    }
  
    module.initialize = function() {
        module.log("Start watching freedback on " + module.system + " " + module.feedback);
        CF.watch(CF.FeedbackMatchedEvent, module.system, module.feedback, module.ProcessFeedback);
        module.requestAddress();
        module.sendDisco();
        setInterval(function(){ module.sendHeartbeat();}, 1000);
        setInterval(function(){ module.sendDisco();} , 10000);
        module.log("Initialized...\n");
    };
  
    module.requestAddress = function() {
        var framestart        = module.framestart;  
        var framecount         = module.framecount;
        var version        = module.version;
        var length         = ["00", "00", "00", "2F"];
        var source         = [module.address[0], module.address[1], "00", "00", "00", "00"];
        var destination     = ["ff", "ff", "00", "00", "00", "00"];
        var messageid        = ["00", "00"];
        var flags        = ["05", "00"];
        var payload         = [module.address[0], module.address[1], "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00"];
        var commandarray     =  [];
        commandarray = commandarray.concat( framestart, framecount, version, length, source, destination, messageid, flags, payload);    
        commandarray.push(module.checksum(commandarray));
        module.sendCommand(commandarray, "Request Address: ", 0);
    }  
  
    module.sendDisco = function() {
        var framestart        = module.framestart;  
        var framecount         = module.framecount;
        var version        = module.version;
        var length         = ["00", "00", "00", "2F"];
        var source         = [module.address[0], module.address[1], "00", "00", "00", "00"];
        var destination     = ["ff", "ff", "00", "00", "00", "00"];
        var messageid        = ["00", "00"];
        var flags        = ["05", "00"];
        var payload         = [module.address[0], module.address[1], "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00", "00"];
        var commandarray     = [];
        commandarray = commandarray.concat( framestart, framecount, version, length, source, destination, messageid, flags, payload);    
        commandarray.push(module.checksum(commandarray));
        module.sendCommand(commandarray, "Send Disco: ", 0);
    };  

  
    module.subscribe = function( zone ) {
        var framestart        = module.framestart;  
        var framecount         = module.framecount;
        var version        = module.version;
        var length         = ["00", "00", "00", "20"];
        var source         = [module.address[0], module.address[1], zone[0], zone[1], zone[2], zone[3]];
        var destination     = ["00", module.node, zone[0], zone[1], zone[2], zone[3]];
        var messageid        = ["01", "13"];
        var flags        = ["00", "00"];
        var payload         = [module.address[0], module.address[1], zone[0], zone[1], zone[2], zone[3], "01", "00", "00", "00", "01"];
        var commandarray     = [];
        commandarray = commandarray.concat( framestart, framecount, version, length, source, destination, messageid, flags, payload);    
        commandarray.push(module.checksum(commandarray));
        module.sendCommand(commandarray, "Subscribe to Zone: ", 0);  
    };
    module.getVDList = function() {
        var framestart        = module.framestart;  
        var framecount         = module.framecount;
        var version        = module.version;
        var length         = ["00", "00", "00", "19"];
        var source         = [module.address[0], module.address[1], "00", "00", "00", "00"];
        var destination     = ["00", module.node, "00", "00", "00", "00"];
        var messageid        = ["01", "1a"];
        var flags        = ["05", "00"];
        var payload         = ["00", "02", "00", "00"];
        var commandarray     = [];
        commandarray = commandarray.concat( framestart, framecount, version, length, source, destination, messageid, flags, payload);    
        commandarray.push(module.checksum(commandarray));
        module.sendCommand(commandarray, "Get VD List: ", 1);      
    }
    module.describeVD = function() {
        var framestart        = module.framestart;  
        var framecount         = module.framecount;
        var version        = module.version;
        var length         = ["00", "00", "00", "15"];
        var source         = [module.address[0], module.address[1], module.zone1[0], module.zone1[1], module.zone1[2], module.zone1[3]];
        var destination     = ["00", module.node, module.zone1[0], module.zone1[1], module.zone1[2], module.zone1[3]];
        var messageid        = ["01", "19"];
        var flags        = ["00", "01"];
        var commandarray     = [];
        module.log(module.zone1 + " " + module.zone1[3]);
        commandarray = commandarray.concat( framestart, framecount, version, length, source, destination, messageid, flags);    
        commandarray.push(module.checksum(commandarray));
        module.sendCommand(commandarray, "Describe VD: ", 1);
    }      
      



      
    ///////////////////////////////
    // VOLUME FUNCTIONS          //
    ///////////////////////////////
    module.setVolume = function(zone, volume) {
        var commandarray = ["F0","64","00","01","00","00","00","1C","00","33"];
        var nodearray      = ["00", module.node];
        var msgidarray     = ["01","00","00","00","00","01","00","01","03","00"];
        var target = "";
        switch (zone) {
            case 1:
            target = module.zone1;
            break;
            case 2:
            target = module.zone2;
            break;
            case 3:
            target = module.zone3;
            break;
            case 4:
            target = module.zone4;
            break;
        }
        commandarray = commandarray.concat(target, nodearray, target, msgidarray);
        commandarray.push(volume);
        commandarray.push(module.checksum(commandarray));
        module.sendCommand(commandarray, "zone " + zone + " volume " + volume );
    };

    module.muteZone = function(zone, join) {
        CF.getJoin(join, function(join,value) {      
            if ( value == 1 ) {
                value = 0;
            } else {
                value = 1;
            }
            // zone 1 mute     F0 64 00 01 00 00 00 1B 00 33 01 05 00 14 00 8A 01 05 00 14 01 00 00 00 00 01 00 02 01 01 81
            // zone 2 unmute   F0 64 00 01 00 00 00 1B 00 33 01 05 00 14 00 8A 01 05 00 14 01 00 00 00 00 01 00 02 01 00 DF
            module.log("Zone " + zone + " mute " + value );
            var commandarray = ["F0","64","00","01","00","00","00","1B","00","33"];
            var nodearray      = ["00", module.node];
            var msgidarray      = ["01","00","00","00","00","01","00","02","01"];  
            var target = "";
            switch (zone) {
                case 1:
                target = module.zone1;
                break;
                case 2:
                target = module.zone2;
                break;
                case 3:
                target = module.zone3;
                break;
                case 4:
                target = module.zone4;
                break;
            }
            commandarray = commandarray.concat(target, nodearray, target, msgidarray);
            commandarray.push("0" + value);
            commandarray.push(module.checksum(commandarray));
            module.sendCommand(commandarray, "zone " + zone + " mute " + value );
        });
    };

    module.setInput = function(zone, input) {
        var commandarray = ["F0","64","00","01","00","00","00","1B","00","33"];
        var nodearray      = ["00", module.node];
        var msgidarray      = ["01","00","00","00","00","01","00","00","01"];  
        var target = "";
        switch (zone) {
            case 1:
            target = module.zone1;
            break;
            case 2:
            target = module.zone2;
            break;
            case 3:
            target = module.zone3;
            break;
            case 4:
            target = module.zone4;
            break;
        }
        commandarray = commandarray.concat(target, nodearray, target, msgidarray);          
        commandarray.push("0" + input);
        commandarray.push(module.checksum(commandarray));
        module.sendCommand(commandarray, "zone " + zone + " input " + input + " - ");  
    }
  
  
  


  
// current receiving from disco 64 - 0 - 1 - 0 0 0 2f - 0 8a - 0 0 0 0 - 1c 30 0 0 0 0 0 0 0 4 0 8a 5 0 10 0 0 0 0 0 0 0 0 0 0 0 f d7 1 5 8a 10 0 0 0 e8
//     [FRAMESTART]    [FRAMECOUNT]    [VERSION]    [LEN]            [SRC.RTE]    [NODE]    [DEST.RTE]    [MSGID]        [FLAGS]        [PAYLOAD]    [CHECKSUM]
// F0    64        00        01        00,00,00,1B    00,33     01,05,00,15    00,8A    01,05,00,15    01,00,00,00,00,01,00,02,01    01        7B
// 4 10 17 26 37 45
// send disco no address
// 01 00 00 00 2f 30 1c 00 00 00 00 ff ff 00 00 00 00 00 00 05 00 1c 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
// send disco w/ address
// 01 00 00 00 2f 30 1c 00 00 00 00 00 30 00 00 00 00 00 00 05 04 1c 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
// rec disco no address
// 01 00 00 00 2f 00 30 00 00 00 00 ff ff 00 00 00 00 00 00 00 04 00 30 37 00 10 00 00 00 00 00 00 00 00 00 00 00 0f d7 02 20 51 10 00 00 00 04
// rec disco w/ address
// 01 00 00 00 2f 00 30 00 00 00 00 30 1c 00 00 00 00 00 00 00 04 00 30 70 00 10 00 00 00 00 00 00 00 00 00 00 00 0f d7 02 20 51 10 00 00 00 04
    ///////////////////////////////
    // FEEDBACK                  //
    ///////////////////////////////
    module.ProcessFeedback = function(feedbackname, feedbackstring) {

        // put the feedback string in the buffer
        var text = feedbackstring.split("");      
        for ( var i = 0; i < text.length; i++ ) {
            var digit = text[i].charCodeAt(0);
            var hexy = digit.toString(16);
            // ignore resync requests
            if ( hexy === "f0" && i == 0) { return; }
            if ( hexy === "ff" && i == 0) { return; }
            module.buffer.push(hexy);
        }  
        //module.log("Buffer " + module.buffer);
        // The first part of the buffer is the frame start
        // we want to get go the length marker and cut that chunk from the buffer and process it

        // find the first index of a frame start "64"
        var index = module.buffer.indexOf("64");
        // remove everything that precedes it
        if ( index > 0 ) {
            var waste = module.buffer.splice(0, index);
            //module.log("Waste " + waste);
            // reset the 64 index incase waste happened

            index = module.buffer.indexOf("64");

        }

        var framelength = 0;
        if ( module.buffer.length > 7 ) {      
            framelength = parseInt(module.buffer[6], 16);
        //    module.log("Frame Length: " + framelength);
            // if we have accumulated the whole frame in the buffer splice it out
            var response = "";
            if ( index > -1 && module.buffer.length >= framelength + 3 ) {
                response = module.buffer.splice(0, framelength + 3);  
            //    module.log("\nResponse: " + response + "\n");
                module.parseCommand(response);
            }          
        }
        //module.log("Buffer " + module.buffer );
      
      

      
      
      
      
        /// OLD
        return;
  
  
  
  
        var text = feedbackstring.split("");
        var hexstr = "fb>";
        var hexstring = "HS";
        for ( var i = 0; i < text.length; i++ ) {
            var digit = text[i].charCodeAt(0);
            var hexy = digit.toString(16);
            if ( hexy === "f0" && i == 0) { return; }
            if ( hexy === "ff" && i == 0) { return; }
            module.buffer.push(hexy);
            hexstring = hexstring + digit + " ";
            hexstr = hexstr + hexy + " ";
        }
        module.log( "FEEDBACK " + hexstr );
      
  
        for ( var i = 0; i < module.buffer.length; i++ ) {
            if ( module.buffer[i] === "8c" ) {
                // Ping
                module.log("Ping");
                module.buffer.splice(i, 1);
                i--;
            } else
            if ( module.buffer[i] === "64" ) {
          
                // Command - Get Frame Count
                var framecount = "";
                for ( var j = i+3; j < i + 7; j++ ) {
                    framecount +=  module.buffer[j];
                }
                framecount = parseInt(framecount, 16);
                var cmd = module.buffer.splice(i, 1 + framecount + 2);
                i--;
                module.parseCommand( cmd );
            } else
            if ( module.buffer[i] === "ff" ) {
                // Check for FF flush
                var ffcount = 0;
                var start = 0;
                for ( var j = i; j < module.buffer.length; j++ ) {
                    if ( module.buffer[j] === "ff" ) {
                        if ( start == 0 ) { start = i; }
                        ffcount++;
                    }
                    if ( module.buffer[j] !== "ff" ) { break; }
                }
                if ( ffcount > 4 ) {
                //    module.log("FF FLUSH");
                    module.buffer.splice(i, ffcount);
                    i--;
                    return;
                }
            } else
            if ( module.buffer[i] === "f0" ) {
                // Check for FO flush
                var ffcount = 0;
                var start = 0;
                for ( var j = i; j < module.buffer.length; j++ ) {
                    if ( module.buffer[j] === "f0" ) {
                        if ( start == 0 ) { start = i; }
                        ffcount++;
                    }
                    if ( module.buffer[j] !== "f0" ) { break; }
                }
                if ( ffcount > 4 ) {
                    //module.log("F0 FLUSH");
                    module.buffer.splice(i, ffcount);
                    i--;
                    return;
                }
            }
        //    module.log( "FEEDBACK " + hexstr );
            if ( module.buffer.length > 0 ) {
                module.log("BUFFER> " + module.buffer);
            }
        }
    };


    ///////////////////////////////
    // INTERNAL HELPER FUNCTIONS //
    ///////////////////////////////

    module.parseCommand = function(command) {
    module.log("parse");
        module.ack();

        var framestart     = command.splice(0,1);
        var framecount  = command.splice(0,1);
        var version    = command.splice(0,1);
        var framelength    = command.splice(0,4);
        var src     = command.splice(0,6);
        var dest    = command.splice(0,6);
        var msgid    = command.splice(0,2);
        var flags    = command.splice(0,2);
        var payload    = command.splice(0,command.length-1);
        var checksum     = command.splice(0,1);
        var length     = "";  
      
          for ( var i = 0; i < 4; i++ ) {
            length +=  framelength[i];
        }
        // DISCO MESSAGE
        if ( module.compareArrays(msgid, [0,0]) && module.compareArrays(flags,[0,4]) ) {
            module.log("Disco Recieved");
            // if the disco ever fails the src[0] won't match, resubscribe
            if ( module.disco[0] !== src[0] ) {       
                module.getVDList();
                module.subscribe(module.zone1);
                module.subscribe(module.zone2);
                module.subscribe(module.zone3);
                module.subscribe(module.zone4);              
              
            };
            module.disco[0] = src[0];
            module.disco[1] = src[1];
            return;
        }
        // RTE/SV STATE INFORMATION
        if ( module.compareArrays(msgid, [1,0]) && module.compareArrays(flags,[8,0]) ) {
            var foundzonejoin = 0;
            if ( module.compareArrays([src[2],src[3],src[4],src[5]], module.zone1 )) { foundzonejoin = module.zone1join; } else
            if ( module.compareArrays([src[2],src[3],src[4],src[5]], module.zone2 )) { foundzonejoin = module.zone2join; } else
            if ( module.compareArrays([src[2],src[3],src[4],src[5]], module.zone3 )) { foundzonejoin = module.zone3join; } else
            if ( module.compareArrays([src[2],src[3],src[4],src[5]], module.zone4 )) { foundzonejoin = module.zone4join; } else { module.log("Zone Not Found"); return; }
              
            // MUTE
            if ( module.compareArrays([payload[0],payload[1],payload[2],payload[3]], [0,3,0,2] )) {
                //module.log("MUTE");
                //module.log( "Trying to set Join d" + foundzonejoin + payload[3] + " to " + payload[5] );                              
                CF.setJoin("d" + foundzonejoin + payload[3], payload[5]);              
            }
            // VOLUME
            if ( module.compareArrays([payload[0],payload[1],payload[2],payload[3]], [0,3,0,1] )) {
                //module.log("VOLUME");
                //module.log( "Trying to set Join a" + foundzonejoin + payload[3] + " to " + payload[6] );          
                // convert volume to a decimal  00 min DD max (0 - 221);                      
                var volume = parseInt(payload[6], 16);          
                var volinc = parseInt(65535 / 75); // 105 min 180 max (set for my house)  75 = 180-105
                var volset = (volume - 105) * volinc;
                CF.setJoin("a" + foundzonejoin + payload[3], volset );  
            }
            // INPUT
            if ( module.compareArrays([payload[0],payload[1],payload[2],payload[3]], [0,3,0,0] )) {
                //module.log("INPUT");
                //module.log( "Trying to set Join d" + module.zone1join + payload[3] + payload[1] );                              
                for (var i = 0; i <= 6; i++ ) {
                    CF.setJoin("d" + foundzonejoin + payload[3] + i, 0);
                }          
                CF.setJoin("d" + foundzonejoin + payload[3] + payload[5], 1);
            }
        }
    //    if ( module.compareArrays( [src[2],src[3],src[4],src[5]], module.zone1 ) ) {
            module.log( "Feedback: FS " + framestart + " FC " + framecount + " FL " + framelength + " SRC " + src + " DEST " + dest + " MSGID " + msgid + " FLAGS " + flags + " PAYLOAD " + payload + " CHK " + checksum );
    //    }
      
        if ( module.compareArrays(msgid, [1,"1a"])  ) {
            module.log("Get VD List Response " + payload);
            module.describeVD();
        }
        if ( module.compareArrays(msgid, [1,"1e"])  ) {
            //module.log("Unkown Response");
            var numsv = payload.splice(0,2);
            var sv_id = payload.splice(0,2);
            var type  = payload.splice(0,1);
            var sv_val = payload
             //   module.log("NumSV " + numsv + " sv_id " + sv_id + " type " + type  + " svval " + sv_val );
        }


        if ( module.compareArrays(msgid, [1,19])  ) {
            module.log("Describe VD Response SRC " + src + " DEST " + dest );
            var numsv = payload.splice(0,2);
            var sv_id = payload.splice(0,2);
            var type  = payload.splice(0,1);
            var sv_val = payload
                module.log("NumSV " + numsv + " sv_id " + sv_id + " type " + type  + " svval " + sv_val );          
        }  
        if ( module.compareArrays(msgid, [1,3]) ) {
            var foundzonejoin = 0;
            if ( module.compareArrays([src[2],src[3],src[4],src[5]], module.zone1 )) { foundzonejoin = module.zone1join; } else
            if ( module.compareArrays([src[2],src[3],src[4],src[5]], module.zone2 )) { foundzonejoin = module.zone2join; } else
            if ( module.compareArrays([src[2],src[3],src[4],src[5]], module.zone3 )) { foundzonejoin = module.zone3join; } else
            if ( module.compareArrays([src[2],src[3],src[4],src[5]], module.zone4 )) { foundzonejoin = module.zone4join; } else { module.log("Zone Not Found"); return; }  

            //              2   INPUT 6     VOLUME 11  MUTE  15   PAGE 19        23        27        31        35  PAGE VOL 40               PAGE DUCKING                              
68      PRVOL 73 PRTHRESH 77PRATTACK 81  PRHOLD 85PRRELEASE 89 PRDEPTH
93           RADIO

            // PAYLOAD 0,18,[0,0,1,6],[0,1,3,0,9c],[0,2,1,1],[0,3,1,0],[0,4,1,0],
[0,5,1,0],[0,6,1,0],[0,7,1,0],[0,8,3,0,b5],[0,9,1,28,0,a,1,9,0,b,1,0,0,c,1,12,0,d,
1,0,0,e,1,3,0,f,1,0],[0,10,3,0,b5],[0,11,1,28],[0,12,1,9],[0,13,1,0],[0,14,1,12],
[0,15,1,0],[0,16,1,3],[0,17,1,0]
          
          
            var input     = payload[5];  //
            var vol     = payload[10]; //
            var mute     = payload[14]; //
            var page    = payload[18]; //
            var pagevol    = payload[39]; //
            var pgthreshold    = payload[43]; //
            var pgattack    = payload[47]; //
            var pghold    = payload[51]; //
            var pgrelease    = payload[55]; //  
            var pgdepth    = payload[59]; //
            var priority    = payload[67]; //
            var priorityvol = payload[72]; //
            var prthreshold    = payload[76]; //
            var prattack    = payload[80]; //
            var prhold    = payload[84]; //
            var prrelease    = payload[88]; //
            var prdepth    = payload[92]; //
            var masterradio = payload[100];//

            // set mute button
            CF.setJoin("d" + foundzonejoin + payload[12], mute);
          
            // set input buttons
            for (var i = 0; i <= 6; i++ ) {
                CF.setJoin("d" + foundzonejoin + payload[3] + i, 0);
            }      
            CF.setJoin("d" + foundzonejoin + 0 + payload[5], 1);          
          
            // set volume sliders          
            var volume = parseInt(vol, 16);          
            var volinc = parseInt(65535 / 75); // 105 min 180 max (set for my house)  75 = 180-105
            var volset = (volume - 105) * volinc;      
            CF.setJoin("a" + foundzonejoin + 1, volset );                  
        }
        payload = payload.splice(41,27);
        return;

    };
    module.resync = function() {
        module.log("resync");
        var resyncrequest = [];
        for ( var i = 0; i < 16; i++ ) {
            resyncrequest.push("FF");
        };
        module.sendCommand(resyncrequest);
        var resyncack = [];
        for ( var i = 0; i < 261; i++ ) {
            resyncack.push("F0");
        }
        module.sendCommand(resyncack, "resync", 1);
    };



    module.ack = function() {
        module.sendCommand(["A5"], "ack", 0);
    };
  
    module.compareArrays = function( array1, array2 ) {
        var equal = 1;
        //module.log( "COMPARE " + array1 +  " " + array2 );
        if (array1.length != array2.length ) { equal = 0; }
        for ( var i = 0; i < array1.length; i++ ) {
            if ( parseInt(array1[i],16) != parseInt(array2[i],16) ) {  equal = 0; }
        }
        return equal;

    };

    module.sendHeartbeat = function() {
        // ever second
        // Heartbeat F0 8C
        module.sendCommand(["F0","8C"], "ping", 0);
    };

    module.hexify = function( array ) {
        var string = "";
        var tstring = "";
        for ( var i = 0; i < array.length; i++) {
            string = string + String.fromCharCode(parseInt(array[i],16));
            tstring = tstring + " " + parseInt(array[i],16);
          
        }
    //    module.log(tstring);
        return string;
    };

        module.checksum = function(dbx) {
                var ccit = ["5E","BC","E2","61","3F","DD","83","C2","9C","7E","20","A3","FD","1F","41","9D","C3","21","7F","FC","A2","40","1E","5F","01","E3","BD","3E","60","82","DC","23",
"7D","9F","C1","42","1C","FE","A0","E1","BF","5D","03","80","DE","3C","62","BE","
E0","02","5C","DF","81","63","3D","7C","22","C0","9E","1D","43","A1","FF","46","
18","FA","A4","27","79","9B","C5","84","DA","38","66","E5","BB","59","07","DB","
85","67","39","BA","E4","06","58","19","47","A5","FB","78","26","C4","9A","65","
3B","D9","87","04","5A","B8","E6","A7","F9","1B","45","C6","98","7A","24","F8","
A6","44","1A","99","C7","25","7B","3A","64","86","D8","5B","05","E7","B9","8C","
D2","30","6E","ED","B3","51","0F","4E","10","F2","AC","2F","71","93","CD","11","
4F","AD","F3","70","2E","CC","92","D3","8D","6F","31","B2","EC","0E","50","AF","
F1","13","4D","CE","90","72","2C","6D","33","D1","8F","0C","52","B0","EE","32","
6C","8E","D0","53","0D","EF","B1","F0","AE","4C","12","91","CF","2D","73","CA","
94","76","28","AB","F5","17","49","08","56","B4","EA","69","37","D5","8B","57","
09","EB","B5","36","68","8A","D4","95","CB","29","77","F4","AA","48","16","E9","
B7","55","0B","88","D6","34","6A","2B","75","97","C9","4A","14","F6","A8","74","
2A","C8","96","15","4B","A9","F7","B6","E8","0A","54","D7","89","6B","35"];
                var bcc = "FF";
                for (var i = 1; i < dbx.length; i++ ) {
                    var dbx1 = parseInt(dbx[i],16);
                    var bcc1 = parseInt(bcc,16);
                   var bcc = ccit[(bcc1^dbx1)-1];
                }
                return bcc;
        };

    module.sendCommand = function (command, descrip, debug) {
        if (debug) { module.log("send command: " + descrip + " " + command); }
        command = module.hexify(command);
    //    module.log("sent command: " + command);
        CF.send("Moxa_ZonePro", command);
    };

    // Only allow logging calls when CF is in debug mode - better performance in release mode this way
    module.log = function(msg) {
        if (CF.debug && module.debug) {
            CF.log("ZonePro: " + msg);
        }
    };
  
  
  
  

    return module;
};

CF.modules.push({
    name: "ZonePro",
    object: ZonePro,
    version: 1.0
});

Last edited by Fiasco on March 24, 2024 03:07.
Pump House on Facebook: [Link: facebook.com]


Hosting Services by ipHouse