Exemplo n.º 1
0
def set_fan_rpm_gs3(ser, slave_address, rpm_setting, max_rpm):
    """
    Set the fan speed in rpm on a gs3 fan controller.
    :param ser: Serial connection to the gs3 fan controller.
    Contains baud rate, parity, and timeout.
    :param slave_address: The Modbus slave address of the device.
    :param rpm_setting: The user supplied rpm setting.
    :param max_rpm: The max rpm setting for the fan motor.
    :return: The modbus write result.
    """
    client = dkmodbus.dkmodbus(ser)
    if rpm_setting == 0:  # Turn the fan off.
        result = client.write_multiple_registers(
            slave_address,  # Slave address.
            0x91B,  # Register to write to.
            1,  # Number of registers to write to.
            2,  # Number of bytes to write.
            '\x00\x00')  # Data to write.
    else:  # Turn the fan on at the desired RPM.
        rpm_to_hz = get_fan_rpm_to_hz_gs3(client.serial_device, slave_address,
                                          max_rpm)
        hz = rpm_setting * rpm_to_hz
        packed_hz = conversions.fan_gs3_packed_hz(hz)

        result = client.write_multiple_registers(
            1,  # Slave address.
            0x91A,  # Register to write to.
            2,  # Number of registers to write to.
            4,  # Number of bytes to write.
            packed_hz + '\x00\x01'
        )  # Frequency setting in Hz / data # 01 is on, # 00 is off.
    return result
Exemplo n.º 2
0
def read_holding_register(ser, slave_address, register):
    """Read a holding register from an RS485 device.
    :param ser: Serial connection to the gs3 fan controller.
    Contains baud rate, parity, and timeout.
    :param slave_address: The Modbus slave address of the device.
    :param register: The register to read (int).
    :returns The register reading (int).
    """
    client = dkmodbus.dkmodbus(ser)
    register_data = client.read_holding_registers(slave_address, register, 1)
    result = conversions.unpack_word(register_data)
    print '0x{}'.format(result)
    return result
Exemplo n.º 3
0
def read_holding_register(ser, slave_address, register):
    """Read a holding register from an RS485 device.
    :param ser: Serial connection to the fan controller.
    Contains baud rate, parity, and timeout.
    :param slave_address: The Modbus slave address of the device.
    :param register: The register to read (int).
    :returns The register reading (int).
    """
    client = dkmodbus.dkmodbus(ser)
    register_data = client.read_holding_registers(slave_address, register, 1)
    result = unpack_register_data(register_data)
    logger.debug('read_holding_register result: {}, type: {}'.format(
        result, type(result)))
    return result
Exemplo n.º 4
0
    def create_modbus_client(self):
        """Production hardware only wrapper for creating the serial device that
         we use to speak modbus to the CEC (Central Exhaust Chamber) board.
         This will not work for the emulator.
         :returns: The dkmodbus client."""
        # Test that the usb device is there. If not, reset the usb.
        if not os.path.exists(self.device_name):
            dkmodbus.dkmodbus.reset_usb([1, 2])

        ser = serial.Serial(
            self.device_name,  # Serial device name.
            baudrate=self.baud_rate,
            parity=self.parity,
            timeout=self.timeout)
        return dkmodbus.dkmodbus(ser)
Exemplo n.º 5
0
def set_fan_rpm_ecblue(ser, slave_address, rpm_setting, max_rpm):
    """
    Set the fan speed in rpm on an ECblue fan controller.
    :param ser: Serial connection to the gs3 fan controller.
    Contains baud rate, parity, and timeout.
    :param slave_address: The Modbus slave address of the device.
    :param rpm_setting: The user supplied rpm setting.
    :param max_rpm: The max rpm setting for the fan motor.
    :return: The modbus write result.
    """
    client = dkmodbus.dkmodbus(ser)

    logger.debug('Setting fan speed. max_rpm: {}, rpm_setting: {}'.format(
        max_rpm, rpm_setting))

    percentage_setting = float(rpm_setting) / float(max_rpm)
    logger.debug('percentage_setting: {}'.format(percentage_setting))
    fan_setting_decimal = int(percentage_setting * float(600.0))
    logger.debug('fan_setting_decimal: {}d 0x{:04x}'.format(
        fan_setting_decimal, fan_setting_decimal))

    fan_setting = (fan_setting_decimal / 100) << 8
    logger.debug('fan_setting: {}d 0x{}'.format(fan_setting, fan_setting))
    setting = ((fan_setting_decimal % 100) / 10) << 4
    fan_setting += setting
    logger.debug('fan_setting: {}d 0x{}'.format(fan_setting, fan_setting))
    setting = (fan_setting_decimal % 10)
    fan_setting += setting
    logger.debug('fan_setting: {}d 0x{}'.format(fan_setting, fan_setting))

    fan_setting = struct.pack('>H', fan_setting)

    result = client.write_multiple_registers(
        slave_address,  # Slave address.
        2,  # Register to write to.
        1,  # Number of registers to write to.
        2,  # Number of bytes to write.
        fan_setting)  # Data to write.
    return result