|  |  | @ -258,8 +258,72 @@ class PubMqtt { | 
			
		
	
		
			
				
					|  |  |  |                     delete[] buf; | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 yield(); | 
			
		
	
		
			
				
					|  |  |  |                yield(); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  | //Début modif
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             String node_mac = WiFi.macAddress().substring(12,14)+ WiFi.macAddress().substring(15,17); | 
			
		
	
		
			
				
					|  |  |  |             String node_id = "AHOY_DTU_" + node_mac; | 
			
		
	
		
			
				
					|  |  |  |             doc.clear(); | 
			
		
	
		
			
				
					|  |  |  |             doc[F("name")] = node_id; | 
			
		
	
		
			
				
					|  |  |  |             doc[F("ids")] = node_id; | 
			
		
	
		
			
				
					|  |  |  |             doc[F("cu")] = F("http://") + String(WiFi.localIP().toString()); | 
			
		
	
		
			
				
					|  |  |  |             doc[F("mf")] = F("Hoymiles"); | 
			
		
	
		
			
				
					|  |  |  |             doc[F("mdl")] = "AHOY_DTU"; | 
			
		
	
		
			
				
					|  |  |  |             JsonObject deviceObj = doc.as<JsonObject>(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             uint8_t fieldId; | 
			
		
	
		
			
				
					|  |  |  |             String fieldUnit; | 
			
		
	
		
			
				
					|  |  |  |             for (uint8_t i = 0; i < 4; i++) { | 
			
		
	
		
			
				
					|  |  |  |                 switch (i) { | 
			
		
	
		
			
				
					|  |  |  |                     default: | 
			
		
	
		
			
				
					|  |  |  |                     case 0: | 
			
		
	
		
			
				
					|  |  |  |                         fieldId = FLD_PAC; | 
			
		
	
		
			
				
					|  |  |  |                         fieldUnit = "W"; | 
			
		
	
		
			
				
					|  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |                     case 1: | 
			
		
	
		
			
				
					|  |  |  |                         fieldId = FLD_YT; | 
			
		
	
		
			
				
					|  |  |  |                         fieldUnit = "kWh"; | 
			
		
	
		
			
				
					|  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |                     case 2: | 
			
		
	
		
			
				
					|  |  |  |                         fieldId = FLD_YD; | 
			
		
	
		
			
				
					|  |  |  |                         fieldUnit = "Wh"; | 
			
		
	
		
			
				
					|  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |                     case 3: | 
			
		
	
		
			
				
					|  |  |  |                         fieldId = FLD_PDC; | 
			
		
	
		
			
				
					|  |  |  |                         fieldUnit = "W"; | 
			
		
	
		
			
				
					|  |  |  |                         break; | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(name, 32, "Total %s", fields[fieldId]); | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(topic, 64, "/%s", fields[fieldId]); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 const char *devCls = getFieldDeviceClass(fieldId); | 
			
		
	
		
			
				
					|  |  |  |                 const char *stateCls = getFieldStateClass(fieldId); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 DynamicJsonDocument doc2(512); | 
			
		
	
		
			
				
					|  |  |  |                 doc2.clear(); | 
			
		
	
		
			
				
					|  |  |  |                 doc2[F("name")] = String(name); | 
			
		
	
		
			
				
					|  |  |  |                 doc2[F("stat_t")] = String(mCfgMqtt->topic) + "/total" + String(topic); | 
			
		
	
		
			
				
					|  |  |  |                 doc2[F("unit_of_meas")] = fieldUnit; | 
			
		
	
		
			
				
					|  |  |  |                 doc2[F("uniq_id")] = String(node_id) + "_" + String(fields[fieldId]); | 
			
		
	
		
			
				
					|  |  |  |                 doc2[F("dev")] = deviceObj; | 
			
		
	
		
			
				
					|  |  |  |                 doc2[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) | 
			
		
	
		
			
				
					|  |  |  |                     doc2[F("dev_cla")] = String(devCls); | 
			
		
	
		
			
				
					|  |  |  |                 if (stateCls != NULL) | 
			
		
	
		
			
				
					|  |  |  |                     doc2[F("stat_cla")] = String(stateCls); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(topic, 64, "%s/sensor/%s/Total_%s/config", MQTT_DISCOVERY_PREFIX, node_id.c_str(),fields[fieldId]); | 
			
		
	
		
			
				
					|  |  |  |                 size_t size = measureJson(doc2) + 1; | 
			
		
	
		
			
				
					|  |  |  |                 char *buf = new char[size]; | 
			
		
	
		
			
				
					|  |  |  |                 memset(buf, 0, size); | 
			
		
	
		
			
				
					|  |  |  |                 serializeJson(doc2, buf, size); | 
			
		
	
		
			
				
					|  |  |  |                 publish(topic, buf, true, false); | 
			
		
	
		
			
				
					|  |  |  |                 delete[] buf; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |                 yield(); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         void setPowerLimitAck(Inverter<> *iv) { | 
			
		
	
	
		
			
				
					|  |  | @ -388,6 +452,14 @@ class PubMqtt { | 
			
		
	
		
			
				
					|  |  |  |             return (pos >= DEVICE_CLS_ASSIGN_LIST_LEN) ? NULL : stateClasses[deviceFieldAssignment[pos].stateClsId]; | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         const char *getFieldUnit(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]; | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |         bool processIvStatus() { | 
			
		
	
		
			
				
					|  |  |  |             // returns true if all inverters are available
 | 
			
		
	
		
			
				
					|  |  |  |             bool allAvail = true; | 
			
		
	
	
		
			
				
					|  |  | 
 |