Webseite: http://egneos.de/portfoli/projekt-neos-wind-1/
Lage: http://www.openstreetmap.org/node/3996237479#map=15/51.3463/13.3807
Typ: Enercon E-101 http://www.enercon.de/produkte/ep-3/e-101/
Dokumentation und Quelltext: https://github.com/kolossos/energy-tests/blob/master/Dokumente/energy/PyOPC-visualizeSQLite3.ipynb
Man besitzt nur das, was man aufschrauben und wo man reinschauen kann.
Anlagedaten
Temperaturdaten
Historische Daten werden aggregiert als Min, Max und Mittelwert gespeichert. Alle Datensätze mit Zeitstempel (UTC).
#!/usr/bin/env python
%matplotlib inline
#from PyOPC.OPCContainers import *
#from PyOPC.XDAClient import XDAClient
import time
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sqlalchemy import create_engine # database connection
import datetime as dt
from IPython.display import display
from IPython.display import clear_output
import scipy.stats
#http://pyopc.sourceforge.net/
#https://plot.ly/python/big-data-analytics-with-pandas-and-sqlite/
disk_engine = create_engine('sqlite:///egneos2.db')
df = pd.read_sql_query('SELECT *'
' FROM Wecstd_Raw limit 720 offset (select count(*) FROM Wecstd_Raw)-720'
, disk_engine)
df.index=pd.DatetimeIndex(df["index"])
df.drop('index', axis=1, inplace=True)
pd.read_sql_query('SELECT Count(*) '
'FROM Wecstd_Raw '
, disk_engine)
df.head()
df.columns
fig=plt.figure(figsize=(12,8))
plt.plot(df[u'MitVwind'],df[[u'MitP']],'.')
x1,x2,y1,y2 = plt.axis()
v=np.linspace(0,10,100)
power=2.9*v**3
plt.plot(v,power)
plt.axis((0,x2,0,3300));
plt.xlabel("Windgeschw. [m/s]")
plt.ylabel("Leistung [kW]");
plt.title(u'Leistung über Windgeschwindigkeit');
fig=plt.figure(figsize=(8,8))
ax = plt.subplot(111, projection='polar')
ax.set_theta_direction(-1)
ax.plot(np.pi+df[[u'GoPos']].values*np.pi/180,df[[u'MitVwind']].values,'x')
ax.set_theta_zero_location("N")
ax.set_rmax(20)
ax.grid(True)
plt.title('Windrichtung und Windgeschwindigkeit [m/s]');
fig=plt.figure(figsize=(8,8))
ax = plt.subplot(111, projection='polar')
ax.set_theta_direction(-1)
ax.plot(np.pi+df[[u'GoPos']].values*np.pi/180,(df.index.values.max()-df.index.values).astype(float)/(1000000000*3600),'o')
ax.set_theta_zero_location("N")
ax.set_rmax(15)
ax.grid(True)
plt.title(u'Windrichtung über die verstrichene Zeit [h] ("Rauchfahne")');
df[[u'PavaExtern','MitP','PavaVwind']].plot(rot=45,ylim=(0,3500),figsize=(14,6))
plt.title(u'Leistungen [kW] über die Zeit bis '+str(df.index[-1]));
plt.savefig('Egneos-Power-letzten12Stunden.png')
df['Wexp'].plot(rot=45,figsize=(14,6));
plt.title(u'Stromzähler in kWh');
df = pd.read_sql_query('SELECT *'
' FROM Wecstd_Rep limit 1008 offset (select count(*) FROM Wecstd_Rep)-1008'
, disk_engine)
#aller 10Min.:6 pro Stunde mal 24 mal 7 = 1008
df.index=pd.DatetimeIndex(df["index"])
df.drop('index', axis=1, inplace=True)
print "df-Shape: ",df.shape
df[[u'PavaExtern','MitP','PavaVwind']].plot(rot=45,ylim=(0,3500),figsize=(14,6))
plt.title(u'Leistungen [kW] über die Zeit bis '+str(df.index[-1]));
plt.savefig('Egneos-Power-letzten7Tage.png')
df['Wexp'].plot(rot=45,figsize=(14,6));
plt.title(u'Stromzähler in kWh');
df = pd.read_sql_query('SELECT *'
' FROM Wecstd_Rep limit 4320 offset (select count(*) FROM Wecstd_Rep)-4320'
, disk_engine)
#aller 10Min.:6 pro Stunde mal 24 mal 30 = 4320
df.index=pd.DatetimeIndex(df["index"])
df.drop('index', axis=1, inplace=True)
print "df-Shape: ",df.shape
df[[u'PavaExtern','MitP','PavaVwind']].plot(rot=45,ylim=(0,3500),figsize=(14,6))
plt.title(u'Leistungen [kW] über die Zeit bis '+str(df.index[-1]));
plt.savefig('Egneos-Power-letzten30Tage.png')
df['Wexp'].plot(rot=45,figsize=(14,6));
plt.title(u'Stromzähler in kWh');
df = pd.read_sql_query('SELECT *'
' FROM Wecstd_Day'
, disk_engine)
#aller 10Min.:6 pro Stunde mal 24 mal 30 = 4320
df.index=pd.DatetimeIndex(df["index"])
df.drop('index', axis=1, inplace=True)
print "df-Shape: ",df.shape
df[[u'PavaExtern','MitP','PavaVwind']].plot(rot=45,ylim=(0,3500),figsize=(14,6))
plt.title(u'Leistungen [kW] über die Zeit');
plt.savefig('Egneos-Power-alleTage.png')
df['Wexp'].cumsum().plot(rot=45,figsize=(14,6));
plt.title(u'Stromzähler in kWh');
#Alle Daten
df = pd.read_sql_query('SELECT *'
' FROM Wecstd_Rep '
, disk_engine)
df.index=pd.DatetimeIndex(df["index"])
df.drop('index', axis=1, inplace=True)
print "df-Shape: ",df.shape
fig=plt.figure(figsize=(12,8))
plt.hist(df[[u'MitVwind']].values,normed=True,bins=20);
x1,x2,y1,y2 = plt.axis()
plt.axis((0,x2,0,y2));
mean=df[[u'MitVwind']].mean().values[0]
plt.axvline(mean);
rv = scipy.stats.exponweib(1.0, 2.05, scale=7.7) #Prognose mit mittel. vWind 7.7m/s, k=2.05 und x=1 ?
x_range = np.arange(0, 30, 0.1)
plt.plot(x_range, rv.pdf(x_range));
plt.title('Verteilung der Windgeschw. und mittlere bei ' +"%.2f"% mean +" m/s")
plt.xlabel("Windgeschw. [m/s]")
plt.ylabel("Wahrsscheinlichkeit"); #ToDo Weibull-Verteilung;
fig=plt.figure(figsize=(12,8))
plt.plot(df[u'MitVwind'].values ,df[[u'MitNRotor']].values,'.')
plt.xlabel(u'Mittlere Windgeschw. [m/s]')
plt.ylabel(u'Mittlere Rotordrehzahl [U/min]')
x1,x2,y1,y2 = plt.axis()
plt.axis((0,x2,0,y2));
plt.title(u'Rotordrehzahl über Windgeschwindigkeit');
df[[u'Pitch']].plot(rot=45,ylim=(0,90),figsize=(14,6));
plt.title(u'Pitch-Anstellwinkel [°]');
df['Wexp'].plot(rot=45,figsize=(14,6));
plt.title(u'Stromzähler in kWh');
df.MitVwind.plot(rot=45,ylim=(0,25),figsize=(14,6));
plt.title(u'mittlere Windgeschwindigkeiten [m/s]');
fig=plt.figure(figsize=(12,8))
plt.plot(-np.sort(-df['MitP'].values))
plt.title(u'vorläufige Leistungsdauerlinie');
df[['GoPos']].plot(rot=45,figsize=(14,6));
plt.title(u'Ausrichtung der Gondel [°]');
df_temp = pd.read_sql_query('SELECT *'
' FROM T101a1_Rep limit 15000 offset (select count(*) FROM T101a1_Rep)-15000'
, disk_engine)
df_temp.index=pd.DatetimeIndex(df_temp["index"])
df_temp.drop('index', axis=1, inplace=True)
df_temp.shape
df_temp.ix[:,2:8].plot(figsize=(14,6)).legend(loc='center left', bbox_to_anchor=(1, 0.5));
df_temp.ix[:,8:15].plot(figsize=(14,6)).legend(loc='center left', bbox_to_anchor=(1, 0.5));
df_temp.ix[:,15:20].plot(figsize=(14,6)).legend(loc='center left', bbox_to_anchor=(1, 0.5));
df_temp.ix[:,20:].plot(figsize=(14,6)).legend(loc='center left', bbox_to_anchor=(1, 0.5));
Nutzung spezieller Datenstandards (MQTT, OpenEnergyMonitor (https://emoncms.org/), Sensor Observation Service, Sensornetzwerke http://codeforchemnitz.de/projects/sensor/)
kleines Webseiten-Widget mit aktuellen Daten