import os import serial import syslog import datetime import requests from spx.spxconfig import spxConfig from spx.spxlogger import spxLogger label = [] report = [] cfg_settings = {} def getConfigValue(config, value, default=False): try: ret = config.get(option=value) except: ret = default return ret """ " This is looking at the config.ini and setting up the necessary " logging objects in spxLogger. """ def initLogConfig(config): file_log = None syslog_log = None mongo_log = False file_log = getConfigValue(config, 'file_log', None) spxLogger.logFile = file_log syslog_log = getConfigValue(config, 'syslog_log', None) f = getattr(syslog, syslog_log, None) spxLogger.logSyslog = f spxLogger.logMongo = mongo_log spxLogger.setup() def initConfig(config): global cfg_settings cfg_settings['powerAbsolute'] = getConfigValue(config, 'power_absolute', False) cfg_settings['computePower'] = getConfigValue(config, 'compute_power', False) cfg_settings['influx_url'] = getConfigValue(config, 'influx_url', False) cfg_settings['influx_db'] = getConfigValue(config, 'influx_db', False) cfg_settings['influx_measurement'] = getConfigValue(config, 'influx_measurement', False) cfg_settings['influx_user'] = getConfigValue(config, 'influx_user', False) if cfg_settings['influx_user'] == '': cfg_settings['influx_user'] = None cfg_settings['influx_passwd'] = getConfigValue(config, 'influx_passwd', False) if cfg_settings['influx_passwd'] == '': cfg_settings['influx_passwd'] = None for i in range(1,8): val = getConfigValue(config, 'label'+str(i), None) label.append(val) val = getConfigValue(config, 'report'+str(i), False) if val == 'True': report.append(True) elif val == 'False': report.append(False) else: report.append(False) def printConfig(): print('[-] Will use the following configuration:') print('\t+ Power Absolute values: ' + str(cfg_settings['powerAbsolute'])) print('\t+ Compute Power: ' + str(cfg_settings['computePower'])) for i in range(1,8): print('\tReport '+str(i)+': '+str(report[i-1])) print('\tLabel '+str(i)+': '+str(label[i-1])) if __name__ == "__main__": config = spxConfig(os.path.dirname(os.path.realpath(__file__))+'/config.ini') config.read() initLogConfig(config) initConfig(config) printConfig() debug_mode = False try: if config.get(option='debug_mode') == 'True': debug_mode = True except: debug_mode = False serial_port = None try: serial_port = config.get(option='serial_port') except: serial_port = None if not serial_port: print('[!] No serial port specified in the config file, please check.') print('[-] Opening ' + serial_port + ' to read power values') ser = serial.Serial(serial_port, 38400) try: while 1: response = ser.readline() response = response.decode('utf-8') response = response.strip() f = response.split(' ') if len(f) < 16 or len(f) > 16: print('[!] Incorrect number of fields have been found, skipping') continue; print('[-] New Reading:') voltage = float(f[15]) print('\tVoltage: '+str(voltage)+' V') amps = [] realp = [] computep = [] utcnow = datetime.datetime.utcnow() timestamp = utcnow.strftime("%s") t = timestamp + '000000000' params = {'db': cfg_settings['influx_db']} if cfg_settings['influx_user'] and cfg_settings['influx_passwd']: params['u'] = cfg_settings['influx_user'] params['p'] = cfg_settings['influx_passwd'] payload = "" #payload += "%s,label=%s value=%s %s\n" % (cfg_settings['influx_measurement'], 'Voltage', voltage, t) j = 0 for i in range(1,8): a = float(f[7+i]) rp = float(f[i]) cp = 0 if cfg_settings['powerAbsolute']: rp = abs(rp) if cfg_settings['computePower']: cp = (a/1000)*voltage amps.append(a) realp.append(rp) computep.append(cp) if report[i-1]: payload += "%s,label=%s amps=%s,power=%s,cpower=%s,voltage=%s %s\n" % (cfg_settings['influx_measurement'], label[i-1], a, rp, cp, voltage, t) print('\t['+label[i-1]+'] Output: '+str(rp)+' W\t I='+str(a)+' mA') j += 1 #print(payload) r = requests.post(cfg_settings['influx_url'], params=params, data=payload) if r.status_code < 300 and r.status_code > 199: print('[-] Posted to influx') else: print('[!] Error while posting data to influxdb') except KeyBoardInterrupt: ser.close() print('[!] Serial port closed unexpectedly')