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')
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()
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))