Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Address spurious LB+RB log flood on APC BXnnnnMI devices #2565

Merged
merged 18 commits into from
Aug 12, 2024

Conversation

jimklimov
Copy link
Member

@jimklimov jimklimov commented Jul 29, 2024

Closes: #2347
Also note for #2533 question

It also adds some visibility around calibration status setting, extends "dstate" API with a status_get() method, and this helps avoid setting duplicate states (roughly like "OB LB OB") seen in some drivers earlier.

I hope this toggle allows to fix the problem in the field by optionally delaying spurious status propagation from the driver by lbrb_log_delay_sec at most, and if the device is otherwise "online" and is calibrating (unless lbrb_log_delay_without_calibrating flag was also set).

The fix goes to some lengths to try detecting the device model during init to default the setting to 3 sec for this line-up, otherwise defaults to 0 (immediate status propagation).

@desertwitch @grifferz @ShiroDN @PilaScat @bitmario @marcgarciamarti @KillianMelsen @gerben838665 @mauro-dasilva @tsopokis @statte @s7uben @Sanderluc5 @ivanjx @gabrieleancora @JoshNansoz1 @rioachim @owenperkins111 : Better late than never: would you be able to try a custom build of NUT following https://github.com/networkupstools/nut/wiki/Building-NUT-for-in%E2%80%90place-upgrades-or-non%E2%80%90disruptive-tests to see if it handles the devices better?

For the git checkout, use this PR's source branch:

:; git clone https://github.com/jimklimov/nut -b issue-2347 nut
:; cd nut
...

If you run the built driver with debug verbosity of 2 or greater, it should log that it saw these calibration-like, LB and RB states, and chose to suppress them for a while according to settings. Checking that the numbers from CLI/ups.conf settings are propagated and considered correctly would also be helpful :)

Maybe these messages should be sunk to a less visible debug verbosity, eventually.

Also of interest is if the impacted devices report frequent calibration messages by default (without debug) and if that should be addressed additionally or if onlinedischarge_calibration and/or onlinedischarge_log_throttle_sec and related existing settings address it and the logs can be made peaceful and quiet already.

@jimklimov jimklimov added bug need testing Code looks reasonable, but the feature would better be tested against hardware or OSes APC USB Incorrect or missing readings On some devices driver-reported values are systemically off (e.g. x10, x0.1, const+Value, etc.) Connection stability issues Issues about driver<->device and/or networked connections (upsd<->upsmon...) going AWOL over time labels Jul 29, 2024
@jimklimov jimklimov added this to the 2.8.3 milestone Jul 29, 2024
@jimklimov jimklimov marked this pull request as draft July 30, 2024 07:23
@jimklimov
Copy link
Member Author

Converting to draft while this is being tested, so NUT CI won't rebuild it in vain against newer target branch as it evolves.

@jimklimov
Copy link
Member Author

Gentle bump. So many people complained about the issue, is anyone still interested in testing a prospective fix? :)

@jimklimov jimklimov marked this pull request as ready for review August 5, 2024 08:17
@ivanjx
Copy link

ivanjx commented Aug 5, 2024

im new to this so please bear with me

so to test just need to clone this branch, compile, and sudo make install on the drivers folder?

the way i currently install nut is installing via apt first then overwrite it with manual compile and sudo make install

@desertwitch
Copy link
Contributor

Gentle bump. So many people complained about the issue, is anyone still interested in testing a prospective fix? :)

Hi Jim, thanks a lot for the effort put into making this work for everyone.
Unfortunately not able to test due to lack of affected hardware, but will do a code review / sanity-check tonight.

@jimklimov
Copy link
Member Author

im new to this so please bear with me

so to test just need to clone this branch, compile, and sudo make install on the drivers folder?

the way i currently install nut is installing via apt first then overwrite it with manual compile and sudo make install

Generally, yes. A finer approach is presented at https://github.com/networkupstools/nut/wiki/Building-NUT-for-in%E2%80%90place-upgrades-or-non%E2%80%90disruptive-tests which refers to the list of dependencies per platform, configure the new build similarly to what your packages (or older custom builds) delivered, and describes how to test a new driver from the build workspace before installing it over your older build for "production" use (or not, if the test is unsuccessful). Surely it is not the only way to skin a cat, but one best streamlined to exploratory custom builds.

@jimklimov jimklimov marked this pull request as draft August 5, 2024 17:34
@desertwitch
Copy link
Contributor

Code looking good as usual, Jim, one thing we might want to consider is if we should default to lbrb_log_delay_without_calibrating = 1 for the affected APC series as well. I'm thinking this, as these spurious and seemingly random events might not always be preceded by an assumed or actual calibration. 3 seconds delay to registering an actual LB status will probably not make a difference in real life, as opposed to the very real annoyance of false statuses being reported and users then having to go search for the lbrb_log_delay_without_calibrating toggle in the manuals. Thanks for your efforts!

@jimklimov
Copy link
Member Author

Well, given lbrb_log_delay_without_calibrating is a flag, users of those models would not be able to disable it. Can at least suggest it in autodetection message, though.

@desertwitch
Copy link
Contributor

Rolled out a testing package with this PR's code for the affected Unraid users today, hoping to hear back soon-ish. 😉

@clepple clepple removed their request for review August 8, 2024 13:13
@desertwitch
Copy link
Contributor

desertwitch commented Aug 9, 2024

I just heard back with rudimentary logs from one affected user who thankfully tested the PR package for us.
It seems the auto-detection did not work for them, I guess we should've seen the LOG_INFO in the SYSLOG here (?).
There is also one OL LB RB occurrence, but it seems they have not waited much longer after seeing that (re-)appearing.

I'll see if I can get in touch with them again to raise the debug level for more verbose logfiles and also to wait longer...
Unfortunately I haven't heard back from anyone else yet...

Bus 001 Device 073: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
[nutdev-usb1]
	driver = "usbhid-ups"
	port = "auto"
	vendorid = "051D"
	productid = "0002"
	product = "Back-UPS BX750MI"
	serial = "REMOVED"
	vendor = "American Power Conversion"
	# bus = "001"
	# device = "073"
	# busport = "001"
[ups]
driver = usbhid-ups
port = auto
#pollonly
battery.charge: 100
battery.charge.low: 10
battery.mfr.date: 2024/06/17
battery.runtime: 3284
battery.runtime.low: 120
battery.type: PbAc
battery.voltage: 13.6
battery.voltage.nominal: 12.0
device.mfr: American Power Conversion
device.model: Back-UPS BX750MI 
device.serial: REMOVED
device.type: ups
driver.debug: 0
driver.flag.allow_killpower: 0
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.synchronous: auto
driver.state: quiet
driver.version: 2.8.2.1
driver.version.data: APC HID 0.100
driver.version.internal: 0.56
driver.version.usb: libusb-1.0.26 (API: 0x1000108)
input.sensitivity: medium
input.transfer.high: 295
input.transfer.low: 145
input.voltage: 224.0
input.voltage.nominal: 230
ups.beeper.status: disabled
ups.delay.shutdown: 20
ups.load: 12
ups.mfr: American Power Conversion
ups.mfr.date: 2024/03/25
ups.model: Back-UPS BX750MI 
ups.productid: 0002
ups.realpower.nominal: 410
ups.serial: REMOVED
ups.status: OL
ups.test.result: Done and passed
ups.timer.reboot: 0
ups.timer.shutdown: -1
ups.vendorid: 051d
Aug  9 19:35:27 gabry-nas rc.nut: Network UPS Tools upsdrvctl - UPS driver controller 2.XXX.XXX.1 (development iteration after 2.8.2)
Aug  9 19:35:27 gabry-nas rc.nut: Network UPS Tools driver 2.XXX.XXX.1 (development iteration after 2.8.2) - Generic HID driver 0.56
Aug  9 19:35:27 gabry-nas rc.nut: USB communication driver (libusb 1.0) 0.48
Aug  9 19:35:28 gabry-nas rc.nut: HIDParse: LogMax is less than LogMin. Vendor HID report descriptor may be incorrect; interpreting LogMax -1 as 255 in ReportID: 0x0c
Aug  9 19:35:28 gabry-nas rc.nut: HIDParse: LogMax is less than LogMin. Vendor HID report descriptor may be incorrect; interpreting LogMax -1 as 255 in ReportID: 0x22
Aug  9 19:35:28 gabry-nas rc.nut: HIDParse: LogMax is less than LogMin. Vendor HID report descriptor may be incorrect; interpreting LogMax -1 as 255 in ReportID: 0x40
Aug  9 19:35:28 gabry-nas rc.nut: Using subdriver: APC HID 0.100
Aug  9 19:35:28 gabry-nas usbhid-ups[4242]: Startup successful
Aug  9 19:35:29 gabry-nas rc.nut: Network UPS Tools upsd 2.XXX.XXX.1 (development iteration after 2.8.2)
Aug  9 19:35:29 gabry-nas upsd[4288]: listening on 0.XXX.XXX.0 port 3493
Aug  9 19:35:29 gabry-nas rc.nut: listening on 0.XXX.XXX.0 port 3493
Aug  9 19:35:29 gabry-nas upsd[4288]: Connected to UPS [ups]: usbhid-ups-ups
Aug  9 19:35:29 gabry-nas usbhid-ups[4242]: sock_connect: enabling asynchronous mode (auto)
Aug  9 19:35:29 gabry-nas upsd[4288]: Found 1 UPS defined in ups.conf
Aug  9 19:35:29 gabry-nas rc.nut: Connected to UPS [ups]: usbhid-ups-ups
Aug  9 19:35:29 gabry-nas rc.nut: Found 1 UPS defined in ups.conf
Aug  9 19:35:29 gabry-nas upsd[4297]: Startup successful
Aug  9 19:35:29 gabry-nas rc.nut: Network UPS Tools upsmon 2.XXX.XXX.1 (development iteration after 2.8.2)
Aug  9 19:35:29 gabry-nas rc.nut: UPS: [email protected] (primary) (power value 1)
Aug  9 19:35:29 gabry-nas rc.nut: Using power down flag file /etc/nut/no_killpower
Aug  9 19:35:29 gabry-nas upsmon[4300]: Startup successful
Aug  9 19:35:29 gabry-nas upsmon[4300]: Warning: running as one big root process by request (upsmon -p)
Aug  9 19:35:29 gabry-nas upsd[4297]: User [email protected] logged into UPS [ups]
Aug  9 19:48:39 gabry-nas upsmon[4300]: UPS [email protected] battery is low
Aug  9 19:48:39 gabry-nas upsmon[4300]: UPS [email protected] battery needs to be replaced
Aug  9 19:48:39 gabry-nas nut-notify: [ups] UPS reports that its batteries need replacement.

(blanked out details are due to Unraid's log anonymization mechanisms)

@gerben838665
Copy link

gerben838665 commented Aug 9, 2024

I can also confirm that issue's seems to persist with this update on my BX1600MI.
Been testing on my Unraid server for about 24 hours now.
Still getting sporadic LOWBATT/REPLACEBATT events as can be seen below.

Sorry if this is unrelated but a different issue that was fixed before also seems to have returned.
Log spam with OL+DISCHRG which I think was fixed here: #2216

[BX1600MI]
driver = usbhid-ups
port = auto
battery.charge: 99
battery.charge.low: 10
battery.mfr.date: 2023/10/06
battery.runtime: 1772
battery.runtime.low: 120
battery.type: PbAc
battery.voltage: 27.2
battery.voltage.nominal: 24.0
device.mfr: American Power Conversion
device.model: Back-UPS BX1600MI
device.serial: REMOVED
device.type: ups
driver.debug: 0
driver.flag.allow_killpower: 0
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.synchronous: auto
driver.state: quiet
driver.version: 2.8.2.1
driver.version.data: APC HID 0.100
driver.version.internal: 0.56
driver.version.usb: libusb-1.0.26 (API: 0x1000108)
input.sensitivity: medium
input.transfer.high: 295
input.transfer.low: 145
input.transfer.reason: input voltage out of range
input.voltage: 226.0
input.voltage.nominal: 230
ups.beeper.status: disabled
ups.delay.shutdown: 20
ups.load: 13
ups.mfr: American Power Conversion
ups.mfr.date: 2023/10/06
ups.model: Back-UPS BX1600MI
ups.productid: 0002
ups.realpower.nominal: 900
ups.serial: REMOVED
ups.status: OL CHRG
ups.test.result: Done and passed
ups.timer.reboot: 0
ups.timer.shutdown: -1
ups.vendorid: 051d
Aug  8 19:58:09 MyServer root: Starting NUT services...
Aug  8 19:58:10 MyServer rc.nut: Writing NUT configuration...
Aug  8 19:58:21 MyServer rc.nut: Updating permissions for NUT...
Aug  8 19:58:21 MyServer rc.nut: Adding UDEV lines to rc.6 for NUT...
Aug  8 19:58:21 MyServer rc.nut: Adding UPS shutdown lines to rc.6 for NUT...
Aug  8 19:58:21 MyServer rc.nut: Checking if the NUT Runtime Statistics Module should be enabled...
Aug  8 19:58:21 MyServer rc.nut: Disabling the NUT Runtime Statistics Module...
Aug  8 19:58:22 MyServer rc.nut: Network UPS Tools upsdrvctl - UPS driver controller 2.8.2.1 (development iteration after 2.8.2)
Aug  8 19:58:22 MyServer rc.nut: Network UPS Tools driver 2.8.2.1 (development iteration after 2.8.2) - Generic HID driver 0.56
Aug  8 19:58:22 MyServer rc.nut: USB communication driver (libusb 1.0) 0.48
Aug  8 19:58:22 MyServer rc.nut: HIDParse: LogMax is less than LogMin. Vendor HID report descriptor may be incorrect; interpreting LogMax -1 as 255 in ReportID: 0x0c
Aug  8 19:58:22 MyServer rc.nut: HIDParse: LogMax is less than LogMin. Vendor HID report descriptor may be incorrect; interpreting LogMax -1 as 255 in ReportID: 0x22
Aug  8 19:58:22 MyServer rc.nut: HIDParse: LogMax is less than LogMin. Vendor HID report descriptor may be incorrect; interpreting LogMax -1 as 255 in ReportID: 0x40
Aug  8 19:58:22 MyServer rc.nut: Using subdriver: APC HID 0.100
Aug  8 19:58:22 MyServer rc.nut: Defaulting lbrb_log_delay_sec=3 for American Power Conversion model Back-UPS BX1600MI; consider also setting the lbrb_log_delay_without_calibrating flag in your configuration
Aug  8 19:58:22 MyServer usbhid-ups[4502]: Startup successful
Aug  8 19:58:23 MyServer rc.nut: Network UPS Tools upsd 2.8.2.1 (development iteration after 2.8.2)
Aug  8 19:58:23 MyServer rc.nut: listening on 0.0.0.0 port 3493
Aug  8 19:58:23 MyServer upsd[4505]: listening on 0.0.0.0 port 3493
Aug  8 19:58:23 MyServer usbhid-ups[4502]: sock_connect: enabling asynchronous mode (auto)
Aug  8 19:58:23 MyServer upsd[4505]: Connected to UPS [BX1600MI]: usbhid-ups-BX1600MI
Aug  8 19:58:23 MyServer rc.nut: Connected to UPS [BX1600MI]: usbhid-ups-BX1600MI
Aug  8 19:58:23 MyServer upsd[4505]: Found 1 UPS defined in ups.conf
Aug  8 19:58:23 MyServer rc.nut: Found 1 UPS defined in ups.conf
Aug  8 19:58:23 MyServer upsd[4506]: Startup successful
Aug  8 19:58:23 MyServer rc.nut: Network UPS Tools upsmon 2.8.2.1 (development iteration after 2.8.2)
Aug  8 19:58:23 MyServer rc.nut: UPS: [email protected] (secondary) (power value 1)
Aug  8 19:58:23 MyServer rc.nut: Using power down flag file /etc/nut/killpower
Aug  8 19:58:23 MyServer upsmon[4509]: Startup successful
Aug  8 19:58:23 MyServer upsmon[4509]: Warning: running as one big root process by request (upsmon -p)
Aug  8 19:58:23 MyServer root: NUT services have been started successfully.
Aug  8 20:50:38 MyServer upsmon[4509]: UPS [email protected] battery is low
Aug  8 20:50:38 MyServer upsmon[4509]: UPS [email protected] battery needs to be replaced
Aug  8 20:50:38 MyServer nut-notify: [BX1600MI] UPS reports that its batteries need replacement.
Aug  8 21:51:13 MyServer upsmon[4509]: UPS [email protected] battery is low
Aug  8 23:28:10 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  8 23:54:31 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 00:57:41 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 03:11:59 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 04:02:54 MyServer upsmon[4509]: UPS [email protected] battery is low
Aug  9 04:51:09 MyServer upsmon[4509]: UPS [email protected] battery is low
Aug  9 06:14:39 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 06:14:40 MyServer upsmon[4509]: UPS [email protected] battery is low
Aug  9 06:14:51 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 07:47:18 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 08:02:06 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 08:02:28 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 08:02:30 MyServer upsmon[4509]: UPS [email protected] battery is low
Aug  9 08:04:30 MyServer upsmon[4509]: UPS [email protected] battery is low
Aug  9 08:09:05 MyServer upsmon[4509]: UPS [email protected] battery is low
Aug  9 08:13:11 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 08:19:37 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 10:35:40 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 11:43:45 MyServer upsmon[4509]: UPS [email protected] battery is low
Aug  9 12:24:41 MyServer upsmon[4509]: UPS [email protected] battery is low
Aug  9 12:53:48 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 13:05:30 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 13:05:31 MyServer upsmon[4509]: UPS [email protected] battery is low
Aug  9 13:05:31 MyServer upsmon[4509]: UPS [email protected] battery needs to be replaced
Aug  9 13:05:31 MyServer nut-notify: [BX1600MI] UPS reports that its batteries need replacement.
Aug  9 13:54:49 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 14:07:51 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 15:00:04 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 16:18:02 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 17:39:52 MyServer usbhid-ups[4502]: ups_status_set: seems that UPS [BX1600MI] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 20:01:27 MyServer upsmon[4509]: UPS [email protected] battery is low
Aug  9 20:01:37 MyServer upsmon[4509]: UPS [email protected] battery is low

@Sanderluc5
Copy link

Sanderluc5 commented Aug 9, 2024

It's not resolved in Unraid on latest preview build.

I'm stilling getting errors. My battery is also never reaching 100% anymore on this build. It seems to be stuck at 99%.

Model: Back-UPS BX2200MI

Aug  9 17:05:53 srv01 usbhid-ups[22917]: Reconnecting. If you saw "nut_libusb_get_interrupt: Input/Output Error" or similar message in the log above, try setting "pollonly" flag in "ups.conf" options section for this driver!
Aug  9 17:21:14 srv01 usbhid-ups[22917]: ups_status_set: seems that UPS [ups] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 17:29:21 srv01 usbhid-ups[22917]: nut_libusb_get_report: Input/Output Error
Aug  9 17:29:21 srv01 usbhid-ups[22917]: Reconnecting. If you saw "nut_libusb_get_interrupt: Input/Output Error" or similar message in the log above, try setting "pollonly" flag in "ups.conf" options section for this driver!
Aug  9 17:39:12 srv01 upsmon[22942]: UPS [email protected] battery is low
Aug  9 17:51:42 srv01 usbhid-ups[22917]: nut_libusb_get_report: Input/Output Error
Aug  9 17:51:43 srv01 usbhid-ups[22917]: Reconnecting. If you saw "nut_libusb_get_interrupt: Input/Output Error" or similar message in the log above, try setting "pollonly" flag in "ups.conf" options section for this driver!
Aug  9 17:51:44 srv01 usbhid-ups[22917]: nut_libusb_get_report: Input/Output Error
Aug  9 17:51:45 srv01 usbhid-ups[22917]: Reconnecting. If you saw "nut_libusb_get_interrupt: Input/Output Error" or similar message in the log above, try setting "pollonly" flag in "ups.conf" options section for this driver!
Aug  9 17:51:46 srv01 usbhid-ups[22917]: nut_libusb_get_report: Input/Output Error
Aug  9 17:51:47 srv01 usbhid-ups[22917]: Reconnecting. If you saw "nut_libusb_get_interrupt: Input/Output Error" or similar message in the log above, try setting "pollonly" flag in "ups.conf" options section for this driver!
Aug  9 17:51:48 srv01 usbhid-ups[22917]: nut_libusb_get_report: Input/Output Error
Aug  9 17:51:49 srv01 usbhid-ups[22917]: Reconnecting. If you saw "nut_libusb_get_interrupt: Input/Output Error" or similar message in the log above, try setting "pollonly" flag in "ups.conf" options section for this driver!
Aug  9 18:34:41 srv01 usbhid-ups[22917]: nut_libusb_get_report: Input/Output Error
Aug  9 18:34:43 srv01 usbhid-ups[22917]: Reconnecting. If you saw "nut_libusb_get_interrupt: Input/Output Error" or similar message in the log above, try setting "pollonly" flag in "ups.conf" options section for this driver!
Aug  9 18:45:35 srv01 usbhid-ups[22917]: nut_libusb_get_report: Input/Output Error
Aug  9 18:45:37 srv01 usbhid-ups[22917]: Reconnecting. If you saw "nut_libusb_get_interrupt: Input/Output Error" or similar message in the log above, try setting "pollonly" flag in "ups.conf" options section for this driver!
Aug  9 19:51:13 srv01 usbhid-ups[22917]: ups_status_set: seems that UPS [ups] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 20:24:00 srv01 usbhid-ups[22917]: ups_status_set: seems that UPS [ups] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 20:30:40 srv01 usbhid-ups[22917]: nut_libusb_get_report: Input/Output Error
Aug  9 20:30:42 srv01 usbhid-ups[22917]: Reconnecting. If you saw "nut_libusb_get_interrupt: Input/Output Error" or similar message in the log above, try setting "pollonly" flag in "ups.conf" options section for this driver!
Aug  9 20:30:42 srv01 usbhid-ups[22917]: nut_libusb_get_report: Input/Output Error
Aug  9 20:30:44 srv01 usbhid-ups[22917]: Reconnecting. If you saw "nut_libusb_get_interrupt: Input/Output Error" or similar message in the log above, try setting "pollonly" flag in "ups.conf" options section for this driver!
Aug  9 20:41:26 srv01 usbhid-ups[22917]: nut_libusb_get_report: Input/Output Error
Aug  9 20:41:28 srv01 usbhid-ups[22917]: Reconnecting. If you saw "nut_libusb_get_interrupt: Input/Output Error" or similar message in the log above, try setting "pollonly" flag in "ups.conf" options section for this driver!
Aug  9 20:41:28 srv01 usbhid-ups[22917]: nut_libusb_get_report: Input/Output Error
Aug  9 20:41:30 srv01 usbhid-ups[22917]: Reconnecting. If you saw "nut_libusb_get_interrupt: Input/Output Error" or similar message in the log above, try setting "pollonly" flag in "ups.conf" options section for this driver!
Aug  9 20:41:30 srv01 usbhid-ups[22917]: nut_libusb_get_report: Input/Output Error
Aug  9 20:41:32 srv01 usbhid-ups[22917]: Reconnecting. If you saw "nut_libusb_get_interrupt: Input/Output Error" or similar message in the log above, try setting "pollonly" flag in "ups.conf" options section for this driver!
Aug  9 20:42:21 srv01 usbhid-ups[22917]: ups_status_set: seems that UPS [ups] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 20:42:23 srv01 upsmon[22942]: UPS [email protected] battery is low
Aug  9 20:42:23 srv01 upsmon[22942]: UPS [email protected] battery needs to be replaced
Aug  9 20:47:01 srv01 root: Fix Common Problems Version 2024.07.18
Aug  9 21:05:03 srv01 usbhid-ups[22917]: ups_status_set: seems that UPS [ups] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 21:44:17 srv01 usbhid-ups[22917]: nut_libusb_get_report: Input/Output Error
Aug  9 21:44:19 srv01 usbhid-ups[22917]: Reconnecting. If you saw "nut_libusb_get_interrupt: Input/Output Error" or similar message in the log above, try setting "pollonly" flag in "ups.conf" options section for this driver!
Aug  9 21:46:26 srv01 usbhid-ups[22917]: ups_status_set: seems that UPS [ups] is in OL+DISCHRG state now. Battery charge is currently 99. Is it calibrating (perhaps you want to set 'onlinedischarge_calibration' option)? Note that some UPS models (e.g. CyberPower UT series) emit OL+DISCHRG when in fact offline/on-battery (perhaps you want to set 'onlinedischarge_onbattery' option).
Aug  9 21:46:28 srv01 upsmon[22942]: UPS [email protected] battery is low```

@jimklimov
Copy link
Member Author

Thanks for tests and logs, hope to figure out what mis-fired, when I get time to tend to this :\ People are welcome to look over the PR code, maybe some dumb typo breaks stuff.

Regarding #2216 and OL+DISCHRG messages - that mentioned PR added a way to conceal these messages on devices where the owner knows (suspects) that this state combo means calibration (should set onlinedischarge_calibration in ups,conf section for the device), or perhaps (on CPS mostly) a onlinedischarge_onbattery. Just as that message says :)

@desertwitch
Copy link
Contributor

desertwitch commented Aug 10, 2024

Thanks for tests and logs, hope to figure out what mis-fired, when I get time to tend to this :\ People are welcome to look over the PR code, maybe some dumb typo breaks stuff.

Regarding #2216 and OL+DISCHRG messages - that mentioned PR added a way to conceal these messages on devices where the owner knows (suspects) that this state combo means calibration (should set onlinedischarge_calibration in ups,conf section for the device), or perhaps (on CPS mostly) a onlinedischarge_onbattery. Just as that message says :)

I think he meant the following behavior: onlinedischarge_log_throttle_sec=num

Set the minimum frequency (in seconds) at which warnings would be emitted for an otherwise not handled OL+DISCHRG device status combination. Negative values disable sequentially repeated messages (when this state appears and persists)._

If the device does not report battery.charge, the default value is 30 seconds (fairly frequent, in case the UPS-reported state combination does reflect a bad power condition and so the situation is urgent).

If it does report battery.charge, by default the repeated notifications would only be logged if this charge is different from when the message was emitted previously (e.g. when the battery is really discharging).

If both this option is set, and battery.charge is correctly reported, either of these rules allow the notification to be logged.

But, since the logs are quite far apart, it's possible that his device either doesn't report a battery.charge (in which case logs would by default fire for being longer than 30 seconds apart) or does some hover-charge thing between 99% and 100% and the log by default fires seeing a different battery.charge than before (notification 1 at 99% and notification 2 at 100%, rinse and repeat).

Ideally, yes, onlinedischarge_calibration should also be set here. Regardless of this though, the OL+DISCHRG logs should by default be rate limited by the onlinedischarge_log_throttle_sec mechanisms even when not specifically set.

@gerben838665
Copy link

gerben838665 commented Aug 10, 2024

I think he meant the following behavior: onlinedischarge_log_throttle_sec=num

Set the minimum frequency (in seconds) at which warnings would be emitted for an otherwise not handled OL+DISCHRG device status combination. Negative values disable sequentially repeated messages (when this state appears and persists)._

If the device does not report battery.charge, the default value is 30 seconds (fairly frequent, in case the UPS-reported state combination does reflect a bad power condition and so the situation is urgent).

If it does report battery.charge, by default the repeated notifications would only be logged if this charge is different from when the message was emitted previously (e.g. when the battery is really discharging).

If both this option is set, and battery.charge is correctly reported, either of these rules allow the notification to be logged.

But, since the logs are quite far apart, it's possible that his device either doesn't report a battery.charge (in which case logs would by default fire for being longer than 30 seconds apart) or does some hover-charge thing between 99% and 100% and the log by default fires seeing a different battery.charge than before (notification 1 at 99% and notification 2 at 100%, rinse and repeat).

Ideally, yes, onlinedischarge_calibration should also be set here. Regardless of this though, the OL+DISCHRG logs should by default be rate limited by the onlinedischarge_log_throttle_sec mechanisms even when not specifically set.

I might be remembering incorrectly but I think I didn't get any "OL+DISCHRG" messages in my logs while on the 2.8.2 stable release.

Just now I've added the following 2 lines to my ups.conf file and I'll report back tomorrow if these help fix the issue(s).

lbrb_log_delay_without_calibrating = 1
onlinedischarge_calibration = 1

The UPS showing 99% instead of 100% is a different issue i'm experiencing. Not sure if the UPS is doing some kind of hover-charge but the UPS never reports above 99%. There is 1 way to get it to show 100% and that is reconnecting the USB cable when the UPS is fully charged. If the UPS ever gets below 100% because of a power outage it will once again become stuk at 99%. Rebooting NUT or even the server itself doesn't fix this and it will keep reporting 99%.

@desertwitch
Copy link
Contributor

Got two more reports from affected users testing this PR:

I’m currently on 6.12.11 and nut-2.8.2-x86_64-2master.ssl11 for about two days. Brand new Back-UPS BX1200MI, still getting the replacement battery error everyday, but the event count seems to be reduced.

I just installed the latest preview of your plugin and it looks to be working. I'm using a brand new BX750. I got the incessant spurious battery disconnected/reattached errors with the stock UPS controls in Unraid along with the battery failure notifications. In the preview release of NUT, I'm only getting the "nut_libusb_get_report: Input/Output Error", but there doesn't seem to be a functional impact.

@gerben838665
Copy link

After setting lbrb_log_delay_without_calibrating = 1 and onlinedischarge_calibration = 1 in ups.conf I'm no longer getting LOWBATT/REPLACEBATT events.

Below you can find the NUT details and all NUT related logs from the last +-24 hours. If you want me to test anything else please let me know.

battery.charge: 99
battery.charge.low: 10
battery.mfr.date: 2023/10/06
battery.runtime: 1772
battery.runtime.low: 120
battery.type: PbAc
battery.voltage: 27.2
battery.voltage.nominal: 24.0
device.mfr: American Power Conversion
device.model: Back-UPS BX1600MI
device.serial: REMOVED
device.type: ups
driver.debug: 0
driver.flag.allow_killpower: 0
driver.name: usbhid-ups
driver.parameter.lbrb_log_delay_without_calibrating: 1
driver.parameter.onlinedischarge_calibration: 1
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.synchronous: auto
driver.state: quiet
driver.version: 2.8.2.1
driver.version.data: APC HID 0.100
driver.version.internal: 0.56
driver.version.usb: libusb-1.0.26 (API: 0x1000108)
input.sensitivity: medium
input.transfer.high: 295
input.transfer.low: 145
input.voltage: 248.0
input.voltage.nominal: 230
ups.beeper.status: disabled
ups.delay.shutdown: 20
ups.load: 12
ups.mfr: American Power Conversion
ups.mfr.date: 2023/10/06
ups.model: Back-UPS BX1600MI
ups.productid: 0002
ups.realpower.nominal: 900
ups.serial: REMOVED
ups.status: OL CHRG
ups.test.result: Done and passed
ups.timer.reboot: 0
ups.timer.shutdown: -1
ups.vendorid: 051d
Aug 10 13:27:36 MyServer rc.nut: Writing NUT configuration...
Aug 10 13:27:38 MyServer rc.nut: Updating permissions for NUT...
Aug 10 13:27:38 MyServer rc.nut: Checking if the NUT Runtime Statistics Module should be enabled...
Aug 10 13:27:38 MyServer rc.nut: Disabling the NUT Runtime Statistics Module...
Aug 10 13:27:39 MyServer rc.nut: Network UPS Tools upsdrvctl - UPS driver controller 2.8.2.1 (development iteration after 2.8.2)
Aug 10 13:27:39 MyServer rc.nut: Network UPS Tools driver 2.8.2.1 (development iteration after 2.8.2) - Generic HID driver 0.56
Aug 10 13:27:39 MyServer rc.nut: USB communication driver (libusb 1.0) 0.48
Aug 10 13:27:39 MyServer rc.nut: HIDParse: LogMax is less than LogMin. Vendor HID report descriptor may be incorrect; interpreting LogMax -1 as 255 in ReportID: 0x0c
Aug 10 13:27:39 MyServer rc.nut: HIDParse: LogMax is less than LogMin. Vendor HID report descriptor may be incorrect; interpreting LogMax -1 as 255 in ReportID: 0x22
Aug 10 13:27:39 MyServer rc.nut: HIDParse: LogMax is less than LogMin. Vendor HID report descriptor may be incorrect; interpreting LogMax -1 as 255 in ReportID: 0x40
Aug 10 13:27:39 MyServer rc.nut: Using subdriver: APC HID 0.100
Aug 10 13:27:39 MyServer rc.nut: Defaulting lbrb_log_delay_sec=3 for American Power Conversion model Back-UPS BX1600MI
Aug 10 13:27:39 MyServer usbhid-ups[31807]: Startup successful
Aug 10 13:27:40 MyServer rc.nut: Network UPS Tools upsd 2.8.2.1 (development iteration after 2.8.2)
Aug 10 13:27:40 MyServer rc.nut: listening on 0.0.0.0 port 3493
Aug 10 13:27:40 MyServer upsd[31846]: listening on 0.0.0.0 port 3493
Aug 10 13:27:40 MyServer upsd[31846]: Connected to UPS [BX1600MI]: usbhid-ups-BX1600MI
Aug 10 13:27:40 MyServer rc.nut: Connected to UPS [BX1600MI]: usbhid-ups-BX1600MI
Aug 10 13:27:40 MyServer usbhid-ups[31807]: sock_connect: enabling asynchronous mode (auto)
Aug 10 13:27:40 MyServer upsd[31846]: Found 1 UPS defined in ups.conf
Aug 10 13:27:40 MyServer rc.nut: Found 1 UPS defined in ups.conf
Aug 10 13:27:40 MyServer rc.nut: Ignoring duplicate password for monuser
Aug 10 13:27:40 MyServer rc.nut: Ignoring duplicate password for monuser
Aug 10 13:27:40 MyServer upsd[31847]: Startup successful
Aug 10 13:27:40 MyServer rc.nut: Network UPS Tools upsmon 2.8.2.1 (development iteration after 2.8.2)
Aug 10 13:27:40 MyServer rc.nut: UPS: [email protected] (secondary) (power value 1)
Aug 10 13:27:40 MyServer rc.nut: Using power down flag file /etc/nut/killpower
Aug 10 13:27:40 MyServer upsmon[31850]: Startup successful
Aug 10 13:27:40 MyServer upsmon[31850]: Warning: running as one big root process by request (upsmon -p)
Aug 10 13:27:40 MyServer upsd[31847]: User [email protected] logged into UPS [BX1600MI]
Aug 10 15:55:15 MyServer upsmon[31850]: UPS [email protected]: calibration in progress
Aug 10 15:55:20 MyServer upsmon[31850]: UPS [email protected]: calibration finished
Aug 10 16:56:51 MyServer upsmon[31850]: UPS [email protected]: calibration in progress
Aug 10 16:56:56 MyServer upsmon[31850]: UPS [email protected]: calibration finished
Aug 10 20:30:06 MyServer upsmon[31850]: UPS [email protected]: calibration in progress
Aug 10 20:30:11 MyServer upsmon[31850]: UPS [email protected]: calibration finished
Aug 10 21:55:41 MyServer upsmon[31850]: UPS [email protected]: calibration in progress
Aug 10 21:55:46 MyServer upsmon[31850]: UPS [email protected]: calibration finished
Aug 11 03:09:22 MyServer upsmon[31850]: UPS [email protected]: calibration in progress
Aug 11 03:09:27 MyServer upsmon[31850]: UPS [email protected]: calibration finished
Aug 11 03:25:52 MyServer upsmon[31850]: UPS [email protected]: calibration in progress
Aug 11 03:25:57 MyServer upsmon[31850]: UPS [email protected]: calibration finished
Aug 11 05:35:52 MyServer upsmon[31850]: UPS [email protected]: calibration in progress
Aug 11 05:35:57 MyServer upsmon[31850]: UPS [email protected]: calibration finished
Aug 11 06:35:58 MyServer upsmon[31850]: UPS [email protected]: calibration in progress
Aug 11 06:36:03 MyServer upsmon[31850]: UPS [email protected]: calibration finished
Aug 11 06:56:08 MyServer upsmon[31850]: UPS [email protected]: calibration in progress
Aug 11 06:56:13 MyServer upsmon[31850]: UPS [email protected]: calibration finished
Aug 11 08:19:13 MyServer upsmon[31850]: UPS [email protected]: calibration in progress
Aug 11 08:19:18 MyServer upsmon[31850]: UPS [email protected]: calibration finished

@jimklimov
Copy link
Member Author

Now, this sounds very promising, thanks! So I suppose the NEWS and/or UPGRADING notes for other users of this model should be extended with such details, but the solution did work after all?

@desertwitch
Copy link
Contributor

desertwitch commented Aug 11, 2024

Now, this sounds very promising, thanks! So I suppose the NEWS and/or UPGRADING notes for other users of this model should be extended with such details, but the solution did work after all?

I also think this looks very positive, the auto detection mechanism seems to work too except for the one case with a BXnnnMI instead of a BXnnnnMI (although I can't see a reason why it should fail there code-wise). The options are there regardless of any auto detection woes, so it may at most require some fine tuning from the user to their respective device's behavior. This could also prove helpful for other UPS devices with odd status behavior, so definitely deserves its place being added to the NEWS and respective documentation files.

@jimklimov
Copy link
Member Author

Fun fact: this issue and PR got onto the working table along with #2564 for unrelated line-up of other APC devices :)

@jimklimov
Copy link
Member Author

Bumped the documentation and log-message suggestions. The latter is quite a monster of elvis operators now, would benefit from a bit of cosmetic testing :D

@jimklimov
Copy link
Member Author

The CI faults are due to a change with an agent after an upgrade (lacked 32-bit libs for some dependencies now).

@jimklimov
Copy link
Member Author

Tested the monster message printer, works well but relies on math a bit (that the testvar findings are exactly 0 or 1) so will poke that a bit later.

Not sure why CI builds that code path where it failed due to missing libs, by config it should not have.

…actly 0/1 [networkupstools#2347]

When building a complex text expression, we rely on maths in some spots.

Signed-off-by: Jim Klimov <[email protected]>
…ctually build a graphical program

Namely, that further third-party libs are available
for the chosen architecture, not only the headers.
Had a problem with 32/64-bit build agent that only
had a binary lib*.so set for 64-bit after an update.

Signed-off-by: Jim Klimov <[email protected]>
@desertwitch
Copy link
Contributor

desertwitch commented Aug 12, 2024

Tested the monster message printer, works well but relies on math a bit (that the testvar findings are exactly 0 or 1) so will poke that a bit later.

Not sure why CI builds that code path where it failed due to missing libs, by config it should not have.

Thanks for the additions, is there a process for testing drivers and such hardware-specific code without actually having the affected hardware (which I assume you don't either)? Would love to help out with testing such code, but not sure how to go about that with the drivers (dummy-ups wouldn't work for a specific driver, right?). That message printer, as an example.

@jimklimov
Copy link
Member Author

jimklimov commented Aug 12, 2024 via email

@jimklimov jimklimov merged commit 443ba6a into networkupstools:master Aug 12, 2024
30 checks passed
@jimklimov jimklimov deleted the issue-2347 branch August 12, 2024 21:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
APC bug Connection stability issues Issues about driver<->device and/or networked connections (upsd<->upsmon...) going AWOL over time Incorrect or missing readings On some devices driver-reported values are systemically off (e.g. x10, x0.1, const+Value, etc.) need testing Code looks reasonable, but the feature would better be tested against hardware or OSes USB
Projects
None yet
Development

Successfully merging this pull request may close these issues.

APC Back-UPS BX1600MI spurious LOWBATT/REPLACEBATT events
5 participants