Skip to content

Commit 992b030

Browse files
committed
Update the use of temperature reading, now outside temp is fetched from the web
Added prelim support to upload Smart meter (slimme meter) data
1 parent 33f5917 commit 992b030

File tree

5 files changed

+114
-35
lines changed

5 files changed

+114
-35
lines changed

LiveStats.py

+5
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@
6363
#sock.close
6464

6565
msg = InverterMsg(data) # This is where the magic happens ;)
66+
now = datetime.datetime.now()
67+
68+
print "Time: ", now.strftime('%H:%M')
69+
print "Date: ", now.strftime('%Y%m%d')
70+
6671
print "ID: {0}".format(msg.getID())
6772

6873
print "E Today: {0:>5} Total: {1:<5}".format(msg.getEToday(), msg.getETotal())

OmnikExport.py

+83-34
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
import socket # Needed for talking to inverter
66
import datetime # Used for timestamp
77
import sys
8+
import re
89
import logging
910
import ConfigParser, os
11+
from os import path
12+
1013

1114
# For PVoutput
1215
import urllib, urllib2
@@ -29,10 +32,17 @@
2932
mysql_pass = config.get('mysql','mysql_pass')
3033
mysql_db = config.get('mysql','mysql_db')
3134

35+
smartmeter = config.getboolean('smartmeter','read_smartmeter')
36+
smartmeter_file = config.get('smartmeter', 'data_file')
37+
3238
pvout_enabled = config.getboolean('pvout','pvout_enabled')
3339
pvout_apikey = config.get('pvout','pvout_apikey')
3440
pvout_sysid = config.get('pvout','pvout_sysid')
3541

42+
read_remote_temperature = config.getboolean('temperature','read_remote_temperature')
43+
temperature_city = config.get('temperature','city')
44+
temperature_country = config.get('temperature','country')
45+
3646
log_enabled = config.getboolean('log','log_enabled')
3747
log_filename = mydir + '/' + config.get('log','log_filename')
3848

@@ -46,6 +56,17 @@
4656
logger.addHandler(hdlr)
4757
logger.setLevel(logging.DEBUG)
4858

59+
if read_remote_temperature:
60+
import serial
61+
import yweather
62+
client = yweather.Client()
63+
loc = temperature_city + ', ' + temperature_country
64+
id = client.fetch_woeid(loc)
65+
loc_weather = client.fetch_weather(id, metric=True)
66+
local_temp = float(loc_weather["condition"]["temp"])
67+
logger.debug("Local temperature is %s" % local_temp)
68+
69+
4970
for res in socket.getaddrinfo(ip, port, socket.AF_INET , socket.SOCK_STREAM):
5071
af, socktype, proto, canonname, sa = res
5172
try:
@@ -58,6 +79,7 @@
5879
continue
5980
try:
6081
s.connect(sa)
82+
inverter_online = True
6183
except socket.error as msg:
6284
s.close()
6385
s = None
@@ -67,17 +89,22 @@
6789
if s is None:
6890
if log_enabled:
6991
logger.error('could not open socket')
70-
sys.exit(1)
92+
inverter_online = False
7193

72-
s.sendall(InverterMsg.generate_string(wifi_serial))
73-
data = s.recv(1024)
74-
s.close()
7594

76-
msg = InverterMsg.InverterMsg(data) # This is where the magic happens ;)
95+
if inverter_online:
96+
s.sendall(InverterMsg.generate_string(wifi_serial))
97+
data = s.recv(1024)
98+
s.close()
99+
100+
msg = InverterMsg.InverterMsg(data) # This is where the magic happens ;)
101+
102+
77103
now = datetime.datetime.now()
78104

79105
if log_enabled:
80-
logger.info("ID: {0}".format(msg.getID()))
106+
if inverter_online:
107+
logger.info("ID: {0}".format(msg.getID()))
81108

82109

83110
if mysql_enabled:
@@ -105,38 +132,60 @@
105132
msg.getFAC(2), msg.getFAC(3), msg.getPAC(1), msg.getPAC(2),
106133
msg.getPAC(3)) );
107134

135+
136+
if smartmeter:
137+
logger.info('Reading smartmeter file')
138+
with open(smartmeter_file , "r") as f:
139+
for line in f:
140+
if line.startswith('actual_usage.'):
141+
s = line
142+
actual_usage = s.split()[-1]
143+
actual_usage.rstrip()
144+
145+
f.close()
146+
logger.debug("Actual usage was read %s", actual_usage)
147+
108148
if pvout_enabled and (now.minute % 5) == 0:
109149
if log_enabled:
110150
logger.info('Uploading to PVoutput')
111151
url = "http://pvoutput.org/service/r2/addstatus.jsp"
112-
113-
if use_temp:
114-
get_data = {
115-
'key': pvout_apikey,
116-
'sid': pvout_sysid,
117-
'd': now.strftime('%Y%m%d'),
118-
't': now.strftime('%H:%M'),
119-
'v1': msg.getEToday() * 1000,
120-
'v2': msg.getPAC(1),
121-
'v5': msg.getTemp(),
122-
'v6': msg.getVPV(1)
123-
}
124-
else:
152+
153+
154+
if (inverter_online == True or smartmeter == True):
155+
#Only send data to pvoutput if the inverter is online or we have a smartmeter (consumption)
125156
get_data = {
126-
'key': pvout_apikey,
127-
'sid': pvout_sysid,
128-
'd': now.strftime('%Y%m%d'),
129-
't': now.strftime('%H:%M'),
130-
'v1': msg.getEToday() * 1000,
131-
'v2': msg.getPAC(1),
132-
'v6': msg.getVPV(1)
133-
}
134-
135-
get_data_encoded = urllib.urlencode(get_data) # UrlEncode the parameters
136-
137-
request_object = urllib2.Request(url + '?' + get_data_encoded) # Create request object
138-
response = urllib2.urlopen(request_object) # Make the request and store the response
157+
'key' : pvout_apikey,
158+
'sid' : pvout_sysid,
159+
'd' : now.strftime('%Y%m%d'),
160+
't' : now.strftime('%H:%M')
161+
}
162+
if inverter_online:
163+
get_data['v1'] = msg.getEToday() * 1000
164+
get_data['v2'] = msg.getPAC(1)
165+
get_data['v6'] = msg.getVPV(1)
166+
167+
if ( ( use_temp == True and inverter_online == True) or read_remote_temperature == True):
168+
if (use_temp == True and inverter_online == True):
169+
temp_reading = msg.getTemp()
170+
if (read_remote_temperature == True):
171+
#Overwrite the reading from real value
172+
temp_reading = local_temp
173+
174+
get_data['v5'] = temp_reading
175+
176+
if smartmeter:
177+
get_data['v4'] = actual_usage
178+
179+
get_data_encoded = urllib.urlencode(get_data) # UrlEncode the parameters
139180

140-
if log_enabled:
141-
logger.info(response.read()) # Show the response
181+
logger.debug("Sending url: %s " % url + '?' + get_data_encoded)
182+
183+
request_object = urllib2.Request(url + '?' + get_data_encoded) # Create request object
184+
response = urllib2.urlopen(request_object) # Make the request and store the response
142185

186+
if log_enabled:
187+
logger.info("Response from server: %s" % response.read()) # Show the response
188+
else:
189+
if log_enabled:
190+
logger.debug("Inverter is offline and no smartmeter installed") # Show the response
191+

README.md

+8
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ status.
1212
## Installation and Setup
1313

1414
* Install Python
15+
* To use your local weather install yweather `pip install yweather`, and update your config with city and country
1516
* Git clone the source with `git clone https://github.com/Woutrrr/Omnik-Data-Logger.git`
1617
* Copy the config-org.cfg to config.cfg
1718
* Change the settings in config.cfg
@@ -20,6 +21,13 @@ data from your inverter
2021
* Run the script with `python OmnikExport.py` or better set a scheduled task or
2122
cronjob.
2223

24+
### Smart meter (Slimme meter)
25+
To upload your current usage to pvoutput, there must be a file to read in which this data can be found
26+
In this file there must by a string like this:
27+
`actual_usage 120.0`
28+
Which means current usage is 120W
29+
See the example is the Resources folder `slimme_meter.txt`
30+
2331
### Example cronjob
2432
With these options this will execute the script every minute.
2533

Resources/slimme_meter.txt

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
low tariff.value 27.365
2+
normal_tariff.value 0.000
3+
low_tariff_produced.value 13.471
4+
normal_tariff_produced.value 0.000
5+
actual_usage.value 0.0
6+
actual_production.value 270.0
7+
gas_usage.value 10.601

config-org.cfg

+11-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ port = 8899
1010
# S/N of the wifi kit
1111
wifi_sn = 602123456
1212
#use temperature of inverter for pvoutput
13-
use_temperature = true
13+
use_temperature = false
1414

1515
[mysql]
1616
# Enable for exporting to a mysql database
@@ -21,6 +21,16 @@ mysql_user =
2121
mysql_pass =
2222
mysql_db =
2323

24+
[smartmeter]
25+
read_smartmeter = true
26+
data_file = /home/robl/p1/P1uitlezer.txt
27+
28+
29+
[temperature]
30+
read_remote_temperature = true
31+
city = Haarlem
32+
country = The Netherlands
33+
2434
[pvout]
2535
# Enable or disable uploading to PVoutput
2636
pvout_enabled = true

0 commit comments

Comments
 (0)