Easymeter auslesen - Problem
Verfasst: Freitag 5. Januar 2018, 11:14
Guten Tag,
Ich habe im Net das ein Programm gefunden welches mein Strom Zähler Easymeter Q3D auslesen und die werte in Python ausgeben soll. Bekomme immer folgende Meldung wenn Ich das folgende Script starte:
---------------------------------------------------------------------------------------------------------------------------
Python 2.7.9 (default, Sep 17 2016, 20:26:04)
[GCC 4.9.2] on linux2
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "/home/pi/rrd12.py", line 16, in <module>
if sys.argv[1] == 'A+': # Meter reading import
IndexError: list index out of range
>>>
---------------------------------------------------------------------------------------------------------------------------
Den code den ich benutze ist folgender:
import serial, sys
ser = serial.Serial(port='/dev/ttyUSB0', baudrate=9600, bytesize=7, parity='E', timeout=1)
reading = ser.read(300).decode("utf-8")
ser.flushInput()
# Try again if reading was unsuccessful
if reading.find('/',0) <> 0:
reading = ser.read(300).decode("utf-8")
ser.flushInput()
ser.close()
if len(sys.argv) > 2:
print ("Aborting: To many arguments"), sys.exit()
else:
if sys.argv[1] == 'A+': # Meter reading import
start = reading.find('1-0:1.8.0')
s_id = 1
elif sys.argv[1] == 'A-': # Meter reading export
start = reading.find('1-0:2.8.0')
s_id = 2
elif sys.argv[1] == 'L1': # Power L1
start = reading.find('1-0:21.7.255')
s_id = 3
elif sys.argv[1] == 'L2': # Power L2
start = reading.find('1-0:41.7.255')
s_id = 4
elif sys.argv[1] == 'L3': # Power L3
start = reading.find('1-0:61.7.255')
s_id = 5
elif sys.argv[1] == 'In': # Power total in
start = reading.find('1-0:1.7.255')
s_id = 1
elif sys.argv[1] == 'Out': # Power total out
start = reading.find('1-0:1.7.255')
s_id = 2
else:
print ("Aborting:", sys.argv[1] ,"is not a valid argument"),sys.exit()
idx_StartValue = reading.find('(', start) # Start index of value string
idx_Seperator = reading.find('*', idx_StartValue) # Index of seperator character
idx_EndUnit = reading.find(')', idx_Seperator) # End index of unit string
s_value = reading[idx_StartValue+1:idx_Seperator] # Value as string
s_unit = reading[idx_Seperator+1:idx_EndUnit] # Unit as string
s_prefix = reading[idx_Seperator+1:idx_Seperator+2] # Assume 1st character as prefix
if s_prefix == 'k': # Allocate value and prefix
r_value = float(s_value)*1000
s_unit = s_unit[1:]
else:
r_value = float(s_value)
# Adapt acutal values
if sys.argv[1] == 'In' and r_value <= 0 : # Set value to 0 if negative
r_value = 0
elif sys.argv[1] == 'Out' : # Invert value if negative, set to 0 if positive
if r_value <= 0:
r_value = r_value * -1
else:
r_value = 0
result = str(s_id) + '(' + str(r_value) + '*' + s_unit + ')' # create P1 string
print result.encode('utf-8')
quit()
#/ESY5Q3DA2024 V3.03
#
#1-0:0.0.0*255(184293)
#1-0:1.8.0*255(00004209.8821908*kWh)
#1-0:2.8.0*255(00007505.1469667*kWh)
#1-0:21.7.255*255(000107.34*W)
#1-0:41.7.255*255(000192.22*W)
#1-0:61.7.255*255(000226.02*W)
#1-0:1.7.255*255(000525.58*W)
#1-0:96.5.5*255(82)
#0-0:96.1.255*255(1ESY1213007893)
#!
Ich würde mich sehr über Lösungsvorschläge freuen, vielen Dank im Voraus !
Seecosea
Ich habe im Net das ein Programm gefunden welches mein Strom Zähler Easymeter Q3D auslesen und die werte in Python ausgeben soll. Bekomme immer folgende Meldung wenn Ich das folgende Script starte:
---------------------------------------------------------------------------------------------------------------------------
Python 2.7.9 (default, Sep 17 2016, 20:26:04)
[GCC 4.9.2] on linux2
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "/home/pi/rrd12.py", line 16, in <module>
if sys.argv[1] == 'A+': # Meter reading import
IndexError: list index out of range
>>>
---------------------------------------------------------------------------------------------------------------------------
Den code den ich benutze ist folgender:
import serial, sys
ser = serial.Serial(port='/dev/ttyUSB0', baudrate=9600, bytesize=7, parity='E', timeout=1)
reading = ser.read(300).decode("utf-8")
ser.flushInput()
# Try again if reading was unsuccessful
if reading.find('/',0) <> 0:
reading = ser.read(300).decode("utf-8")
ser.flushInput()
ser.close()
if len(sys.argv) > 2:
print ("Aborting: To many arguments"), sys.exit()
else:
if sys.argv[1] == 'A+': # Meter reading import
start = reading.find('1-0:1.8.0')
s_id = 1
elif sys.argv[1] == 'A-': # Meter reading export
start = reading.find('1-0:2.8.0')
s_id = 2
elif sys.argv[1] == 'L1': # Power L1
start = reading.find('1-0:21.7.255')
s_id = 3
elif sys.argv[1] == 'L2': # Power L2
start = reading.find('1-0:41.7.255')
s_id = 4
elif sys.argv[1] == 'L3': # Power L3
start = reading.find('1-0:61.7.255')
s_id = 5
elif sys.argv[1] == 'In': # Power total in
start = reading.find('1-0:1.7.255')
s_id = 1
elif sys.argv[1] == 'Out': # Power total out
start = reading.find('1-0:1.7.255')
s_id = 2
else:
print ("Aborting:", sys.argv[1] ,"is not a valid argument"),sys.exit()
idx_StartValue = reading.find('(', start) # Start index of value string
idx_Seperator = reading.find('*', idx_StartValue) # Index of seperator character
idx_EndUnit = reading.find(')', idx_Seperator) # End index of unit string
s_value = reading[idx_StartValue+1:idx_Seperator] # Value as string
s_unit = reading[idx_Seperator+1:idx_EndUnit] # Unit as string
s_prefix = reading[idx_Seperator+1:idx_Seperator+2] # Assume 1st character as prefix
if s_prefix == 'k': # Allocate value and prefix
r_value = float(s_value)*1000
s_unit = s_unit[1:]
else:
r_value = float(s_value)
# Adapt acutal values
if sys.argv[1] == 'In' and r_value <= 0 : # Set value to 0 if negative
r_value = 0
elif sys.argv[1] == 'Out' : # Invert value if negative, set to 0 if positive
if r_value <= 0:
r_value = r_value * -1
else:
r_value = 0
result = str(s_id) + '(' + str(r_value) + '*' + s_unit + ')' # create P1 string
print result.encode('utf-8')
quit()
#/ESY5Q3DA2024 V3.03
#
#1-0:0.0.0*255(184293)
#1-0:1.8.0*255(00004209.8821908*kWh)
#1-0:2.8.0*255(00007505.1469667*kWh)
#1-0:21.7.255*255(000107.34*W)
#1-0:41.7.255*255(000192.22*W)
#1-0:61.7.255*255(000226.02*W)
#1-0:1.7.255*255(000525.58*W)
#1-0:96.5.5*255(82)
#0-0:96.1.255*255(1ESY1213007893)
#!
Ich würde mich sehr über Lösungsvorschläge freuen, vielen Dank im Voraus !
Seecosea