Teil3 – Visualisierung (ob mit Grafana oder mit anderen Tools muss ich sehen)
ongoing, erster Screenshot von meinem Grafana Dashboard (auch hier danke an inkoFa, das ist nämlich seine Idee gewesen).
Damit ihr euch das auch nachbauen könnt, erkläre ich nachfolgend welche Einstellungen dafür notwendig sind. Der linke Block kommt von meiner Heizung, den lasse ich außen vor und konzentriere mich nur auf die PV Sachen.
1. Graph PV
Quellen aus der InfluxDB sind
PVLeistungAktuell -> gelber Graph
Hausverbrauch -> blauer Graph
TempWechselrichter -> orangener Graph
(Sonnenstand) -> gestrichelt grüne Linie
Die ersten 3 Werte solltet ihr schon haben wenn ihr oben aus meinem Teil 2 die Sachen übernommen habt.
Sonnenstand war ein fertiges JS Script:
// calculates the sun position, path and power throughout the day
// based on from http://www.stjarnhimlen.se/comp/tutorial.html
// most var-names are identical to above tutorial
// combined with Sonnenstand-Script: paul53, pix; 06.07.2015 nach ioBroker Forum http://forum.iobroker.net/viewtopic.php?f=21&t=975&sid=6f0ba055de5f82eed6809424f49ca93b#p7635
// Angepasst ykuendig 12.02.17; stringify im log, ack = true bei setState und Diverses
var suncalc = require('suncalc'),
result = getObject("system.adapter.javascript.0"),
lat = result.native.latitude,
long = result.native.longitude;
log("long: " + long + " - lat: " + lat);
var modtilt = 50; //Dachneigung in Grad (Solar panel's tilt angle)
var modazi = 285; //Ausrichtung des Hauses in Grad zB SSW (Solar panel's azimut)
var modsufrace = 148.0; //Paneloberfläche in m2 (Solar panel's surface in sq. meters)
var modeff = 0.211; //Annäherung an Panel-Wirkungsgrad zB 18 Prozent (modules efficiency correction)
// Hier kann an einem klaren Tag etwas geschraubt werden ;-)
var altitude; // Calculated Elevation
var azimuth; // Calculated Azimuth
createState('javascript.0.Solar.Sonnenstand.Elevation', 0, {unit: '°'});
createState('javascript.0.Solar.Sonnenstand.Azimut', 0, {unit: '°'});
createState('javascript.0.Solar.Sonnenstand.PanelPossible', 0, {unit: 'W'});
// ganz am Ende die setStates anpassen nicht vergessen!
// Do not change below, until You know what You are doing!
// ********************************************************
Math.degrees = function(radians) {return radians * 180 / Math.PI;};
Math.radians = function(degrees) {return degrees * Math.PI / 180;};
function Sonnenstand_berechnen () {
var now = new Date();
var sunpos = suncalc.getPosition(now, lat, long);
log("Script Sonnenstand; latitude : " + result.native.latitude + " / longitude: " + result.native.longitude,'debug');
log("Script Sonnenstand; sunpos: " + JSON.stringify(sunpos),'debug');
altitude = Math.degrees(sunpos.altitude);
azimuth = Math.degrees(sunpos.azimuth) + 180;
// The intensity of the direct component of sunlight throughout each day can be determined as
// a function of air mass. based on: http://pveducation.org/pvcdrom/properties-of-sunlight/air-mass#formula
var airmass = 1/Math.cos((90-altitude)*4*Math.asin(1)/360);
// Sincident is the intensity on a plane perpendicular to the sun's rays in units of kW/m2 and AM is the air mass.
// The value of 1.353 kW/m2 is the solar constant and the number 0.7 arises from the fact that about 70% of the radiation incident on the atmosphere is transmitted
// to the Earth. The extra power term of 0.678 is an empirical fit to the observed data and takes into account the non-uniformities in the atmospheric layers.
// ykuendig: use different values because of pv instead thermal panels
var Sincident = (1.367*Math.pow(0.78,Math.pow(airmass,0.6)));
var fraction = Math.cos(altitude*4*Math.asin(1)/360)*Math.sin(modtilt*4*Math.asin(1)/360)*Math.cos(azimuth*4*Math.asin(1)/360-modazi*4*Math.asin(1)/360)+Math.sin(altitude*4*Math.asin(1)/360)*Math.cos(modtilt*4*Math.asin(1)/360);
// W/m² light intensity on the module * module's surface
var SmoduleInt = Sincident * fraction * modsufrace * 1000;
if(SmoduleInt<0) {
SmoduleInt = 0;
}
// Module Effective in relation of the efficiency of the used panel
var SmoduleEff = SmoduleInt * modeff;
if( altitude < 0 ) {
SmoduleInt = 0;
SmoduleEff = 0;
altitude = 0;
}
log("Script Sonnenstand; Erfolgreich gelaufen, Werte akzeptiert", "info");
log("Script Sonnenstand; airmass: " + airmass,"debug");
log("Script Sonnenstand; azimuth: " + azimuth,"debug");
log("Script Sonnenstand; altitude: " + altitude,"debug");
log("Script Sonnenstand; SmoduleInt: " + SmoduleInt,"debug");
log("Script Sonnenstand; SmoduleEff: " + SmoduleEff,"debug");
// Change ID to the created States
setState('javascript.0.Solar.Sonnenstand.Elevation'/*javascript 0 Solar Sonnenstand Elevation*/,altitude.toFixed(1), true);
setState('javascript.0.Solar.Sonnenstand.Azimut'/*javascript 0 Solar Sonnenstand Azimut*/,azimuth.toFixed(), true);
setState('javascript.0.Solar.Sonnenstand.PanelPossible'/*javascript 0 Solar Sonnenstand PanelPossible*/, SmoduleEff.toFixed(), true);
}
// -> Zyklisch
schedule("*/10 * * * *", Sonnenstand_berechnen);
Sonnenstand_berechnen(); // bei Scriptstart
2. Graph PV Erzeugung in kWh
Quelle aus der InfluxDB sind
@hennerich du hast bestimmt auch viele DP, die du in influxDB speicherst!? Kennst du das Problem, dass beim Auswählen des DP nur so ca. 120 DP angezeigt werden? Ist ja alphabetisch... ich komme nur bis "G". Kann man die Anzahl der angezeigten DP irgendwo ändern?
Edit: so sieht es dann aus. Ich komme nicht tiefer...
@lobomau
Naja, so viele hab ich gar nicht
Spontan fällt mir dazu ein, dass du einfach mal oben im Suchfeld den Anfang deines Datenpunktes eingeben könntest und dann unten in der Liste in Echtzeit gefiltert wird.
Also einfach mal go-e.0. eingeben. Geht das?
Hallo Hennerich
Sieht super aus Dein Dashbord.
Die PV Erzeugung 3 Wochen unten rechts kriege ich nicht hin.
Kannst Du die Konfig mal erläutern, der Rest gerne auch..
@hennerich
Supergenial die Infofülle. Danke!
Wo ich grad keinen Durchblick habe und die Frage hinzielte war betreffend der Visualisierung in Grafana.
Wie machst Du von diesen Zehntagesverlaufsbalken in Grafana?
Die Frage ging in die Richtung: Hast du Screenshot oder SQL Sniplet und Dashborad Einstellung der Abfrage in Grafana?
Ich bringe die schöne Vergleichsgrafik der letzten x Tage nicht hin...
Habt ihr andere Dinge umgesetzt? Leitet ihr Infos aus anderen Werten ab, die ich noch gar nicht auf dem Schirm habe?
Was ich plane ist die voraussichtliche PV Leistung von morgen zu berücksichtigen. Berechnung sowas wie dein Sonnenstand Script mit der Wetterprognose verknüpft. Beispiel hier https://www.photovoltaikforum.com/thread/128698-pimp-my-autarkiegrad-eigenverbrauch-optimieren-pv-ertrag-via-kurzzeitprognosen-d/ aus DWD Opendata https://opendata.dwd.de/weather/local_forecasts/mos/MOSMIX_L . Oder alternativ einfacher gesteuert vom gelieferten Wettericon eines vorhandenen Wetteradapters.
Ziel: Wenn für morgen keine Sonne vorausgesagt ist heize ich mit der Wärmepumpe mit günstigerem Nachtstrom. Wenn Sonne vorausgesagt ist warte ich mit dem füllen des Puffers auf den PV Ertrag des kommenden Tages. Da meine Scriptfähigleiten sehr rudimentär sind befürchte ich dass das noch sehr lange dauern wird (oder hoffe dass ein gewiefter Scripter die Idee umsetzt )
@Aare-07
Interessant. Sowas ähnliches hatte ich auch vor. Allerdings nicht mit meiner WP sondern mit einem Heizstab. Ich wollte vermeiden, dass die WP bei schwankender Leistung immer Strom aus dem Netz beziehen muss, weil die Mindestlaufzeit 15min beträgt. Und wenn immer mal wieder Wolken durchziehen und bei Sonne das Signal WP AN kommt, verbrauche ich bestimmt zu viel Netzstrom. Daher der (stufenlos regelbare) Heizstab. Aber die Anlage muss erstmal paar Monate laufen, damit ich ein Gefühl dafür bekomme.
@hennerich Vielen Dank für die Mühe hier! Das hat mir, als absoluter Anfänger, sehr geholfen
Eine Frage hätte ich dazu noch: Wie hast Du es hinbekommen, dass bei dem Panel "PV Erzeugung in kWh" der aktuelle Tag (Balken) in kompletter Breite angezeigt wird und sich nicht im Laufe des Tages langsam von rechts reinschiebt?
Egal was ich in Grafana schon versucht habe, sieht es immernoch so aus:
@hennerich
Nein, ich habe drei Datenquellen eingebunden, wobei ich den Gesamtverbrauch hinter den gestapelten Balken "versteckt" habe.
Bei mir sieht es ein bissl anders aus.
Die Datenreihen sind fortlaufende Zählerstände, deshalb SELECT max("value") - min("value")
Bei GROUP BY time(1d,-1h) fill(null) mustte ich -1h eintragen, da die Ausgabewerte sonst nicht stimmen, da sich Grafana scheinbar nicht um die Zeitzohne schert und einfach UTC nimmt. So stimmten die Verbrauchswerte nicht, da die Zeit zwischen 0:00 und 01:00 Uhr immer dem Vortag zugerechnet wurde.
Die übrige Config des Panels, Display usw, ist bei mir bis auf Stacking gleich.
Mir war nur so, als wenn die Anzeige nach Mitternacht gleich um einen Tag nach links springt. Aber vielleicht habe ich mich auch geirrt. Ist halt nicht so ganz schön, wenn der aktuelle Tag anfangs nur als schmaler Balken langsam ins Bild kommt.
Bei deinem Bild oben ist der aktuelle Tag ja auch schon komplett sichtbar, obwohl es ja erst nach 11:00 Uhr zu sein scheint.
Aber egal, ich bin schon forh, dass ich überhaupt was hinbekommen habe.
In meinem Alter (knappe 60) dauert die Lernphase ja immer etwas länger
Gruß Jörg
EDIT sagt:
Gerade habe ich noch irgendwo aufgeschnappt, dass der Eintrag GROUP BY time(1d,-1h) fill(null) zwar funktioniert, aber zur Sommerzeit auf -2h geändert werde müsste.
Deshalb ist es besser den Versatz nicht einzutragen und stattdessen GROUP BY time(1d) fill(null) tz('Europe/Berlin')
Somit braucht man sich um die Zeitumstellung nicht mehr zu sorgen.
Was ich plane ist die voraussichtliche PV Leistung von morgen zu berücksichtigen.
Mich hatte es auch gestört, dass die Wärmepumpe kurz vor Sonnenaufgang lief und kurze Zeit später viel Strom vom Dach kam. Versuche mal meinen Ansatz zu beschreiben (vielleicht hilft es jemandem).
Grundsätzlich hebe ich die Temperatur Nachts nicht an, sondern sperre die Wärmepumpe. Ich habe Angst dass die Wärmepumpe in einem ungünstigen Arbeitspunkt kommt und so lasse ich die Wärme etwas abfalle (nur soviel, dass es nicht kalt wird) und heize sobald die Sonne kommt nach. Ich habe aber auch keine Speicher.
Ablauf:
Ab einer bestimmten Zeit in der Nacht sperre ich die WP, wenn der Wetterbericht "Sonne" ankündigt.
Verwenden den Adapter "DasWetter.com" und schaue ob um 9:00Uhr weniger als 60% Wolken vorhergesagt werden. Sonst sperre ich die WP für heute nicht.
Zusätzlich schaue ich auch auf die Aussentemperatur und setzt den Zeitpunkt des Anfangs der Sperre früher oder später (Erfahrungswerte damit es bis zum Morgen nicht kalt wird)
Sobald genügend Sonne vom Dach kommt hebe ich die Sperre wieder auf und die WP fängt automatisch an zu laufen, da die Heiztemperatur mittlerweile zu tief ist.
ich verwende da keine Sonnenstand-Scripte oder so. Ich habe mit der PV-Anlage ja einen grossen "Sensor" und der berücksichtig den Schatten von den Nachbarhäusern gleich mit.
Ist die Vorhersage "falsch" und die Sonne kommt einfach nicht, stelle ich das fest und hebe die Sperre wieder auf.
Dies ist bei mir bei Nebel z.B. häuftig der Fall. Früher hatte ich einfach ein Zeit (10:00Uhr) an welcher ich die Sperre auf jeden Fall zurückgesetzt hatte.
In der Zwischenzeit schaue ich, wann sie in den letzten 7 Tagen kam und setze spätestens 30min später die Sperre zurück. Damit muss ich mich wieder nicht um die Nachbarhäuser, Jahreszeit oder Sommer-/Winterzeit kümmern.
Versuche mal meinen Ansatz zu beschreiben (vielleicht hilft es jemandem).
Danke für den Ansatz, gute Idee das einrechnen der erwarteten Temperatur in die Dauer der Absenkung unter Berücksichtigung der Dämpfung des Hauses.
Da ich nicht so der Scripter bin, wäre es Dir möglich die verschiedenen Script-Snipnets hier einzustellen?
Gruss Aare
... gute Idee das einrechnen der erwarteten Temperatur in die Dauer der Absenkung unter Berücksichtigung der Dämpfung des Hauses.
Du meinst diesen Teil: "Zusätzlich schaue ich auch auf die Aussentemperatur und setzt den Zeitpunkt des Anfangs der Sperre früher oder später (Erfahrungswerte damit es bis zum Morgen nicht kalt wird)"?
Da schaue ich auf Isttemperatur morgens um 0.30Uhr uns setzen den Startpunkt der Sperre wie folgt:
![Bild Text](Bild Link)
vielen Dank für dieses Tutorial. Leider habe ich das Problem, dass nachts, wenn keine Stromerzeugung ist, unter "holdingRegisters.40083_I_AC_Leistung" weiterhin Zahlen angezeigt werden (bei mir wechselnd zwischen ~30 Watt und ~650 Watt). Das ist natürlich falsch.
Tagsüber stimmen die Werte aber mit den Daten aus der App überein und sind realistisch.
@cybtrash Was hast Du denn bei "SELECT" eingestellt?
Bei mir steht "last" und damit passt es.
EDIT:
Hast Du den Fehler nur in Grafana, oder kommen die "falschen" Werte direkt vom Wechselrichter über den Modbus Adapter? Dann weiß ich auch nicht...