Moved Zephyr into a standalone repository; Re-organized tutorials

Zephyr3, the latest version, was moved into its own repo and renamed ZephyrVentHood.

Deleted Zephyr1, Zephyr2, and Zephyr3, which are no longer needed.

Flattened folder structure for Examples and placed them all in top-level directory
This commit is contained in:
Gregg 2020-10-04 11:00:08 -05:00
parent 65ce2d57aa
commit 22962ebfe3
45 changed files with 3 additions and 789 deletions

View File

@ -1,38 +0,0 @@
//////////////////////////////////
// DEVICE-SPECIFIC SERVICES //
//////////////////////////////////
struct DEV_Identify : Service::AccessoryInformation {
int nBlinks; // number of times to blink built-in LED in identify routine
SpanCharacteristic *identify; // reference to the Identify Characteristic
DEV_Identify(char *name, char *manu, char *sn, char *model, char *version, int nBlinks, ServiceType sType=ServiceType::Regular) : Service::AccessoryInformation(sType){
new Characteristic::Name(name); // create all the required Characteristics with values set based on above arguments
new Characteristic::Manufacturer(manu);
new Characteristic::SerialNumber(sn);
new Characteristic::Model(model);
new Characteristic::FirmwareRevision(version);
identify=new Characteristic::Identify(); // store a reference to the Identify Characteristic for use below
this->nBlinks=nBlinks; // store the number of times to blink the built-in LED
pinMode(LED_BUILTIN,OUTPUT); // make sure built-in LED is set for output
}
StatusCode update(){
for(int i=0;i<nBlinks;i++){
digitalWrite(LED_BUILTIN,LOW);
delay(250);
digitalWrite(LED_BUILTIN,HIGH);
delay(250);
}
return(StatusCode::OK);
} // update
};

View File

@ -1,199 +0,0 @@
////////////////////////////////////
// DEVICE-SPECIFIC SERVICE //
////////////////////////////////////
#include "extras/RFControl.h"
// Zephyr Vent Hood
// Frequency: 433 MHz
// Encoding: Fixed pulse duration of 850 usec
// 0-Bit: 230 HIGH / 620 LOW
// 1-Bit: 620 HIGH / 230 LOW
// N-Bits: 20
// N-Cycles: 8
// Cycle Gap: 4000 usec
void transmitZephyr(uint32_t code);
//////////////////////////////////
struct DEV_ZephyrLight : Service::LightBulb {
uint32_t code;
SpanCharacteristic *power;
int buttonPin;
DEV_ZephyrLight(uint32_t code, int buttonPin, ServiceType mod=ServiceType::Regular) : Service::LightBulb(mod){
power=new Characteristic::On();
new Characteristic::Name("Vent Light");
this->code=code;
this->buttonPin=buttonPin;
Serial.print("Configuring Zephyr Vent Hood Light 433MHz Transmitter with code: ");
Serial.print(code,HEX);
Serial.print("\n");
new SpanButton(buttonPin);
}
StatusCode update(){
if(power->getNewVal()){
LOG1("Activating Zephyr Vent Hood Light\n");
transmitZephyr(code);
}
return(StatusCode::OK);
} // update
void loop(){
if(power->getVal() && power->timeVal()>500){ // check that power is true, and that time since last modification is greater than 3 seconds
LOG1("Resetting Zephyr Vent Hood Light Control\n"); // log message
power->setVal(false); // set power to false
}
} // loop
void button(int pin, boolean isLong) override {
LOG1("Activating Zephyr Vent Hood Light\n");
transmitZephyr(code);
power->setVal(true);
} // button
};
//////////////////////////////////
struct DEV_ZephyrFan : Service::Fan {
uint32_t code;
SpanCharacteristic *power;
int buttonPin;
DEV_ZephyrFan(uint32_t code, int buttonPin, ServiceType mod=ServiceType::Regular) : Service::Fan(mod){
power=new Characteristic::Active();
new Characteristic::Name("Vent Fan");
this->code=code;
this->buttonPin=buttonPin;
Serial.print("Configuring Zephyr Vent Hood Fan 433MHz Transmitter with code: ");
Serial.print(code,HEX);
Serial.print("\n");
new SpanButton(buttonPin);
}
StatusCode update(){
if(power->getNewVal()){
LOG1("Activating Zephyr Vent Hood Fan\n");
transmitZephyr(code);
}
return(StatusCode::OK);
} // update
void loop(){
if(power->getVal() && power->timeVal()>500){ // check that power is true, and that time since last modification is greater than 3 seconds
LOG1("Resetting Zephyr Vent Hood Fan Control\n"); // log message
power->setVal(false); // set power to false
}
} // loop
void button(int pin, boolean isLong) override {
LOG1("Activating Zephyr Vent Hood Fan\n");
transmitZephyr(code);
power->setVal(true);
} // button
};
//////////////////////////////////
struct DEV_ZephyrPower : Service::Switch {
uint32_t code;
SpanCharacteristic *power;
int buttonPin;
DEV_ZephyrPower(uint32_t code, int buttonPin, ServiceType mod=ServiceType::Regular) : Service::Switch(mod){
power=new Characteristic::On();
new Characteristic::Name("Vent Power");
this->code=code;
this->buttonPin=buttonPin;
Serial.print("Configuring Zephyr Vent Hood Power 433MHz Transmitter with code: ");
Serial.print(code,HEX);
Serial.print("\n");
new SpanButton(buttonPin);
}
StatusCode update(){
if(power->getNewVal()){
LOG1("Activating Zephyr Vent Hood Power\n");
transmitZephyr(code);
}
return(StatusCode::OK);
} // update
void loop(){
if(power->getVal() && power->timeVal()>500){ // check that power is true, and that time since last modification is greater than 3 seconds
LOG1("Resetting Zephyr Vent Hood Power Control\n"); // log message
power->setVal(false); // set power to false
}
} // loop
void button(int pin, boolean isLong) override {
LOG1("Activating Zephyr Vent Hood Power\n");
transmitZephyr(code);
power->setVal(true);
} // button
};
//////////////////////////////////
void transmitZephyr(uint32_t code){
char c[32];
sprintf(c,"Transmitting code: %lx\n",code);
LOG1(c);
RF433.clear();
for(int b=19;b>0;b--){
if(code&(1<<b))
RF433.add(620,230);
else
RF433.add(230,620);
}
if(code&1)
RF433.add(620,4230);
else
RF433.add(230,4620);
RF433.start(8,1);
}

View File

@ -1,36 +0,0 @@
#include "HomeSpan.h"
#include "DEV_Identify.h"
#include "DEV_Zephyr.h"
void setup() {
Serial.begin(115200);
homeSpan.begin(Category::Bridges,"ZephyrVH Bridge");
new SpanAccessory();
new DEV_Identify("Zephyr VH Bridge","HomeSpan","ZVH-1","HS Bridge","1.0",3);
new Service::HAPProtocolInformation();
new Characteristic::Version("1.1.0");
new SpanAccessory();
new DEV_Identify("Zephyr Light","HomeSpan","ZVH-1","RF-Control","1.0",0);
new DEV_ZephyrLight(0x51390,17);
new SpanAccessory();
new DEV_Identify("Zephyr Fan","HomeSpan","ZVH-1","RF-Control","1.0",0);
new DEV_ZephyrFan(0x51388,16);
new SpanAccessory();
new DEV_Identify("Zephyr Power","HomeSpan","ZVH-1","RF-Control","1.0",0);
new DEV_ZephyrPower(0x61398,19);
}
//////////////////////////////////////
void loop(){
homeSpan.poll();
}

View File

@ -1,38 +0,0 @@
//////////////////////////////////
// DEVICE-SPECIFIC SERVICES //
//////////////////////////////////
struct DEV_Identify : Service::AccessoryInformation {
int nBlinks; // number of times to blink built-in LED in identify routine
SpanCharacteristic *identify; // reference to the Identify Characteristic
DEV_Identify(char *name, char *manu, char *sn, char *model, char *version, int nBlinks, ServiceType sType=ServiceType::Regular) : Service::AccessoryInformation(sType){
new Characteristic::Name(name); // create all the required Characteristics with values set based on above arguments
new Characteristic::Manufacturer(manu);
new Characteristic::SerialNumber(sn);
new Characteristic::Model(model);
new Characteristic::FirmwareRevision(version);
identify=new Characteristic::Identify(); // store a reference to the Identify Characteristic for use below
this->nBlinks=nBlinks; // store the number of times to blink the built-in LED
pinMode(LED_BUILTIN,OUTPUT); // make sure built-in LED is set for output
}
StatusCode update(){
for(int i=0;i<nBlinks;i++){
digitalWrite(LED_BUILTIN,LOW);
delay(250);
digitalWrite(LED_BUILTIN,HIGH);
delay(250);
}
return(StatusCode::OK);
} // update
};

View File

@ -1,189 +0,0 @@
////////////////////////////////////
// DEVICE-SPECIFIC SERVICE //
////////////////////////////////////
#include "extras/RFControl.h"
// Zephyr Vent Hood
// Frequency: 433 MHz
// Encoding: Fixed pulse duration of 850 usec
// 0-Bit: 230 HIGH / 620 LOW
// 1-Bit: 620 HIGH / 230 LOW
// N-Bits: 20
// N-Cycles: 8
// Cycle Gap: 4000 usec
void transmitZephyr(uint32_t code);
boolean resetLight=false;
//////////////////////////////////
struct DEV_ZephyrLight : Service::LightBulb {
uint32_t code;
SpanCharacteristic *power;
SpanCharacteristic *level;
int buttonPin;
DEV_ZephyrLight(uint32_t code, int buttonPin, ServiceType mod=ServiceType::Regular) : Service::LightBulb(mod){
power=new Characteristic::On(false);
level=new Characteristic::Brightness(3);
new SpanRange(0,3,1);
new Characteristic::Name("Vent Light");
this->code=code;
this->buttonPin=buttonPin;
Serial.print("Configuring Zephyr Vent Hood Light 433MHz Transmitter with code: ");
Serial.print(code,HEX);
Serial.print("\n");
new SpanButton(buttonPin);
}
StatusCode update(){
LOG1("Zephyr Vent Hood Light Power: ");
LOG1(power->getVal());
if(power->updated()){
LOG1("->");
LOG1(power->getNewVal());
}
LOG1(" Level: ");
LOG1(level->getVal());
if(level->updated()){
LOG1("->");
LOG1(level->getNewVal());
}
LOG1("\n");
int oldState=power->getVal()*(4-level->getVal());
int newState=(power->updated()?power->getNewVal():power->getVal())
*(4-(level->updated()?level->getNewVal():level->getVal()));
while(newState!=oldState){
transmitZephyr(code);
delay(200);
oldState=(oldState+1)%4;
}
return(StatusCode::OK);
} // update
void button(int pin, boolean isLong) override {
LOG1("Zephyr Vent Hood Light Short Button Press\n");
transmitZephyr(code);
int newLevel=level->getVal()-1;
if(newLevel<0)
newLevel=3;
level->setVal(newLevel);
power->setVal(newLevel>0);
} // button
void loop(){
if(resetLight){
power->setVal(false);
level->setVal(0);
resetLight=false;
}
} // loop
};
//////////////////////////////////
struct DEV_ZephyrFan : Service::Fan {
uint32_t fanCode;
uint32_t powerCode;
SpanCharacteristic *power;
int fanPin;
DEV_ZephyrFan(uint32_t fanCode, uint32_t powerCode, int fanPin, ServiceType mod=ServiceType::Regular) : Service::Fan(mod){
power=new Characteristic::Active();
new Characteristic::Name("Vent Fan");
this->fanCode=fanCode;
this->powerCode=powerCode;
this->fanPin=fanPin;
Serial.print("Configuring Zephyr Vent Hood Fan 433MHz Transmitter with fan code: ");
Serial.print(fanCode,HEX);
Serial.print(" power code: ");
Serial.print(powerCode,HEX);
Serial.print("\n");
new SpanButton(fanPin);
}
StatusCode update(){
if(power->getNewVal()){ // it's okay to repease ON commands - this just cycles through fan speed
LOG1("Zephyr Vent Hood Fan: Power On\n");
transmitZephyr(fanCode);
} else
if(power->getVal()){ // only transmit power code if we know power is really on, else this OFF command will turn fan ON!
LOG1("Zephyr Vent Hood Fan: Power Off\n");
transmitZephyr(powerCode);
resetLight=true;
}
return(StatusCode::OK);
} // update
void button(int pin, boolean isLong) override {
if(!isLong){
LOG1("Zephyr Vent Hood Fan Short Button Press: Speed Change\n");
transmitZephyr(fanCode);
if(!power->getVal())
power->setVal(true);
} else
if(power->getVal()){
LOG1("Zephyr Vent Hood Fan Long Button Press: Power Off\n");
transmitZephyr(powerCode);
power->setVal(false);
resetLight=true;
} else {
LOG1("Zephyr Vent Hood Fan Long Button Press: Power is already off!\n");
resetLight=true;
}
} // button
};
//////////////////////////////////
void transmitZephyr(uint32_t code){
char c[32];
sprintf(c,"Transmitting code: %lx\n",code);
LOG1(c);
RF433.clear();
for(int b=19;b>0;b--){
if(code&(1<<b))
RF433.add(620,230);
else
RF433.add(230,620);
}
if(code&1)
RF433.add(620,4230);
else
RF433.add(230,4620);
RF433.start(8,1);
}

View File

@ -1,32 +0,0 @@
#include "HomeSpan.h"
#include "DEV_Identify.h"
#include "DEV_Zephyr.h"
void setup() {
Serial.begin(115200);
homeSpan.begin(Category::Bridges,"ZephyrVH Bridge");
new SpanAccessory();
new DEV_Identify("Zephyr VH Bridge","HomeSpan","ZVH-1","HS Bridge","1.0",3);
new Service::HAPProtocolInformation();
new Characteristic::Version("1.1.0");
new SpanAccessory();
new DEV_Identify("Zephyr Light","HomeSpan","ZVH-1","RF-Control","1.0",0);
new DEV_ZephyrLight(0x51390,17);
new SpanAccessory();
new DEV_Identify("Zephyr Fan","HomeSpan","ZVH-1","RF-Control","1.0",0);
new DEV_ZephyrFan(0x51388,0x61398,16);
}
//////////////////////////////////////
void loop(){
homeSpan.poll();
}

View File

@ -1,38 +0,0 @@
//////////////////////////////////
// DEVICE-SPECIFIC SERVICES //
//////////////////////////////////
struct DEV_Identify : Service::AccessoryInformation {
int nBlinks; // number of times to blink built-in LED in identify routine
SpanCharacteristic *identify; // reference to the Identify Characteristic
DEV_Identify(char *name, char *manu, char *sn, char *model, char *version, int nBlinks, ServiceType sType=ServiceType::Regular) : Service::AccessoryInformation(sType){
new Characteristic::Name(name); // create all the required Characteristics with values set based on above arguments
new Characteristic::Manufacturer(manu);
new Characteristic::SerialNumber(sn);
new Characteristic::Model(model);
new Characteristic::FirmwareRevision(version);
identify=new Characteristic::Identify(); // store a reference to the Identify Characteristic for use below
this->nBlinks=nBlinks; // store the number of times to blink the built-in LED
pinMode(LED_BUILTIN,OUTPUT); // make sure built-in LED is set for output
}
StatusCode update(){
for(int i=0;i<nBlinks;i++){
digitalWrite(LED_BUILTIN,LOW);
delay(250);
digitalWrite(LED_BUILTIN,HIGH);
delay(250);
}
return(StatusCode::OK);
} // update
};

View File

@ -1,187 +0,0 @@
////////////////////////////////////
// DEVICE-SPECIFIC SERVICE //
////////////////////////////////////
#include "extras/RFControl.h"
// Zephyr Vent Hood
// Frequency: 433 MHz
// Encoding: Fixed pulse duration of 850 usec
// 0-Bit: 230 HIGH / 620 LOW
// 1-Bit: 620 HIGH / 230 LOW
// N-Bits: 20
// N-Cycles: 8
// Cycle Gap: 4000 usec
void transmitZephyr(uint32_t code);
boolean resetLight=false;
//////////////////////////////////
struct DEV_ZephyrLight : Service::LightBulb {
uint32_t lightCode;
SpanCharacteristic *power;
int lightPin;
int state=0; // 0=off, 1=dim, 2=medium, 3=bright
DEV_ZephyrLight(uint32_t lightCode, int lightPin, ServiceType mod=ServiceType::Regular) : Service::LightBulb(mod){
power=new Characteristic::On();
new Characteristic::Name("Vent Light");
this->lightCode=lightCode;
this->lightPin=lightPin;
Serial.print("Configuring Zephyr Vent Hood Light 433MHz Transmitter with code: ");
Serial.print(lightCode,HEX);
Serial.print("\n");
new SpanButton(lightPin);
}
StatusCode update(){
if(!power->getVal() && power->getNewVal()){ // only transmit code to turn on light if we know power is really off
LOG1("Zephyr Vent Hood Light: Power On\n");
transmitZephyr(lightCode);
state=3; // light always turns on in brightest setting
} else
if(!power->getNewVal()){ // send light code until state=0
LOG1("Zephyr Vent Hood Light: Power Off\n");
while(state){
transmitZephyr(lightCode);
state--;
}
}
return(StatusCode::OK);
} // update
void button(int pin, boolean isLong) override {
LOG1("Zephyr Vent Hood Light Short Button Press\n");
transmitZephyr(lightCode);
state--; // decrement state
if(state==0){ // if reached zero, set power to OFF
power->setVal(false);
} else
if(state==-1){ // if state was already zero, reset to 3 and set power to ON
state=3;
power->setVal(true);
}
} // button
void loop(){
if(resetLight){
power->setVal(false);
state=0;
resetLight=false;
}
} // loop
};
//////////////////////////////////
struct DEV_ZephyrFan : Service::Fan {
uint32_t fanCode;
uint32_t powerCode;
SpanCharacteristic *power;
int fanPin;
DEV_ZephyrFan(uint32_t fanCode, uint32_t powerCode, int fanPin, ServiceType mod=ServiceType::Regular) : Service::Fan(mod){
power=new Characteristic::Active();
new Characteristic::Name("Vent Fan");
this->fanCode=fanCode;
this->powerCode=powerCode;
this->fanPin=fanPin;
Serial.print("Configuring Zephyr Vent Hood Fan 433MHz Transmitter with fan code: ");
Serial.print(fanCode,HEX);
Serial.print(" power code: ");
Serial.print(powerCode,HEX);
Serial.print("\n");
new SpanButton(fanPin);
}
StatusCode update(){
if(power->getNewVal()){ // it's okay to repeat ON commands - this just cycles through fan speed
LOG1("Zephyr Vent Hood Fan: Power On\n");
transmitZephyr(fanCode);
} else
if(power->getVal()){ // only transmit power code if we know power is really on, else this OFF command will turn everything ON!
LOG1("Zephyr Vent Hood Fan: Power Off\n");
transmitZephyr(powerCode);
resetLight=true;
}
return(StatusCode::OK);
} // update
void button(int pin, boolean isLong) override {
if(!isLong){
LOG1("Zephyr Vent Hood Fan Short Button Press: Speed Change\n");
transmitZephyr(fanCode);
if(!power->getVal())
power->setVal(true);
} else
if(power->getVal()){
LOG1("Zephyr Vent Hood Fan Long Button Press: Power Off\n");
transmitZephyr(powerCode);
power->setVal(false);
resetLight=true;
} else {
LOG1("Zephyr Vent Hood Fan Long Button Press: Power is already off!\n");
resetLight=true;
}
} // button
};
//////////////////////////////////
void transmitZephyr(uint32_t code){
char c[32];
sprintf(c,"Transmitting code: %lx\n",code);
LOG1(c);
RF433.clear();
for(int b=19;b>0;b--){
if(code&(1<<b))
RF433.add(620,230);
else
RF433.add(230,620);
}
if(code&1)
RF433.add(620,4230);
else
RF433.add(230,4620);
RF433.start(8,1);
delay(200); // wait 200 ms before returning to ensure vent has sufficient time to process request
}

View File

@ -1,32 +0,0 @@
#include "HomeSpan.h"
#include "DEV_Identify.h"
#include "DEV_Zephyr.h"
void setup() {
Serial.begin(115200);
homeSpan.begin(Category::Bridges,"ZephyrVH Bridge");
new SpanAccessory();
new DEV_Identify("Zephyr VH Bridge","HomeSpan","ZVH-1","HS Bridge","1.0",3);
new Service::HAPProtocolInformation();
new Characteristic::Version("1.1.0");
new SpanAccessory();
new DEV_Identify("Zephyr Light","HomeSpan","ZVH-1","RF-Control","1.0",0);
new DEV_ZephyrLight(0x51390,19);
new SpanAccessory();
new DEV_Identify("Zephyr Fan","HomeSpan","ZVH-1","RF-Control","1.0",0);
new DEV_ZephyrFan(0x51388,0x61398,18);
}
//////////////////////////////////////
void loop(){
homeSpan.poll();
}

View File

@ -54,6 +54,9 @@ void Span::begin(Category catID, char *displayName, char *hostNameBase, char *mo
Serial.print(__DATE__);
Serial.print(" ");
Serial.print(__TIME__);
Serial.print("\n\nDevice Name: ");
Serial.print(homeSpan.displayName);
Serial.print("\n\n");
if(!digitalRead(controlPin)){ // factory reset pin is low upon start-up