ayush3504 icon

modbus usb powerstrip script

ayush3504 | PRO | 09/16/13 07:41:22 PM UTC | 0 ⭐ | 217 👁️ | Never ⏰ | []
Python |

3.05 KB

|

None

|

0 👍

/

0 👎

#!/usr/bin/env python
 
import os, sys, minimalmodbus, argparse
 
# choose no. of switch in the given power strip model
switchNum=6
 
# parse command line paramenters
parser = argparse.ArgumentParser(description=\
                                 'Modbus master for Modbus USB Power Strip. \
                                 Reads and writes to specified switch relay coils')
parser.add_argument('devicePath', help='Device path e.g. /dev/ttyUSB0')
parser.add_argument('switchId', type=int, choices=range(switchNum+1), help='Select switch number 1-' + str(switchNum) + ' on the power strip. Switch number 0 is used to select all switches for turn_on or turn_off operations')
parser.add_argument('operation', choices=['read','turn_on', 'turn_off'], help='Performs given operation on the chosen switch')                
args = parser.parse_args()
 
def main(devicePath, switchId, operation):
    # to ensure that the port closes after each call
    minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL=True
    
    # establish connection
    try:
        # resolve symbolic links, if any, in the given device path
        powerStripCanonicalPath = os.path.realpath(devicePath)
        # create an instance of modbus slave instrument called powerStrip
        powerStrip = minimalmodbus.Instrument(powerStripCanonicalPath, 1) # arguments: port name, slave address (in decimal)
        # set baud rate
        powerStrip.serial.baudrate = 9600
        #powerStrip.debug = True  # to see communication with the instrument
    except:
        print 'Connection failed'
        sys.exit(1)
 
    # set switch address since addressing starts from 0
    switchAddr = switchId - 1
 
    # execute given operation
    try:
        if operation=='read':
            # check for valid switchId to perform read operation
            if switchId > 0:
                print 'Switch', switchId,
                if powerStrip.read_bit(switchAddr, 1) == 1: # read_bit(coil address, modbus function code)
                    print 'is on'
                elif powerStrip.read_bit(switchAddr, 1) == 0:
                    print 'is off'
            else:
                print 'Read not supported on all switches'
                raise
        else:
            if switchId > 0:
                # to perform turn_on, turn_off operations on given switch
                if operation == 'turn_on':
                    powerStrip.write_bit(switchAddr, 1, 5) # write_bit(coil address, value, modbus function code)
                if operation == 'turn_off':
                    powerStrip.write_bit(switchAddr, 0, 5) # write_bit(coil address, value, modbus function code)
                # to perform operation on all switch
            elif switchId == 0:
                for currSwitchAddr in range(switchNum):
                    powerStrip.write_bit(currSwitchAddr, operation == 'turn_on', 5) # write_bit(coil address, value, modbus function code)
    except:
        print 'Operation failed'
        sys.exit(2)
if __name__ == "__main__":
    main(args.devicePath, args.switchId, args.operation)

Comments