Vincenzo Colonnella
2013-Feb-08 08:38 UTC
[Nut-upsdev] Very long delay for shutdown.restart on usbhid-ups powercom
I'm testing a Powercom UPS (branded as Control System 2 STD80S: http://www.cs2.it/home.php?goto=prodotti&cat=0&idp=2&subid=0) with NUT. It is a USB HID device, with ID 0d9f:0004. I configured nut-server to use driver usbhid-ups and it works almost correctly: upsd communicates right with the device, upsmon catches its events... But when I try to perform a Forced Shutdown, UPS pauses indefinitely delaying the poweroff. I'm using NUT ver. 2.6.4 on "Debian Squeeze", with a package installed from "Debian Testing". If you try to invoke a "shutdown.return", it seems delay value is badly converted: $> upscmd STD80S shutdown.return 30 Driver debug logs show the command as correctly processed, but with uncorrect parameters: 55.348163 instcmd(shutdown.return, 30) 55.348205 powercom_shutdown_nuf: value = 30, command = 5E00 55.348218 hu_find_valinfo: found 24064 (value: 30) 55.348229 Unit = 00000000, UnitExp = 0 55.348239 Exponent = 0 55.348249 PhyMax = 0, PhyMin = 0, LogMax = 65535, LogMin = 0 55.348920 Report[set]: (3 bytes) => 0f 00 5e 55.348945 Set report succeeded 55.348956 instcmd: SUCCEED Value 30 is converted to 24064, and this seems the delay that is configured on the device to complete its shutdown: [...] 56.358009 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 24064 58.721177 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 23865 60.576175 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 23864 62.471044 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 23861 64.580550 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 23859 66.645841 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 23857 68.733541 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 23855 [...] The translation of the value may be due to the following function, where value seems to be splitted in seconds and minutes parts, then ORed with 0x4000 to perform the "return" feature. $> less nut-2.6.4/drivers/powercom-hid.c [...] static double powercom_shutdown_nuf(const char *value) { const char *s = dstate_getinfo("ups.delay.shutdown"); uint16_t val, command; val = atoi(value ? value : s); command = ((val % 60) << 8) + (val / 60); command |= 0x4000; /* AC RESTART NORMAL ENABLE */ upsdebugx(3, "%s: value = %s, command = %04X", __func__, value, command); return command; } [...] This implementation follows Powercom specification of BNT protocol (http://www.networkupstools.org/ups-protocols/powercom/Software_USB_comm unication_controller_BNT_series.doc), which overrides the semantics of the seconds field of USB HID Set Report command. As reported in document: Byte 13, Byte 14 (min, sec) If Byte(sec), bit7=0 and bit6=0 Then If Byte 9, bit0=1 Then command 185, 188, min, sec If Byte 9, bit0=0 Then command 186, 188, min, sec If Byte(sec), bit7=0 and bit6=1 Then command 185, 188, min, sec If Byte(sec), bit7=1 and bit6=0 Then command 186, 188, min, sec If Byte(sec), bit7=1 and bit6=1 Then no actions OR with 0x4000 sets the bit6 of seconds field to 1: so the commands 185, 188 are processed (shutdown and restart after elapsed time). But such way the time value is misconfigured. I tried to modify the driver to switch seconds and minutes field, as in the attached patch, and now it works better: it waits for the required time (+64 seconds) and then shuts down and restart. 39.474936 instcmd(shutdown.return, 30) 39.474978 powercom_shutdown_nuf: value = 30, command = 005E 39.474990 hu_find_valinfo: found 94 (value: 30) 39.475000 Unit = 00000000, UnitExp = 0 39.475010 Exponent = 0 39.475020 PhyMax = 0, PhyMin = 0, LogMax = 65535, LogMin = 0 39.532901 Report[set]: (3 bytes) => 0f 5e 00 39.532929 Set report succeeded 39.532939 instcmd: SUCCEED [...] 40.406761 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 94 [...] 42.483186 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 92 [...] 44.399070 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 90 [...] 46.264173 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 88 [...] 48.325784 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 86 [...] 50.167518 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 84 [...] 53.099694 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 82 [...] 54.200409 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 82 [...] 56.244932 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 78 [...] 58.328966 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 76 [...] 60.215708 Path: UPS.PowerSummary.DelayBeforeShutdown, Type: Feature, ReportID: 0x0f, Offset: 0, Size: 16, Value: 74 [...] The device sums 64 seconds as the effect of "override", it doesn't reset the overflow to max 59 seconds. But this is a better error than wait a switched value between minutes and seconds + 64 minutes. I don't know if the error is in provided documentation or it is a misunderstanding of byte order. I don't own other USB HID Powercom models, so I don't know if this issue arises also for other models and if the solution works in general. I hope this is useful. Many thanks for your work and Best Regards, Vincenzo Colonnella -------------- next part -------------- A non-text attachment was scrubbed... Name: nut-patch-powercom-hid-shutdownrestart.diff Type: application/octet-stream Size: 913 bytes Desc: nut-patch-powercom-hid-shutdownrestart.diff URL: <http://lists.alioth.debian.org/pipermail/nut-upsdev/attachments/20130208/b528b057/attachment.obj>