forked from arnekaas/DSMR-P1-usb-logger
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathread_p1_telegram.py
More file actions
executable file
·131 lines (111 loc) · 3.48 KB
/
Copy pathread_p1_telegram.py
File metadata and controls
executable file
·131 lines (111 loc) · 3.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# DSMR P1 uitlezen
# (c) 10-2012 - GJ - gratis te kopieren en te plakken
# update Matthijs Danes 27-12-2017
version = "2.0"
import sys
import serial
import signal
import os
#set timeonut
def handler(signum, frame):
ser.close()
print("Error handler called with errornum: ", signum)
raise OSError("No proper DSMR P1 telegram recieved.")
return
def read_DSMR_telegram(ser, telegram = ''):
#global ser
#global telegram
#global signal
#global handler
#Open COM port
ser.open()
# except:
# sys.exit ("Coul not open serial '%s'. Aaaaarch." % ser.name)
# Set the signal handler and a 15-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(15)
while True:
#proces serial line to string
p1_raw = ser.readline()
p1_str=str(p1_raw)
p1_line=p1_str.strip()
#print for debugging purpose
print (p1_line)
#add line to telegram
telegram += str(p1_line) + '\n'
# stop reading if '!' was found (DSMR telegram ends with it.)
if len(p1_line) > 0:
if p1_line[0] == '!':
#Close port and show status
try:
ser.close()
except:
sys.exit ("Oops %s. Program aborted. Could not close serial port" % ser.name )
break
signal.alarm(0) # Disable the alarm
return telegram
def create_log_folder(dirout=os.path.dirname(os.path.realpath(__file__)),
logfolder="../data/logs"):
# Create "logs" folder if not exists.
if not os.path.exists(os.path.join(dirout,logfolder)):
os.makedirs(os.path.join(dirout,logfolder))
return
def read_p1_telegram(dirout=os.path.dirname(os.path.realpath(__file__)),
logfolder="../data",
logfile="lastP1read.txt"):
global type
create_log_folder(dirout=dirout,logfolder=logfolder)
# print ("USB DSMR P1 telegram reader, version " + version)
print ("Waiting for next telegram... Control-C to exit")
# Set COM port config
try:
ser
except:
ser = serial.Serial()
if type == 9600:
ser.baudrate = 9600
ser.bytesize = serial.SEVENBITS
ser.parity = serial.PARITY_EVEN
else:
ser.baudrate = 115200
ser.parity=serial.PARITY_NONE
ser.bytesize=serial.EIGHTBITS
ser.stopbits = serial.STOPBITS_ONE
ser.xonxoff = 0
ser.rtscts = 0
ser.timeout = 20
ser.port = "/dev/ttyUSB0" # use on raspberrypi ser.port="/dev/tty.usbserial-P11KXDOA" # use for testing on macs
try:
telegram = read_DSMR_telegram(ser)
except:
try:
ser.close()
except:
print("could not close serial")
print ("Increasing baudrate to 115200, retrying serial")
if type == 9600:
type = 115200
telegram = read_p1_telegram()
else:
type = 9600
telegram = 'read failed'
# ser.baudrate = 115200
# ser.parity=serial.PARITY_NONE
# ser.bytesize=serial.EIGHTBITS
# try:
# telegram = read_p1_telegram()
# except:
# print("115200 also failed, faling back to 9600")
# type = 9600
# ser.baudrate = 9600
# ser.bytesize=serial.SEVENBITS
# ser.parity=serial.PARITY_EVEN
text_file = open(os.path.join(dirout,logfolder,logfile), "w")
text_file.write(telegram)
text_file.close()
return telegram
def main():
telegram = read_p1_telegram()
return
if __name__ == "__main__":
main()