예제 #1
0
    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]))
예제 #2
0
파일: command.py 프로젝트: RaigK/smeterd
    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]))
예제 #3
0
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
예제 #4
0
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
예제 #5
0
    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
예제 #6
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 = [
            ('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
예제 #7
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
예제 #8
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
예제 #9
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)