NEWS
APC USV Status auslesen via APCUPSD-CGI
-
Hallo,
ich habe ein Skript geschrieben, welches auf einen vorhandenen apdupsd-Server zugreift und die Informationen in entsprechende Datenpunkte schreibt.
Wie das Ganze dann im Object-Tree aussieht -> siehe Bild im Anhang!
-
IP und ggfalls URL
-
Das wohl wichtigste Objekt "Status" bedeuted: 1..alles ok, 0..power fail. Wem das nicht gefällt, der findet im Code einen kleinen Kommentar zur Aktivierung der textuellen Übersetzung. Mit 0 und 1 ist halt der Vorteil, dass man es plotten kann.
`// Liest den Status einer APC USV aus durch Abfragen des apcupsd CGI-Skripts // Weiterführende Infos zu apcupds: http://www.apcupsd.com // Author : frost - 19.06.2016 // hier IP Adresse und ggfalls URL des apcupds Server anpassen var upsIP = "10.0.0.35"; var upsURL = "http://" + upsIP + "/cgi-bin/apcupsd/upsfstats.cgi"; //----------------------------------------------------------------- var request = require('request'); var ups_apcupsd_ver = "0.0.0"; var ups_Model = "apc"; var ups_Status = "unknown"; var ups_LineVoltage = 0; var ups_LoadPercent = 0; var ups_BatteryCharge = 0; var ups_TimeLeft = 0; var ups_Temperature = 0; var ups_BatteryVoltage = 0; var ups_LastSupplyFault = "never"; var ups_TimeOnBattery = 0; var ups_SerialNo = "12345"; // Datenpunkte erstellen mit Default-Werten createState('USV.APC.IP',upsIP); createState('USV.APC.apcupsd_ver',ups_apcupsd_ver); createState('USV.APC.Model',ups_Model); createState('USV.APC.Status',ups_Status); createState('USV.APC.LineVoltage',ups_LineVoltage); createState('USV.APC.CurrentLoad',ups_LoadPercent); createState('USV.APC.BatteryCharge',ups_BatteryCharge); createState('USV.APC.TimeLeft',ups_TimeLeft); createState('USV.APC.Temperature',ups_Temperature); createState('USV.APC.BatteryVoltage',ups_BatteryVoltage); createState('USV.APC.LastSupplyFault',ups_LastSupplyFault); createState('USV.APC.TimeOnBattery',ups_TimeOnBattery); createState('USV.APC.Serialnumber',ups_SerialNo); schedule("*/1 * * * *", function () // alle x Minuten { request(upsURL, function (error, response, body) { if (!error && response.statusCode == 200) { // entferne nicht benötigte HTML Tags var ups_data = body.substring (body.indexOf ("")); // Extrahiere Daten aus Antwort var data_lines = ups_data.split(/\r?\n/); var i = 0; while (i < data_lines.length) { var curr_line = data_lines[i].split(":", 1); curr_line[1] = data_lines[i].substring (data_lines[i].indexOf(":") + 2).trim(); if (curr_line.length > 1) // Sicherheitsabfrage { if (curr_line[0].indexOf ("VERSION") >= 0) { ups_apcupsd_ver = curr_line[1].split(" ")[0]; } else if (curr_line[0].indexOf ("MODEL") >= 0) { ups_Model = curr_line[1]; } else if (curr_line[0].indexOf ("STATUS") >= 0) { if (curr_line[1].search("ONLINE") >= 0) { ups_Status = 1; } else { ups_Status = 0; // something is wrong with the power line } // Aktivieren, falls "ONLINE" und "ONBATT" angezeigt werden soll // ups_Model = curr_line[1]; } else if (curr_line[0].indexOf ("LINEV") >= 0) { ups_LineVoltage = curr_line[1].split(" ")[0] + " V"; } else if (curr_line[0].indexOf ("LOADPCT") >= 0) { ups_LoadPercent = curr_line[1].split(" ")[0] + " %"; } else if (curr_line[0].indexOf ("BCHARGE") >= 0) { ups_BatteryCharge = curr_line[1].split(" ")[0] + " %"; } else if (curr_line[0].indexOf ("TIMELEFT") >= 0) { ups_TimeLeft = curr_line[1].split(" ")[0] + " min"; } else if (curr_line[0].indexOf ("ITEMP") >= 0) { ups_Temperature = curr_line[1].split(" ")[0] + " °C"; } else if (curr_line[0].indexOf ("BATTV") >= 0) { ups_BatteryVoltage = curr_line[1].split(" ")[0] + " V"; } else if (curr_line[0].indexOf ("XONBATT") >= 0) { ups_LastSupplyFault = curr_line[1]; } else if (curr_line[0].indexOf ("TONBATT") >= 0) { ups_TimeOnBattery = curr_line[1].split(" ")[0] + " s"; } else if (curr_line[0].indexOf ("SERIALNO") >= 0) { ups_SerialNo = curr_line[1]; } } i++; } // Schreibe Daten in Datenpunkte setState('USV.APC.IP',upsIP); setState('USV.APC.apcupsd_ver',ups_apcupsd_ver); setState('USV.APC.Model',ups_Model); setState('USV.APC.Status',ups_Status); setState('USV.APC.LineVoltage',ups_LineVoltage); setState('USV.APC.CurrentLoad',ups_LoadPercent); setState('USV.APC.BatteryCharge',ups_BatteryCharge); setState('USV.APC.TimeLeft',ups_TimeLeft); setState('USV.APC.Temperature',ups_Temperature); setState('USV.APC.BatteryVoltage',ups_BatteryVoltage); setState('USV.APC.LastSupplyFault',ups_LastSupplyFault); setState('USV.APC.TimeOnBattery',ups_TimeOnBattery); setState('USV.APC.Serialnumber',ups_SerialNo); } else { log(error); log('APCUPSD not found', 'warn'); } }); // end of request }); // end of schedule` [1310_apcups-iobroker.png](/assets/uploads/files/1310_apcups-iobroker.png) [/i][/i][/i]
-
-
Danke, läuft bei mir ohne Probleme.
Gruß
Tino
-
hier auch keine Probleme, cooles Script, danke
-
Ich baue gerade an einem Script, welches ohne den Web-Teil auskommt und direkt die Konsolenabfrage nutzt.
Damit entfällt die Notwendigkeit des Apache (den ich persönlich auf meiner ioBroker-Maschine sonst nicht benötige).
Gruß,
Eric
-
Hi,
ich baue gerade an einem Adapter der das ganze per NUT macht Warte noch 1-2 Tage dann wäre was zum testen da …
-
Und hier wäre die Testversion: http://forum.iobroker.net/viewtopic.php … 890#p29890
Bin gespannt auf Euer Feedback
-
ich habe ein Skript geschrieben, welches auf einen vorhandenen apdupsd-Server zugreift und die Informationen in entsprechende Datenpunkte schreibt. `
Was man nicht so alles findet beim suchen !!!
Habe dein Script übernommen und nach dem durchreichen des USB-Ports an meine VM werden die Werte nun schön auch in IoBroker abgelegt
Genial. Auch wenn es schon lange her war –> VIELEN DANK !
-
Hallo Segway,
ich versuche nun auch schon eine ganze Weile mein Smart-UPS 1000 via USB in meine unter Proxmox laufende VM mit dem IOBroker einzubinden. Geht das so ohne weiteres? Eine weitere VM mit einem Nut-Server habe ich leider nicht so recht zum Laufen bekommen. Ich würde mich freuen, wenn du mir ein paar Ratschläge geben könntest, wie ich die Konstellation zum Funktionieren bekomme.
Danke
Ralf
-
Ja das geht ohne weiteres! Habe die Infos ganz einfach über das Script bekommen und abgelegt. Das Script ist auch eher nicht das Problem sondern die Verbindung hinzubekommen in deiner VM:
-
Hallo Segway,
in deinem Screenshot ist aber zu erkennen, das die USV eine IP-Adresse bekommen hat. Das sieht für mich dann aber so aus als ob sie nicht über das USB-Kabel, sondern über einen separaten Nut-Server angesprochen wird. Das Duchreichen an die VM habe ich, da bin ich mir realtiv sicher, hinbekommen. Hast du in den ersten Zeilen des Scripts, wo die Config eingetragen wird, etwas geändert?
Danke schon mal im Voraus.
Ralf
-
Hi Ralf,
das ist nicht die USV sondern die IP-Adresse von dem Host auf dem der apc-Dienst läuft –> die USV ist dann per USB angeschlossen.
Also bei mir ist die 40.8 der Debian-VM und der USB-Anschluss steckt im NUC und ist an die entsprechende 40.8 VM durchgereicht.
Hast du in den ersten Zeilen des Scripts, wo die Config eingetragen wird, etwas geändert? `
Welche Config meinst du ?
-
Hallo Dirk,
var upsIP = "10.0.0.35"; var upsURL = "http://" + upsIP + "/cgi-bin/apcupsd/upsfstats.cgi";
Diese beiden Zeilen meine ich.
Ich bin davon ausgegangen, das man die USV ohne einen separaten Dienst, also nur über den USB-Anschluss aulesen könnte. Das scheint dann wohl nicht der Fall zu sein. Wärest du bereit, mir mit einigen Stichpunkten zu erklären wie ich vorgehen müsste um zum Ziel zu kommen?
Danke schon mal im Voraus.
Ralf
-
Ist nicht wirklich schwer - ich meine das ist den Dienst installieren.
schau mal ins Wiki, danach habe ich das gemacht und es lief –> https://wiki.debian.org/apcupsd
-
Hallo Dirk,
danke für den Link. Ich beiße mich mal durch, auch wenn ich mir die Frage stelle, welches RJ45-Kabel ich, ohne eine Netzwerkkarte in der USV zu haben, anschließen soll. Die USV hat in der Normalkonfiguration keinen Netzwerkanschluss. Ja, man kann den nachkaufen, aber das muss doch auch so gehen. Wie gesagt, ich probier es mal aus, nicht das Sie in dem WIKI meinen entweder USB oder RJ45.
Schönes Sonntag noch.
Ich melde mich, ob ich es geschafft habe.
Ralf
-
Gibt auch noch andere Anleitungen, die sich dann nur auf USB konzentrieren. Dieses Wiki ist für beide.
Ich habe nur installiert und die Datei angepasst, das wars. Wenn du einen Webserver dann noch laufen hast kannst du es mit dem http Aufruf einmal testen. Das ging bei mir und dann hab ich das Script in IoB gestartet fertig bei Fragen melde dich evtl. auch gerne Teamviewer /wenn du magst)
-
Danke für das Angebot Dirk,
aber ein bischen sportlicher Ehrgeiz steht da auch dahinter. Ich kämpf mich erst noch mal durch, falls ich dann nicht mehr weiter weis, würde ich das Angebot mit der Fernbedienung durch den Teamviewer annehmen. Aber noch bin ich nicht soweit.
Einen schönen Sonntag wünscht
Ralf
-
@eric2905 sagte in APC USV Status auslesen via APCUPSD-CGI:
Ich baue gerade an einem Script, welches ohne den Web-Teil auskommt und direkt die Konsolenabfrage nutzt.
Damit entfällt die Notwendigkeit des Apache (den ich persönlich auf meiner ioBroker-Maschine sonst nicht benötige).
Gruß,
Eric
Habe es erst jetzt geschafft mal die USV mit dem iobroker Raspi zu verbinden und jetzt wäre das Skript für die Konsolenabfrage Gold wert. Möchte auch darauf verzichten noch einen Apache zu installieren und hoffe, dass Du dein Skript schon verwendest. Oder hast du es am Ende ganz anders umgesetzt?
-
@timtaler007 sagte in APC USV Status auslesen via APCUPSD-CGI:
Habe es erst jetzt geschafft mal die USV mit dem iobroker Raspi zu verbinden und jetzt wäre das Skript für die Konsolenabfrage Gold wert
geht das nicht mit dem NUT-Adapter?
-
@homoran
Danke für den Hinweis. Habe die Beschreibung wohl etwas falsch verstanden und dachte beim Einsatz vom NUT müsste ich wieder einen extra Server oder Komponeten installieren. Aber das ging mit der Anleitung von https://forum.iobroker.net/topic/23688/howto-usv-nut-server-auf-sbc-installieren ganz gut.
Aber dabei habe ich mir mein iobroker zerschossen
Der iobroker raspi hing an der USV und ich wollte das mit dem Nut erstmal auf einem anderen Raspi ausprobieren.
ich habe dann gemäss Anleitung nut usbutils gestartet, konfiguriert und neugestartet. Jetzt ist es so, dass nach dem Neustart die USV einmal aus geht?! Dadurch wurde der Iobroker Raspi im ungünstigen Moment ausgeschaltet und war danach Grütze.
Da half nur ein Recover.Aber kann das sein, dass ein Reboot des Rechners mit der USV diese auch einmal resetet? Ich konnte das 2mal reproduzieren und habe es danach erstmal gelassen. Gruselig
Bei meinem ersten Versuch hatte ich apcaccess drauf und damit war das nicht so.
-
@timtaler007 sagte in APC USV Status auslesen via APCUPSD-CGI:
Aber kann das sein, dass ein Reboot des Rechners mit der USV diese auch einmal resetet?
Es gibt nix, das es nicht gibt
Ehrlich weiß ich es nicht, ob da beim Boot oder Shutdown irgend etwas über USB an die USV ausgegeben wird.
ich weiß, dass meine USV immer hektisch piept wenn mein Server einen reboot fährt, da bleibt dann aber zumindest die BatteriePower an.
Kann es sein, dass dein Akku tot ist und einen kurzen PowerOff nicht überlebt?
Das merkt man meistens erst wenn es drauf ankommtAndererseits glaube ich mich zu erinnern, dass man eine USV so programmieren kann, dass sie sich nach herunterfahren des angeschlossenen Rechners abschaltet um die Batterie zu schonen