You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.9 KiB

#!/usr/bin/env python3
# https://github.com/loganmarchione/telegraf-nut-input
import subprocess
import sys
final = ""
# UPS capacity in watts
myupscap={{ upswatts }}
# If an argument isn't supplied, exit
if len(sys.argv) <= 1:
print('Please include a valid NUT UPS name\n Example: input.py ups_name@localhost')
sys.exit(1)
# Set the UPS name from an argument and host
full_name = sys.argv[1]
ups_name = full_name.split('@')[0]
# Get the data from upsc
data = subprocess.run(["upsc", full_name], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, check=True)
# For each line in the standard output
for line in data.stdout.splitlines():
# Replace ": " with a ":", then separate based on the colon (example below)
# battery.type: PbAc
# ^^key^^ ^^value^^
line = line.replace(': ', ':')
key = line.split(':')[0]
value = line.split(':')[1]
# Different manufacturers use different values (floats vs strings) for specific fields
# Matches device.serial, ups.serial, and ups.vendorid
matches = [".serial", ".vendorid", "ups.firmware.aux"]
# First, check for any keys containing strings from above and set those values to strings
if any(x in key for x in matches):
value = f'"{value}"'
else:
try:
# If the value is a float, ok
float(value)
except ValueError:
# If the value is not a float (i.e., a string), then wrap it in quotes (this is needed for Influx's line protocol)
value = f'"{value}"'
# Create a single data point, then append that data point to the string
data_point = f"{key}={value},"
if key == "ups.load":
watts=float(value)*myupscap/100
final += f"ups.watts={watts},"
final += data_point
# Format is "measurment tag field(s)", stripping off the final comma
print("ups,"+"ups_name="+ups_name, final.rstrip(','))