|  |  | @ -182,50 +182,51 @@ class PubMqtt { | 
			
		
	
		
			
				
					|  |  |  |         void sendDiscoveryConfig(void) { | 
			
		
	
		
			
				
					|  |  |  |             DPRINTLN(DBG_VERBOSE, F("sendMqttDiscoveryConfig")); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             char stateTopic[64], discoveryTopic[64], buffer[512], name[32], uniq_id[32]; | 
			
		
	
		
			
				
					|  |  |  |             char topic[64], buffer[512], name[32], uniq_id[32]; | 
			
		
	
		
			
				
					|  |  |  |             DynamicJsonDocument doc(512); | 
			
		
	
		
			
				
					|  |  |  |             for (uint8_t id = 0; id < mSys->getNumInverters(); id++) { | 
			
		
	
		
			
				
					|  |  |  |                 Inverter<> *iv = mSys->getInverterByPos(id); | 
			
		
	
		
			
				
					|  |  |  |                 if (NULL != iv) { | 
			
		
	
		
			
				
					|  |  |  |                     record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); | 
			
		
	
		
			
				
					|  |  |  |                     DynamicJsonDocument deviceDoc(128); | 
			
		
	
		
			
				
					|  |  |  |                     deviceDoc[F("name")] = iv->config->name; | 
			
		
	
		
			
				
					|  |  |  |                     deviceDoc[F("ids")] = String(iv->config->serial.u64, HEX); | 
			
		
	
		
			
				
					|  |  |  |                     deviceDoc[F("cu")] = F("http://") + String(WiFi.localIP().toString()); | 
			
		
	
		
			
				
					|  |  |  |                     deviceDoc[F("mf")] = F("Hoymiles"); | 
			
		
	
		
			
				
					|  |  |  |                     deviceDoc[F("mdl")] = iv->config->name; | 
			
		
	
		
			
				
					|  |  |  |                     JsonObject deviceObj = deviceDoc.as<JsonObject>(); | 
			
		
	
		
			
				
					|  |  |  |                     DynamicJsonDocument doc(384); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     for (uint8_t i = 0; i < rec->length; i++) { | 
			
		
	
		
			
				
					|  |  |  |                         if (rec->assign[i].ch == CH0) { | 
			
		
	
		
			
				
					|  |  |  |                             snprintf(name, 32, "%s %s", iv->config->name, iv->getFieldName(i, rec)); | 
			
		
	
		
			
				
					|  |  |  |                         } else { | 
			
		
	
		
			
				
					|  |  |  |                             snprintf(name, 32, "%s CH%d %s", iv->config->name, rec->assign[i].ch, iv->getFieldName(i, rec)); | 
			
		
	
		
			
				
					|  |  |  |                         } | 
			
		
	
		
			
				
					|  |  |  |                         snprintf(stateTopic, 64, "/ch%d/%s", rec->assign[i].ch, iv->getFieldName(i, rec)); | 
			
		
	
		
			
				
					|  |  |  |                         snprintf(discoveryTopic, 64, "%s/sensor/%s/ch%d_%s/config", MQTT_DISCOVERY_PREFIX, iv->config->name, rec->assign[i].ch, iv->getFieldName(i, rec)); | 
			
		
	
		
			
				
					|  |  |  |                         snprintf(uniq_id, 32, "ch%d_%s", rec->assign[i].ch, iv->getFieldName(i, rec)); | 
			
		
	
		
			
				
					|  |  |  |                         const char *devCls = getFieldDeviceClass(rec->assign[i].fieldId); | 
			
		
	
		
			
				
					|  |  |  |                         const char *stateCls = getFieldStateClass(rec->assign[i].fieldId); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                         doc[F("name")] = name; | 
			
		
	
		
			
				
					|  |  |  |                         doc[F("stat_t")] = String(mCfgMqtt->topic) + "/" + String(iv->config->name) + String(stateTopic); | 
			
		
	
		
			
				
					|  |  |  |                         doc[F("unit_of_meas")] = iv->getUnit(i, rec); | 
			
		
	
		
			
				
					|  |  |  |                         doc[F("uniq_id")] = String(iv->config->serial.u64, HEX) + "_" + uniq_id; | 
			
		
	
		
			
				
					|  |  |  |                         doc[F("dev")] = deviceObj; | 
			
		
	
		
			
				
					|  |  |  |                         doc[F("exp_aft")] = MQTT_INTERVAL + 5;  // add 5 sec if connection is bad or ESP too slow @TODO: stimmt das wirklich als expire!?
 | 
			
		
	
		
			
				
					|  |  |  |                         if (devCls != NULL) | 
			
		
	
		
			
				
					|  |  |  |                             doc[F("dev_cla")] = devCls; | 
			
		
	
		
			
				
					|  |  |  |                         if (stateCls != NULL) | 
			
		
	
		
			
				
					|  |  |  |                             doc[F("stat_cla")] = stateCls; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                         serializeJson(doc, buffer); | 
			
		
	
		
			
				
					|  |  |  |                         publish(discoveryTopic, buffer, true, false); | 
			
		
	
		
			
				
					|  |  |  |                         doc.clear(); | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                 if (NULL == iv) | 
			
		
	
		
			
				
					|  |  |  |                     continue; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     yield(); | 
			
		
	
		
			
				
					|  |  |  |                 record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); | 
			
		
	
		
			
				
					|  |  |  |                 doc.clear(); | 
			
		
	
		
			
				
					|  |  |  |                 doc[F("name")] = iv->config->name; | 
			
		
	
		
			
				
					|  |  |  |                 doc[F("ids")] = String(iv->config->serial.u64, HEX); | 
			
		
	
		
			
				
					|  |  |  |                 doc[F("cu")] = F("http://") + String(WiFi.localIP().toString()); | 
			
		
	
		
			
				
					|  |  |  |                 doc[F("mf")] = F("Hoymiles"); | 
			
		
	
		
			
				
					|  |  |  |                 doc[F("mdl")] = iv->config->name; | 
			
		
	
		
			
				
					|  |  |  |                 JsonObject deviceObj = doc.as<JsonObject>(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 for (uint8_t i = 0; i < rec->length; i++) { | 
			
		
	
		
			
				
					|  |  |  |                     if (rec->assign[i].ch == CH0) | 
			
		
	
		
			
				
					|  |  |  |                         snprintf(name, 32, "%s %s", iv->config->name, iv->getFieldName(i, rec)); | 
			
		
	
		
			
				
					|  |  |  |                     else | 
			
		
	
		
			
				
					|  |  |  |                         snprintf(name, 32, "%s CH%d %s", iv->config->name, rec->assign[i].ch, iv->getFieldName(i, rec)); | 
			
		
	
		
			
				
					|  |  |  |                     snprintf(topic, 64, "/ch%d/%s", rec->assign[i].ch, iv->getFieldName(i, rec)); | 
			
		
	
		
			
				
					|  |  |  |                     snprintf(uniq_id, 32, "ch%d_%s", rec->assign[i].ch, iv->getFieldName(i, rec)); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     const char *devCls = getFieldDeviceClass(rec->assign[i].fieldId); | 
			
		
	
		
			
				
					|  |  |  |                     const char *stateCls = getFieldStateClass(rec->assign[i].fieldId); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     doc.clear(); | 
			
		
	
		
			
				
					|  |  |  |                     doc[F("name")] = name; | 
			
		
	
		
			
				
					|  |  |  |                     doc[F("stat_t")] = String(mCfgMqtt->topic) + "/" + String(iv->config->name) + String(topic); | 
			
		
	
		
			
				
					|  |  |  |                     doc[F("unit_of_meas")] = iv->getUnit(i, rec); | 
			
		
	
		
			
				
					|  |  |  |                     doc[F("uniq_id")] = String(iv->config->serial.u64, HEX) + "_" + uniq_id; | 
			
		
	
		
			
				
					|  |  |  |                     doc[F("dev")] = deviceObj; | 
			
		
	
		
			
				
					|  |  |  |                     doc[F("exp_aft")] = MQTT_INTERVAL + 5;  // add 5 sec if connection is bad or ESP too slow @TODO: stimmt das wirklich als expire!?
 | 
			
		
	
		
			
				
					|  |  |  |                     if (devCls != NULL) | 
			
		
	
		
			
				
					|  |  |  |                         doc[F("dev_cla")] = String(devCls); | 
			
		
	
		
			
				
					|  |  |  |                     if (stateCls != NULL) | 
			
		
	
		
			
				
					|  |  |  |                         doc[F("stat_cla")] = String(stateCls); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                     snprintf(topic, 64, "%s/sensor/%s/ch%d_%s/config", MQTT_DISCOVERY_PREFIX, iv->config->name, rec->assign[i].ch, iv->getFieldName(i, rec)); | 
			
		
	
		
			
				
					|  |  |  |                     serializeJson(doc, buffer); | 
			
		
	
		
			
				
					|  |  |  |                     publish(topic, buffer, true, false); | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 yield(); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | 
 |