Define ZUNO Channel
Define ZUNO Channel
The simple sensor example http://z-uno.z-wave.me/examples/SimpleSensor/ uses:
/ channel number
#define ZUNO_CHANNEL_NUMBER_ONE 1
which I assume is a definition?
I don't see any reference to this in the Reference Section, there is a ZUNO_SET_CHANNELS which is used later but not the above.
Further in the example (which works as is), if 1 is deleted, the compiler returns an error.
Further in the sketch I find:
zunoSendReport(ZUNO_CHANNEL_NUMBER_ONE); // send report over the Z-Wave to the controller
if 1 is used in the definition, then why isn't it used in the above fragment. eg.
zunoSendReport(1) or zunoSendReport(ZUNO_CHANNEL_NUMBER_ONE 1)
/ channel number
#define ZUNO_CHANNEL_NUMBER_ONE 1
which I assume is a definition?
I don't see any reference to this in the Reference Section, there is a ZUNO_SET_CHANNELS which is used later but not the above.
Further in the example (which works as is), if 1 is deleted, the compiler returns an error.
Further in the sketch I find:
zunoSendReport(ZUNO_CHANNEL_NUMBER_ONE); // send report over the Z-Wave to the controller
if 1 is used in the definition, then why isn't it used in the above fragment. eg.
zunoSendReport(1) or zunoSendReport(ZUNO_CHANNEL_NUMBER_ONE 1)
-
- Posts: 201
- Joined: 05 Sep 2016 22:27
Re: Define ZUNO Channel
Hi,
I am not sure if I understood your problem...
This just defines the "pseudo constant" ZUNO_CHANNEL_NUMBER_ONE which is to be replaced with the assigned value (1 in this case) by the pre-processor prior to compiling.
In the example this is just to use a more readable channel-number for the zunoSendReport().
You can remove the define statement and directly use instead, but the syntax of
is wrong and would not work.
So, what exactly is the problem with the "#define"?
Regards,
Andreas.
I am not sure if I understood your problem...
Code: Select all
#define ZUNO_CHANNEL_NUMBER_ONE 1
In the example this is just to use a more readable channel-number for the zunoSendReport().
You can remove the define statement and directly use
Code: Select all
zunoSendReport(1)
Code: Select all
zunoSendReport(ZUNO_CHANNEL_NUMBER_ONE 1)
So, what exactly is the problem with the "#define"?
Regards,
Andreas.
fhem.de - ZWave development support
Re: Define ZUNO Channel
Thanks for the reply,
The problem is that there is no documentation about Channels, why are they required and how they are setup.
I have deduced that there are 10 channels and assume that they are numbered from 1 to 10 and that they are required to send a report back to the controller however as there is no documentation it took me a day of tinkering to work this out.
In this case the example came from the simple sensor, you may ask why? Because I nedd a physical switch and feedback as to it's status in the UI.
I used that example to expand it to 2 toggle switches eventually 4.
So far the code used works 2 switches form the UI but only physical switch1 commands LED1, physical switch2 does nothing.
Code below for 2 switch.
Hopefully you might have some suggestions?
The problem is that there is no documentation about Channels, why are they required and how they are setup.
I have deduced that there are 10 channels and assume that they are numbered from 1 to 10 and that they are required to send a report back to the controller however as there is no documentation it took me a day of tinkering to work this out.
In this case the example came from the simple sensor, you may ask why? Because I nedd a physical switch and feedback as to it's status in the UI.
I used that example to expand it to 2 toggle switches eventually 4.
So far the code used works 2 switches form the UI but only physical switch1 commands LED1, physical switch2 does nothing.
Code below for 2 switch.
Hopefully you might have some suggestions?
Code: Select all
// LED pin number
#define LED_PIN1 9 // 9 pin - user LED of Z-Uno board
#define LED_PIN2 10 // 10 pin - user LED of Z-Uno board
byte currentLEDValue1; // Last saved LED1 value
byte currentLEDValue2; // Last saved LED2 value
byte lastButtonState1; // variable to store current button1 state
byte lastButtonState2; // variable to store current button2 state
// button pin number
#define BTN_PIN1 18 // 18 pin - button(BTN1) of Z-Uno board
#define BTN_PIN2 19 // 19 pin - button(BTN2) of Z-Uno board
// channel number
#define ZUNO_CHANNEL_NUMBER_ONE 1
#define ZUNO_CHANNEL_NUMBER_TWO 2
ZUNO_SETUP_CHANNELS(
ZUNO_SWITCH_BINARY(getterSwitch1, setterSwitch1),
ZUNO_SWITCH_BINARY(getterSwitch2, setterSwitch2)
);
// the setup routine runs once when you press reset:
void setup() {
pinMode(LED_PIN1, OUTPUT); // setup pin as output
pinMode(BTN_PIN1, INPUT_PULLUP); // set button pin as input
pinMode(LED_PIN2, OUTPUT); // setup pin as output
pinMode(BTN_PIN2, INPUT_PULLUP); // set button pin as input
}
// the loop routine runs over and over again forever:
void loop() {
byte currentButtonState1 = digitalRead(BTN_PIN1);
if (currentButtonState1 != lastButtonState1) { // if state changes
lastButtonState1 = currentButtonState1; // save new state
zunoSendReport(ZUNO_CHANNEL_NUMBER_ONE); // send report over the Z-Wave to the controller
if (currentButtonState1 == LOW) { // if button is pressed
digitalWrite(LED_PIN1, HIGH); // turn the LED on
} else { // if button is released
digitalWrite(LED_PIN1, LOW); // turn the LED off
}
}
}
byte getterSwitch1() {
if (lastButtonState1 == 0) { // if button is pressed
return 0xff; // return "Triggered" state to the controller
} else { // if button is released
return 0; // return "Idle" state to the controller
}
}
void setterSwitch1(byte value1) {
// value is a variable, holding a "new value"
// which came from the controller or other Z-Wave device
if (value1 > 0) { // if greater then zero
digitalWrite (LED_PIN1, HIGH); //turn the LED on (HIGH is the voltage level)
} else { // if equals zero
digitalWrite(LED_PIN1, LOW); //turn the LED off by making the voltage LOW
}
// we'll save our value for the situation, when the controller will ask us about it
currentLEDValue1 = value1;
byte currentButtonState2 = digitalRead(BTN_PIN2);
if (currentButtonState2 != lastButtonState2) { // if state changes
lastButtonState2 = currentButtonState2; // save new state
zunoSendReport(ZUNO_CHANNEL_NUMBER_TWO); // send report over the Z-Wave to the controller
if (currentButtonState2 == LOW) { // if button is pressed
digitalWrite(LED_PIN2, HIGH); // turn the LED on
} else { // if button is released
digitalWrite(LED_PIN2, LOW); // turn the LED off
}
}
}
byte getterSwitch2() {
if (lastButtonState2 == 0) { // if button is pressed
return 0xff; // return "Triggered" state to the controller
} else { // if button is released
return 0; // return "Idle" state to the controller
}
}
void setterSwitch2(byte value2) {
// value is a variable, holding a "new value"
// which came from the controller or other Z-Wave device
if (value2 > 0) { // if greater then zero
digitalWrite (LED_PIN2, HIGH); //turn the LED on (HIGH is the voltage level)
} else { // if equals zero
digitalWrite(LED_PIN2, LOW); //turn the LED off by making the voltage LOW
}
// we'll save our value for the situation, when the controller will ask us about it
currentLEDValue2 = value2;
}
-
- Posts: 201
- Joined: 05 Sep 2016 22:27
Re: Define ZUNO Channel
Hi,
just a short feedback...
You mixed up the code a little bit ,-)
In the main loop() you have to put the two blocks that check the button 1 and 2. In the current code the block that is checking for button 2 is inside the setterswitch1() function... (which means the button is only checked when the channel 1 is set from the controlling software...)
When you move this block to the loop() then it should work.
But you stated in the other thread that you are trying to build a 16 channel device, that is not possible, Z-Uno is limited to 10 channels (see documentation here and you would need more input pins for the buttons (that could be done easily with multiplexer or a I2C / SPI chip), but the limit of 10 channels is inside the firmware of the Z-Uno.
You might overcome this by sending a 16bit value where each bit represents the status of a channel, but you need then a decoding function in the controlling automation system to seperate the status of the 16 channels.
Hope that helps,
Andreas.
just a short feedback...
You mixed up the code a little bit ,-)
In the main loop() you have to put the two blocks that check the button 1 and 2. In the current code the block that is checking for button 2 is inside the setterswitch1() function... (which means the button is only checked when the channel 1 is set from the controlling software...)
When you move this block to the loop() then it should work.
But you stated in the other thread that you are trying to build a 16 channel device, that is not possible, Z-Uno is limited to 10 channels (see documentation here and you would need more input pins for the buttons (that could be done easily with multiplexer or a I2C / SPI chip), but the limit of 10 channels is inside the firmware of the Z-Uno.
You might overcome this by sending a 16bit value where each bit represents the status of a channel, but you need then a decoding function in the controlling automation system to seperate the status of the 16 channels.
Hope that helps,
Andreas.
fhem.de - ZWave development support
Re: Define ZUNO Channel
Thanks for the reply, however, I'm confused as to what has to be moved and how it it separated in the loop()?
I have tried {} but I only get compile errors.
I'm just not seeing how to do this.
If I understand this is the part I have incorrect is in between 1 & 2, see the // part in CAPS below in the code.
Lets not discuss the 16 channel Irrigation controller until I get a meaningful understanding of this code.
I need a little bit of hand holding to fully understand this.
Thanks for your help on this.
I have tried {} but I only get compile errors.
I'm just not seeing how to do this.
If I understand this is the part I have incorrect is in between 1 & 2, see the // part in CAPS below in the code.
Code: Select all
// the loop routine runs over and over again forever:
void loop() {
byte currentButtonState1 = digitalRead(BTN_PIN1);
if (currentButtonState1 != lastButtonState1) { // if state changes
lastButtonState1 = currentButtonState1; // save new state
zunoSendReport(ZUNO_CHANNEL_NUMBER_ONE); // send report over the Z-Wave to the controller
if (currentButtonState1 == LOW) { // if button is pressed
digitalWrite(LED_PIN1, HIGH); // turn the LED on
} else { // if button is released
digitalWrite(LED_PIN1, LOW); // turn the LED off
}
}
}
byte getterSwitch1() {
if (lastButtonState1 == 0) { // if button is pressed
return 0xff; // return "Triggered" state to the controller
} else { // if button is released
return 0; // return "Idle" state to the controller
}
}
void setterSwitch1(byte value1) {
// value is a variable, holding a "new value"
// which came from the controller or other Z-Wave device
if (value1 > 0) { // if greater then zero
digitalWrite (LED_PIN1, HIGH); //turn the LED on (HIGH is the voltage level)
} else { // if equals zero
digitalWrite(LED_PIN1, LOW); //turn the LED off by making the voltage LOW
}
// we'll save our value for the situation, when the controller will ask us about it
currentLEDValue1 = value1;
// IF I UNDERSTAND YOUR REPLY A COMMAND MUST GO HERE TO SEPARATE THE FUNCTION IN THE LOOP. IS that what you mean?
byte currentButtonState2 = digitalRead(BTN_PIN2);
if (currentButtonState2 != lastButtonState2) { // if state changes
lastButtonState2 = currentButtonState2; // save new state
zunoSendReport(ZUNO_CHANNEL_NUMBER_TWO); // send report over the Z-Wave to the controller
if (currentButtonState2 == LOW) { // if button is pressed
digitalWrite(LED_PIN2, HIGH); // turn the LED on
} else { // if button is released
digitalWrite(LED_PIN2, LOW); // turn the LED off
}
}
}
byte getterSwitch2() {
if (lastButtonState2 == 0) { // if button is pressed
return 0xff; // return "Triggered" state to the controller
} else { // if button is released
return 0; // return "Idle" state to the controller
}
}
I need a little bit of hand holding to fully understand this.
Thanks for your help on this.
Re: Define ZUNO Channel
I attempted to clean up the code and add the extra 2 channels.
I find that UISwitch1 controls UISwitch4, also Button Switch 1 controls Button Switch 4.
I still don't see where the interference is as 2 and 3 work as is expected.
I think the coding is easier to read in this format, but I do not know if it is acceptable format?
I find that UISwitch1 controls UISwitch4, also Button Switch 1 controls Button Switch 4.
I still don't see where the interference is as 2 and 3 work as is expected.
I think the coding is easier to read in this format, but I do not know if it is acceptable format?
Code: Select all
// LED pin number
#define LED_PIN1 9 // 9 pin - user LED of Z-Uno board
#define LED_PIN2 10 // 10 pin - user LED of Z-Uno board
#define LED_PIN3 11
#define LED_PIN4 12
byte currentLEDValue1; // Last saved LED1 value
byte currentLEDValue2; // Last saved LED2 value
byte currentLEDValue3;
byte currentLEDValue4;
byte lastButtonState1; // variable to store current button1 state
byte lastButtonState2; // variable to store current button2 state
byte lastButtonState3;
byte lastButtonState4;
// button pin number
#define BTN_PIN1 18 // 18 pin - button(BTN1) of Z-Uno board
#define BTN_PIN2 19 // 19 pin - button(BTN2) of Z-Uno board
#define BTN_PIN3 20
#define BTN_PIN4 21
// channel number
#define ZUNO_CHANNEL_NUMBER_ONE 1
#define ZUNO_CHANNEL_NUMBER_TWO 2
#define ZUNO_CHANNEL_NUMBER_THREE 3
#define ZUNO_CHANNEL_NUMBER_FOUR 4
ZUNO_SETUP_CHANNELS(
ZUNO_SWITCH_BINARY(getterSwitch1, setterSwitch1),
ZUNO_SWITCH_BINARY(getterSwitch2, setterSwitch2),
ZUNO_SWITCH_BINARY(getterSwitch3, setterSwitch3),
ZUNO_SWITCH_BINARY(getterSwitch4, setterSwitch4)
);
// the setup routine runs once when you press reset:
void setup() {
pinMode(LED_PIN1, OUTPUT); // setup pin as output
pinMode(BTN_PIN1, INPUT_PULLUP); // set button pin as input
pinMode(LED_PIN2, OUTPUT); // setup pin as output
pinMode(BTN_PIN2, INPUT_PULLUP); // set button pin as input
pinMode(LED_PIN3, OUTPUT); // setup pin as output
pinMode(BTN_PIN3, INPUT_PULLUP); // set button pin as input
pinMode(LED_PIN4, OUTPUT); // setup pin as output
pinMode(BTN_PIN4, INPUT_PULLUP); // set button pin as input
}
// the loop routine runs over and over again forever:
void loop() {
byte currentButtonState1 = digitalRead(BTN_PIN1);
byte currentButtonState2 = digitalRead(BTN_PIN2);
byte currentButtonState3 = digitalRead(BTN_PIN3);
byte currentButtonState4 = digitalRead(BTN_PIN4);
if (currentButtonState1 != lastButtonState1) { // if state changes
lastButtonState1 = currentButtonState1; // save new state
zunoSendReport(ZUNO_CHANNEL_NUMBER_ONE); // send report over the Z-Wave to the controller
if (currentButtonState1 == LOW) { // if button is pressed
digitalWrite(LED_PIN1, HIGH); // turn the LED on
} else { // if button is released
digitalWrite(LED_PIN1, LOW); // turn the LED off
}
}
if (currentButtonState2 != lastButtonState2) { // if state changes
lastButtonState2 = currentButtonState2; // save new state
zunoSendReport(ZUNO_CHANNEL_NUMBER_TWO); // send report over the Z-Wave to the controller
if (currentButtonState2 == LOW) { // if button is pressed
digitalWrite(LED_PIN2, HIGH); // turn the LED on
} else { // if button is released
digitalWrite(LED_PIN2, LOW); // turn the LED off
}
}
if (currentButtonState3 != lastButtonState3) { // if state changes
lastButtonState3 = currentButtonState3; // save new state
zunoSendReport(ZUNO_CHANNEL_NUMBER_THREE); // send report over the Z-Wave to the controller
if (currentButtonState3 == LOW) { // if button is pressed
digitalWrite(LED_PIN3, HIGH); // turn the LED on
} else { // if button is released
digitalWrite(LED_PIN3, LOW); // turn the LED off
}
}
if (currentButtonState4 != lastButtonState4) // if state changes
{lastButtonState4 = currentButtonState4; // save new state
zunoSendReport(ZUNO_CHANNEL_NUMBER_FOUR); // send report over the Z-Wave to the controller
if (currentButtonState4 == LOW) { // if button is pressed
digitalWrite(LED_PIN4, HIGH); // turn the LED on
} else { // if button is released
digitalWrite(LED_PIN4, LOW); // turn the LED off
}
}
}
//switch 2 below
byte getterSwitch1() {
if (lastButtonState1 == 0) { // if button is pressed
return 0xff; // return "Triggered" state to the controller
} else { // if button is released
return 0; // return "Idle" state to the controller
}
}
byte getterSwitch2() {
if (lastButtonState2 == 0) { // if button is pressed
return 0xff; // return "Triggered" state to the controller
} else { // if button is released
return 0; // return "Idle" state to the controller
}
}
byte getterSwitch3() {
if (lastButtonState3 == 0) { // if button is pressed
return 0xff; // return "Triggered" state to the controller
} else { // if button is released
return 0; // return "Idle" state to the controller
}
}
byte getterSwitch4() {
if (lastButtonState4 == 0) { // if button is pressed
return 0xff; // return "Triggered" state to the controller
} else { // if button is released
return 0; // return "Idle" state to the controller
}
}
void setterSwitch1(byte value1) {
// value is a variable, holding a "new value1"
// which came from the controller or other Z-Wave device
if (value1 > 0) { // if greater then zero
digitalWrite (LED_PIN1, HIGH); //turn the LED on (HIGH is the voltage level)
} else { // if equals zero
digitalWrite(LED_PIN1, LOW); //turn the LED off by making the voltage LOW
}
// we'll save our value for the situation, when the controller will ask us about it
currentLEDValue1 = value1;
}
void setterSwitch2(byte value2) {
// value is a variable, holding a "new value2"
// which came from the controller or other Z-Wave device
if (value2 > 0) { // if greater then zero
digitalWrite (LED_PIN2, HIGH); //turn the LED on (HIGH is the voltage level)
} else { // if equals zero
digitalWrite(LED_PIN2, LOW); //turn the LED off by making the voltage LOW
}
// we'll save our value for the situation, when the controller will ask us about it
currentLEDValue2 = value2;
}
void setterSwitch3(byte value3) {
// value is a variable, holding a "new value3"
// which came from the controller or other Z-Wave device
if (value3 > 0) { // if greater then zero
digitalWrite (LED_PIN3, HIGH); //turn the LED on (HIGH is the voltage level)
} else { // if equals zero
digitalWrite(LED_PIN3, LOW); //turn the LED off by making the voltage LOW
}
// we'll save our value for the situation, when the controller will ask us about it
currentLEDValue3 = value3;
}
void setterSwitch4(byte value4) {
// value is a variable, holding a "new value4"
// which came from the controller or other Z-Wave device
if (value4 > 0) { // if greater then zero
digitalWrite (LED_PIN4, HIGH); //turn the LED on (HIGH is the voltage level)
} else { // if equals zero
digitalWrite(LED_PIN4, LOW); //turn the LED off by making the voltage LOW
}
// we'll save our value for the situation, when the controller will ask us about it
currentLEDValue4 = value4;
}
-
- Posts: 201
- Joined: 05 Sep 2016 22:27
Re: Define ZUNO Channel
Hi,
I think the code looks ok now, are you shure that you hade made the association with the channels correctly inside ZWay?
BR,
Andreas
I think the code looks ok now, are you shure that you hade made the association with the channels correctly inside ZWay?
BR,
Andreas
fhem.de - ZWave development support
Re: Define ZUNO Channel
Thanks, but why would I make or need an association?
This is not controlling another device. It is the device, I just need to have the UI indicate correctly. MAybe I have missed something or not understanding a principle?
I'm using Home Seer, will test it on Vera over the weekend to see if there is any change. If anyone has another controller, perhaps they could test the code and report back their finding?
This is not controlling another device. It is the device, I just need to have the UI indicate correctly. MAybe I have missed something or not understanding a principle?
I'm using Home Seer, will test it on Vera over the weekend to see if there is any change. If anyone has another controller, perhaps they could test the code and report back their finding?
Re: Define ZUNO Channel
Perhaps there is some logic that can be added to turn the UI off? Not sure just thinking out aloud?
Re: Define ZUNO Channel
Now this really starts to get weird.
I had initially thought that it might be due to the PINOUTS and had today intended play around with them, but after I plugged the ZUNO into my PC prior to uploading a new sketch I thought I should check the current sketch.
What I found was that the UI indication when selecting Switch 1 also turned Binary Switch 3 ON.
I think that PIN 17 has something to do with this and intend to try different PINOUTS today to test this theory.
I had initially thought that it might be due to the PINOUTS and had today intended play around with them, but after I plugged the ZUNO into my PC prior to uploading a new sketch I thought I should check the current sketch.
What I found was that the UI indication when selecting Switch 1 also turned Binary Switch 3 ON.
I think that PIN 17 has something to do with this and intend to try different PINOUTS today to test this theory.