|  |  | @ -154,7 +154,7 @@ void app::setup(uint32_t timeout) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         mMqtt.setup(addr, mqttTopic, mqttUser, mqttPwd, mqttPort); | 
			
		
	
		
			
				
					|  |  |  |         mMqttTicker = 0; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |          | 
			
		
	
		
			
				
					|  |  |  |         mSerialTicker = 0; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         if(mqttAddr[0] > 0) { | 
			
		
	
	
		
			
				
					|  |  | @ -284,6 +284,7 @@ void app::loop(void) { | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             snprintf(val, 10, "%d", millis()/1000); | 
			
		
	
		
			
				
					|  |  |  |             sendMqttDiscoveryConfig(); | 
			
		
	
		
			
				
					|  |  |  |             mMqtt.sendMsg("uptime", val); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -904,3 +905,61 @@ void app::updateCrc(void) { | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_DEBUG, F("new CRC: ") + String(crc, HEX)); | 
			
		
	
		
			
				
					|  |  |  |     mEep->write(ADDR_SETTINGS_CRC, crc); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | void app::sendMqttDiscoveryConfig(void) { | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_VERBOSE, F("app::sendMqttDiscoveryConfig")); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     char stateTopic[64], discoveryTopic[64], buffer[512], name[32], uniq_id[32]; | 
			
		
	
		
			
				
					|  |  |  |     for(uint8_t id = 0; id < mSys->getNumInverters(); id++) { | 
			
		
	
		
			
				
					|  |  |  |         Inverter<> *iv = mSys->getInverterByPos(id); | 
			
		
	
		
			
				
					|  |  |  |         if(NULL != iv) { | 
			
		
	
		
			
				
					|  |  |  |             if(iv->isAvailable(mTimestamp) && mMqttConfigSendState[id] != true) { | 
			
		
	
		
			
				
					|  |  |  |                 DynamicJsonDocument deviceDoc(128); | 
			
		
	
		
			
				
					|  |  |  |                 deviceDoc["name"] = iv->name; | 
			
		
	
		
			
				
					|  |  |  |                 deviceDoc["ids"] = String(iv->serial.u64, HEX); | 
			
		
	
		
			
				
					|  |  |  |                 deviceDoc["cu"] = F("http://") + String(WiFi.localIP().toString()); | 
			
		
	
		
			
				
					|  |  |  |                 JsonObject deviceObj = deviceDoc.as<JsonObject>(); | 
			
		
	
		
			
				
					|  |  |  |                 DynamicJsonDocument doc(384); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 for(uint8_t i = 0; i < iv->listLen; i++) { | 
			
		
	
		
			
				
					|  |  |  |                     if (iv->assign[i].ch == CH0) { | 
			
		
	
		
			
				
					|  |  |  |                         snprintf(name, 32, "%s %s", iv->name, iv->getFieldName(i)); | 
			
		
	
		
			
				
					|  |  |  |                     } else { | 
			
		
	
		
			
				
					|  |  |  |                         snprintf(name, 32, "%s CH%d %s", iv->name, iv->assign[i].ch, iv->getFieldName(i)); | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     snprintf(stateTopic, 64, "%s/%s/ch%d/%s", mMqtt.getTopic(), iv->name, iv->assign[i].ch, iv->getFieldName(i)); | 
			
		
	
		
			
				
					|  |  |  |                     snprintf(discoveryTopic, 64, "%s/sensor/%s/ch%d_%s/config", MQTT_DISCOVERY_PREFIX, iv->name, iv->assign[i].ch, iv->getFieldName(i)); | 
			
		
	
		
			
				
					|  |  |  |                     snprintf(uniq_id, 32, "ch%d_%s", iv->assign[i].ch, iv->getFieldName(i)); | 
			
		
	
		
			
				
					|  |  |  |                     const char* devCls = getFieldDeviceClass(iv->assign[i].fieldId); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     doc["name"] = name; | 
			
		
	
		
			
				
					|  |  |  |                     doc["stat_t"]  = stateTopic; | 
			
		
	
		
			
				
					|  |  |  |                     doc["unit_of_meas"] = iv->getUnit(i); | 
			
		
	
		
			
				
					|  |  |  |                     doc["uniq_id"] = String(iv->serial.u64, HEX) + "_" + uniq_id; | 
			
		
	
		
			
				
					|  |  |  |                     doc["dev"] = deviceObj; | 
			
		
	
		
			
				
					|  |  |  |                     doc["exp_aft"] = mMqttInterval; | 
			
		
	
		
			
				
					|  |  |  |                     if (devCls != NULL) { | 
			
		
	
		
			
				
					|  |  |  |                         doc["dev_cla"] = devCls; | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     serializeJson(doc, buffer); | 
			
		
	
		
			
				
					|  |  |  |                     mMqtt.sendMsg2(discoveryTopic, buffer); | 
			
		
	
		
			
				
					|  |  |  |                     doc.clear(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     yield(); | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 mMqttConfigSendState[id] = true; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | const char* app::getFieldDeviceClass(uint8_t fieldId) { | 
			
		
	
		
			
				
					|  |  |  |     uint8_t pos = 0; | 
			
		
	
		
			
				
					|  |  |  |     for(; pos < DEVICE_CLS_ASSIGN_LIST_LEN; pos++) { | 
			
		
	
		
			
				
					|  |  |  |         if(deviceFieldAssignment[pos].fieldId == fieldId) | 
			
		
	
		
			
				
					|  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |     return (pos >= DEVICE_CLS_ASSIGN_LIST_LEN) ? NULL : deviceClasses[deviceFieldAssignment[pos].deviceClsId]; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | 
 |