| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -432,7 +432,6 @@ void app::cbMqtt(char* topic, byte* payload, unsigned int length) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if (std::strcmp(token,"devcontrol")==0){ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            token = strtok(NULL, "/"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            uint8_t iv_id = std::stoi(token); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            uint8_t powerLimitControl = 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if (iv_id >= 0  && iv_id <= MAX_NUM_INVERTERS){ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                Inverter<> *iv = this->mSys->getInverterByPos(iv_id); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                if(NULL != iv) { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -442,24 +441,24 @@ void app::cbMqtt(char* topic, byte* payload, unsigned int length) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            case ActivePowerContr:  // Active Power Control
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                token = strtok(NULL, "/"); // get ControlMode aka "PowerPF.Desc" in DTU-Pro Code from topic string
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                if (token == NULL) // default via mqtt ommit the LimitControlMode
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    powerLimitControl = AbsolutNonPersistent; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    iv->powerLimit[1] = AbsolutNonPersistent; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                else | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    powerLimitControl = std::stoi(token); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    // 0x0001 -> relativ limit in percent
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    // 0x0000 -> absolut limit in Watt
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    // 0x0101 -> persisten limit in percent (?)
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    // ...
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                if (true){ // if (std::stoi((char*)payload) > 0) error handling powerlimit needed?
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    iv->devControlCmd = ActivePowerContr; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    iv->powerLimit[0] = std::stoi((char*)payload); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    if (powerLimitControl >= AbsolutNonPersistent && powerLimitControl <= RelativNonPersistent) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                        iv->powerLimit[1] = powerLimitControl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    if (iv->powerLimit[1] & 0x0001) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                        DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("%") );     | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    else | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                        DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("W") ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    iv->powerLimit[1] = std::stoi(token); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                DPRINTLN(DBG_VERBOSE, F("iv->powerLimit[1]=") + String(iv->powerLimit[1])); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                DPRINTLN(DBG_VERBOSE, F("length=") + String(length)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                if (length<=5){ // if (std::stoi((char*)payload) > 0) more error handling powerlimit needed?
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    if (iv->powerLimit[1] >= AbsolutNonPersistent && iv->powerLimit[1] <= RelativPersistent){ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                        iv->devControlCmd = ActivePowerContr; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                        iv->powerLimit[0] = std::stoi((char*)payload); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                        if (iv->powerLimit[1] & 0x0001) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                            DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("%") );     | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                        else | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                            DPRINTLN(DBG_INFO, F("Power limit for inverter ") + String(iv->id) + F(" set to ") + String(iv->powerLimit[0]) + F("W") ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    iv->devControlRequest = true; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    DPRINTLN(DBG_INFO, F("Invalid mqtt payload recevied: ") + String((char*)payload)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                iv->devControlRequest = true; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            case TurnOn: // Turn On
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                iv->devControlCmd = TurnOn; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |