Exemple #1
0
 def dev_read(self, *args):
     try:
         self.dev_sleep()
         return TCPModbusClient.dev_read(self.serverloc[0],
                                         self.serverloc[1],
                                         self.modbus_addr, *args)
     except:
         return None
Exemple #2
0
class VerisMeter:
    all_meters = range(1, 43)
    register_map = {
        'current_scale': (1000, 1041),
        'power_scale': (1042, 1083),
        'energy_scale': (1084, 1125),
        'kwh': (1168, 1251),
        'kwh_fl': (2000, 2083),
        'kw': (1252, 1293),
        'pf': (1294, 1335),
        'current': (1336, 1377),
        'pkw': (1378, 1419),
        'maxkw': (1420, 1461),
        'pcurrent': (1462, 1503),
        'maxcurrent': (1504, 1545),
        'reset': (1126, 1167),
    }

    val_clear_kw = 10203
    val_clear_max = 29877

    def __init__(self, server, port, bus_addr):
        self.server = server
        self.port = port
        self.bus_addr = bus_addr
        self.logger = logging.getLogger('VerisMeter')
        self.last_reading_time = 0.0
        self.last_reset_energy = None
        self.last_reset_time = 0.0
        self.boot_time = time.time()

    def get_current(self):
        values = self.read_reg_range(self.register_map['current'])
        scales = self.read_reg_range(self.register_map['current_scale'])
        return self.scale_vals(values, scales)

    def get_power(self):
        values = self.read_reg_range(self.register_map['kw'])
        scales = self.read_reg_range(self.register_map['power_scale'])
        return self.scale_vals(values, scales)

    def get_powerfactor(self):
        values = self.read_reg_range(self.register_map['pf'])
        scales = [-3] * len(values)
        return self.scale_vals(values, scales)

    def get_energy_totals(self):
        values_16bit = self.read_reg_range(self.register_map['kwh'])
        scale = self.read_reg_range(self.register_map['energy_scale'])

        values = []
        for i in range(0, len(values_16bit) / 2):
            values.append(((values_16bit[i * 2] & 0xffff) << 16)
                          | (values_16bit[i * 2 + 1] & 0xffff))
        return self.scale_vals(values, scale)

    def get_energy(self, current=None):
        if not current:
            current = self.get_energy_totals()
        if not self.last_reset_energy:
            return current

        return map(lambda x, y: x - y, current, self.last_reset_energy)

    def reset_energy(self, vals=None):
        # reset doesn't seem to work reliably -- just remember what it was last time
        if not vals:
            newvals = self.get_energy_totals()
        else:
            newvals = vals
        self.last_reset_time = time.time()
        self.last_reset_energy = newvals

    def scale_vals(self, vals, scale):
        return map(lambda x, y: x * (10**y), vals, scale)

    def read_reg_range(self, (start, end)):
        start -= 1
        end -= 1
        if end < start:
            self.logger.error("read_reg_range: invalid range: (%i, %i)" %
                              (start, end))
            return None
        self.logger.debug("read_reg_range: %i:%i" % (start, end))

        now = time.time()
        if now - self.last_reading_time < 2:
            time.sleep(2 - (now - self.last_reading_time))

        response = TCPModbusClient.dev_read(self.server, self.port,
                                            self.bus_addr, start,
                                            end - start + 1)

        self.last_reading_time = time.time()
        self.logger.debug("read_reg_range: %i response bytes",
                          response.modbus_val_bytes)

        return [
            TCPModbusClient.get_val(response.modbus_reg_val, i)
            for i in range(0, response.modbus_val_bytes / 2)
        ]
Exemple #3
0
 def dev_read(self, *args):
     try:
         self.dev_sleep()
         return TCPModbusClient.dev_read(self.serverloc[0], self.serverloc[1],self.modbus_addr,*args)
     except:
         return None