[Nut-upsdev] Re: RE nut 2.0 fentonups and Xanto S3000R

Henning Brauer henning at openbsd.org
Sat Apr 29 20:51:33 UTC 2006


* Arnaud QUETTE <Arnaud.QUETTE at mgeups.com> [2006-04-26 10:18]:
> you should get in touch with Carlos, who his developing a generic
> megatec driver

since that'll happen who-knows-when I have put these changes in the 
openbsd port in the meantime.

for the record, and the magic new megatec driver:
-the online-usv.de UPSes have no way to identify themselves
-they do not respond to "I"
-thus you need a way to force a model.

the data for the S3000R is in the patch, I refrained from buying more 
UPSes from them after I saw this divergence in the protocol (well, and 
other stuff). maintaing an inhouse version of the fentonups driver for 
3 or 4 years (hmm, maybe we even bought these in 2001... anyway) was 
painful enough, so please include this in future versions.

another thing as I write to you anyway, apcsmart and APC SUDP8000XL:
Network UPS Tools (version 2.0.0) - APC Smart protocol driver
        Driver version 1.99.6, command table version 2.0
dstate_setflags: base variable (input.transfer.high) does not exist
dstate_addenum: base variable (input.transfer.high) does not exist
dstate_setflags: base variable (input.transfer.low) does not exist
dstate_addenum: base variable (input.transfer.low) does not exist
dstate_setflags: base variable (input.sensitivity) does not exist
dstate_addenum: base variable (input.sensitivity) does not exist
dstate_setflags: base variable (battery.charge.restart) does not exist
dstate_addenum: base variable (battery.charge.restart) does not exist
Detected Smart-UPS DP 8000 XL [GS0144110071  ] on /dev/ttyj7

and I cannot get load. well manually, by doing
output.current * output.voltage / 8000

<brahe at paploo:7>$ upsc UPS-4 at localhost
battery.alarm.threshold: L
battery.charge: 100.0
battery.date: 11/6/03
battery.packs: 001
battery.packs.bad: 000
battery.runtime: 1620
battery.runtime.low: 120
driver.name: apcsmart
driver.parameter.port: /dev/ttyj7
driver.version: 2.0.0
driver.version.internal: 1.99.6
input.frequency: 51.20
input.quality: FF
input.transfer.reason: T
input.voltage: 229.0
input.voltage.maximum: 229.0
input.voltage.minimum: 229.0
output.current: 17.10
output.voltage: 230.0
output.voltage.target.battery: 230
ups.delay.shutdown: 180
ups.delay.start: 060
ups.firmware: 381.5.I
ups.id: UPS_IDEN
ups.mfr: APC
ups.mfr.date: 11/06/01
ups.model: Smart-UPS DP 8000 XL
ups.serial: GS0144110071  
ups.status: OL
ups.temperature: 025.0
ups.test.interval: 1209600
ups.test.result: NO


> Henning Brauer <henning at openbsd.org> 
> 04/26/06 12:19 AM
> 
> A
> arnaud.quette at mgeups.com
> cc
> bernd at cvs.openbsd.org, Henning Brauer <henning at cvs.openbsd.org>
> Objet
> nut 2.0 fentonups
> 
> 
> 
> 
> 
> 
> this allows the model to be forced for the fentonups driver. I have a 
> UPS that does not respond to I, but otherwise perfectly follows the 
> fenton protocol. this makes it work.
> the Xanto S3000R is a rackmount 2U UPS, online, 3000VA, which requires
> and external 2U battery pack. The manufacturer is www.online-usv.de
> 
> <brahe at paploo:59>$ sudo ./fentonups -x model=XS3000R /dev/ttym1 
> Network UPS Tools - Fenton UPS driver 1.21 (2.0.0)
> Detected Xanto S3000R on /dev/ttym1
> <brahe at paploo:61>$ upsc UPS-3 at localhost
> battery.charge: 100.0
> battery.voltage: 2.26
> driver.name: fentonups
> driver.parameter.model: XS3000R
> driver.version: 2.0.0
> driver.version.internal: 1.21
> input.frequency: 50.0
> input.transfer.high: 275
> input.transfer.low: 165
> input.voltage: 228.8
> output.voltage: 230.0
> ups.load: 052
> ups.mfr: Online
> ups.model: Xanto S3000R
> ups.status: OL
> ups.temperature: 28.0
> 
> $OpenBSD$
> --- drivers/fentonups.c.orig             Tue Apr 25 23:33:03 2006
> +++ drivers/fentonups.c          Wed Apr 26 00:11:06 2006
> @@ -33,14 +33,17 @@ static               float           lowvolt = 0, 
> voltrange;
>  static          int             lownorm, highnorm;
>  
>  /* handle devices which don't give a properly formatted I string */
> -static int check_mtab2(const char *raw)
> +static int check_mtab2(const char *raw, int israw)
>  {
>                  int             i;
>                  char            *cooked;
>  
> -                /* trim off the leading # and any trailing spaces */
> -                cooked = xstrdup(&raw[1]);
> -                rtrim(cooked, ' ');
> +                if (israw) {
> +                                /* trim off the leading # and any 
> trailing spaces */
> +                                cooked = xstrdup(&raw[1]);
> +                                rtrim(cooked, ' ');
> +                } else
> +                                cooked = xstrdup(raw);
>  
>                  for (i = 0; mtab2[i].id != NULL; i++) {
>                                  if (!strcmp(cooked, mtab2[i].id)) {
> @@ -74,7 +77,7 @@ static void guessmodel(const char *raw)
>                  char            mch, *mstr;
>  
>                  /* first see if it's in the mtab2 */
> -                if (check_mtab2(raw))
> +                if (check_mtab2(raw, 1))
>                                  return;
>  
>                  mch = raw[17];
> @@ -175,28 +178,36 @@ static char *get_id(void)
>  void upsdrv_initinfo(void)
>  {
>                  int             modelnum, i, ret;
> -                char            temp[256], model[32], *raw;
> +                char            temp[256], qmodel[32], *model, *raw = 
> NULL;
>  
> -                raw = get_id();
> +                model = getval("model");
>  
> -                if (!raw)
> -                                fatalx("Unable to detect a Fenton or 
> Megatec protocol UPS");
> +                if (!model) {
> +                                raw = get_id();
>  
> -                snprintf(temp, sizeof(temp), "%s", raw);
> +                                if (!raw)
> +                                                fatalx("Unable to detect 
> a Fenton or Megatec protocol UPS");
>  
> -                temp[11] = 0;
> -                temp[27] = 0;
> +                                snprintf(temp, sizeof(temp), "%s", raw);
>  
> -                /* manufacturer */
> -                rtrim(&temp[1], ' ');
> -                dstate_setinfo("ups.mfr", &temp[1], 0, 0);
> +                                temp[11] = 0;
> +                                temp[27] = 0;
>  
> -                /* L660A = PowerPal (L) @ 660 VA, American (A) version 
> (115V) */
> +                                /* manufacturer */
> +                                rtrim(&temp[1], ' ');
> +                                dstate_setinfo("ups.mfr", &temp[1], 0, 
> 0);
>  
> -                /* grab full model string */
> -                rtrim(&temp[17], ' ');
> -                snprintf(model, sizeof(model), "%s", &temp[17]);
> +                                /* L660A = PowerPal (L) @ 660 VA, 
> American (A) version (115V) */
>  
> +                                /* grab full model string */
> +                                rtrim(&temp[17], ' ');
> +                                snprintf(qmodel, sizeof(qmodel), "%s", 
> &temp[17]);
> +                                model = qmodel;
> +                }
> +
> +                if (!model)
> +                                fatalx("unable to determine model");
> +
>                  modelnum = -1;
>  
>                  /* figure out official model name and voltage info from 
> table */
> @@ -210,20 +221,27 @@ void upsdrv_initinfo(void)
>                                  }
>                  }
>  
> -                /* table lookup fails -> guess */
> -                if (modelnum == -1)
> -                                guessmodel(raw);
> -                else {
> -                                dstate_setinfo("ups.model", "%s", 
> modeltab[modelnum].desc);
> +                if (model && modelnum == -1)
> +                                if (check_mtab2(model, 0) == 0)
> +                                                fatalx("no such model: 
> %s", model);
>  
> -                                dstate_setinfo("input.transfer.low", 
> "%d", 
> - modeltab[modelnum].lowxfer);
> +                if (raw) {
> +                                /* table lookup fails -> guess */
> +                                if (modelnum == -1)
> +                                                guessmodel(raw);
> +                                else {
> + dstate_setinfo("ups.model", "%s",
> + modeltab[modelnum].desc);
>  
> -                                dstate_setinfo("input.transfer.high", 
> "%d",
> - modeltab[modelnum].highxfer);
> + dstate_setinfo("input.transfer.low", "%d", 
> + modeltab[modelnum].lowxfer);
>  
> -                                lownorm = modeltab[modelnum].lownorm;
> -                                highnorm = modeltab[modelnum].highnorm;
> + dstate_setinfo("input.transfer.high", "%d",
> + modeltab[modelnum].highxfer);
> +
> +                                                lownorm = 
> modeltab[modelnum].lownorm;
> +                                                highnorm = 
> modeltab[modelnum].highnorm;
> +                                }
>                  }
>  
>                  /* now add instant command support info */
> @@ -231,7 +249,8 @@ void upsdrv_initinfo(void)
>                  dstate_addcmd("test.battery.stop");
>  
>                  printf("Detected %s on %s\n", 
> dstate_getinfo("ups.model"), device_path);
> -                free(raw);
> +                if (raw)
> +                                free(raw);
>  
>                  /* paranoia - cancel any shutdown that might already be 
> running */
>                  ret = ser_send(upsfd, "C\r");
> @@ -406,6 +425,7 @@ void upsdrv_help(void)
>  
>  void upsdrv_makevartable(void)
>  {
> +                addvar(VAR_VALUE, "model", "force model");
>  }
>  
>  void upsdrv_banner(void)
> $OpenBSD$
> --- drivers/fentonups.h.orig             Tue Apr 25 23:32:16 2006
> +++ drivers/fentonups.h          Wed Apr 26 00:09:19 2006
> @@ -81,5 +81,6 @@ struct {
>                  { "WELI 500 1.0", "Giant Power", "MT650", 10.6, 3.7, 170, 
> 180, 270, 280, 0 },
>                  { "SMART-UPS       1800VA     T18Q16AG", "Effekta", "MT 
> 2000 RM",
>                                  50.0, 19.5, 171, 200, 260, 278, 1 },
> +                { "XS3000R", "Online", "Xanto S3000R", 1.81, 0.44, 165, 
> 200, 240, 275, 1 },
>                  { NULL,    NULL,                                NULL,  0, 
> 0,   0,   0,   0,   0, 0 }
>  };
> 
> 



More information about the Nut-upsdev mailing list