Fix for config pages with more values

This commit is contained in:
norbert-walter 2022-04-03 19:35:44 +02:00
parent 30437dddb6
commit a4e8b7217b
6 changed files with 189 additions and 61 deletions

View File

@ -237,7 +237,7 @@ SensorData calcSunsetSunrise(GwApi *api, double time, double date, double latitu
int intminSS = 0;
bool sunDown = false;
api->getLogger()->logDebug(GwLog::DEBUG,"... calcSun: Lat %f, Lon %f, at: %d, next SR: %d, next SS: %d", latitude, longitude, t, sunR, sunS);
// api->getLogger()->logDebug(GwLog::DEBUG,"... calcSun: Lat %f, Lon %f, at: %d, next SR: %d, next SS: %d", latitude, longitude, t, sunR, sunS);
if (!isnan(time) && !isnan(date) && !isnan(latitude) && !isnan(longitude) && !isnan(timezone)) {
// Calculate local time
@ -267,8 +267,39 @@ SensorData calcSunsetSunrise(GwApi *api, double time, double date, double latitu
returnset.sunriseMinute = intminSR;
returnset.sunDown = sunDown;
api->getLogger()->logDebug(GwLog::DEBUG,"... calcSun: at t: %d, hasRise: %d, next SR: %d, hasSet: %d, next SS: %d\n", t, sr.hasRise, sr.riseTime, sr.hasSet, sr.setTime);
// api->getLogger()->logDebug(GwLog::DEBUG,"... calcSun: at t: %d, hasRise: %d, next SR: %d, hasSet: %d, next SS: %d\n", t, sr.hasRise, sr.riseTime, sr.hasSet, sr.setTime);
return returnset;
}
// Battery graphic with fill level
void batteryGraphic(uint x, uint y, float percent, int pcolor, int bcolor){
// Show battery
int xb = x; // X position
int yb = y; // Y position
int t = 4; // Line thickness
// Percent limits
if(percent < 0){
percent = 0;
}
if(percent > 99){
percent = 99;
}
// Battery corpus 100x80 with fill level
int level = int((100.0 - percent) * (80-(2*t)) / 100.0);
display.fillRect(xb, yb, 100, 80, pcolor);
if(percent < 99){
display.fillRect(xb+t, yb+t, 100-(2*t), level, bcolor);
}
// Plus pol 20x15
int xp = xb + 20;
int yp = yb - 15 + t;
display.fillRect(xp, yp, 20, 15, pcolor);
display.fillRect(xp+t, yp+t, 20-(2*t), 15-(2*t), bcolor);
// Minus pol 20x15
int xm = xb + 60;
int ym = yb -15 + t;
display.fillRect(xm, ym, 20, 15, pcolor);
display.fillRect(xm+t, ym+t, 20-(2*t), 15-(2*t), bcolor);
}
#endif

View File

@ -44,4 +44,6 @@ void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatVa
SensorData calcSunsetSunrise(GwApi *api, double time, double date, double latitude, double longitude, double timezone); // Calulate sunset and sunrise
void batteryGraphic(uint x, uint y, float percent, int pcolor, int bcolor); // Battery graphic with fill level
#endif

View File

@ -31,7 +31,7 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
return result;
}
LOG_DEBUG(GwLog::DEBUG,"formatValue init: getFormat: %s date->value: %f time->value: %f", value->getFormat(), commondata.date->value, commondata.time->value);
// LOG_DEBUG(GwLog::DEBUG,"formatValue init: getFormat: %s date->value: %f time->value: %f", value->getFormat(), commondata.date->value, commondata.time->value);
static const int bsize = 30;
char buffer[bsize+1];
buffer[0]=0;
@ -42,7 +42,7 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
if (commondata.time->value + int(timeZone*3600) > 86400) {dayoffset = 1;}
if (commondata.time->value + int(timeZone*3600) < 0) {dayoffset = -1;}
LOG_DEBUG(GwLog::DEBUG,"... formatDate value->value: %f tz: %f dayoffset: %d", value->value, timeZone, dayoffset);
// LOG_DEBUG(GwLog::DEBUG,"... formatDate value->value: %f tz: %f dayoffset: %d", value->value, timeZone, dayoffset);
tmElements_t parts;
time_t tv=tNMEA0183Msg::daysToTime_t(value->value + dayoffset);
@ -82,7 +82,7 @@ FormatedData formatValue(GwApi::BoatValue *value, CommonData &commondata){
timeInSeconds = value->value + int(timeZone * 3600);
if (timeInSeconds > 86400) {timeInSeconds = timeInSeconds - 86400;}
if (timeInSeconds < 0) {timeInSeconds = timeInSeconds + 86400;}
LOG_DEBUG(GwLog::DEBUG,"... formatTime value: %f tz: %f corrected timeInSeconds: %f ", value->value, timeZone, timeInSeconds);
// LOG_DEBUG(GwLog::DEBUG,"... formatTime value: %f tz: %f corrected timeInSeconds: %f ", value->value, timeZone, timeInSeconds);
if(usesimudata == false) {
val=modf(timeInSeconds/3600.0,&inthr);
val=modf(val*3600.0/60.0,&intmin);

View File

@ -413,7 +413,15 @@ void sensorTask(void *param){
if(millis() > starttime8 + 1000 && (String(powsensor1) == "INA219" || String(powsensor1) == "INA226")){
starttime8 = millis();
if(String(powsensor1) == "INA226" && INA226_1_ready == true){
sensors.batteryVoltage = ina226_1.getBusVoltage();
double voltage = ina226_1.getBusVoltage();
// Limiter for voltage average building
if(voltage < -30){
voltage = -30;
}
if(voltage > 30){
voltage = 30;
}
sensors.batteryVoltage = voltage;
sensors.batteryCurrent = ina226_1.getCurrent() * corrFactor;
// Eliminates bit jitter by zero current values
float factor = maxCurrent / 100;

View File

@ -49,10 +49,13 @@ public:
bool holdvalues = config->getBool(config->holdvalues);
String flashLED = config->getString(config->flashLED);
String batVoltage = config->getString(config->batteryVoltage);
int batCapacity = config->getInt(config->batteryCapacity);
String batType = config->getString(config->batteryType);
String backlightMode = config->getString(config->backlight);
double value1 = 0;
double value1 = 0; // Battery voltage
double value2 = 0; // Battery current
double value3 = 0; // Battery power consumption
double valueTrend = 0; // Average over 10 values
// Get voltage value
@ -74,18 +77,28 @@ public:
switch (average) {
case 0:
value1 = commonData.data.batteryVoltage; // Live data
value2 = commonData.data.batteryCurrent;
value3 = commonData.data.batteryPower;
break;
case 1:
value1 = commonData.data.batteryVoltage10; // Average 10s
value2 = commonData.data.batteryCurrent10;
value3 = commonData.data.batteryPower10;
break;
case 2:
value1 = commonData.data.batteryVoltage60; // Average 60s
value2 = commonData.data.batteryCurrent60;
value3 = commonData.data.batteryPower60;
break;
case 3:
value1 = commonData.data.batteryVoltage300; // Average 300s
value2 = commonData.data.batteryCurrent300;
value3 = commonData.data.batteryPower300;
break;
default:
value1 = commonData.data.batteryVoltage; // Default
value2 = commonData.data.batteryCurrent;
value3 = commonData.data.batteryPower;
break;
}
bool valid1 = true;
@ -149,35 +162,45 @@ public:
}
// Clear display in obp60task.cpp in main loop
// Show battery
int xb = 150; // X position
int yb = 80; // Y position
int t = 4; // Line thickness
// Battery corpus 100x80
display.fillRect(xb, yb, 100, 80, pixelcolor);
display.fillRect(xb+t, yb+t, 100-(2*t), 80-(2*t), bgcolor);
// Plus pol 20x15
int xp = 170;
int yp = 69;
display.fillRect(xp, yp, 20, 15, pixelcolor);
display.fillRect(xp+t, yp+t, 20-(2*t), 15-(2*t), bgcolor);
// Minus pol 20x15
int xm = 210;
int ym = 69;
display.fillRect(xm, ym, 20, 15, pixelcolor);
display.fillRect(xm+t, ym+t, 20-(2*t), 15-(2*t), bgcolor);
// Show name
display.setTextColor(textcolor);
display.setFont(&Ubuntu_Bold20pt7b);
display.setCursor(10, 65);
display.print("Bat.");
// Show batery type
display.setTextColor(textcolor);
display.setFont(&Ubuntu_Bold8pt7b);
display.setCursor(295, 100);
display.setCursor(90, 65);
display.print(batType);
// Show voltage type
display.setTextColor(textcolor);
display.setFont(&DSEG7Classic_BoldItalic20pt7b);
display.setCursor(10, 140);
int bvoltage = 0;
if(String(batVoltage) == "12V") bvoltage = 12;
else bvoltage = 24;
display.print(bvoltage);
display.setFont(&Ubuntu_Bold16pt7b);
display.print("V");
// Show batery capacity
display.setTextColor(textcolor);
display.setFont(&DSEG7Classic_BoldItalic20pt7b);
display.setCursor(10, 200);
display.print(batCapacity);
display.setFont(&Ubuntu_Bold16pt7b);
display.print("Ah");
// Show battery with fill level
static int level = 0;
batteryGraphic(150, 45, level, pixelcolor, bgcolor);
// Show average settings
display.setTextColor(textcolor);
display.setFont(&Ubuntu_Bold8pt7b);
display.setCursor(320, 100);
display.setCursor(150, 145);
switch (average) {
case 0:
display.print("Avg: 1s");
@ -196,10 +219,28 @@ public:
break;
}
// Show fill level in percent
display.setTextColor(textcolor);
display.setFont(&DSEG7Classic_BoldItalic20pt7b);
display.setCursor(150, 200);
display.print(level);
display.setFont(&Ubuntu_Bold16pt7b);
display.print("%");
level += 1;
level = level % 100;
// Show time to full discharge
display.setTextColor(textcolor);
display.setFont(&DSEG7Classic_BoldItalic20pt7b);
display.setCursor(150, 260);
display.print(8.3, 1);
display.setFont(&Ubuntu_Bold16pt7b);
display.print("h");
// Reading bus data or using simulation data
display.setTextColor(textcolor);
display.setFont(&DSEG7Classic_BoldItalic20pt7b);
display.setCursor(20, 240);
display.setCursor(260, 140);
if(simulation == true){
if(batVoltage == "12V"){
value1 = 12.0;
@ -228,6 +269,24 @@ public:
display.print("---"); // Missing bus data
}
}
display.setFont(&Ubuntu_Bold16pt7b);
display.print("V");
// Show actual current in A
display.setTextColor(textcolor);
display.setFont(&DSEG7Classic_BoldItalic20pt7b);
display.setCursor(260, 200);
display.print(value2, 1);
display.setFont(&Ubuntu_Bold16pt7b);
display.print("A");
// Show actual consumption in W
display.setTextColor(textcolor);
display.setFont(&DSEG7Classic_BoldItalic20pt7b);
display.setCursor(260, 260);
display.print(value3, 1);
display.setFont(&Ubuntu_Bold16pt7b);
display.print("W");
// Key Layout
display.setTextColor(textcolor);

View File

@ -122,8 +122,36 @@
"default": "0.0",
"check": "checkMinMax",
"min": 0.0,
"max": 999.0,
"description": "Battery capacity [0...999Ah]",
"category": "OBP60 Settings",
"capabilities": {
"obp60":"true"
}
},
{
"name": "solarPower",
"label": "Solar Power [W]",
"type": "number",
"default": "0.0",
"check": "checkMinMax",
"min": 0.0,
"max": 10000.0,
"description": "Battery capacity [0...10000Ah]",
"description": "Solar power [0...10000W]",
"category": "OBP60 Settings",
"capabilities": {
"obp60":"true"
}
},
{
"name": "genPower",
"label": "Genarator Power [W]",
"type": "number",
"default": "0.0",
"check": "checkMinMax",
"min": 0.0,
"max": 10000.0,
"description": "Generator power [0...10000W]",
"category": "OBP60 Settings",
"capabilities": {
"obp60":"true"
@ -672,7 +700,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page1type":"OneValue"},{"page1type":"TwoValue"},{"page1type":"ThreeValue"},{"page1type":"FourValues"},{"page1type":"FourValues2"}]
"condition":[{"page1type":"OneValue"},{"page1type":"TwoValues"},{"page1type":"ThreeValues"},{"page1type":"FourValues"},{"page1type":"FourValues2"}]
},
{
"name": "page1value2",
@ -684,7 +712,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page1type":"TwoValue"},{"page1type":"ThreeValue"},{"page1type":"FourValues"},{"page1type":"FourValues2"}]
"condition":[{"page1type":"TwoValues"},{"page1type":"ThreeValues"},{"page1type":"FourValues"},{"page1type":"FourValues2"}]
},
{
"name": "page1value3",
@ -696,7 +724,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page1type":"ThreeValue"},{"page1type":"FourValues"},{"page1type":"FourValues2"}]
"condition":[{"page1type":"ThreeValues"},{"page1type":"FourValues"},{"page1type":"FourValues2"}]
},
{
"name": "page1value4",
@ -733,7 +761,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page2type":"OneValue"},{"page2type":"TwoValue"},{"page2type":"ThreeValue"},{"page2type":"FourValues"},{"page2type":"FourValues2"}]
"condition":[{"page2type":"OneValue"},{"page2type":"TwoValues"},{"page2type":"ThreeValues"},{"page2type":"FourValues"},{"page2type":"FourValues2"}]
},
{
"name": "page2value2",
@ -745,7 +773,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page2type":"TwoValue"},{"page2type":"ThreeValue"},{"page2type":"FourValues"},{"page2type":"FourValues2"}]
"condition":[{"page2type":"TwoValues"},{"page2type":"ThreeValues"},{"page2type":"FourValues"},{"page2type":"FourValues2"}]
},
{
"name": "page2value3",
@ -757,7 +785,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page2type":"ThreeValue"},{"page2type":"FourValues"},{"page2type":"FourValues2"}]
"condition":[{"page2type":"ThreeValues"},{"page2type":"FourValues"},{"page2type":"FourValues2"}]
},
{
"name": "page2value4",
@ -794,7 +822,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page3type":"OneValue"},{"page3type":"TwoValue"},{"page3type":"ThreeValue"},{"page3type":"FourValues"},{"page3type":"FourValues2"}]
"condition":[{"page3type":"OneValue"},{"page3type":"TwoValues"},{"page3type":"ThreeValues"},{"page3type":"FourValues"},{"page3type":"FourValues2"}]
},
{
"name": "page3value2",
@ -806,7 +834,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page3type":"TwoValue"},{"page3type":"ThreeValue"},{"page3type":"FourValues"},{"page3type":"FourValues2"}]
"condition":[{"page3type":"TwoValues"},{"page3type":"ThreeValues"},{"page3type":"FourValues"},{"page3type":"FourValues2"}]
},
{
"name": "page3value3",
@ -818,7 +846,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page3type":"ThreeValue"},{"page3type":"FourValues"},{"page3type":"FourValues2"}]
"condition":[{"page3type":"ThreeValues"},{"page3type":"FourValues"},{"page3type":"FourValues2"}]
},
{
"name": "page3value4",
@ -855,7 +883,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page4type":"OneValue"},{"page4type":"TwoValue"},{"page4type":"ThreeValue"},{"page4type":"FourValues"},{"page4type":"FourValues2"}]
"condition":[{"page4type":"OneValue"},{"page4type":"TwoValues"},{"page4type":"ThreeValues"},{"page4type":"FourValues"},{"page4type":"FourValues2"}]
},
{
"name": "page4value2",
@ -867,7 +895,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page4type":"TwoValue"},{"page4type":"ThreeValue"},{"page4type":"FourValues"},{"page4type":"FourValues2"}]
"condition":[{"page4type":"TwoValues"},{"page4type":"ThreeValues"},{"page4type":"FourValues"},{"page4type":"FourValues2"}]
},
{
"name": "page4value3",
@ -879,7 +907,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page4type":"ThreeValue"},{"page4type":"FourValues"},{"page4type":"FourValues2"}]
"condition":[{"page4type":"ThreeValues"},{"page4type":"FourValues"},{"page4type":"FourValues2"}]
},
{
"name": "page4value4",
@ -916,7 +944,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page5type":"OneValue"},{"page5type":"TwoValue"},{"page5type":"ThreeValue"},{"page5type":"FourValues"},{"page5type":"FourValues2"}]
"condition":[{"page5type":"OneValue"},{"page5type":"TwoValues"},{"page5type":"ThreeValues"},{"page5type":"FourValues"},{"page5type":"FourValues2"}]
},
{
"name": "page5value2",
@ -928,7 +956,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page5type":"TwoValue"},{"page5type":"ThreeValue"},{"page5type":"FourValues"},{"page5type":"FourValues2"}]
"condition":[{"page5type":"TwoValues"},{"page5type":"ThreeValues"},{"page5type":"FourValues"},{"page5type":"FourValues2"}]
},
{
"name": "page5value3",
@ -940,7 +968,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page5type":"ThreeValue"},{"page5type":"FourValues"},{"page5type":"FourValues2"}]
"condition":[{"page5type":"ThreeValues"},{"page5type":"FourValues"},{"page5type":"FourValues2"}]
},
{
"name": "page5value4",
@ -977,7 +1005,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page6type":"OneValue"},{"page6type":"TwoValue"},{"page6type":"ThreeValue"},{"page6type":"FourValues"},{"page6type":"FourValues2"}]
"condition":[{"page6type":"OneValue"},{"page6type":"TwoValues"},{"page6type":"ThreeValues"},{"page6type":"FourValues"},{"page6type":"FourValues2"}]
},
{
"name": "page6value2",
@ -989,7 +1017,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page6type":"TwoValue"},{"page6type":"ThreeValue"},{"page6type":"FourValues"},{"page6type":"FourValues2"}]
"condition":[{"page6type":"TwoValues"},{"page6type":"ThreeValues"},{"page6type":"FourValues"},{"page6type":"FourValues2"}]
},
{
"name": "page6value3",
@ -1001,7 +1029,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page6type":"ThreeValue"},{"page6type":"FourValues"},{"page6type":"FourValues2"}]
"condition":[{"page6type":"ThreeValues"},{"page6type":"FourValues"},{"page6type":"FourValues2"}]
},
{
"name": "page6value4",
@ -1038,7 +1066,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page7type":"OneValue"},{"page7type":"TwoValue"},{"page7type":"ThreeValue"},{"page7type":"FourValues"},{"page7type":"FourValues2"}]
"condition":[{"page7type":"OneValue"},{"page7type":"TwoValues"},{"page7type":"ThreeValues"},{"page7type":"FourValues"},{"page7type":"FourValues2"}]
},
{
"name": "page7value2",
@ -1050,7 +1078,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page7type":"TwoValue"},{"page7type":"ThreeValue"},{"page7type":"FourValues"},{"page7type":"FourValues2"}]
"condition":[{"page7type":"TwoValues"},{"page7type":"ThreeValues"},{"page7type":"FourValues"},{"page7type":"FourValues2"}]
},
{
"name": "page7value3",
@ -1062,7 +1090,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page7type":"ThreeValue"},{"page7type":"FourValues"},{"page7type":"FourValues2"}]
"condition":[{"page7type":"ThreeValues"},{"page7type":"FourValues"},{"page7type":"FourValues2"}]
},
{
"name": "page7value4",
@ -1099,7 +1127,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page8type":"OneValue"},{"page8type":"TwoValue"},{"page8type":"ThreeValue"},{"page8type":"FourValues"},{"page8type":"FourValues2"}]
"condition":[{"page8type":"OneValue"},{"page8type":"TwoValues"},{"page8type":"ThreeValues"},{"page8type":"FourValues"},{"page8type":"FourValues2"}]
},
{
"name": "page8value2",
@ -1111,7 +1139,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page8type":"TwoValue"},{"page8type":"ThreeValue"},{"page8type":"FourValues"},{"page8type":"FourValues2"}]
"condition":[{"page8type":"TwoValues"},{"page8type":"ThreeValues"},{"page8type":"FourValues"},{"page8type":"FourValues2"}]
},
{
"name": "page8value3",
@ -1123,7 +1151,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page8type":"ThreeValue"},{"page8type":"FourValues"},{"page8type":"FourValues2"}]
"condition":[{"page8type":"ThreeValues"},{"page8type":"FourValues"},{"page8type":"FourValues2"}]
},
{
"name": "page8value4",
@ -1160,7 +1188,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page9type":"OneValue"},{"page9type":"TwoValue"},{"page9type":"ThreeValue"},{"page9type":"FourValues"},{"page9type":"FourValues2"}]
"condition":[{"page9type":"OneValue"},{"page9type":"TwoValues"},{"page9type":"ThreeValues"},{"page9type":"FourValues"},{"page9type":"FourValues2"}]
},
{
"name": "page9value2",
@ -1172,7 +1200,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page9type":"TwoValue"},{"page9type":"ThreeValue"},{"page9type":"FourValues"},{"page9type":"FourValues2"}]
"condition":[{"page9type":"TwoValues"},{"page9type":"ThreeValues"},{"page9type":"FourValues"},{"page9type":"FourValues2"}]
},
{
"name": "page9value3",
@ -1184,7 +1212,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page9type":"ThreeValue"},{"page9type":"FourValues"},{"page9type":"FourValues2"}]
"condition":[{"page9type":"ThreeValues"},{"page9type":"FourValues"},{"page9type":"FourValues2"}]
},
{
"name": "page9value4",
@ -1221,7 +1249,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page10type":"OneValue"},{"page10type":"TwoValue"},{"page10type":"ThreeValue"},{"page10type":"FourValues"},{"page10type":"FourValues2"}]
"condition":[{"page10type":"OneValue"},{"page10type":"TwoValues"},{"page10type":"ThreeValues"},{"page10type":"FourValues"},{"page10type":"FourValues2"}]
},
{
"name": "page10value2",
@ -1233,7 +1261,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page10type":"TwoValue"},{"page10type":"ThreeValue"},{"page10type":"FourValues"},{"page10type":"FourValues2"}]
"condition":[{"page10type":"TwoValues"},{"page10type":"ThreeValues"},{"page10type":"FourValues"},{"page10type":"FourValues2"}]
},
{
"name": "page10value3",
@ -1245,7 +1273,7 @@
"capabilities": {
"obp60":"true"
},
"condition":[{"page10type":"ThreeValue"},{"page10type":"FourValues"},{"page10type":"FourValues2"}]
"condition":[{"page10type":"ThreeValues"},{"page10type":"FourValues"},{"page10type":"FourValues2"}]
},
{
"name": "page10value4",