Rev 4928 Rev 4934
1 #!/usr/bin/python 1 #!/usr/bin/python
2   2  
3 #uncomment for debbug purposes 3 #uncomment for debbug purposes
4 #import logging 4 #import logging
5 #logging.basicConfig(level=logging.DEBUG) 5 #logging.basicConfig(level=logging.DEBUG)
6   6  
7 import time 7 import time
8 import datetime 8 import datetime
9 import sys 9 import sys
10 import os 10 import os
11 import minimalmodbus 11 import minimalmodbus
12   12  
13 from pymlab import config 13 from pymlab import config
14 from mlabutils import ejson 14 from mlabutils import ejson
15   15  
16 parser = ejson.Parser() 16 parser = ejson.Parser()
17   17  
18 #### Script Arguments ############################################### 18 #### Script Arguments ###############################################
19   19  
20 if len(sys.argv) != 3: 20 if len(sys.argv) != 3:
21 sys.stderr.write("Invalid number of arguments.\n") 21 sys.stderr.write("Invalid number of arguments.\n")
22 sys.stderr.write("Usage: %s PORT_ADDRESS CONFIG_FILE\n" % (sys.argv[0], )) 22 sys.stderr.write("Usage: %s PORT_ADDRESS CONFIG_FILE\n" % (sys.argv[0], ))
23 sys.exit(1) 23 sys.exit(1)
24   24  
25   25  
26 port = eval(sys.argv[1]) 26 port = eval(sys.argv[1])
27   27  
28 value = parser.parse_file(sys.argv[2]) 28 value = parser.parse_file(sys.argv[2])
29 path = value['data_path'] 29 path = value['data_path']
30 interval = value['raw_sample_interval'] 30 interval = value['raw_sample_interval']
31 stationName = value['origin'] 31 stationName = value['origin']
32   32  
33   33  
34   34  
35 if (interval<5) or (interval>3600): 35 if (interval<5) or (interval>3600):
36 sys.stderr.write("Invalid sample interval arguments.\n") 36 sys.stderr.write("Invalid sample interval arguments.\n")
37 sys.stderr.write("The interval has to be in the range from 5 to 3600 seconds\n") 37 sys.stderr.write("The interval has to be in the range from 5 to 3600 seconds\n")
38 sys.exit(2) 38 sys.exit(2)
39   39  
40 #### Sensor Configuration ########################################### 40 #### Sensor Configuration ###########################################
41 # I2C 41 # I2C
42 cfg = config.Config( 42 cfg = config.Config(
43 i2c = { 43 i2c = {
44 "port": port, 44 "port": port,
45 }, 45 },
46 bus = [ 46 bus = [
47 { 47 {
48 "name": "current_sensor1", 48 "name": "current_sensor1",
49 "type": "vcai2c01", 49 "type": "vcai2c01",
50 "address": 0x68, 50 "address": 0x68,
51 }, 51 },
52 ], 52 ],
53 ) 53 )
54 cfg.initialize() 54 cfg.initialize()
55   55  
56 # modbus 56 # modbus
57 instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1) # port name, slave address (in decimal) 57 instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1) # port name, slave address (in decimal)
58   58  
59 instrument.serial.port # this is the serial port name 59 instrument.serial.port # this is the serial port name
60 instrument.serial.baudrate = 9600 # Baud 60 instrument.serial.baudrate = 9600 # Baud
61 instrument.serial.bytesize = 8 61 instrument.serial.bytesize = 8
62 instrument.serial.stopbits = 2 62 instrument.serial.stopbits = 2
63 instrument.serial.timeout = 0.5 # seconds 63 instrument.serial.timeout = 0.5 # seconds
64   64  
65 instrument.mode = minimalmodbus.MODE_RTU # rtu or ascii mode 65 instrument.mode = minimalmodbus.MODE_RTU # rtu or ascii mode
66   66  
67   67  
68 sys.stdout.write("Current loop and modbus sensor example \r\n") 68 sys.stdout.write("Current loop and modbus sensor example \r\n")
69 sys.stdout.write("Time, water-level, temp1, conduc, salinity, tds_kcl, temp2, pH, redox \r\n") 69 sys.stdout.write("Time, water-level, temp1, conduc, salinity, tds_kcl, temp2, pH, redox \r\n")
70 #sys.stdout.write("Time, channel #1, channel #2, channel #3 , channel #4, channel #5 channel #6 , channel #7, channel #8 \r\n") 70 #sys.stdout.write("Time, channel #1, channel #2, channel #3 , channel #4, channel #5 channel #6 , channel #7, channel #8 \r\n")
71 sensor1 = cfg.get_device("current_sensor1") 71 sensor1 = cfg.get_device("current_sensor1")
72 #time.sleep(0.5) 72 #time.sleep(0.5)
73   73  
74 #### Data Logging ################################################### 74 #### Data Logging ###################################################
75   75  
-   76 while True:
76 try: 77 try:
77 before = time.time()-interval 78 before = time.time()-interval
78 while True: 79 while True:
79 80
80 filename = path + time.strftime("%Y%m%d%H", time.gmtime()) +"0000_"+ stationName + "_data.csv" 81 filename = path + time.strftime("%Y%m%d%H", time.gmtime()) +"0000_"+ stationName + "_data.csv"
81 now = time.time() 82 now = time.time()
82 83
83 if (now - before >= interval - 2.5): # 0.5*5 channels= 2.5s 84 if (now - before >= interval - 2.5): # 0.5*5 channels= 2.5s
84 with open(filename, "a") as f: 85 with open(filename, "a") as f:
85 86
86 ##Measuremment settings 87 ##Measuremment settings
87 sensor1.setADC(channel = 1, gain = 1, sample_rate = 3.75); 88 sensor1.setADC(channel = 1, gain = 1, sample_rate = 3.75);
88 89
89 instrument.address = 0x1E # this is the slave address number (1E-conductivity) 90 instrument.address = 0x1E # this is the slave address number (1E-conductivity)
90 instrument.write_register(0x01, 0x1F, 0) # Registernumber, value, number of decimals for storage 91 instrument.write_register(0x01, 0x1F, 0) # Registernumber, value, number of decimals for storage
91 92
92 instrument.address = 0x14 # this is the slave address number (14 - pH) 93 instrument.address = 0x14 # this is the slave address number (14 - pH)
93 instrument.write_register(0x01, 0x1F, 0) # Registernumber, value, number of decimals for storage 94 instrument.write_register(0x01, 0x1F, 0) # Registernumber, value, number of decimals for storage
94 95
95 time.sleep(0.5) 96 time.sleep(0.5)
96   97  
97 ##Reading 98 ##Reading
98 ## Read data from analog sensors ## 99 ## Read data from analog sensors ##
99 channel1 = sensor1.readCurrent(); 100 channel1 = sensor1.readCurrent();
100   101  
101 ## Read data from conductivity sensor ## 102 ## Read data from conductivity sensor ##
102 instrument.address = 0x1E # this is the slave address number (1E-conductivity) 103 instrument.address = 0x1E # this is the slave address number (1E-conductivity)
103   104  
104 temperature1 = instrument.read_float(0x53, 3, 2) # Registernumber, number of decimals 105 temperature1 = instrument.read_float(0x53, 3, 2) # Registernumber, number of decimals
105 conductivity = instrument.read_float(0x55, 3, 2) # Registernumber, number of decimals 106 conductivity = instrument.read_float(0x55, 3, 2) # Registernumber, number of decimals
106 salinity = instrument.read_float(0x57, 3, 2) # Registernumber, number of decimals 107 salinity = instrument.read_float(0x57, 3, 2) # Registernumber, number of decimals
107 tds_kcl = instrument.read_float(0x59, 3, 2) # Registernumber, number of decimals 108 tds_kcl = instrument.read_float(0x59, 3, 2) # Registernumber, number of decimals
108 109
109 ## Read data from pH sensor ## 110 ## Read data from pH sensor ##
110 instrument.address = 0x14 # this is the slave address number (14 - pH) 111 instrument.address = 0x14 # this is the slave address number (14 - pH)
111 112
112 temperature2 = instrument.read_float(0x53, 3, 2) # Registernumber, number of decimals 113 temperature2 = instrument.read_float(0x53, 3, 2) # Registernumber, number of decimals
113 pH = instrument.read_float(0x55, 3, 2) # Registernumber, number of decimals 114 pH = instrument.read_float(0x55, 3, 2) # Registernumber, number of decimals
114 redox = instrument.read_float(0x57, 3, 2) # Registernumber, number of decimals 115 redox = instrument.read_float(0x57, 3, 2) # Registernumber, number of decimals
115   116  
116 sys.stdout.write("%s \t %0.3f \t %0.3f \t %0.3f \t %0.3f \t %0.3f \t %0.3f \t %0.3f \t %0.3f \t \n" % (datetime.datetime.now().isoformat(), channel1, temperature1, conductivity, salinity, tds_kcl, temperature2, pH, redox)) 117 sys.stdout.write("%s \t %0.3f \t %0.3f \t %0.3f \t %0.3f \t %0.3f \t %0.3f \t %0.3f \t %0.3f \t \n" % (datetime.datetime.now().isoformat(), channel1, temperature1, conductivity, salinity, tds_kcl, temperature2, pH, redox))
117   118  
118 f.write("%d;%0.3f;%0.3f;%0.3f;%0.3f;%0.3f;%0.3f;%0.3f;%0.3f\n" % (time.time(), channel1, temperature1, conductivity, salinity, tds_kcl, temperature2, pH, redox)) 119 f.write("%d;%0.3f;%0.3f;%0.3f;%0.3f;%0.3f;%0.3f;%0.3f;%0.3f\n" % (time.time(), channel1, temperature1, conductivity, salinity, tds_kcl, temperature2, pH, redox))
119 f.flush() 120 f.flush()
120   121  
121 sys.stdout.flush() 122 sys.stdout.flush()
122 before = time.time() 123 before = time.time()
123 else: 124 else:
124 time.sleep(0.1) 125 time.sleep(0.1)
125   126  
126 except KeyboardInterrupt: 127 except KeyboardInterrupt:
127 f.close() 128 f.close()
128 sys.exit(0) 129 sys.exit(0)
-   130 except Exception as e:
-   131 sys.stdout.write(e)
-   132 time.sleep(5)
129   133  
130   134