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 March 21, 2024 at 18:05
F
Fiasco
Senior Member
Joined:
Posts:
July 2009
1,285
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 02:07.
Pump House on Facebook: [Link: facebook.com]