Ik ben bezig om aan mijn database met meetwaardes van mijn slimme meter ook de temperatuur binnen en buiten toe te voegen om zodoende de correlatie tussen de temperatuur en gasverbruik inzichtelijk te maken.
Voor het inlezen van de gegevens van mijn slimme meter maak ik gebruik van het volgende script:
Dit script werk helemaal goed. Dus heb dit script als uitgangspunt genomen om ook een temperatuur log script te maken. Ondanks dat (voor mij) op eerste gezicht alles hetzelfde lijkt, werkt het script niet en krijg ik de volgende foutmelding:
Het temperatuurlog script, dat de foutmelding geeft:
In beide scripts heb ik de regel : print (add_meting, data_meting) toegevoegd om te controleren hoe de INSERT plaats vindt
Niet werkend:
Wel werkend:
Dit zijn de tabbellen, waar de data ingelezen wordt:
tbl_meetwaarden:
tbl_templog

Zelf heb ik al geprobeerd om de waardes om te zetten naar float en integer. Ook heb ik geprobeerd om de tabel in te stellen als varchar en vervolgens de data als string in te lezen, echter zonder succes.
Zelf denk ik dat het niet aan het datatype ligt, bij een verkeerd datatype krijg ik nl. een formatting error, terwijl nu er iets fout zou zijn in de syntax. Misschien loop ik me er al te lang op blind te staren, maar ik zie het dus echt niet.
Voor het inlezen van de gegevens van mijn slimme meter maak ik gebruik van het volgende script:
Python:
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
| #!/usr/bin/env python # # DSMR P1 uitlezer # (c) 10-2012 - GJ - gratis te kopieren en te plakken versie = "1.0" import sys import serial ################ #Error display # ################ def show_error(): ft = sys.exc_info()[0] fv = sys.exc_info()[1] print("Fout type: %s" % ft ) print("Fout waarde: %s" % fv ) return ################################################################################################################################################ #Main program ################################################################################################################################################ #print ("DSMR P1 uitlezer", versie) #print ("Control-C om te stoppen") #Set COM port config ser = serial.Serial() ser.baudrate = 115200 ser.bytesize=serial.EIGHTBITS ser.parity=serial.PARITY_NONE ser.stopbits=serial.STOPBITS_ONE ser.xonxoff=0 ser.rtscts=0 ser.timeout=20 ser.port="/dev/ttyAMA0" #Open COM port try: ser.open() except: sys.exit ("Fout bij het openen van %s. Programma afgebroken." % ser.name) #Initialize # stack is mijn list met de 20 regeltjes. p1_teller=0 stack=[] while p1_teller < 29: p1_line='' #Read 1 line try: p1_raw = ser.readline() except: sys.exit ("Seriele poort %s kan niet gelezen worden. Programma afgebroken." % ser.name ) p1_str=str(p1_raw) #p1_str=str(p1_raw, "utf-8") p1_line=p1_str.strip() stack.append(p1_line) # als je alles wil zien moet je de volgende line uncommenten # print (p1_line) p1_teller = p1_teller +1 #Initialize # stack_teller is mijn tellertje voor de 20 weer door te lopen. Waarschijnlijk mag ik die p1_teller ook gebruiken stack_teller=0 while stack_teller < 29: if stack[stack_teller][0:9] == "1-0:1.8.1": dal = stack[stack_teller][10:20] print dal, "kWh" elif stack[stack_teller][0:9] == "1-0:1.8.2": piek = stack[stack_teller][10:20] print piek, "kWh" # Huidige stroomafname: 1-0:1.7.0 elif stack[stack_teller][0:9] == "1-0:1.7.0": huidig = stack[stack_teller][10:16] print huidig, "Watt" # Gasmeter: 0-1:24.3.0 elif stack[stack_teller][0:10] == "0-1:24.2.1": gas = stack[stack_teller][26:35] print gas, "m3" else: pass stack_teller = stack_teller +1 # Data inlezen in de Database import MySQLdb as mdb # warnings.filterwarnings('ignore', 'Data truncated for column .*') con = mdb.connect('localhost', '******', '********', 'energie'); cur = con.cursor() add_meting = ("INSERT INTO energie.tbl_meetwaarden " "(id, time, laag, hoog, huidig, gas) " "VALUES (NULL,NULL,%(dal)s, %(piek)s, %(huidig)s, %(gas)s)") # Insert meting information data_meting = { 'dal': dal, 'piek': piek, 'huidig': int(float(huidig)*1000), 'gas': gas, } print (add_meting, data_meting) cur.execute(add_meting, data_meting) con.commit() cur.close() con.close() #Close port and show status try: ser.close() except: sys.exit ("Oops %s. Programma afgebroken." % ser.name ) |
Dit script werk helemaal goed. Dus heb dit script als uitgangspunt genomen om ook een temperatuur log script te maken. Ondanks dat (voor mij) op eerste gezicht alles hetzelfde lijkt, werkt het script niet en krijg ik de volgende foutmelding:
code:
1
2
3
4
5
6
7
8
9
| ('INSERT INTO energie.tbl_templog (id, time, temp_binnen, temp_buiten, hum_binnen) VALUES (NULL,NULL,%(temp_binnen)s, %(temp_buiten)s, %(hum_binnen)s ', {'temp_binnen': 21.75, 'hum_binnen': 0, 'temp_buiten': 9.94}) Traceback (most recent call last): File "templog.py", line 49, in <module> cur.execute(add_meting, data_meting) File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute self.errorhandler(self, exc, value) File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler raise errorclass, errorvalue _mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1") |
Het temperatuurlog script, dat de foutmelding geeft:
Python:
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
| import time sensorids = ["28-000004cea41f", "28-000005e36d6c"] avgtemperatures = [] for sensor in range(len(sensorids)): temperatures = [] for polltime in range(0,3): text = ''; while text.split("\n")[0].find("YES") == -1: tfile = open("/sys/bus/w1/devices/"+ sensorids[sensor] +"/w1_slave") text = tfile.read() tfile.close() time.sleep(1) secondline = text.split("\n")[1] temperaturedata = secondline.split(" ")[9] temperature = float(temperaturedata[2:]) temperatures.append(temperature / 1000) avgtemperatures.append(sum(temperatures) / float(len(temperatures))) buiten = "%.2f" % avgtemperatures[0] binnen = "%.2f" % avgtemperatures[1] hum = 0 # Data inlezen in de Database import MySQLdb as mdb con = mdb.connect('localhost', '*******', '*******', 'energie'); cur = con.cursor() add_meting = ("INSERT INTO energie.tbl_templog " "(id, time, temp_binnen, temp_buiten, hum_binnen) " "VALUES (NULL,NULL,%(temp_binnen)s, %(temp_buiten)s, %(hum_binnen)s ") # Meeting Informatie Toevoegen data_meting = { 'temp_binnen': float(binnen), 'temp_buiten': float(buiten), 'hum_binnen': int(hum), } print (add_meting, data_meting) cur.execute(add_meting, data_meting) con.commit() cur.close() con.close() |
In beide scripts heb ik de regel : print (add_meting, data_meting) toegevoegd om te controleren hoe de INSERT plaats vindt
Niet werkend:
code:
1
| ('INSERT INTO energie.tbl_templog (id, time, temp_binnen, temp_buiten, hum_binnen) VALUES (NULL,NULL,%(temp_binnen)s, %(temp_buiten)s, %(hum_binnen)s ', {'temp_binnen': '21.75', 'hum_binnen': 0, 'temp_buiten': '9.88'}) |
Wel werkend:
code:
1
| ('INSERT INTO energie.tbl_meetwaarden (id, time, laag, hoog, huidig, gas) VALUES (NULL,NULL,%(dal)s, %(piek)s, %(huidig)s, %(gas)s)', {'dal': '000076.570', 'huidig': 669, 'gas': '00022.720', 'piek': '000000.000'}) |
Dit zijn de tabbellen, waar de data ingelezen wordt:
tbl_meetwaarden:

tbl_templog

Zelf heb ik al geprobeerd om de waardes om te zetten naar float en integer. Ook heb ik geprobeerd om de tabel in te stellen als varchar en vervolgens de data als string in te lezen, echter zonder succes.
Zelf denk ik dat het niet aan het datatype ligt, bij een verkeerd datatype krijg ik nl. een formatting error, terwijl nu er iets fout zou zijn in de syntax. Misschien loop ik me er al te lang op blind te staren, maar ik zie het dus echt niet.
Heb je iets aan mijn antwoord ? Een thumbs-up wordt zeker op prijs gesteld.