|  |  | @ -578,7 +578,6 @@ void app::sendMqttDiscoveryConfig(void) { | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::sendMqtt(void) { | 
			
		
	
		
			
				
					|  |  |  |     mMqtt.isConnected(true);  // really needed? See comment from HorstG-57 #176
 | 
			
		
	
	
		
			
				
					|  |  | @ -594,34 +593,32 @@ void app::sendMqtt(void) { | 
			
		
	
		
			
				
					|  |  |  |         Inverter<> *iv = mSys->getInverterByPos(id); | 
			
		
	
		
			
				
					|  |  |  |         if (NULL != iv) { | 
			
		
	
		
			
				
					|  |  |  |             record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); | 
			
		
	
		
			
				
					|  |  |  |             if (!iv->isAvailable(mUtcTimestamp, rec) && !iv->isProducing(mUtcTimestamp, rec)) { | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(topic, 32 + MAX_NAME_LENGTH, "%s/available_text", iv->name); | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(val, 32, DEF_MQTT_IV_MESSAGE_NOT_AVAIL_AND_NOT_PRODUCED); | 
			
		
	
		
			
				
					|  |  |  |                 mMqtt.sendMsg(topic, val); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(topic, 32 + MAX_NAME_LENGTH, "%s/available", iv->name); | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(val, 32, "0"); | 
			
		
	
		
			
				
					|  |  |  |                 mMqtt.sendMsg(topic, val); | 
			
		
	
		
			
				
					|  |  |  |             } else if (!iv->isProducing(mUtcTimestamp, rec)) { | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(topic, 32 + MAX_NAME_LENGTH, "%s/available_text", iv->name); | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(val, 32, DEF_MQTT_IV_MESSAGE_INVERTER_AVAIL_AND_NOT_PRODUCED); | 
			
		
	
		
			
				
					|  |  |  |                 mMqtt.sendMsg(topic, val); | 
			
		
	
		
			
				
					|  |  |  |             uint8_t status = MQTT_STATUS_AVAIL_PROD; | 
			
		
	
		
			
				
					|  |  |  |             if (!iv->isAvailable(mUtcTimestamp, rec)) | 
			
		
	
		
			
				
					|  |  |  |                 status = MQTT_STATUS_NOT_AVAIL_NOT_PROD; | 
			
		
	
		
			
				
					|  |  |  |             if (!iv->isProducing(mUtcTimestamp, rec)) { | 
			
		
	
		
			
				
					|  |  |  |                 if (MQTT_STATUS_AVAIL_PROD == status) | 
			
		
	
		
			
				
					|  |  |  |                     status = MQTT_STATUS_AVAIL_NOT_PROD; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(topic, 32 + MAX_NAME_LENGTH, "%s/available", iv->name); | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(val, 32, "1"); | 
			
		
	
		
			
				
					|  |  |  |                 mMqtt.sendMsg(topic, val); | 
			
		
	
		
			
				
					|  |  |  |             snprintf(topic, 32 + MAX_NAME_LENGTH, "%s/available_text", iv->name); | 
			
		
	
		
			
				
					|  |  |  |             snprintf(val, 32, "%s%s%s%s", | 
			
		
	
		
			
				
					|  |  |  |                 (MQTT_STATUS_NOT_AVAIL_NOT_PROD) ? "not " : "", | 
			
		
	
		
			
				
					|  |  |  |                 "available and ", | 
			
		
	
		
			
				
					|  |  |  |                 (MQTT_STATUS_NOT_AVAIL_NOT_PROD || MQTT_STATUS_AVAIL_NOT_PROD) ? "not " : "", | 
			
		
	
		
			
				
					|  |  |  |                 "producing" | 
			
		
	
		
			
				
					|  |  |  |             ); | 
			
		
	
		
			
				
					|  |  |  |             mMqtt.sendMsg(topic, val); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             snprintf(topic, 32 + MAX_NAME_LENGTH, "%s/available", iv->name); | 
			
		
	
		
			
				
					|  |  |  |             snprintf(val, 32, "%d", status); | 
			
		
	
		
			
				
					|  |  |  |             mMqtt.sendMsg(topic, val); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             if (iv->isAvailable(mUtcTimestamp, rec)) { | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(topic, 32 + MAX_NAME_LENGTH, "%s/last_success", iv->name); | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(val, 48, "%i", iv->getLastTs(rec) * 1000); | 
			
		
	
		
			
				
					|  |  |  |                 mMqtt.sendMsg(topic, val); | 
			
		
	
		
			
				
					|  |  |  |             } else {  // is producing and is available
 | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(topic, 32 + MAX_NAME_LENGTH, "%s/available_text", iv->name); | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(val, 32, DEF_MQTT_IV_MESSAGE_INVERTER_AVAIL_AND_PRODUCED); | 
			
		
	
		
			
				
					|  |  |  |                 mMqtt.sendMsg(topic, val); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(topic, 32 + MAX_NAME_LENGTH, "%s/available", iv->name); | 
			
		
	
		
			
				
					|  |  |  |                 snprintf(val, 32, "2"); | 
			
		
	
		
			
				
					|  |  |  |                 mMqtt.sendMsg(topic, val); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 for (uint8_t i = 0; i < rec->length; i++) { | 
			
		
	
		
			
				
					|  |  |  |                     snprintf(topic, 32 + MAX_NAME_LENGTH, "%s/ch%d/%s", iv->name, rec->assign[i].ch, fields[rec->assign[i].fieldId]); | 
			
		
	
	
		
			
				
					|  |  | @ -675,7 +672,6 @@ void app::sendMqtt(void) { | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | const char *app::getFieldDeviceClass(uint8_t fieldId) { | 
			
		
	
		
			
				
					|  |  |  |     uint8_t pos = 0; | 
			
		
	
	
		
			
				
					|  |  | @ -686,7 +682,6 @@ const char *app::getFieldDeviceClass(uint8_t fieldId) { | 
			
		
	
		
			
				
					|  |  |  |     return (pos >= DEVICE_CLS_ASSIGN_LIST_LEN) ? NULL : deviceClasses[deviceFieldAssignment[pos].deviceClsId]; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | const char *app::getFieldStateClass(uint8_t fieldId) { | 
			
		
	
		
			
				
					|  |  |  |     uint8_t pos = 0; | 
			
		
	
	
		
			
				
					|  |  | @ -697,7 +692,6 @@ const char *app::getFieldStateClass(uint8_t fieldId) { | 
			
		
	
		
			
				
					|  |  |  |     return (pos >= DEVICE_CLS_ASSIGN_LIST_LEN) ? NULL : stateClasses[deviceFieldAssignment[pos].stateClsId]; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::resetSystem(void) { | 
			
		
	
		
			
				
					|  |  |  |     mUptimeSecs = 0; | 
			
		
	
	
		
			
				
					|  |  | @ -869,7 +863,6 @@ void app::setupMqtt(void) { | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::resetPayload(Inverter<> *iv) { | 
			
		
	
		
			
				
					|  |  |  |     DPRINTLN(DBG_INFO, "resetPayload: id: " + String(iv->id)); | 
			
		
	
	
		
			
				
					|  |  | @ -882,7 +875,6 @@ void app::resetPayload(Inverter<> *iv) { | 
			
		
	
		
			
				
					|  |  |  |     mPayload[iv->id].ts = mUtcTimestamp; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void app::calculateSunriseSunset() { | 
			
		
	
		
			
				
					|  |  |  |     // Source: https://en.wikipedia.org/wiki/Sunrise_equation#Complete_calculation_on_Earth
 | 
			
		
	
	
		
			
				
					|  |  | 
 |