|
36 | 36 | #include "main.h" /* for getval() */ |
37 | 37 | #include "usbhid-ups.h" |
38 | 38 | #include "mge-hid.h" |
| 39 | +#include <math.h> |
39 | 40 |
|
40 | | -#define MGE_HID_VERSION "MGE HID 1.42" |
| 41 | +#define MGE_HID_VERSION "MGE HID 1.43" |
41 | 42 |
|
42 | 43 | /* (prev. MGE Office Protection Systems, prev. MGE UPS SYSTEMS) */ |
43 | 44 | /* Eaton */ |
@@ -653,6 +654,39 @@ static info_lkp_t eaton_check_country_info[] = { |
653 | 654 | { 0, NULL, NULL } |
654 | 655 | }; |
655 | 656 |
|
| 657 | +/* When UPS.PowerConverter.Output.ActivePower is not present, |
| 658 | + * compute a realpower approximation using available data */ |
| 659 | +static const char *eaton_compute_realpower_fun(double value) |
| 660 | +{ |
| 661 | + const char *str_ups_load = dstate_getinfo("ups.load"); |
| 662 | + const char *str_power_nominal = dstate_getinfo("ups.power.nominal"); |
| 663 | + const char *str_powerfactor = dstate_getinfo("output.powerfactor"); |
| 664 | + float powerfactor = 0.80; |
| 665 | + int power_nominal = 0; |
| 666 | + int ups_load = 0; |
| 667 | + double realpower = 0; |
| 668 | + if (str_power_nominal && str_ups_load) { |
| 669 | + /* Extract needed values */ |
| 670 | + ups_load = atoi(str_ups_load); |
| 671 | + power_nominal = atoi(str_power_nominal); |
| 672 | + if (str_powerfactor) |
| 673 | + powerfactor = atoi(str_powerfactor); |
| 674 | + /* Compute the value */ |
| 675 | + realpower = round(ups_load * 0.01 * power_nominal * powerfactor); |
| 676 | + snprintf(mge_scratch_buf, sizeof(mge_scratch_buf), "%.0f", realpower); |
| 677 | + upsdebugx(1, "eaton_compute_realpower_fun(%s)", mge_scratch_buf); |
| 678 | + return mge_scratch_buf; |
| 679 | + } |
| 680 | + /* else can't process */ |
| 681 | + /* Return NULL, not to get the value published! */ |
| 682 | + return NULL; |
| 683 | +} |
| 684 | + |
| 685 | +static info_lkp_t eaton_compute_realpower_info[] = { |
| 686 | + { 0, "dummy", eaton_compute_realpower_fun }, |
| 687 | + { 0, NULL, NULL } |
| 688 | +}; |
| 689 | + |
656 | 690 | /* Limit nominal output voltage according to HV or LV models */ |
657 | 691 | static const char *nominal_output_voltage_fun(double value) |
658 | 692 | { |
@@ -1153,6 +1187,9 @@ static hid_info_t mge_hid2nut[] = |
1153 | 1187 | { "ups.L3.power", 0, 0, "UPS.PowerConverter.Output.Phase.[3].ApparentPower", NULL, "%.0f", 0, NULL }, |
1154 | 1188 | { "ups.power.nominal", 0, 0, "UPS.Flow.[4].ConfigApparentPower", NULL, "%.0f", HU_FLAG_STATIC, NULL }, |
1155 | 1189 | { "ups.realpower", 0, 0, "UPS.PowerConverter.Output.ActivePower", NULL, "%.0f", 0, NULL }, |
| 1190 | + /* When not available, process an approximation from other data, |
| 1191 | + * but map to apparent power to be called */ |
| 1192 | + { "ups.realpower", 0, 0, "UPS.Flow.[4].ConfigApparentPower", NULL, "-1", 0, eaton_compute_realpower_info }, |
1156 | 1193 | { "ups.L1.realpower", 0, 0, "UPS.PowerConverter.Output.Phase.[1].ActivePower", NULL, "%.0f", 0, NULL }, |
1157 | 1194 | { "ups.L2.realpower", 0, 0, "UPS.PowerConverter.Output.Phase.[2].ActivePower", NULL, "%.0f", 0, NULL }, |
1158 | 1195 | { "ups.L3.realpower", 0, 0, "UPS.PowerConverter.Output.Phase.[3].ActivePower", NULL, "%.0f", 0, NULL }, |
|
0 commit comments