[Nut-upsuser] Synthesize low batt (LB) fron SNMP UPS which does not support this?

Carsten Aulbert carsten.aulbert at aei.mpg.de
Wed May 24 10:26:31 BST 2023


Hi again,

On 5/22/23 18:31, Willcox David via Nut-upsuser wrote:
> Hmm. Is there maybe something there already that will do this? Maybe 
> kind of back-handed.
> 
> In drivers/dstate.c, I see:
> 
>  1. In status_init(), if “driver.flag.ignorelb” is set in the driver
>     state, the “ignorelb” flag is set.
>  2. In status_set(), if ignorelb is set, and the status being set
>     (presumably from the UPS) is LB, it’s ignored. In other words, LB
>     reported by the UPS is ignored.
>  3. In status_commit(), if ignorelb is set, there’s code to compare
>     battery.charge against battery.charge.low and battery.runtime
>     against battery.runtime.low. If either is below the “low” setting, “
>     LB” is added to the status. (So “OL” would become “OL LB” and “OB"
>     would become “OB LB”. And note that the two “.low” settings can be
>     overridden in the config.

this looks exactly like the right place and functionality I would like 
to have, BUT
> 
> Am I missing something?

yes, probably the same trap I fell into, status_commit does not seem to 
be not called (at least from the dummy driver I use for testing) upon 
changing charge/runtime. I can only force a call by flipping OL/OB.

I sprinkled a bit of debug information [1] into status_commit and 
journald looks like

initial upsrw call to set dummy OL:

May 24 08:23:24 gateway dummy-ups[284580]: [D2] entering 
setvar(ups.status, OL)
May 24 08:23:24 gateway dummy-ups[284580]: [D2] status_commit: Entering (1)
May 24 08:23:24 gateway dummy-ups[284580]: [D2] status_commit: charge 
val/low 33/30']
May 24 08:23:24 gateway dummy-ups[284580]: [D2] status_commit: runtime 
val/low 200/180']
May 24 08:23:27 gateway dummy-ups[284580]: [D1] upsdrv_updateinfo...

setting it OB

May 24 08:23:38 gateway dummy-ups[284580]: [D2] entering 
setvar(ups.status, OB)
May 24 08:23:38 gateway dummy-ups[284580]: [D2] status_commit: Entering (1)
May 24 08:23:38 gateway dummy-ups[284580]: [D2] status_commit: charge 
val/low 33/30']
May 24 08:23:38 gateway dummy-ups[284580]: [D2] status_commit: runtime 
val/low 200/180']
May 24 08:23:42 gateway dummy-ups[284580]: [D1] upsdrv_updateinfo...

changing run-time

May 24 08:23:48 gateway dummy-ups[284580]: [D2] upsdrv_updateinfo: 
NO-OP: input file was already read once to the end
May 24 08:23:49 gateway dummy-ups[284580]: [D2] entering 
setvar(battery.runtime, 100)
May 24 08:23:52 gateway dummy-ups[284580]: [D1] upsdrv_updateinfo...

later changing charge

May 24 08:37:28 gateway dummy-ups[284580]: [D2] send_to_one: sending PONG
May 24 08:37:32 gateway dummy-ups[284580]: [D1] upsdrv_updateinfo...
May 24 08:37:33 gateway dummy-ups[284580]: [D2] upsdrv_updateinfo: 
NO-OP: input file was already read once to the end
May 24 08:37:33 gateway dummy-ups[284580]: [D2] entering 
setvar(battery.charge, 5)
May 24 08:37:37 gateway dummy-ups[284580]: [D1] upsdrv_updateinfo...
May 24 08:37:38 gateway dummy-ups[284580]: [D2] upsdrv_updateinfo: 
NO-OP: input file was already read once to the end

and still no LB.

But going back "OL", suddenly LB is added:

May 24 09:21:48 gateway dummy-ups[284580]: [D2] entering 
setvar(ups.status, OL)
May 24 09:21:48 gateway dummy-ups[284580]: [D2] status_commit: Entering (1)
May 24 09:21:48 gateway dummy-ups[284580]: [D2] status_commit: charge 
val/low 5/30']
May 24 09:21:48 gateway dummy-ups[284580]: [D2] status_commit: appending 
LB flag [charge '5' below '30']

Thus it seems somewhere in the state logic there ought to be a 
possibility to trigger this automatically (on changing charge/runtime 
while OB) but there is not.

Hopefully, someone with more knowledge than I have can chime in here :)

Cheers

Carsten

[1] Please don't judge me by this, I still use printf and friends a lot 
for debugging (sorry for breaking lines, it's just for illustration):

@@ -1113,12 +1116,13 @@
  /* write the status_buf into the externally visible dstate storage */
  void status_commit(void)
  {
+       upsdebugx(2, "%s: Entering (%d)", __func__, ignorelb);
         while (ignorelb) {
                 const char      *val, *low;

                 val = dstate_getinfo("battery.charge");
                 low = dstate_getinfo("battery.charge.low");
-
+               upsdebugx(2, "%s: charge val/low %s/%s']", __func__, 
val, low);
                 if (val && low && (strtol(val, NULL, 10) < strtol(low, 
NULL, 10))) {
                         snprintfcat(status_buf, sizeof(status_buf), " LB");
                         upsdebugx(2, "%s: appending LB flag [charge 
'%s' below '%s']", __func__, val, low);
@@ -1127,6 +1131,7 @@

                 val = dstate_getinfo("battery.runtime");
                 low = dstate_getinfo("battery.runtime.low");
+               upsdebugx(2, "%s: runtime val/low %s/%s']", __func__, 
val, low);

                 if (val && low && (strtol(val, NULL, 10) < strtol(low, 
NULL, 10))) {
                         snprintfcat(status_buf, sizeof(status_buf), " LB");



-- 
Dr. Carsten Aulbert, Max Planck Institute for Gravitational Physics,
Callinstraße 38, 30167 Hannover, Germany, Phone +49 511 762 17185
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4827 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://alioth-lists.debian.net/pipermail/nut-upsuser/attachments/20230524/86647a74/attachment.bin>


More information about the Nut-upsuser mailing list