From e1f3d6e0d2379d6c14712f8e1b0d10c63bec0f9c Mon Sep 17 00:00:00 2001 From: vvzvlad Date: Tue, 13 Aug 2024 04:17:30 +0300 Subject: [PATCH] init --- .gitignore | 1 + apc.py | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 .gitignore create mode 100644 apc.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..87a15c2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/.venv diff --git a/apc.py b/apc.py new file mode 100644 index 0000000..3b6ae42 --- /dev/null +++ b/apc.py @@ -0,0 +1,111 @@ +import subprocess + +def snmp_get(ip, community, oid): + command = f"snmpget -v2c -O v -O q -c {community} {ip} {oid}" + result = subprocess.run(command, shell=True, capture_output=True, text=True) + return result.stdout.strip().strip('"') + +def interpret_flags(state_string): + if state_string == "UNKNOWN": + return "NMC имеет внутреннюю проблему коммуникации с ИБП." + + flags_description = { + 1: "Abnormal Condition Present", + 2: "On Battery", + 3: "Low Battery", + 4: "On Line", + 5: "Replace Battery", + 6: "Serial Communication Established", + 7: "AVR Boost Active", + 8: "AVR Trim Active", + 9: "Overload", + 10: "Runtime Calibration", + 11: "Batteries Discharged", + 12: "Manual Bypass", + 13: "Software Bypass", + 14: "In Bypass due to Internal Fault", + 15: "In Bypass due to Supply Failure", + 16: "In Bypass due to Fan Failure", + 17: "Sleeping on a Timer", + 18: "Sleeping until Utility Power Returns", + 19: "On", + 20: "Rebooting", + 21: "Battery Communication Lost", + 22: "Graceful Shutdown Initiated", + 23: "Smart Boost or Smart Trim Fault", + 24: "Bad Output Voltage", + 25: "Battery Charger Failure", + 26: "High Battery Temperature", + 27: "Warning Battery Temperature", + 28: "Critical Battery Temperature", + 29: "Self Test In Progress", + 30: "Low Battery / On Battery", + 31: "Graceful Shutdown Issued by Upstream Device", + 32: "Graceful Shutdown Issued by Downstream Device", + 33: "No Batteries Attached", + 34: "Synchronized Command is in Progress", + 35: "Synchronized Sleeping Command is in Progress", + 36: "Synchronized Rebooting Command is in Progress", + 37: "Inverter DC Imbalance", + 38: "Transfer Relay Failure", + 39: "Shutdown or Unable to Transfer", + 40: "Low Battery Shutdown", + 41: "Electronic Unit Fan Failure", + 42: "Main Relay Failure", + 43: "Bypass Relay Failure", + 44: "Temporary Bypass", + 45: "High Internal Temperature", + 46: "Battery Temperature Sensor Fault", + 47: "Input Out of Range for Bypass", + 48: "DC Bus Overvoltage", + 49: "PFC Failure", + 50: "Critical Hardware Fault", + 51: "Green Mode/ECO Mode", + 52: "Hot Standby", + 53: "Emergency Power Off (EPO) Activated", + 54: "Load Alarm Violation", + 55: "Bypass Phase Fault", + 56: "UPS Internal Communication Failure", + 57: "Efficiency Booster Mode", + 58: "Off", + 59: "Standby", + 60: "Minor or Environment Alarm", + } + + + positions = [pos + 1 for pos, char in enumerate(state_string) if char == '1'] + flags = [flags_description.get(pos, f"Flag {pos} not defined") for pos in positions] + + return ", ".join(flags) + + + +oids = { + "upsAdvBatteryCapacity": "1.3.6.1.4.1.318.1.1.1.2.2.1.0", + "upsAdvBatteryRunTimeRemaining": "1.3.6.1.4.1.318.1.1.1.2.2.3.0", + "upsAdvBatteryTemperature": "1.3.6.1.4.1.318.1.1.1.2.2.2.0", + "upsAdvOutputLoad": "1.3.6.1.4.1.318.1.1.1.4.2.3.0", + "upsBasicStateOutputState": "1.3.6.1.4.1.318.1.1.1.11.1.1.0", + "upsBasicIdentModel": "1.3.6.1.4.1.318.1.1.1.1.1.1.0" + +} + + +def parse_time(time_str): + time_parts = time_str.split(":")[-4:] + days = int(time_parts[0]) + hours = int(time_parts[1]) + minutes = int(time_parts[2]) + seconds = float(time_parts[3]) + total_minutes = (days * 24 * 60) + (hours * 60) + minutes + (int(seconds // 60)) + return total_minutes + + +for name, oid in oids.items(): + response = snmp_get('10.31.41.46', 'public', oid) + if name == "upsBasicStateOutputState": + print(f"{name}: {interpret_flags(response)}") + elif name == "upsAdvBatteryRunTimeRemaining": + print(f"{name}: {parse_time(response)} minutes") + else: + print(f"{name}: {response}")