diff --git a/src/plugins/MonochromeDisplay/MonochromeDisplay.h b/src/plugins/MonochromeDisplay/MonochromeDisplay.h index 0935d337..0394e37f 100644 --- a/src/plugins/MonochromeDisplay/MonochromeDisplay.h +++ b/src/plugins/MonochromeDisplay/MonochromeDisplay.h @@ -46,6 +46,9 @@ class MonochromeDisplay { void setup(HMSYSTEM *sys, uint32_t *utcTs) { mSys = sys; mUtcTs = utcTs; + memset( mToday, 0, sizeof(float)*MAX_NUM_INVERTERS ); + memset( mTotal, 0, sizeof(float)*MAX_NUM_INVERTERS ); + mLastHour = 25; #if defined(ENA_NOKIA) mDisplay.begin(); ShowInfoText("booting..."); @@ -109,6 +112,7 @@ class MonochromeDisplay { void DataScreen(void) { String timeStr = ah::getDateTimeStr(mCE.toLocal(*mUtcTs)).substring(2, 22); + int hr = timeStr.substring(9,2).toInt(); IPAddress ip = WiFi.localIP(); float totalYield = 0.0, totalYieldToday = 0.0, totalActual = 0.0; char fmtText[32]; @@ -116,6 +120,9 @@ class MonochromeDisplay { unsigned int pow_i[ MAX_NUM_INVERTERS ]; memset( pow_i, 0, sizeof(unsigned int)* MAX_NUM_INVERTERS ); + if ( hr < mLastHour ) // next day ? reset today-values + memset( mToday, 0, sizeof(float)*MAX_NUM_INVERTERS ); + mLastHour = hr; for (uint8_t id = 0; id < mSys->getNumInverters(); id++) { Inverter<> *iv = mSys->getInverterByPos(id); @@ -124,68 +131,73 @@ class MonochromeDisplay { uint8_t pos; uint8_t list[] = {FLD_PAC, FLD_YT, FLD_YD}; - num_inv++; - - if ( !iv->isProducing(*mUtcTs,rec) ) - continue; - for (uint8_t fld = 0; fld < 3; fld++) { pos = iv->getPosByChFld(CH0, list[fld],rec); + int isprod = iv->isProducing(*mUtcTs,rec); if(fld == 1) - totalYield += iv->getValue(pos,rec); + { + if ( isprod ) + mTotal[num_inv] = iv->getValue(pos,rec); + totalYield += mTotal[num_inv]; + } if(fld == 2) - totalYieldToday += iv->getValue(pos,rec); - if(fld == 0) { - pow_i[num_inv-1] = iv->getValue(pos,rec); + if ( isprod ) + mToday[num_inv] = iv->getValue(pos,rec); + totalYieldToday += mToday[num_inv]; + } + if((fld == 0) && isprod ) + { + pow_i[num_inv] = iv->getValue(pos,rec); totalActual += iv->getValue(pos,rec); + ucnt++; } } - ucnt++; + num_inv++; } } - /* u8g2_font_open_iconic_embedded_2x_t 'D' + 'G' + 'J' */ mDisplay.clear(); #if defined(ENA_NOKIA) mDisplay.firstPage(); do { if(ucnt) { - mDisplay.drawXBMP(10,0,8,17,bmp_arrow); + mDisplay.drawXBMP(10,1,8,17,bmp_arrow); mDisplay.setFont(u8g2_font_logisoso16_tr); - mDisplay.setCursor(25,16); + mDisplay.setCursor(25,17); sprintf(fmtText,"%3.0f",totalActual); mDisplay.print(String(fmtText)+F(" W")); - mDisplay.drawHLine(2,20,78); - mDisplay.setFont(u8g2_font_5x8_tr); - mDisplay.setCursor(5,29); - if (( num_inv != 2 ) || !(mExtra%2)) - { - sprintf(fmtText,"%4.0f",totalYieldToday); - mDisplay.print(F("today ")+String(fmtText)+F(" Wh")); - mDisplay.setCursor(5,37); - sprintf(fmtText,"%.1f",totalYield); - mDisplay.print(F("total ")+String(fmtText)+F(" kWh")); - } - else - { - if( pow_i[0] ) - mDisplay.print(F("#1 ")+String(pow_i[0])+F(" W")); - else - mDisplay.print(F("#1 -----")); - mDisplay.setCursor(5,37); - if( pow_i[1] ) - mDisplay.print(F("#2 ")+String(pow_i[1])+F(" W")); - else - mDisplay.print(F("#2 -----")); - } } - else { - mDisplay.setFont(u8g2_font_logisoso16_tr); - mDisplay.setCursor(30,30); - mDisplay.print(F("off")); - mDisplay.setFont(u8g2_font_5x8_tr); + else + { + mDisplay.setFont(u8g2_font_logisoso16_tr ); + mDisplay.setCursor(10,17); + mDisplay.print(String(F("offline"))); + } + mDisplay.drawHLine(2,20,78); + mDisplay.setFont(u8g2_font_5x8_tr); + mDisplay.setCursor(5,29); + if (( num_inv < 2 ) || !(mExtra%2)) + { + sprintf(fmtText,"%4.0f",totalYieldToday); + mDisplay.print(F("today ")+String(fmtText)+F(" Wh")); + mDisplay.setCursor(5,37); + sprintf(fmtText,"%.1f",totalYield); + mDisplay.print(F("total ")+String(fmtText)+F(" kWh")); + } + else + { + int id1=(mExtra/2)%(num_inv-1); + if( pow_i[id1] ) + mDisplay.print(F("#")+String(id1+1)+F(" ")+String(pow_i[id1])+F(" W")); + else + mDisplay.print(F("#")+String(id1+1)+F(" -----")); + mDisplay.setCursor(5,37); + if( pow_i[id1+1] ) + mDisplay.print(F("#")+String(id1+2)+F(" ")+String(pow_i[id1+1])+F(" W")); + else + mDisplay.print(F("#")+String(id1+2)+F(" -----")); } if ( !(mExtra%10) && ip ) { mDisplay.setCursor(5,47); @@ -217,34 +229,36 @@ class MonochromeDisplay { mDisplay.setFont(ArialMT_Plain_24); sprintf(fmtText,"%3.0f",totalActual); mDisplay.drawString(25+ex,0,String(fmtText)+F(" W")); - mDisplay.setFont(ArialMT_Plain_16); - - if (( num_inv != 2 ) || !(mExtra%2)) - { - sprintf(fmtText,"%4.0f",totalYieldToday); - mDisplay.drawString(5,22,F("today ")+String(fmtText)+F(" Wh")); - sprintf(fmtText,"%.1f",totalYield); - mDisplay.drawString(5,35,F("total ")+String(fmtText)+F(" kWh")); - } - else - { - if( pow_i[0] ) - mDisplay.drawString(15,22,F("#1 ")+String(pow_i[0])+F(" W")); - else - mDisplay.drawString(15,22,F("#1 -----")); - if( pow_i[1] ) - mDisplay.drawString(15,35,F("#2 ")+String(pow_i[1])+F(" W")); - else - mDisplay.drawString(15,35,F("#2 -----")); - } - mDisplay.drawLine(2,23,123,23); } - else { + else + { mDisplay.setBrightness(1); mDisplay.setFont(ArialMT_Plain_24); - mDisplay.drawString(mRx+50, 10, F("off")); - mDisplay.setFont(ArialMT_Plain_16); + mDisplay.drawString(25+ex,0,String(F("offline"))); + } + mDisplay.setFont(ArialMT_Plain_16); + + if (( num_inv < 2 ) || !(mExtra%2)) + { + sprintf(fmtText,"%4.0f",totalYieldToday); + mDisplay.drawString(5,22,F("today ")+String(fmtText)+F(" Wh")); + sprintf(fmtText,"%.1f",totalYield); + mDisplay.drawString(5,35,F("total ")+String(fmtText)+F(" kWh")); + } + else + { + int id1=(mExtra/2)%(num_inv-1); + if( pow_i[id1] ) + mDisplay.drawString(15,22,F("#")+String(id1+1)+F(" ")+String(pow_i[id1])+F(" W")); + else + mDisplay.drawString(15,22,F("#")+String(id1+1)+F(" -----")); + if( pow_i[id1+1] ) + mDisplay.drawString(15,35,F("#")+String(id1+2)+F(" ")+String(pow_i[id1+1])+F(" W")); + else + mDisplay.drawString(15,35,F("#")+String(id1+2)+F(" -----")); } + mDisplay.drawLine(2,23,123,23); + if ( (!(mExtra%10) && ip )|| (timeStr.length()<16)) { mDisplay.drawString(5,49,ip.toString()); @@ -277,7 +291,10 @@ class MonochromeDisplay { #endif int mExtra; bool mNewPayload; + float mTotal[ MAX_NUM_INVERTERS ]; + float mToday[ MAX_NUM_INVERTERS ]; uint32_t *mUtcTs; + int mLastHour; HMSYSTEM *mSys; Timezone mCE; };