#!/usr/bin/python # -* coding: utf-8 *- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Developed 2009-2010 by Bernd Wurst # for own use. # Released to the public in 2012. import time, sys, os from solarmax import SolarMax from sqlite3 import dbapi2 as sqlite DB_FILE=sys.argv[1] inverters = { '192.168.0.201': [1,], '192.168.0.202': [2,], '192.168.0.203': [3,], '192.168.0.204': [4,], } smlist = [] for host in inverters.keys(): sm = SolarMax(host, 12345) sm.use_inverters(inverters[host]) smlist.append(sm) allinverters = [] for host in inverters.keys(): allinverters.extend(inverters[host]) dbconn = sqlite.connect(DB_FILE) db = dbconn.cursor() while True: pac_gesamt = 0.0 daysum_gesamt = 0.0 count = 0 for sm in smlist: for (no, ivdata) in sm.inverters().iteritems(): try: (inverter, current) = sm.query(no, ['PAC', 'KDY', 'KT0', 'IDC', 'UDC', 'IL1', 'UL1', 'FDAT', 'SYS']) count += 1 except: # Kommunikationsfehler, evtl. Wechselrichter aus print 'Kommunikationsfehler, WR %i' % no continue ivmax = ivdata['installed'] ivname = ivdata['desc'] PAC = current['IL1'] * current['UL1'] percent = int((PAC/ivmax) * 100) PDC = current['IDC'] * current['UDC'] (status, errors) = sm.status(no) if errors: print 'WR %i: %s (%s)' % (no, status, errors) #print ''' #WR %i (%s) #Status: %s #Aktuell: %9.1f Watt / errechnet: %8.1f W (%i %% von %i Watt) #P_DC: %9.1f Watt (Wirkungsgrad: %i %%) #Gesamt heute: %8.1f kWh #Gesamt bisher: %8.1f kWh (seit %s) #''' % (inverter, ivname, status, current['PAC'], PAC, percent, ivmax, PDC, int((float(PAC)/PDC) * 100), current['KDY'], current['KT0'], current['FDAT'].date()) try: # Könnte gelocked sein # System ist 2 in diesem Fall. Fix. db.execute('''INSERT INTO performance (time, inverter, system, pac, daysum, total) VALUES (strftime('%%s','now'), %i, 2, %i, %i, %i)''' % (inverter, int(current['PAC']), int(current['KDY']*1000), int(current['KT0']*1000))) except: pass pac_gesamt += current['PAC'] daysum_gesamt += current['KDY'] try: dbconn.commit() except: pass if count < len(allinverters): print 'Zu wenig Wechselrichter (%i < %i)' % (count, len(allinverters)) #print '='*80 #print 'GESAMT: %9.2f Watt / Heute: %8.1f kWh' % (pac_gesamt, daysum_gesamt) time.sleep(10)