capture and import smartmeter data from Web Solar Log

Moderator: leecollings

kaatje
Posts: 6
Joined: Friday 20 February 2015 20:32
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: capture and import smartmeter data from Web Solar Log

Post by kaatje »

pi@domoticzpi ~/domoticz/scripts/Omnik-Data-Logger $ cat OmnikExport.py
#!/usr/bin/python

import InverterMsg # Import the Msg handler

import socket # Needed for talking to inverter
import datetime # Used for timestamp
import sys
import logging
import ConfigParser, os

# For PVoutput
import urllib, urllib2

# Load the setting
mydir = os.path.dirname(os.path.abspath(__file__))

config = ConfigParser.RawConfigParser()
config.read([mydir + '/config-default.cfg', mydir + '/config.cfg'])

# Receive data with a socket
ip = config.get('inverter','ip')
port = config.get('inverter','port')
use_temp = config.getboolean('inverter','use_temperature')
wifi_serial = config.getint('inverter', 'wifi_sn')

mysql_enabled = config.getboolean('mysql', 'mysql_enabled')
mysql_host = config.get('mysql','mysql_host')
mysql_user = config.get('mysql','mysql_user')
mysql_pass = config.get('mysql','mysql_pass')
mysql_db = config.get('mysql','mysql_db')

domoticz_enabled = 'true'
domoticz_host = '192.168.1.10'
domoticz_port = '8080'
domoticz_url = 'json.htm'
#domoticz_enabled = config.getboolean('domoticz','domoticz_enabled')
#domoticz_host = config.get('domoticz','domoticz_host')
#domoticz_port = config.get('domoticz','domoticz_port')
#domoticz_url = config.get('domoticz','domoticz_url')

domoticz_temp = config.get('domoticz','domoticz_temp')
domoticz_Input_PV1 = config.get('domoticz','domoticz_Input_PV1')
domoticz_Input_PV2 = config.get('domoticz','domoticz_Input_PV2')
domoticz_AC_Output = config.get('domoticz','domoticz_AC_Output')
domoticz_Cur_Total = config.get('domoticz','domoticz_Cur_Total')
domoticz_AMP_1_2_3 = config.get('domoticz','domoticz_AMP_1_2_3')


pvout_enabled = config.getboolean('pvout','pvout_enabled')
pvout_apikey = config.get('pvout','pvout_apikey')
pvout_sysid = config.get('pvout','pvout_sysid')

log_enabled = config.getboolean('log','log_enabled')
log_filename = mydir + '/' + config.get('log','log_filename')


server_address = ((ip, port))

logger = logging.getLogger('OmnikLogger')
hdlr = logging.FileHandler(log_filename)
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.DEBUG)

for res in socket.getaddrinfo(ip, port, socket.AF_INET , socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
if log_enabled:
logger.info('connecting to %s port %s' % server_address)
s = socket.socket(af, socktype, proto)
s.settimeout(10)
except socket.error as msg:
s = None
continue
try:
s.connect(sa)
except socket.error as msg:
s.close()
s = None
continue
break

if s is None:
if log_enabled:
logger.error('could not open socket')
sys.exit(1)

s.sendall(InverterMsg.generate_string(wifi_serial))
data = s.recv(1024)
s.close()

msg = InverterMsg.InverterMsg(data) # This is where the magic happens ;)
now = datetime.datetime.now()

if log_enabled:
logger.info("ID: {0}".format(msg.getID()))
# --------------------------------------------------
# Uploaden Temperature of Omnik Omvormer to Domoticz
# --------------------------------------------------

if domoticz_enabled:
url = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url)

if use_temp:
get_data = {
'svalue': msg.getTemp(),
'type': 'command',
'param': 'udevice',
'idx' : domoticz_temp,
'nvalue': '0'
}

else:
get_data = {
'svalue': msg.getTemp(),
'type': 'command',
'param': 'udevice',
'idx' : domoticz_temp,
'nvalue': '0'
}

get_data_encoded = urllib.urlencode(get_data)
request_object = urllib2.Request(url + '?' + get_data_encoded)
response = urllib2.urlopen(request_object)



# --------------------------------------------------
# Uploaden Input String (1) PV1 to Domoticz
# --------------------------------------------------

if use_temp:
get_data = {
'svalue': msg.getVPV(1),
'type': 'command',
'param': 'udevice',
'idx' : domoticz_Input_PV1,
'nvalue': '0'
}

else:
get_data = {
'svalue': msg.getVPV(1),
'type': 'command',
'param': 'udevice',
'idx' : domoticz_Input_PV1,
'nvalue': '0'
}

get_data_encoded = urllib.urlencode(get_data)
request_object = urllib2.Request(url + '?' + get_data_encoded)
response = urllib2.urlopen(request_object)

# --------------------------------------------------
# Uploaden Input String (2) PV2 to Domoticz
# --------------------------------------------------

if use_temp:
get_data = {
'svalue': msg.getVPV(2),
'type': 'command',
'param': 'udevice',
'idx' : domoticz_Input_PV2,
'nvalue': '0'
}

else:
get_data = {
'svalue': msg.getVPV(2),
'type': 'command',
'param': 'udevice',
'idx' : domoticz_Input_PV2,
'nvalue': '0'
}

get_data_encoded = urllib.urlencode(get_data)
request_object = urllib2.Request(url + '?' + get_data_encoded)
response = urllib2.urlopen(request_object)


# --------------------------------------------------
# Uploaden AC Power output to Domoticz
# --------------------------------------------------

if use_temp:
get_data = {
'svalue': msg.getVAC(1),
'type': 'command',
'param': 'udevice',
'idx' : domoticz_AC_Output,
'nvalue': '0'
}

else:
get_data = {
'svalue': msg.getVAC(1),
'type': 'command',
'param': 'udevice',
'idx' : domoticz_AC_Output,
'nvalue': '0'
}

get_data_encoded = urllib.urlencode(get_data)
request_object = urllib2.Request(url + '?' + get_data_encoded)
response = urllib2.urlopen(request_object)


# --------------------------------------------------
# Uploaden Current Power and Day Total to Domoticz
# --------------------------------------------------

if use_temp:
get_data = {
'svalue': str(msg.getPAC(1)) + ';' + str(msg.getEToday() * 1000),
'type': 'command',
'param': 'udevice',
'idx' : domoticz_Cur_Total,
'nvalue': '0'
}

else:
get_data = {
'svalue': str(msg.getPAC(1)) + ';' + str(msg.getEToday() * 1000),
'type': 'command',
'param': 'udevice',
'idx' : domoticz_Cur_Total,
'nvalue': '0'
}

get_data_encoded = urllib.urlencode(get_data)
request_object = urllib2.Request(url + '?' + get_data_encoded)
response = urllib2.urlopen(request_object)


# --------------------------------------------------
# Uploaden Ampere to Domoticz
# --------------------------------------------------

if use_temp:
get_data = {
'svalue': str(msg.getIPV(1)) + ';' + str(msg.getIPV(2)) + ';' + str(msg.getIAC(1)),
'type': 'command',
'param': 'udevice',
'idx' : domoticz_AMP_1_2_3,
'nvalue': '0'
}

else:
get_data = {
'svalue': str(msg.getIPV(1)) + ';' + str(msg.getIPV(2)) + ';' + str(msg.getIAC(1)),
'type': 'command',
'param': 'udevice',
'idx' : domoticz_AMP_1_2_3,
'nvalue': '0'
}

get_data_encoded = urllib.urlencode(get_data)
request_object = urllib2.Request(url + '?' + get_data_encoded)
response = urllib2.urlopen(request_object)
#-------------------------------------------------
#END OF DOMOTICZ ADJUSTMENT
#-------------------------------------------------

if mysql_enabled:
# For database output
import MySQLdb as mdb

if log_enabled:
logger.info('Uploading to database')
con = mdb.connect(mysql_host, mysql_user, mysql_pass, mysql_db);

with con:
cur = con.cursor()
cur.execute("""INSERT INTO minutes
(InvID, timestamp, ETotal, EToday, Temp, HTotal, VPV1, VPV2, VPV3,
IPV1, IPV2, IPV3, VAC1, VAC2, VAC3, IAC1, IAC2, IAC3, FAC1, FAC2,
FAC3, PAC1, PAC2, PAC3)
VALUES
(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
%s, %s, %s, %s, %s, %s, %s);""",
(msg.getID(), now, msg.getETotal(),
msg.getEToday(), msg.getTemp(), msg.getHTotal(), msg.getVPV(1),
msg.getVPV(2), msg.getVPV(3), msg.getIPV(1), msg.getIPV(2),
msg.getIPV(3), msg.getVAC(1), msg.getVAC(2), msg.getVAC(3),
msg.getIAC(1), msg.getIAC(2), msg.getIAC(3), msg.getFAC(1),
msg.getFAC(2), msg.getFAC(3), msg.getPAC(1), msg.getPAC(2),
msg.getPAC(3)) );


if pvout_enabled and (now.minute % 5) == 0:
if log_enabled:
logger.info('Uploading to PVoutput')
url = "http://pvoutput.org/service/r2/addstatus.jsp"

if use_temp:
get_data = {
'key': pvout_apikey,
'sid': pvout_sysid,
'd': now.strftime('%Y%m%d'),
't': now.strftime('%H:%M'),
'v1': msg.getEToday() * 1000,
'v2': msg.getPAC(1),
'v5': msg.getTemp(),
'v6': msg.getVPV(1)
}
else:
get_data = {
'key': pvout_apikey,
'sid': pvout_sysid,
'd': now.strftime('%Y%m%d'),
't': now.strftime('%H:%M'),
'v1': msg.getEToday() * 1000,
'v2': msg.getPAC(1),
'v6': msg.getVPV(1)
}

get_data_encoded = urllib.urlencode(get_data) # UrlEncode the parameters

request_object = urllib2.Request(url + '?' + get_data_encoded) # Create request object
response = urllib2.urlopen(request_object) # Make the request and store the response

if log_enabled:
logger.info(response.read()) # Show the response
kaatje
Posts: 6
Joined: Friday 20 February 2015 20:32
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: capture and import smartmeter data from Web Solar Log

Post by kaatje »

and config
pi@domoticzpi ~/domoticz/scripts/Omnik-Data-Logger $ cat config.cfg
################
### Settings ###
################

[inverter]
# IP address of your Omnik inverter
ip = 192.168.1.30
# Default for a Omnik with Wifi module
port = 8899
# S/N of the wifi kit
wifi_sn = 602xxxxx
#use temperature of inverter for pvoutput
use_temperature = true

[mysql]
# Enable for exporting to a mysql database
mysql_enabled = false
# Host where the mysql server is active
mysql_host = 127.0.0.1
mysql_user =
mysql_pass =
mysql_db =

[pvout]
# Enable or disable uploading to PVoutput
pvout_enabled = true
# These two can be found at http://pvoutput.org/account.jsp
pvout_apikey = a6203somekey3506c1cc489d
pvout_sysid = 187483

[log]
log_enabled = true
log_filename = omnik-export.log


[domoticz]
domoticz_enabled = true
domoticz_host = 192.168.1.10
domoticz_port = 8080
domoticz_url = json.htm

# Provide IDX here of the specific devices
domoticz_temp = 15
domoticz_Input_PV1 = 11
domoticz_Input_PV2 = 10
domoticz_AC_Output = 12
domoticz_Cur_Total = 14
domoticz_AMP_1_2_3 = 16
Solar
Posts: 2
Joined: Monday 23 March 2015 15:09
Target OS: -
Domoticz version:
Contact:

capture and import smartmeter data from Web Solar Log

Post by Solar »

Is there anyone who can help me with the script if you have 2 inverters. The script for one works perfect.
User avatar
sincze
Posts: 1299
Joined: Monday 02 June 2014 22:46
Target OS: Raspberry Pi / ODroid
Domoticz version: 2024.4
Location: Netherlands / Breda Area
Contact:

Re: capture and import smartmeter data from Web Solar Log

Post by sincze »

Solar wrote:Is there anyone who can help me with the script if you have 2 inverters. The script for one works perfect.
Maybe we need to create 2 scripts one for each inverter, as each inverter can be triggered via a unique package.
Or did you already solve this in a different way?
Pass2php
LAN: RFLink, P1, OTGW, MySensors
USB: RFXCom, ZWave, Sonoff 3
MQTT: ZIgbee2MQTT,
ZWAVE: Zwave-JS-UI
WIFI: Mi-light, Tasmota, Xiaomi Shelly
Solar: Omnik, PVOutput
Video: Kodi, Harmony HUB, Chromecast
Sensors: You name it I got 1.
Nicap
Posts: 6
Joined: Sunday 14 December 2014 23:38
Target OS: Raspberry Pi / ODroid
Domoticz version: Latest B
Contact:

Re: capture and import smartmeter data from Web Solar Log

Post by Nicap »

I tried this script too, but this is what i get:

Code: Select all

pi@domoticzpi ~ $ sudo python /home/pi/Omnik-Data-Logger/OmnikExport.py
  File "/home/pi/Omnik-Data-Logger/OmnikExport.py", line 67
    af, socktype, proto, canonname, sa = res
     ^
IndentationError: expected an indented block
Someone an idea?

It's a copy from the code of the user kaatje
arnaudarduino
Posts: 21
Joined: Wednesday 06 July 2016 22:31
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: capture and import smartmeter data from Web Solar Log

Post by arnaudarduino »

Hello
I copied Omnik-Data-Logger en followd the post from kaatje.
But i can't get it to work.
Anyone can help?
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest