[Nut-upsuser] Cyberpower Value1200E might not need 0.667 battery scaling
Matthew Stapleton
matthew4196 at gmail.com
Mon Aug 11 01:29:55 UTC 2014
Attached is the first 32 seconds of the driver output after applying the
patch which fixes the battery scaling problem for this UPS.
Matthew Stapleton
Email: matthew4196 at gmail.com
On 10/08/14 01:27, Charles Lepple wrote:
> On Aug 8, 2014, at 9:15 AM, Charles Lepple <clepple at gmail.com> wrote:
>
>> On Aug 7, 2014, at 10:52 PM, Charles Lepple <clepple at gmail.com> wrote:
>>
>>> On Aug 7, 2014, at 10:18 PM, Matthew Stapleton <matthew4196 at gmail.com> wrote:
>>>
>>>> I just got a Cyberpower SOHO Value 1200 ELCD UPS and even with nut 2.7.2, it appears to report battery voltage too low due to the battery scaling function (In drivers/cps-hid.c). Even though the ups has usb id: 0764:0501, UPS.PowerSummary.Voltage reports 26.6 for the 24V batteries so when the 0.667 battery scale is applied that goes down to 17.7V.
>>> I'm wondering if that scale factor is only needed for that one Dynex UPS model. We should be able to do a string match, which is ugly, but should work (especially if we default to no scaling).
>>>
>>> Logged: https://github.com/networkupstools/nut/issues/142
>> It's not just Dynex models - there are some early "UPS VALUE" and "CP 1000D" units that seem to need the correction factor. I'll try to add a check that looks to see if the battery voltage makes sense.
> Matthew, can you try the attached patch, and run the driver it with -DDDD?
>
> https://github.com/networkupstools/nut/commit/c8950dee9c91ce45d05d8f220ea26891fb92329e
>
> Also, if anyone else has a Cyberpower UPS with the 0501 productID, I'd appreciate any additional testing.
>
> Thanks,
>
>
> cps_hid_scale.patch
>
>
> commit c8950dee9c91ce45d05d8f220ea26891fb92329e
> Author: Charles Lepple <clepple+nut at gmail.com>
> Date: Sat Aug 9 11:19:27 2014 -0400
>
> usbhid-ups (CPS): determine battery.voltage scale factor at runtime
>
> If the battery.voltage reading is greater than 1.4x battery.voltage.nominal,
> apply a scale factor of 2/3 to bring the voltage back in line.
>
> Closes networkupstools/nut#142
>
> diff --git a/drivers/cps-hid.c b/drivers/cps-hid.c
> index a6d64ba..78c952f 100644
> --- a/drivers/cps-hid.c
> +++ b/drivers/cps-hid.c
> @@ -28,29 +28,36 @@
> #include "cps-hid.h"
> #include "usb-common.h"
>
> -#define CPS_HID_VERSION "CyberPower HID 0.3"
> +#define CPS_HID_VERSION "CyberPower HID 0.4"
>
> /* Cyber Power Systems */
> #define CPS_VENDORID 0x0764
>
> -/*
> +/*! Battery voltage scale factor.
> * For some devices, the reported battery voltage is off by factor
> * of 1.5 so we need to apply a scale factor to it to get the real
> * battery voltage. By default, the factor is 1 (no scaling).
> */
> static double battery_scale = 1;
> +static int might_need_battery_scale = 0;
> +static int battery_scale_checked = 0;
> +
> +/*! If the ratio of the battery voltage to the nominal battery voltage exceeds
> + * this factor, we assume that the battery voltage needs to be scaled by 2/3.
> + */
> +static const double battery_voltage_sanity_check = 1.4;
>
> static void *cps_battery_scale(USBDevice_t *device)
> {
> - battery_scale = 0.667;
> + might_need_battery_scale = 1;
> return NULL;
> }
>
> /* USB IDs device table */
> static usb_device_id_t cps_usb_device_table[] = {
> - /* 900AVR/BC900D, CP1200AVR/BC1200D */
> + /* 900AVR/BC900D */
> { USB_DEVICE(CPS_VENDORID, 0x0005), NULL },
> - /* Dynex DX-800U? */
> + /* Dynex DX-800U?, CP1200AVR/BC1200D, CP825AVR-G, CP1000AVRLCD, CP1000PFCLCD, CP1500C, CP550HG, etc. */
> { USB_DEVICE(CPS_VENDORID, 0x0501), &cps_battery_scale },
> /* OR2200LCDRM2U, OR700LCDRM1U, PR6000LCDRTXL5U */
> { USB_DEVICE(CPS_VENDORID, 0x0601), NULL },
> @@ -59,12 +66,48 @@ static usb_device_id_t cps_usb_device_table[] = {
> { -1, -1, NULL }
> };
>
> +/*! Adjusts @a battery_scale if voltage is well above nominal.
> + */
> +static void cps_adjust_battery_scale(double batt_volt)
> +{
> + const char *batt_volt_nom_str;
> + double batt_volt_nom;
> +
> + if(battery_scale_checked) {
> + return;
> + }
> +
> + batt_volt_nom_str = dstate_getinfo("battery.voltage.nominal");
> + if(!batt_volt_nom_str) {
> + upsdebugx(2, "%s: 'battery.voltage.nominal' not available yet; skipping scale determination", __func__);
> + return;
> + }
> +
> + batt_volt_nom = strtod(batt_volt_nom_str, NULL);
> + if(batt_volt_nom == 0) {
> + upsdebugx(3, "%s: 'battery.voltage.nominal' is %s", __func__, batt_volt_nom_str);
> + return;
> + }
> +
> + if( (batt_volt / batt_volt_nom) > battery_voltage_sanity_check ) {
> + upslogx(LOG_INFO, "%s: battery readings will be scaled by 2/3", __func__);
> + battery_scale = 2.0/3;
> + }
> +
> + battery_scale_checked = 1;
> +}
> +
> /* returns statically allocated string - must not use it again before
> done with result! */
> static const char *cps_battvolt_fun(double value)
> {
> static char buf[8];
>
> + if(might_need_battery_scale) {
> + cps_adjust_battery_scale(value);
> + }
> +
> + upsdebugx(5, "%s: battery_scale = %.3f", __func__, battery_scale);
> snprintf(buf, sizeof(buf), "%.1f", battery_scale * value);
>
> return buf;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.alioth.debian.org/pipermail/nut-upsuser/attachments/20140811/86140247/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cyberpower_debug_log.txt.gz
Type: application/x-gzip
Size: 6728 bytes
Desc: not available
URL: <http://lists.alioth.debian.org/pipermail/nut-upsuser/attachments/20140811/86140247/attachment.bin>
More information about the Nut-upsuser
mailing list