def run(self, args, parser): meter = SmartMeter(args.serial_port, baudrate=args.baudrate) try: packet = meter.read_one_packet() except SerialException as e: parser.error(e) finally: meter.disconnect() if args.raw: print(str(packet)) return 0 data = [('Time', datetime.now()), ('Total kWh High consumed', int(packet['kwh']['high']['consumed'] * 1000)), ('Total kWh Low consumed', int(packet['kwh']['low']['consumed'] * 1000)), ('Total gas consumed', int(packet['gas']['total'] * 1000)), ('Current kWh tariff', packet['kwh']['tariff'])] if args.tsv: print('\t'.join(map(str, [d for k, d in data]))) else: print('\n'.join(['%-25s %s' % (k, d) for k, d in data]))
def run(self, args, parser): meter = SmartMeter(args.serial_port, baudrate=args.baudrate) try: packet = meter.read_one_packet() except SerialException as e: parser.error(e) finally: meter.disconnect() if args.raw: print(str(packet)) return 0 data = [ ('Time', datetime.now()), ('Total kWh High consumed', int(packet['kwh']['high']['consumed']*1000)), ('Total kWh Low consumed', int(packet['kwh']['low']['consumed']*1000)), ('Total gas consumed', int(packet['gas']['total']*1000)), ('Current kWh tariff', packet['kwh']['tariff']) ] if args.tsv: print('\t'.join(map(str, [d for k,d in data]))) else: print('\n'.join(['%-25s %s' % (k,d) for k,d in data]))
def test_meter_disconnect_and_connect(): serial.Serial = SerialMock meter = SmartMeter('/dev/ttyUSB0') assert meter.connected() == True meter.disconnect() assert meter.connected() == False meter.connect() assert meter.connected() == True
def collect(self): metrics = { 'p1_total_electricity_used_rate_1': GaugeMetricFamily('p1_total_electricity_used_rate_1', 'Gebruik elektra dal'), 'p1_total_electricity_used_rate_2': GaugeMetricFamily('p1_total_electricity_used_rate_2', 'Gebruik elektra piek'), 'p1_total_electricity_provided_rate_1': GaugeMetricFamily('p1_total_electricity_provided_rate_1', 'Geleverd elektra dal'), 'p1_total_electricity_provided_rate_2': GaugeMetricFamily('p1_total_electricity_provided_rate_2', 'Geleverd elektra piek'), 'p1_total_electricity_used': GaugeMetricFamily('p1_total_electricity_used', 'Totaal gebruik elektra'), 'p1_total_electricity_provided': GaugeMetricFamily('p1_total_electricity_provided', 'Totaal geleverd elektra'), 'p1_l1_voltage': GaugeMetricFamily('p1_l1_voltage', 'Totaal geleverd elektra'), 'p1_l2_voltage': GaugeMetricFamily('p1_l2_voltage', 'Totaal geleverd elektra'), 'p1_l3_voltage': GaugeMetricFamily('p1_l3_voltage', 'Totaal geleverd elektra'), 'p1_current_tarrif': GaugeMetricFamily('p1_current_tarrif', 'Totaal geleverd elektra') } meter = SmartMeter('/dev/ttyUSB0', baudrate=115200) metrics = self.get_p1_metrics(meter.read_one_packet(), metrics) meter.disconnect() for metric in metrics.values(): yield metric
def run(self, args, parser): meter = SmartMeter( args.serial_port, baudrate=args.serial_baudrate, bytesize=args.serial_bytesize, parity=args.serial_parity, stopbits=args.serial_stopbits, xonxoff=args.serial_xonxoff, timeout=args.serial_timeout, ) try: packet = meter.read_one_packet() except SerialException as e: parser.error(e) finally: meter.disconnect() if args.raw: print(str(packet)) return 0 data = [ ('Time', datetime.now()), ('Total kWh High consumed', int(packet['kwh']['high']['consumed']*1000)), ('Total kWh Low consumed', int(packet['kwh']['low']['consumed']*1000)), ('Total gas consumed', int(packet['gas']['total']*1000)), ('Current kWh tariff', packet['kwh']['tariff']), ('Gas Measured At', packet['gas']['measured_at']), ] if args.tsv: print('\t'.join(map(str, [d for k,d in data]))) else: print('\n'.join(['%-25s %s' % (k,d) for k,d in data])) return 0
def run(self, args, parser): meter = SmartMeter( args.serial_port, baudrate=args.serial_baudrate, bytesize=args.serial_bytesize, parity=args.serial_parity, stopbits=args.serial_stopbits, xonxoff=args.serial_xonxoff, timeout=args.serial_timeout, ) try: packet = meter.read_one_packet() except SerialException as e: parser.error(e) finally: meter.disconnect() if args.raw: print(str(packet)) return 0 data = [('Telegram Time', self.convertTime(packet['kwh']['etime'])), ('Total kWh High consumed', int(packet['kwh']['high']['consumed'] * 1000)), ('Total kWh Low consumed', int(packet['kwh']['low']['consumed'] * 1000)), ('Total gas consumed', int(packet['gas']['total'] * 1000)), ('Current kWh tariff', packet['kwh']['tariff'])] if args.tsv: print('\t'.join(map(str, [d for k, d in data]))) else: print('\n'.join(['%-25s %s' % (k, d) for k, d in data])) return 0
def run(self, args, parser): meter = SmartMeter( args.serial_port, baudrate=args.serial_baudrate, bytesize=args.serial_bytesize, parity=args.serial_parity, stopbits=args.serial_stopbits, xonxoff=args.serial_xonxoff, timeout=args.serial_timeout, ) try: packet = meter.read_one_packet() except SerialException as e: parser.error(e) finally: meter.disconnect() if args.raw: print(str(packet)) return 0 # Set multiplication factor based on requested unit elec_unit_factor = { 'Wh': 1000, 'kWh': 1, 'J': 1000 * 3600, 'MJ': 1000 * 3600 / 1000 / 1000 } gas_unit_factor = { 'm3': 1000, 'l': 1, 'J': 43.935, 'MJ': 1000 * 43.935 # 43.46 - 44.41 MJ/m^3(n) legal Wobbe-index ('Bovenwaarde') for Dutch Groningen gas, also widely used in north-west Europe: https://wetten.overheid.nl/BWBR0035367/2019-01-01#Bijlage2 } # Construct output depending on user request data = [] if ('time' in args.show_output): data.append(('Time', datetime.now())) if ('kwh_eid' in args.show_output): data.append(('Electricity serial', packet['kwh']['eid'])) if ('gas_eid' in args.show_output): data.append(('Gas serial', packet['gas']['eid'])) if ('consumed' in args.show_output): data.extend([ ('Total electricity consumed (high, ' + args.elec_unit + ')', int(packet['kwh']['high']['consumed'] * elec_unit_factor[args.elec_unit])), ('Total electricity consumed (low, ' + args.elec_unit + ')', int(packet['kwh']['low']['consumed'] * elec_unit_factor[args.elec_unit])), ('Total gas consumed (' + args.gas_unit + ')', int(packet['gas']['total'] * gas_unit_factor[args.gas_unit])) ]) if ('produced' in args.show_output): data.extend([ ('Total electricity produced (high, ' + args.elec_unit + ')', int(packet['kwh']['high']['produced'] * elec_unit_factor[args.elec_unit])), ('Total electricity produced (low, ' + args.elec_unit + ')', int(packet['kwh']['low']['produced'] * elec_unit_factor[args.elec_unit])) ]) if ('current' in args.show_output): data.extend([('Current electricity consumption (W)', int(packet['kwh']['current_consumed'] * 1000)), ('Current electricity production (W)', int(packet['kwh']['current_produced'] * 1000))]) if ('tariff' in args.show_output): data.append( ('Current electricity tariff', packet['kwh']['tariff'])) if ('gas_measured_at' in args.show_output): data.append(('Gas measured at', packet['gas']['measured_at'])) if args.tsv: print('\t'.join(map(str, [d for k, d in data]))) else: print('\n'.join(['%-40s %s' % (k, d) for k, d in data])) return 0
print("[{}] p1_total_electricity_provided: {}".format( datetime.datetime.now(), markup_helper(p1_line))) p1_total_electricity_provided.set(markup_helper(p1_line)) elif '0-1:24.2.1' in p1_line: print("[{}] p1_total_gas_used: {}".format(datetime.datetime.now(), markup_helper(p1_line))) p1_total_gas_used.set(markup_helper(p1_line)) def markup_helper(str_line): ''' Read raw string and return only the value ''' return int(str_line.split('(')[-1].split('*')[0].replace('.', '')) if __name__ == '__main__': # Start up the server to expose the metrics. start_http_server(8000) # Generate some requests. while True: try: # Define device meter = SmartMeter('/dev/ttyUSB0', baudrate=115200) get_p1_metrics(meter.read_one_packet()) meter.disconnect() except: sys.exit("Serial port cannot be read. Will try again.") print("") time.sleep(interval)