Autor Thema: [erledigt] Zustandsanzeige USV (mit NUT)  (Gelesen 201 mal)

Offline dt2510

  • Full Member
  • ***
  • Beiträge: 431
[erledigt] Zustandsanzeige USV (mit NUT)
« am: 18 Mai 2018, 11:22:26 »
Ich versuche gerade den Zustand meiner USV mit einem Symbol anzuzeigen. Die USV hängt an einer DiskStation und ist über NUT eingebunden. Geliefert werden folgende Statusmeldungen (im Reading "state"):

- ACCESS-DENIED (wenn NUT keinen Zugriff auf die USV hat)
- disconnected (wenn die USV nicht erreichbar ist)
- opened (da bin ich mir nicht 100% sicher - kam immer, wenn ich FHEM als erlaubtes Gerät in der DS aufgenommen habe)
- OL (am Netz, Akku vollständig geladen)
- OL CHRG (am Netz, Akku wird geladen)
- OB (Batteriebetrieb)
- LB (niedriger Batteriestatus)

Aktuell verwende ich folgenden Code zur Anzeige (mit data-hide-on/off)

<div data-type="symbol"
     data-device="UPS"
     data-hide="state"
     data-hide-on="!ACCESS-DENIED.*"
     data-hide-off="ACCESS-DENIED.*"
     data-icon="fa-exclamation-triangle blink"
     data-background-icon=""
     data-color="Yellow"
     data-background-color="Transparent">
</div>
<div data-type="symbol"
     data-device="UPS"
     data-hide="state"
     data-hide-on="!open.*"
     data-hide-off="open.*"
     data-icon="fa-unlink blink"
     data-background-icon=""
     data-color="Linen"
     data-background-color="Transparent">
</div>
<div data-type="symbol"
     data-device="UPS"
     data-hide="state"
     data-hide-on="!disconnected.*"
     data-hide-off="disconnected.*"
     data-icon="fa-unlink blink"
     data-background-icon=""
     data-color="FireBrick"
     data-background-color="Transparent">
</div>
<div data-type="symbol"
     data-device="UPS"
     data-hide="state"
     data-hide-on="!OL"
     data-hide-off="OL"
     data-icon="mi-power"
     data-background-icon=""
     data-color="Linen"
     data-background-color="Transparent">
</div>
<div data-type="symbol"
     data-device="UPS"
     data-hide="state"
     data-hide-on="!OL CHRG"
     data-hide-off="OL CHRG"
     data-icon="fa-bolt blink"
     data-background-icon=""
     data-color="Yellow"
     data-background-color="Transparent">
</div>
<div data-type="symbol"
     data-device="UPS"
     data-hide="state"
     data-hide-on="!OB.*"
     data-hide-off="OB.*"
     data-get="battery.charge"
     data-states='["100.*|[8-9][0-9].*|[7][6-9].*","[7][0-5].*|[6][0-9].*|[5][1-9].*","50.*|[0-4][0-9].*"]'
     data-icon=""
     data-background-icon=""
     data-icons='["fa-battery-4","fa-battery-3","fa-battery-2"]'
     data-background-icons='["","",""]'
     data-color="Transparent"
     data-background-color="Transparent"
     data-colors='["Linen","Linen","Linen"]'
     data-background-colors='["Transparent","Transparent","Transparent"]'>
</div>
<div data-type="symbol"
     data-device="UPS"
     data-hide="state"
     data-hide-on="!LB.*"
     data-hide-off="LB.*"
     data-icon="fa-battery-1 blink"
     data-background-icon=""
     data-color="FireBrick"
     data-background-color="Transparent">
</div>
<div data-type="symbol"
     data-device="UPS"
     data-hide="state"
     data-hide-on="ACCESS-DENIED.*|open.*|disconnected.*|OL.*|OB.*|LB.*"
     data-hide-off="!ACCESS-DENIED.*|!open.*|!disconnected.*|!OL.*|!OB.*|!LB.*"
     data-icon="wi wi-na blink"
     data-background-icon=""
     data-color="FireBrick"
     data-background-color="Transparent">
</div>

Grundsätzlich funktioniert das ganze, allerdings wird die Anzeige beim Update des Readings "state" nicht immer aktualisiert (oft erst nach einem Reload der Seite). Lieber wäre es mir, wenn ich den Inhalt von "state" (in Abhängigkeit anderer Readings) übersetzen könnte und diesen dann mit einem Symbol-Widget mit data-states auswerten könnte. Übersetzen würde ich folgendermaßen:

opened verbinde ...
disconnected nicht verbunden
ACCESS-DENIED Zugriff verweigert
OL Netzbetrieb
OL CHRG Batterie wird geladen
OB Batteriebetrieb (voll) wenn battery.charge > 75 ist
OB Batteriebetrieb (75%) wenn battery.charge > 50 und < 76 ist
OB Batteriebetrieb (50%) wenn battery.charge < 51 ist
LB Batteriebetrieb (leer)
rest unbekannt

Ich habe schon versucht mit einem notify eine Prozedur in 99_myUtils.pm aufzurufen, allerdings erhalte ich z.B. beim FHEM Start auch die unter asReadings angegebenen User-Readings als Events !? Der Event wurde folgendermaßen eingebunden (GetUPSState sollte ein Dummy mit dem Text bestücken):

define UPSevent notify UPS {GetUPSState($EVENT)}

Hier noch ein List meines NUT Devices

Internals:
   DEF        ups 192.168.220.240
   DeviceName 192.168.220.240:3493
   FD         65
   NAME       UPS
   NR         56
   PARTIAL   
   STATE      OL
   TYPE       NUT
   UpsName    ups
   buffer     
   lastStatus OL
   pollValState 50
   Helper:
     DBLOG:
       battery.charge:
         logdb:
           TIME       1526634664.73346
           VALUE      100
       battery.runtime:
         logdb:
           TIME       1526634664.73346
           VALUE      2835
       input.voltage:
         logdb:
           TIME       1526634664.73346
           VALUE      236.0
       state:
         logdb:
           TIME       1526634704.75562
           VALUE      OL
       ups.load:
         logdb:
           TIME       1526634664.73346
           VALUE      19.0
       ups.mfr:
         logdb:
           TIME       1526634664.73346
           VALUE      American Power Conversion
       ups.model:
         logdb:
           TIME       1526634664.73346
           VALUE      Back-UPS CS 650
   READINGS:
     2018-05-18 11:11:04   battery.charge  100
     2018-05-18 11:11:04   battery.runtime 2835
     2018-05-18 11:11:04   input.voltage   236.0
     2018-05-18 10:32:53   lastError       ACCESS-DENIED
     2018-05-18 11:11:44   state           OL
     2018-05-18 11:11:04   ups.load        19.0
     2018-05-18 11:11:04   ups.mfr         American Power Conversion
     2018-05-18 11:11:04   ups.model       Back-UPS CS 650
   helper:
     battery.charge 100
     battery.charge.low 10
     battery.charge.warning 50
     battery.date 2015/04/18
     battery.mfr.date 2015/04/18
     battery.runtime 2835
     battery.runtime.low 120
     battery.temperature 29.2
     battery.type PbAc
     battery.voltage 13.6
     battery.voltage.nominal 12.0
     device.mfr American Power Conversion
     device.model Back-UPS CS 650
     device.serial 4B1516P53132 
     device.type ups
     driver.name usbhid-ups
     driver.parameter.pollfreq 30
     driver.parameter.pollinterval 5
     driver.parameter.port auto
     driver.version DSM6-1-15255-180302
     driver.version.data APC HID 0.95
     driver.version.internal 0.38
     input.sensitivity medium
     input.transfer.high 266
     input.transfer.low 180
     input.transfer.reason input voltage out of range
     input.voltage 236.0
     input.voltage.nominal 230
     output.frequency 50.0
     output.voltage 230.0
     output.voltage.nominal 230.0
     ups.beeper.status enabled
     ups.delay.shutdown 20
     ups.delay.start 30
     ups.firmware 817.v9.I
     ups.firmware.aux v9
     ups.load   19.0
     ups.mfr    American Power Conversion
     ups.mfr.date 2015/04/18
     ups.model  Back-UPS CS 650
     ups.productid 0002
     ups.realpower.nominal 400
     ups.serial 4B1516P53132 
     ups.status OL
     ups.test.result No test initiated
     ups.timer.reboot 0
     ups.timer.shutdown -1
     ups.timer.start 0
     ups.vendorid 051d
Attributes:
   asReadings battery.charge,battery.runtime,input.voltage,ups.load,ups.mfr,ups.model
   disable    0
   pollState  10
   pollVal    60


edit:

Ich hab' mir die Events nochmal genauer angesehen und es folgendermaßen umgesetzt (vielleicht hat ja jemand Verwendung dafür)

define UPSEvent notify (UPS:OL.*|UPS:OB.*|UPS:LB.*|UPS:ACCESS-DENIED.*|UPS:DISCONNECTED.*) {UpdateUPSState($EVENT)}
sub UpdateUPSState($) {
  my ($myEvent) = @_;
  if ($myEvent eq "ACCESS-DENIED") {
    fhem("set UPSState Zugriff verweigert");   
    fhem("set UPSPower unbekannt");   
    return();
  }
  if ($myEvent eq "DISCONNECTED") {
    fhem("set UPSState nicht verbunden");   
    fhem("set UPSPower unbekannt");   
    return();
  }
  if ($myEvent eq "OL") {
    fhem("set UPSState Netzbetrieb");   
    fhem("set UPSPower Netzbetrieb");   
    return();
  }
  if ($myEvent eq "OL CHRG") {
    fhem("set UPSState Batterie wird geladen");   
    fhem("set UPSPower Netzbetrieb");   
    return();
  }
  if ($myEvent eq "OB") {
    if (ReadingsVal("UPS","battery.charge","") > "75") {fhem("set UPSState Batteriebetrieb (voll)");} elsif
       (ReadingsVal("UPS","battery.charge","") > "50") {fhem("set UPSState Batteriebetrieb (75%)");} else
       {fhem("set UPSState Batteriebetrieb (50%)");}
    fhem("set UPSPower Stromausfall");   
    return();
  }
  if ($myEvent eq "LB") {
    fhem("set UPSState Batteriebetrieb (leer)");   
    fhem("set UPSPower Stromausfall");   
    return();
  }
}

<div data-type="symbol"
     data-device="UPSState"
     data-states='["Zugriff verweigert","nicht verbunden","Netzbetrieb","Batterie wird geladen","Batteriebetrieb (voll)","Batteriebetrieb (75%)","Batteriebetrieb (50%)","Batteriebetrieb (leer)"]'
     data-icon=""
     data-background-icon=""
     data-color="Transparent"
     data-background-color="Transparent"
     data-icons='["fa-exclamation-triangle blink","fa-unlink blink","mi-power","fa-bolt blink","fa-battery-4","fa-battery-3","fa-battery-2","fa-battery-1 blink"]'
     data-background-icons='["","","","","","","",""]'
     data-colors='["Yellow","FireBrick","Linen","Yellow","Linen","Linen","Linen","FireBrick"]'
     data-background-colors='["Transparent","Transparent","Transparent","Transparent","Transparent","Transparent","Transparent","Transparent"]'>
</div>
« Letzte Änderung: 18 Mai 2018, 13:14:30 von dt2510 »

 

decade-submarginal