122 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*********************************************************************************
 | |
|  *  MIT License
 | |
|  *  
 | |
|  *  Copyright (c) 2020-2022 Gregg E. Berman
 | |
|  *  
 | |
|  *  https://github.com/HomeSpan/HomeSpan
 | |
|  *  
 | |
|  *  Permission is hereby granted, free of charge, to any person obtaining a copy
 | |
|  *  of this software and associated documentation files (the "Software"), to deal
 | |
|  *  in the Software without restriction, including without limitation the rights
 | |
|  *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | |
|  *  copies of the Software, and to permit persons to whom the Software is
 | |
|  *  furnished to do so, subject to the following conditions:
 | |
|  *  
 | |
|  *  The above copyright notice and this permission notice shall be included in all
 | |
|  *  copies or substantial portions of the Software.
 | |
|  *  
 | |
|  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
|  *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
|  *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | |
|  *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | |
|  *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | |
|  *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | |
|  *  SOFTWARE.
 | |
|  *  
 | |
|  ********************************************************************************/
 | |
|  
 | |
| ////////////////////////////////////////////////////////////
 | |
| //                                                        //
 | |
| //    HomeSpan: A HomeKit implementation for the ESP32    //
 | |
| //    ------------------------------------------------    //
 | |
| //                                                        //
 | |
| //     Demonstrates how to use SpanPoint() to implement   //
 | |
| //     two remote temperature sensors on separate ESP32   //
 | |
| //     devices.                                           //
 | |
| //                                                        //
 | |
| //     This sketch is for the MAIN DEVICE that contains   //
 | |
| //     all the usual HomeSpan logic, plus two instances   //
 | |
| //     of SpanPoint to read temperatures from two other   //
 | |
| //     remote devices.                                    //
 | |
| //                                                        //
 | |
| ////////////////////////////////////////////////////////////
 | |
| 
 | |
| #include "HomeSpan.h"
 | |
| 
 | |
| struct RemoteTempSensor : Service::TemperatureSensor {
 | |
| 
 | |
|   SpanCharacteristic *temp;
 | |
|   SpanCharacteristic *fault;
 | |
|   SpanPoint *remoteTemp;
 | |
|   const char *name;
 | |
|   float temperature;
 | |
|   
 | |
|   RemoteTempSensor(const char *name, const char*macAddress) : Service::TemperatureSensor(){
 | |
| 
 | |
|     this->name=name;
 | |
|     
 | |
|     temp=new Characteristic::CurrentTemperature(-10.0);      // set initial temperature
 | |
|     temp->setRange(-50,100);                                 // expand temperature range to allow negative values
 | |
| 
 | |
|     fault=new Characteristic::StatusFault(1);                // set initial state = fault
 | |
| 
 | |
|     remoteTemp=new SpanPoint(macAddress,0,sizeof(float));    // create a SpanPoint with send size=0 and receive size=sizeof(float)
 | |
| 
 | |
|   } // end constructor
 | |
| 
 | |
|   void loop(){
 | |
|        
 | |
|     if(remoteTemp->get(&temperature)){      // if there is data from the remote sensor
 | |
|       temp->setVal(temperature);            // update temperature
 | |
|       fault->setVal(0);                     // clear fault
 | |
|        
 | |
|       LOG1("Sensor %s update: Temperature=%0.2f\n",name,temperature*9/5+32);
 | |
|       
 | |
|     } else if(remoteTemp->time()>60000 && !fault->getVal()){    // else if it has been a while since last update (60 seconds), and there is no current fault
 | |
|       fault->setVal(1);                                         // set fault state
 | |
|       LOG1("Sensor %s update: FAULT\n",name);
 | |
|     }
 | |
|     
 | |
|   } // loop
 | |
|   
 | |
| };
 | |
| 
 | |
| //////////////////////////////////////
 | |
| 
 | |
| void setup() {
 | |
|   
 | |
|   Serial.begin(115200);
 | |
| 
 | |
|   homeSpan.setLogLevel(1);
 | |
| 
 | |
|   homeSpan.begin(Category::Bridges,"Sensor Hub");
 | |
| 
 | |
|   new SpanAccessory();  
 | |
|     new Service::AccessoryInformation();
 | |
|       new Characteristic::Identify(); 
 | |
|       
 | |
|   new SpanAccessory();
 | |
|     new Service::AccessoryInformation();
 | |
|       new Characteristic::Identify();
 | |
|       new Characteristic::Name("Indoor Temp");
 | |
|     new RemoteTempSensor("Device 1","AC:67:B2:77:42:20");        // pass MAC Address of Remote Device
 | |
| 
 | |
|   new SpanAccessory();
 | |
|     new Service::AccessoryInformation();
 | |
|       new Characteristic::Identify(); 
 | |
|       new Characteristic::Name("Outdoor Temp");
 | |
|     new RemoteTempSensor("Device 2","84:CC:A8:11:B4:84");        // pass MAC Address of Remote Device
 | |
| 
 | |
|   
 | |
| } // end of setup()
 | |
| 
 | |
| //////////////////////////////////////
 | |
| 
 | |
| void loop(){
 | |
|   
 | |
|   homeSpan.poll();
 | |
|   
 | |
| } // end of loop()
 | |
| 
 | |
| //////////////////////////////////////
 |