Created Zephyr2
Create logic to track whether fan and light is on, withouth needing to rely on emulated pushbuttons.
This commit is contained in:
parent
054d4dbf64
commit
35280ccf53
|
|
@ -0,0 +1,38 @@
|
|||
|
||||
//////////////////////////////////
|
||||
// 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
|
||||
|
||||
};
|
||||
|
|
@ -0,0 +1,219 @@
|
|||
|
||||
////////////////////////////////////
|
||||
// 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 masterPower=false;
|
||||
|
||||
//////////////////////////////////
|
||||
|
||||
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 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()){
|
||||
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
|
||||
LOG1("Zephyr Vent Hood Fan: Power Off\n");
|
||||
transmitZephyr(powerCode);
|
||||
}
|
||||
|
||||
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 {
|
||||
|
||||
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);
|
||||
} else {
|
||||
LOG1("Zephyr Vent Hood Fan Long Button Press: Power is already off!\n");
|
||||
}
|
||||
|
||||
} // 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);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
|
||||
#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);
|
||||
|
||||
new SpanAccessory();
|
||||
new DEV_Identify("Zephyr Power","HomeSpan","ZVH-1","RF-Control","1.0",0);
|
||||
new DEV_ZephyrPower(0x61398,19);
|
||||
|
||||
}
|
||||
|
||||
//////////////////////////////////////
|
||||
|
||||
void loop(){
|
||||
homeSpan.poll();
|
||||
}
|
||||
Loading…
Reference in New Issue