def main():
    print('Multiple R421A08 relay boards example\n')

    # ----------------------------------------------------------------------------------------------
    # Create relay_modbus object
    _modbus = relay_modbus.Modbus(serial_port=SERIAL_PORT, verbose=False)

    # Open serial port
    try:
        _modbus.open()
    except relay_modbus.SerialOpenException as err:
        print(err)
        sys.exit(1)

    # ----------------------------------------------------------------------------------------------
    # Create relay board object with on address 1
    relays_kitchen = relay_boards.R421A08(_modbus,
                                          address=1,
                                          board_name='Kitchen')

    # Create second relay board object on address 2
    relays_living_room = relay_boards.R421A08(_modbus,
                                              address=1,
                                              board_name='Living room')

    # ----------------------------------------------------------------------------------------------
    # Print board info
    print_relay_board_info(relays_kitchen)
    print_relay_board_info(relays_living_room)

    # ----------------------------------------------------------------------------------------------
    # Control relays kitchen
    print('Relay board #{} relay 1 on'.format(relays_kitchen.address))
    relays_kitchen.on(1)
    print('Relay board #{} relays 2, 3 and 7 on'.format(
        relays_kitchen.address))
    relays_kitchen.on_multi([2, 3, 7])
    print('Relay board #{} status:'.format(relays_kitchen.address))
    relays_kitchen.print_status_all()
    time.sleep(2)

    # ----------------------------------------------------------------------------------------------
    # Control relays living room
    print('Relay board #{} toggle relay 8'.format(relays_living_room.address))
    relays_living_room.toggle(8)
    print('Relay board #{} status:'.format(relays_kitchen.address))
    relays_living_room.print_status_all()
    time.sleep(2)

    # ----------------------------------------------------------------------------------------------
    # Control relays kitchen and living room
    print('Relay board #{} all off'.format(relays_kitchen.address))
    relays_kitchen.off_all()
    print('Relay board #{} all off'.format(relays_living_room.address))
    relays_living_room.off_all()

    print('Done')
Ejemplo n.º 2
0
def main():
    print('Single R421A08 relay board example\n')

    # Create relay_modbus object
    _modbus = relay_modbus.Modbus(serial_port=SERIAL_PORT, verbose=False)

    # Open serial port
    try:
        _modbus.open()
    except relay_modbus.SerialOpenException as err:
        print(err)
        sys.exit(1)

    # Create relay board object
    board = relay_boards.R421A08(_modbus,
                                 address=address,
                                 board_name=board_name,
                                 verbose=False)

    # Print board info
    print_relay_board_info(board)

    # Control some relays
    relay_control(board)

    print('Done')
    def CreateObjects(self, serial_port, address):
        # Check argument types
        assert type(serial_port) == str
        assert type(address) == int

        # Create MODBUS object and open serial port
        self.m_relay_modbus = relay_modbus.Modbus(serial_port)
        try:
            self.m_relay_modbus.open()
        except relay_modbus.SerialOpenException as err:
            wx.MessageBox(str(err), u'Failure', style=wx.OK | wx.ICON_STOP)
            sys.exit(1)

        # Create relay board object
        self.m_relay_board = relay_boards.R421A08(self.m_relay_modbus)
        if address < 0 or address >= self.m_relay_board.num_addresses:
            wx.MessageBox(u'Invalid address {}'.format(address), u'Failure',
                          style=wx.OK | wx.ICON_STOP)
            sys.exit(1)
        self.m_relay_board.address = address

        # Set window title
        self.SetTitle(u'{} address {}'.format(self.m_relay_modbus.serial_port,
                                              self.m_relay_board.address))
    def __init__(self, parent, board_address):
        wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition,
                          size=wx.Size(600, 300), style=wx.TAB_TRAVERSAL)

        # ------------------------------------------------------------------------------------------
        self.m_status_bar = parent.GetTopLevelParent().m_statusBar
        self.m_relay_modbus = parent.GetTopLevelParent().m_relay_modbus
        self.m_relay_board = relay_boards.R421A08(self.m_relay_modbus)

        # ------------------------------------------------------------------------------------------
        # Load resources
        self.m_relay_status_on = None
        self.m_relay_status_off = None
        self.m_relay_status_unknown = None

        img_list = [
            resource_path('images/state_on.png'),
            resource_path('images/state_off.png'),
            resource_path('images/state_unknown.png'),
         ]

        all_found = True
        for img in img_list:
            if not os.path.exists(img):
                all_found = False
                break

        if all_found:
            self.m_relay_status_on = wx.Icon(resource_path('images/state_on.png'))
            self.m_relay_status_off = wx.Icon(resource_path('images/state_off.png'))
            self.m_relay_status_unknown = wx.Icon(resource_path('images/state_unknown.png'))

        # ------------------------------------------------------------------------------------------
        # Form sizer
        fgSizerForm = wx.FlexGridSizer(0, 1, 0, 0)
        fgSizerForm.AddGrowableRow(1)
        fgSizerForm.AddGrowableCol(0)
        fgSizerForm.SetFlexibleDirection(wx.BOTH)
        fgSizerForm.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)

        # ------------------------------------------------------------------------------------------
        # Relay board static box sizer
        sbSizerAddress = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, u"Relay board"),
                                           wx.HORIZONTAL)

        self.m_txtAddress = wx.StaticText(sbSizerAddress.GetStaticBox(), wx.ID_ANY, u"Address:",
                                          wx.DefaultPosition, wx.DefaultSize, 0)
        self.m_txtAddress.Wrap(-1)
        sbSizerAddress.Add(self.m_txtAddress, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)

        self.m_spinAddress = wx.SpinCtrl(sbSizerAddress.GetStaticBox(), wx.ID_ANY, wx.EmptyString,
                                         wx.DefaultPosition, wx.Size(100, -1), wx.SP_ARROW_KEYS,
                                         0, 63, board_address)
        sbSizerAddress.Add(self.m_spinAddress, 0, wx.ALL, 5)

        fgSizerForm.Add(sbSizerAddress, 1, wx.EXPAND | wx.TOP | wx.RIGHT | wx.LEFT, 5)

        # ------------------------------------------------------------------------------------------
        # Relays static box sizer
        sbSizerRelays = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, u"Relays"), wx.VERTICAL)

        fgSizer = wx.FlexGridSizer(0, 7, 0, 0)
        fgSizer.AddGrowableCol(1)
        fgSizer.SetFlexibleDirection(wx.BOTH)
        fgSizer.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)

        self.m_bmpStatus = []
        self.m_txtName = []
        self.m_btnRelayOn = []
        self.m_btnRelayOff = []
        self.m_lblDelay = []
        self.m_spnDelay = []
        self.m_btnPulse = []
        self.m_timer = []
        for relay in range(0, self.m_relay_board.num_relays):
            fgSizer.AddGrowableRow(relay)
            self.add_relay(relay, sbSizerRelays, fgSizer)

        # ------------------------------------------------------------------------------------------
        # Set sizers
        sbSizerRelays.Add(fgSizer, 1, wx.EXPAND, 5)
        fgSizerForm.Add(sbSizerRelays, 1, wx.EXPAND | wx.ALL, 5)

        self.SetSizer(fgSizerForm)
        self.Layout()
Ejemplo n.º 5
0
def argument_parser(args):
    """
        Argument parser
    :param args: Commandline arguments
    :return: None
    """

    # ----------------------------------------------
    # Description and help strings
    description = \
        'Python script to control a 8 Channel RS485 MODBUS RTU relay board type R421A08.'

    help_serial_port = \
        'Serial port (such as COM1 or /dev/ttyUSB0)'

    help_address = \
        'Address of the board [0..{}] (Set DIP switches)'.format(R421A08_NUM_ADDRESSES - 1)

    help_relays = \
        'Relay numbers [1..{}] or * for all relays'.format(R421A08_NUM_RELAYS)

    # ----------------------------------------------------------------------------------------------
    # Create argument parser
    _parser = argparse.ArgumentParser(description=description)

    # Serial port argument is always required
    _parser.add_argument('serial_port',
                         metavar='<SERIAL_PORT>',
                         type=str,
                         help=help_serial_port)

    # Address argument is always required
    _parser.add_argument('address',
                         metavar='<ADDRESS>',
                         type=arg_check_address,
                         help=help_address)

    # ----------------------------------------------------------------------------------------------
    # Create sub command arguments
    _subparsers = _parser.add_subparsers(help='Relay command')

    # Create status argument
    _parser_status = _subparsers.add_parser('status', help='Read status')
    _parser_status.add_argument('relays',
                                metavar='<RELAYS>',
                                nargs='*',
                                default=['*'],
                                type=arg_check_relay,
                                help=help_relays)
    _parser_status.add_argument('-v',
                                '--verbose',
                                action='store_true',
                                help='Print verbose')
    _parser_status.set_defaults(func=relay_cmd_status)

    # Create poll argument
    # _parser_poll = _subparsers.add_parser('poll', help='Poll status')
    # _parser_poll.add_argument('relays', metavar='<RELAYS>', nargs='*', default=['*'],
    #                           type=arg_check_relay, help=help_relays)
    # _parser_poll.add_argument('-i', '--interval', type=int, help='Poll interval in seconds')
    # _parser_poll.add_argument('-v', '--verbose', action='store_true', help='Print verbose')
    # _parser_poll.set_defaults(func=relay_cmd_poll)

    # Create on argument
    _parser_on = _subparsers.add_parser('on', help='On')
    _parser_on.add_argument('relays',
                            metavar='<RELAYS>',
                            nargs='*',
                            type=arg_check_relay,
                            help=help_relays)
    _parser_on.add_argument('-v',
                            '--verbose',
                            action='store_true',
                            help='Print verbose')
    _parser_on.set_defaults(func=relay_cmd_on)

    # Create off argument
    _parser_off = _subparsers.add_parser('off', help='Off')
    _parser_off.add_argument('relays',
                             metavar='<RELAYS>',
                             nargs='*',
                             type=arg_check_relay,
                             help=help_relays)
    _parser_off.add_argument('-v',
                             '--verbose',
                             action='store_true',
                             help='Print verbose')
    _parser_off.set_defaults(func=relay_cmd_off)

    # Create toggle argument
    _parser_toggle = _subparsers.add_parser('toggle', help='Toggle')
    _parser_toggle.add_argument('relays',
                                metavar='<RELAYS>',
                                nargs='*',
                                type=arg_check_relay,
                                help=help_relays)
    _parser_toggle.add_argument('-v',
                                '--verbose',
                                action='store_true',
                                help='Print verbose')
    _parser_toggle.set_defaults(func=relay_cmd_toggle)

    # Create latch argument
    _parser_latch = _subparsers.add_parser('latch', help='Latch')
    _parser_latch.add_argument('relays',
                               metavar='<RELAYS>',
                               nargs='*',
                               type=arg_check_relay,
                               help=help_relays)
    _parser_latch.add_argument('-v',
                               '--verbose',
                               action='store_true',
                               help='Print verbose')
    _parser_latch.set_defaults(func=relay_cmd_latch)

    # Create momentary argument
    _parser_latch = _subparsers.add_parser('momentary', help='Momentary')
    _parser_latch.add_argument('relays',
                               metavar='<RELAYS>',
                               nargs='*',
                               type=arg_check_relay,
                               help=help_relays)
    _parser_latch.add_argument('-v',
                               '--verbose',
                               action='store_true',
                               help='Print verbose')
    _parser_latch.set_defaults(func=relay_cmd_momentary)

    # Create delay argument
    _parser_moment = _subparsers.add_parser('delay', help='Delay')
    _parser_moment.add_argument('relays',
                                metavar='<RELAYS>',
                                nargs='*',
                                type=arg_check_relay,
                                help=help_relays)
    _parser_moment.add_argument(
        '-d',
        '--delay',
        type=arg_check_delay,
        default=2,
        help='Delay (1..255 seconds) Default: 2 seconds')
    _parser_moment.add_argument('-v',
                                '--verbose',
                                action='store_true',
                                help='Print verbose')
    _parser_moment.set_defaults(func=relay_cmd_delay)

    # ----------------------------------------------------------------------------------------------
    # Parse arguments
    _args = None
    try:
        _args = _parser.parse_args(args)

        # Check required arguments
        for argument in ['serial_port', 'address', 'relays', 'verbose']:
            if argument not in _args:
                raise AttributeError()
    except AttributeError:
        _parser.print_help()
        sys.exit(0)

    # Create relay_modbus object
    _modbus = relay_modbus.Modbus(_args.serial_port, verbose=_args.verbose)
    try:
        _modbus.open()
    except serial.SerialException:
        print_stderr('Error: Cannot open serial port: ' + args.serial_port)
        sys.exit(1)

    # Create relay board object
    _relay_board = relay_boards.R421A08(_modbus,
                                        address=_args.address,
                                        verbose=_args.verbose)

    _args.func(_args, relay_boards=_relay_board)
if __name__ == '__main__':
    print('Getting started R421A08 relay board\n')

    # Create MODBUS object
    _modbus = relay_modbus.Modbus(serial_port=SERIAL_PORT)

    # Open serial port
    try:
        _modbus.open()
    except relay_modbus.SerialOpenException as err:
        print(err)
        sys.exit(1)

    # Create relay board object
    board = relay_boards.R421A08(_modbus, address=1)

    print('Status all relays:')
    check(board.print_status_all())
    time.sleep(1)

    print('Turn relay 1 on')
    check(board.on(1))
    time.sleep(1)

    print('Turn relay 1 off')
    check(board.off(1))
    time.sleep(1)

    print('Toggle relay 8')
    check(board.toggle(8))