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:
parent
65ce2d57aa
commit
22962ebfe3
|
|
@ -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
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
@ -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);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -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();
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
@ -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);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -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();
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -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();
|
|
||||||
}
|
|
||||||
|
|
@ -54,6 +54,9 @@ void Span::begin(Category catID, char *displayName, char *hostNameBase, char *mo
|
||||||
Serial.print(__DATE__);
|
Serial.print(__DATE__);
|
||||||
Serial.print(" ");
|
Serial.print(" ");
|
||||||
Serial.print(__TIME__);
|
Serial.print(__TIME__);
|
||||||
|
|
||||||
|
Serial.print("\n\nDevice Name: ");
|
||||||
|
Serial.print(homeSpan.displayName);
|
||||||
Serial.print("\n\n");
|
Serial.print("\n\n");
|
||||||
|
|
||||||
if(!digitalRead(controlPin)){ // factory reset pin is low upon start-up
|
if(!digitalRead(controlPin)){ // factory reset pin is low upon start-up
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue