diff --git a/src/HAP.cpp b/src/HAP.cpp index bad8448..3001c64 100644 --- a/src/HAP.cpp +++ b/src/HAP.cpp @@ -149,8 +149,8 @@ void HAPClient::init(){ Serial.print("\n"); uint8_t tHash[48]; - TempBuffer tBuf(homeSpan.sprintfAttributes(NULL)+1); - homeSpan.sprintfAttributes(tBuf.buf); + TempBuffer tBuf(homeSpan.sprintfAttributes(NULL,GET_META|GET_PERMS|GET_TYPE|GET_DESC)+1); + homeSpan.sprintfAttributes(tBuf.buf,GET_META|GET_PERMS|GET_TYPE|GET_DESC); mbedtls_sha512_ret((uint8_t *)tBuf.buf,tBuf.len(),tHash,1); // create SHA-384 hash of JSON (can be any hash - just looking for a unique key) if(memcmp(tHash,homeSpan.hapConfig.hashCode,48)){ // if hash code of current HAP database does not match stored hash code @@ -1071,7 +1071,7 @@ int HAPClient::getCharacteristicsURL(char *urlBuf){ numIDs++; char *ids[numIDs]; // reserve space for number of IDs found - int flags=GET_AID; // flags indicating which characteristic fields to include in response (HAP Table 6-13) + int flags=GET_VALUE|GET_AID; // flags indicating which characteristic fields to include in response (HAP Table 6-13) numIDs=0; // reset number of IDs found char *lastSpace=strchr(urlBuf,' '); diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index 5814f9f..0b611d4 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -899,6 +899,17 @@ void Span::processSerialCommand(const char *c){ } break; + + case 'C': { + + char cNum[16]; + sprintf(cNum,"%d",++hapConfig.configNumber); + mdns_service_txt_item_set("_hap","_tcp","c#",cNum); // Accessory Current Configuration Number (updated whenever config of HAP Accessory Attribute Database is updated) + + Serial.printf("\n*** Configuration number updated to: %d\n\n",hapConfig.configNumber); + } + break; + case 'i':{ Serial.print("\n*** HomeSpan Info ***\n\n"); @@ -1001,8 +1012,11 @@ void Span::processSerialCommand(const char *c){ } // Accessories - Serial.printf("\nConfigured as Bridge: %s\n\n",isBridge?"YES":"NO"); - Serial.printf("Database Validation: Warnings=%d, Errors=%d\n\n",nWarnings,nErrors); + Serial.printf("\nConfigured as Bridge: %s\n",isBridge?"YES":"NO"); + if(hapConfig.configNumber>0) + Serial.printf("Configuration Number: %d\n",hapConfig.configNumber); + Serial.printf("\nDatabase Validation: Warnings=%d, Errors=%d\n\n",nWarnings,nErrors); + char d[]="------------------------------"; Serial.printf("%-30s %8s %10s %s %s %s %s %s\n","Service","UUID","AID","IID","Update","Loop","Button","Linked Services"); @@ -1100,14 +1114,14 @@ void Span::setWifiCredentials(const char *ssid, const char *pwd){ /////////////////////////////// -int Span::sprintfAttributes(char *cBuf){ +int Span::sprintfAttributes(char *cBuf, int flags){ int nBytes=0; nBytes+=snprintf(cBuf,cBuf?64:0,"{\"accessories\":["); for(int i=0;isprintfAttributes(cBuf?(cBuf+nBytes):NULL); + nBytes+=Accessories[i]->sprintfAttributes(cBuf?(cBuf+nBytes):NULL,flags); if(i+1sprintfAttributes(cBuf?(cBuf+nChars):NULL,GET_AID+GET_NV); // get JSON attributes for characteristic + nChars+=pObj[i].characteristic->sprintfAttributes(cBuf?(cBuf+nChars):NULL,GET_VALUE|GET_AID|GET_NV); // get JSON attributes for characteristic notifyFlag=true; } // notification requested @@ -1476,13 +1490,13 @@ SpanAccessory::SpanAccessory(uint32_t aid){ /////////////////////////////// -int SpanAccessory::sprintfAttributes(char *cBuf){ +int SpanAccessory::sprintfAttributes(char *cBuf, int flags){ int nBytes=0; nBytes+=snprintf(cBuf,cBuf?64:0,"{\"aid\":%u,\"services\":[",aid); for(int i=0;isprintfAttributes(cBuf?(cBuf+nBytes):NULL); + nBytes+=Services[i]->sprintfAttributes(cBuf?(cBuf+nBytes):NULL,flags); if(i+1sprintfAttributes(cBuf?(cBuf+nBytes):NULL,GET_META|GET_PERMS|GET_TYPE|GET_DESC); + nBytes+=Characteristics[i]->sprintfAttributes(cBuf?(cBuf+nBytes):NULL,flags); if(i+1 getLinks(){return(linkedServices);} // returns linkedServices vector for use as range in "for-each" loops - int sprintfAttributes(char *cBuf); // prints Service JSON records into buf; return number of characters printed, excluding null terminator + int sprintfAttributes(char *cBuf, int flags); // prints Service JSON records into buf; return number of characters printed, excluding null terminator virtual boolean update() {return(true);} // placeholder for code that is called when a Service is updated via a Controller. Must return true/false depending on success of update virtual void loop(){} // loops for each Service - called every cycle and can be over-ridden with user-defined code