Hallo zusammen,
ich habe mich mal daran gemacht und ein Modul für den Kostal PIKO Wechselrichter zusammengebastelt. Es läuft bei mir bislang einwandfrei.Vorlage dafür war das Modul 23_WEBIO.pm.
Da es mein erstes Modul bzw. meine erste Perl Basteslei für FHEM is, würde ich mich über ein paar Anmerkungen oder Tips sehr freuen.
Viel Spaß beim Ausprobieren.
UPDATE: John hat eine neue Version dieses Moduls auferlegt. Bitte verwendet in Zukunft nur noch Version 2.0
http://forum.fhem.de/index.php/topic,24409.msg175253.htm
MfG
Matthias
Hallo Matthias, Klasse ... eingebaut und lief sofort. Der aktuelle Wert wird angezeigt. Muss mich erst reinfinden, perl ist nicht so meins. Mal sehen ob ich mich an den Tagesertrag ran traue.
Danke und viele Grüße
Olaf
Hallo Matthias
vielen Dank für das neue Modul.
Mir ist noch aufgefallen, dass beim Aufruf des InternTimer immer fix die 5 Sekunden verwendet werden.
Dafür war wohl der Parameter Delay gedacht.
Das Polling alle 5 Sekunden war mir zu heftig. Daher die kleine Änderung.
KOSTALPIKO_GetStatus($)
{
my ($hash) = @_;
my $err_log='';
my $line;
my $name = $hash->{NAME};
my $host = $hash->{Host};
my $user = $hash->{User};
my $pass = $hash->{Pass};
my $delay=$attr{$name}{delay}||300;
InternalTimer(gettimeofday()+$delay, "KOSTALPIKO_GetStatus", $hash, 0);
Mir ist nicht klar was "||300" bei
my $delay=$attr{$name}{delay}||300;
bewirken soll.
John
Hallo zusammen,
danke für die Rückmeldungen!
@John: Stimmt Du hast Recht. Da sollte die Variable $delay hin. Ich hatte kurzzeitig das Problem, dass das Modul die Attribute nicht ausgelesen hat. Daher hatte ich das im Code fest hinterlegt.
Das ||300; soll einen default wert setzen, falls kein Attribut "delay" vorhanden ist. Also quasi eine Oder Funktion. Entweder den Wert aus dem Attribut delay oder falls $delay undef ist dann 300 sekunden.
Ich werde dann mal deine Änderung übernehmen. :)
BTW: In der Funktion define habe ich das auch noch drin, allerdings schon auskommentiert. Habe jetzt beides glatt gezogen.
MfG
Matthias
Hallo Matthias,
ich hab noch einige Schnippsel hinzugefügt.
Das Ergebnis:
(siehe Anhang / see attachement)
Alle Parameter der Webseite werden erfasst und als Readings dargestellt.
ModeNum
Darstellung der Betriebsart als Zahl mit folgendem Zusammenhang
Aus 0
Leerlauf 1
Einspeisen MPP 2
Daily.Energy.Last
erzeugte Energie des letzten Tages.
Wird dann ermittelt, wenn Daily.Energy vom Kostal auf 0 gesetzt wird.
Setter wurde entfernt.
Attribute mit $readingFnAttributes erweitert.
Modul HTML::Parser wird nun zusätzlich benötigt
Aktualisierung der Readings erfolgt nur nach Änderung.
Weitere Ideen
(hier bitte ich im Untestützung)
Wechselrichter auf Plausibilität überwachen.
Stimmt die erzeugte Energie mit der zu erwartenden in etwa überein ?
Ziel: Erkennen eines Ausfalls.
Alarmierung durch FHEM.
Problem:
Wie kann man standortbezogen die Soll-Energieausbeute bestimmen ?
John
Hallo John, vielen Dank script funktioniert super, alle readings sind da und stimmen mit meiner Anlage überein.
ZitatProblem:
Wie kann man standortbezogen die Soll-Energieausbeute bestimmen ?
Meinst Du sowas? Dort hole ich mir meine standortbezogen Prognose.
viele Grüße
Olaf
Hallo Olav,
genau darum gehts. Ich möchte die aktuelle Leistung der PVA mit der Prognose vergleichen.
Bei groben Abweichungen ist von einem Fehler auszugehen.
John
Hi John,
danke für deine Erweiterungen, werde ich gleich mal ausprobieren.
Bzgl. der Prognose oder Überwachung:
http://www.suntrol-portal.com/de (//www.suntrol-portal.com/de)
Hier habe ich meinen Wechselrichter zusätlich angemeldet (er überträgt alle 15 min seine Werte zu dem Portal) und von dort bekomme ich dann eine Mail sobald meine Anlage im Verhältnis zu anderen Anlagen in meiner Umgebung weniger Energie liefert. Schöner wäre es natürlich diese Funktion dann auch nur im FHEM zu haben und auf das Portal verzichten zu können.
MfG
Matthias
Hallo John, mein Link ist leider untergegangen :( hier nochmals die Prognose http://re.jrc.ec.europa.eu/pvgis/apps4/pvest.php?lang=de&map=europe (//re.jrc.ec.europa.eu/pvgis/apps4/pvest.php?lang=de&map=europe)
Beim saven der fhem.cfg stürzt fhem ab
Undefined subroutine &main::KOSTALPIKO_Undef called at fhem.pl line 2449.
danke und vg Olaf
Hallo Olaf,
habs gefunden. Die sub KOSTALPIKO_Undef fehlte noch.
Ist nun bereinigt.
John
Guten Morgen
Danke! Das Teil läuft super!
Zum Glück gefunden. ;)
Wollte mich gestern mitm Kumpel an das Modul machen. War schon fertig!
Gruß
Andre
Hallo zusammen,
ich hab nun eine Quelle für die Globalstrahlung gefunden und will diese in den Readings verfügbar machen.
Weiss jemand, wie man von der Globalstrahlung auf die zu erwartende Leistung der PV-Anlage schliessen kann ?
Erste Idee:
Globalstahlung [kWh/qm]* Wirkungsgrad der Module [%] * qm Modulfläche [qm] * Wirkungsgrad.Wechselrichter [%]
- Sicher spielt auch noch die Ausrichtung nach Süden und die Neigung eine Rolle
Wäre für Unterstützung dankbar.
John
Bin zum Thema prognostierte Leistung gut weitergekommen:
(siehe Anhang / see attachement)
Global.Radiation ist die Globalstrahlung meiner Region am heutigen Tag.
EnergyExpected = <Systemnutzungsgrad> * Fläche * Global.Radiation
Und wie man sieht sind die 28,17 Kwh nicht allzu weit von den erwarteten 31.08 entfernt.
Der Chart des heutigen Tages:
(siehe Anhang / see attachement)
John
Hi John,
ich hatte eig. vor mich da heute ran zu setzen, wie hast du das mit dem plot gemacht. Ein Beispiel waere super.
Jeder faengt klein an.
MfG
Kein Problem:
Hier ist auch schon EnergieExpected berücksichtigt
(siehe Anhang / see attachement)
John
Die Frage ist eher wie erstell ich einen Plott.
Muss ich noch ein wenig wiki studieren. Heute nimmer.
Schoene Arbeit gefaellt mir. Ich hab heute die 31kw gehabt :-)
vielen Dank.
Gute Nacht
Moin John,
wie gehst Du dann mit Schlechtwetter wie z.B. Wolken / Gewitter usw. um? So wie ich verstanden haben, hast Du jetzt eine Quelle gefunden, die Dir die erwartete Sonneneinstrahlung unabhängig vom Wetter angibt, richtig?
Aber ansonsten respekt wie schnell Du die Sachen hinbekommst. Wenn ich überlege wie lange ich an dem Grundmodul gearbeitet (rumgebastelt) habe. Dazu muss ich aber auch sagen, dass ich noch nicht lange mit Perl arbeite.
@AK-868:
Um einen Plot zu erstellen, musst du zuerst die Readings in eine Datei schreiben lassen:
# Define für meinen Wechselrichter.
define power_Wechselrichter KOSTALPIKO ip-adresse user pass 5
attr power_Wechselrichter alias Wechselrichter
# Define für mein Log. Mit power_* sage ich dem Log, dass alle Geräte die mit power_ anfange in diese Datei loggen soll
define PowerLog FileLog %L/powerlog-%Y-%m-%d.log power_.*
Und wenn Du das gemacht hast, kannst Du unter "Undefined" oder "Everything" das "Gerät" PowerLog aufrufen und dort findest Du den Link "Create new SVG Plot". Und ab da kannst Du die Werte aus dem Screenshot von John nutzen.
MfG
Matthias
Hallo Matthias,
ich kann über die Qualität der Quelle nichts sagen.
Aber so schlecht wird diese nicht sein ,da sie für die Herrn Landwirte gemacht wurde.
In Folgendem erkläre ich, wie man zu der ortsbezogenen URL gelangt, die die Globalstrahlung beinhaltet.
Folgende Seite aufrufen (ich exerziere es am Beispiel der Stadt Straubing)
http://www.proplanta.de/Agrar-Wetter/Deutschland/ (//www.proplanta.de/Agrar-Wetter/Deutschland/)
Postleitzahl für Straubing eingeben: 94315
ggf. bei Auswahlbox rechts zusätzlich auswählen --> Button "Aufrufen"
Am untersten Ende der nun aufgerufenen Seite findet sich der Link zu
"Wetterrückbick Straubing" --> Click
Auf der nun erscheinenden Seite findet sich ebenfalls am unteren Ende:
"Wetteraussichten Heute" - Click
Nun merken wir uns die URL der aktuellen Seite:
http://www.proplanta.de/Wetter/Straubing-Wetter-Heute.html (//www.proplanta.de/Wetter/Straubing-Wetter-Heute.html)
oder allgemein
http://www.proplanta.de/Wetter/ (//www.proplanta.de/Wetter/)<Ort>-Wetter-Heute.html
Das war das Ziel: eine eindeutige ortsbezogene URL mit dem Inhalt der Globalstrahlung.
Unser Modul wird hier den Begriff "Globalstrahlung" suchen und den entsprechenden Wert extrahieren.
Das geschieht stündlich.
Ich habe ein Attribut vorgesehen, um diesen Link zu speichern:
(siehe Anhang / see attachement)
Das aktualisiert Modul folgt demnächst (will noch etwas testen).
In den technischen Unterlagen meiner PA-Anlagen ist der Systemnutzungsgrad ausgewiesen,
den ich als Gesamtwirkungsgrad verstehe.
Somit ergibt : Expected Energy = <PV-Fläche> * GlobalStrahlung * Systemnutzungsgrad
Dies habe ich mit den UserReadings realisiert:
attr Kostal userReadings EnergyExpected:Global.Radiation { return ReadingsVal("Kostal","Global.Radiation",0)*37*0.10;;}
Sieht auch am 2. Tag sehr plausibel aus.
(siehe Anhang / see attachement)
John
Hi,
super, dann ist das Wetter ja schon mit drin. Ich dachte das wäre jetzt wirklich nur die erwartete Sonneneinstrahlung ahnand von Sonnenstand usw. Aber so ist es ja perfekt. Ich gucke auch mal, ob die Werte bei mir passen und werde berichten.
Danke!
MfG
Matthias
So, ich hab's mal schnell durchgerechnet.
Heute erzeugt (laut Wechselrichter) 23,70 kWh
Nach deiner Formel hätten es sein müssen: 24,44 kWh
Ich würde sagen, das passt sehr gut. Coole Sache!
MfG
Matthias
Nachdem ich alles überprüft habe, nun das überarbeitete Modul.
Anpassungen:
Das Skript ist nun etwas wuchtiger geworden, wegen der Ermittlung der Globalstrahlung.
Daily.Energy.Lastwird einmalig ab 23:00 Uhr mit dem aktuellen Wert von Daily.Energy überschrieben und ist somit zunächst noch nicht
angelegt.
Damit wird dem Tageswert der noch korrekte Datumswert im Log-File zugeordnet und man könnte damit ggf. einen
Woche/Monatsbericht erstellen.
Global.Radiation Hier wird die erwartete Globalstrahlung des Tages eingetragen.
Abhängig vom Attribut GR.Link. Wird nur ermittelt, wenn dieser auch definiert ist.
Die Abfrage erfolgt stündlich. Damit wächst der Graph im Chart mit.
(Man muss den Wert natürlich im Log-File aufzeichnen)
EnergyExpectedHabe ich als UserReading angelegt, kommt also nicht direkt vom Modul selbst.
Hier kann man über eine nach den eigenen Verhältnissen angepasste Formel den zu erwartende Tages-Energie berechnen.
Das Reading triggert man sinnigerweise über Global.Radiation.
Attribut delayParameter entfällt beim define, dafür wird er als Attribut angegeben.
Wenn nicht definiert, wird dieser automatisch mit 300 belegt.
Attribut LoglevelHierüber wird das Skript gesprächig und gibt einem Menge an Informationen in der Log-Datei aus.
Z.B. mit "loglevel 3", wenn "attr global verbose 3" gesetzt ist.
Definition am Beispiel:Gerät definieren (Achtung: Zeilenumbruch ist nicht beabsichtigt)define Kostal KOSTALPIKO 192.168.178.10 pvserver pvwr
attr Kostal GR.Link http://www.proplanta.de/Wetter/Straubing-Wetter-Heute.html
attr Kostal delay 300
attr Kostal loglevel 4
attr Kostal room System
attr Kostal userReadings EnergyExpected:Global.Radiation { return ReadingsVal("Kostal","Global.Radiation",0)*37*0.10;;}
Mit dem UserReadings wird das neue Attribut EnergyExpected, das mit der Aktualisierung von Global.Radiation
neu berechnet wird und zwar mit dem in der geschweiften Klammer angegebenen Ausdruck.
Also hier mit PA-Fläche : 37 qm, System-Wirkungsgrad: 10%
EnergyExpected = Globalstrahlung * 37 * 0.10
Über GR.Link habe ich früher schon berichtet.
Link (http://forum.fhem.de/index.php?topic=13508.msg84662#msg84662)
Logfile definieren# log-files definieren
define Kostal.File FileLog ./log/Kostal-%Y.log Kostal:(AC.Power|Daily.Energy|Total.Energy|ModeNum|EnergyExpected).*
attr Kostal.File logtype text
attr Kostal.File room System
Im einzelnen:Zitat/log/Kostal-%Y.log
besagt, dass wir ein Logfile der Form Kostal-2013.log wollen, also über das Jahr
ZitatKostal:(AC.Power|Daily.Energy|Total.Energy|ModeNum|EnergyExpected).*
wir nehmen nur die wichtigsten Werte auf
"Kostal" kennzeichnet das Gerät, der Rest nach dem ":" ein regulärer Ausdruck für die gewünschten Werte
"|" ist hier als logsiches "Oder" zu verstehen
"." ist ein Platzhalter für ein beliebiges Zeichen
"*" sagt, dass sich dieses beliebig oft wiederholen kann
Chart definierendefine wl_Kostal.File_1 weblink fileplot Kostal.File:wl_Kostal.File_1:CURRENT
attr wl_Kostal.File_1 room System
John
Hallo John,
großen Dank an Deine Arbeit. Es funktioniert super. Bei Deiner super Beschreibung kann man (fast) nichts falsch machen.
Habe jetzt einen 2. LogFile angelegt um "Daily.Energy.Last" zu loggen ...
define KostalM.File FileLog ./log/KostalM-%Y-%m.log Kostal:(Daily.Energy.Last).*
attr KostalM.File logtype text
define wl_KostalM.File_1 weblink fileplot KostalM.File:wl_KostalM.File_1:CURRENT
attr wl_KostalM.File_1 fixedrange month
Der Wert "Daily.Energy.Last" wird bei mir so gegen 4Uhr früh gespeichert, für den Tag davor! Wie bekomme ich es hin, das der PLOT dann Timestamp - 1 Tag anzeigt?
vielen Dank und viele Grüße
Olaf
Hallo Olaf,
das sollte eigentlich mit dem aktuellsten Skript von gestern erledigt sein.
Zitatwird einmalig ab 23:00 Uhr mit dem aktuellen Wert von Daily.Energy überschrieben und ist somit zunächst noch nicht
angelegt.
Bei der Version vorher war es dies anders. Hier wurde der Wert beim Neustart des Wechselrichters geschrieben.
John
Ich hab noch was gefunden und zwar jedes mal wenn ich was in der config geändert habe kam ein Fehler bzgl. delay.
Delay muß dann als Globales attr hinzugefügt werden.
Ich hoffe das erklärt meine hmlan disconnects und fhem abstürze.
Hallo Andre ,
hast du das aktuellste Skript (von gestern) im Einsatz ?
Damit sollte das Delay-Problem behoben sein.
Ansonsten schick mir bitte einen Auszug aus der Log-Datei.
Die Laufzeit des Skripts ist nicht unerheblich und kann mehrere Sekunden (je nach Rechner Power/Internetverbindung)
in Anspruch nehmen. FHEM muss ja jedes einzelne HTML-Tag parsen.
Vielleicht führt dies dazu, dass HMLAN ein Problem hat.
Noch länger dauert das Polling der externen ProPlanta-Seite. (kannst du deaktivieren indem du das Attribut GR.Link löschst)
Geh mal mit loglevel auf 3 und beobachte ob die Timeouts mit der Abfrage der Web-Sites korrelieren.
Vielleicht müssen wir das Polling auf die Betriebssystem-Ebene auslagern, damit FHEM nicht blockiert ist.
John
Hi John,
ich hab das script gerade eingelesen.
Webseite ist jetzt erst hinzugefügt.
Habe das Globale attr. hinzugefügt.
Bisher keine Disconnects mehr.
Im Log stand leider nichts, da sich fhem anscheinend vollständig verabschiedet hat.
Eine andere Frage,
Kann ich Einträge in das Logfile in größeren Abständen schreiben, als das delay der Abfrage vom Wechselrichter?
Oder Durchschnittswerte?
Ich möchte Geräte in Abhängigkeit der Solarleistung schalten, daher benötige ich relativ genaue Leistungsdaten. (AC.Power)
Wenn nicht muß ich ein wenig umgestalten. Die .pm Massiv abspecken und nur AC.Power abfragen.
(siehe Anhang / see attachement)
Hallo Andre,
dein Wunsch ist nachvollziehbar. Du verwendest den erzeugten Strom selbst.
Ich habe nun ein neues Reading AC.Power.Fast eingeführt.
Auszug aus EventLog:
2013-07-03_08:55:29 Kostal AC.Power.Fast: 830
2013-07-03_08:56:29 Kostal AC.Power.Fast: 842
2013-07-03_08:57:29 Kostal AC.Power.Fast: 856
2013-07-03_08:58:29 Kostal AC.Power.Fast: 874
2013-07-03 08:59:29 KOSTALPIKO Kostal AC.Power: 890
2013-07-03 08:59:29 KOSTALPIKO Kostal AC.Power.Fast: 890
2013-07-03 08:59:29 KOSTALPIKO Kostal Daily.Energy: 1.56
2013-07-03 08:59:29 KOSTALPIKO Kostal generator.3.current: 1.52
2013-07-03 08:59:29 KOSTALPIKO Kostal generator.3.voltage: 617
2013-07-03 08:59:29 KOSTALPIKO Kostal output.1.power: 300
2013-07-03 08:59:29 KOSTALPIKO Kostal output.1.voltage: 230
2013-07-03 08:59:29 KOSTALPIKO Kostal output.2.power: 301
2013-07-03 08:59:29 KOSTALPIKO Kostal output.3.power: 289
2013-07-03 08:59:29 KOSTALPIKO Kostal W: 890 - Einspeisen MPP
Das neue Reading wird also schneller abgefragt als die übrigen.
Werde es den Tag über laufen lassen und melde mich am Abend wieder.
John
Hallo zusammen,
das ist ein tolles Modul, was Ihr da erstellt habt. So etwas ähnliches würde ich auch gerne nutzen. Ich besitze seit 2001 eine Solaranlage mit Fronius-Wechelrichter. Dieser hat eine RS232-Schnittstelle.
Welche Schnittstelle verwendet Ihr? Der PIKO hat ja mehrere Möglichkeiten.
Wie muss der Aufruf in der fhem.cfg gestaltet werden?
Vielen Dank schonmal im Voraus für Eure Auskünfte
Harald
Hi Harald,
ich denke da kommst Du mit unserem Modul leider nicht weiter. Dieses Modul greift auf den Webserver des Wechselrichters zu und wertet dann die empfangene HTML Seite aus. Also nutzen wir kein RS232.
Aber ich meine, dass es für RS232 Wechselrichter/Solarlogger auch schon Module gibt.
Aufruf in der CFG hat John bereits beschrieben: HIER (http://forum.fhem.de/index.php?topic=13508.msg84682#msg84682)
MfG
Matthias
Danke Matthias für die Info,
das habe ich befürchtet, als ich las, dass der PIKO auch über's Netz ansprechbar ist. Dann werde ich mal weiter suchen.
Viel Spaß und Erfolg noch von
Harald
Für deinen Wechselrichter gibt es sicher auch einen Datenlogger. Das wäre vermutlich das einfachste.
Evtl. hat jemand schon was für einen RPI gebaut. In die Richtung würde ich mal suchen.
John, es hat Vor und Nachteile das du das machst.
Vorteil ich hab das total schnell hier und es läuft.
Nachteil, ich lern dabei nix :-D
Ich hab jetzt doch noch unregelmässig Disconnects. Zudem ist heute proplanta nicht erreichbar.
Vllt. liegt es daran?
Wenn ich jetzt Urlaub habe, dann versuch ich das mal rauszufinden woran das liegt.
Hallo Andre,
ZitatJohn, es hat Vor und Nachteile das du das machst.
Vorteil ich hab das total schnell hier und es läuft.
Nachteil, ich lern dabei nix :-D
Da war ich wohl wieder einmal zu schnell.
Es ist gut wenn du die Sache selbst angehst. Melde dich wenn du Unterstützung brauchts.
John
Hi zusammen,
@Andre: Was ähnliches habe ich mir auch gedacht. :) Ich will auch Durch das Basteln an den Modulen Perl und FHEM lernen und begreifen.
Allerdings bin ich John sehr dankbar für die Erweiterungen an dem PV-Modul. Jetzt habe ich die PV Anlage schon mal abgehakt und kann mich z.B. den Homematic Wired Modulen oder einem Modul für den USB-Schreiblesekopf (Auslesen von Smartmetern) vom Volkszählerprojekt kümmern (Oder hat da jemand schon was brauchbares gefunden?).
Und auch wenn man sich in Ruhe das Modul jetzt nochmal anschaut kann man schon viel für eigene Änderungen und Module mitnehmen. Mein Problem: Ich bin mit einem Perlbuch von 1999 angefangen und habe damit versucht die Änderungen von John zu verstehen, das ist aber gründlich in die Hose gegangen. In den letzten 14 Jahren hat sich in der Perl Welt doch einiges getan. Für die Grundlagen (Schleifen, Variablen usw.) ganz ok, aber alles was darüber hinausging war im Buch nicht zu vorhanden :-)
Fazit: Danke John, Du bist nicht zu schnell! Weiter so! :-)
Edit: John, ich habe gesehen, dass Du auch einen RPi einsetzt. Hast Du auch das Problem, dass die Graphen so lange zum laden brauchen? Bei mir ca. 20 Sekunden und das Problem scheint wohl der Prozessor zu sein. In der Zeit läuft die CPU auf 100%.
MfG
Matthias
Hallo Matthias,
ZitatEdit: John, ich habe gesehen, dass Du auch einen RPi einsetzt. Hast Du auch das Problem, dass die Graphen so lange zum laden brauchen? Bei mir ca. 20 Sekunden und das Problem scheint wohl der Prozessor zu sein. In der Zeit läuft die CPU auf 100%.
Bei 4 Charts im Bild benötigen mit dem Raspi ca. 3..4 Sekunden:
Grösse der Dateien f. Charts:
1. Datei: 2.5 MB
2. Datei: 700 MB
3. Datei: 6 MB
4. Datei: 500 MB
Der Prozessor läuft praktisch immer auf minimaler Taktung: (bis auf die kurzen Chart-Abfragen)
John
Hallo John,
bei mir dauert das Laden auch so lange.
Ich vermute das kommt von dem Interwall des Logs.
Aber weißt du was super wäre, wenn du die geänderte PM mit AC.Power.Fast: noch online stellen würdest. Ich hab mir jetzt was tolles neues ans Bein gebunden ;)
Ich hab kräftig Hardware bestellt. Mit dem Einbau werd ich einige Zeit beschäftigt sein.
Du willst mir keinen Support leisten :-D Glaub mir. ;)
Ich dank dir auf jeden Fall sehr für deine Arbeit.
Gruß Andre
Das neue Reading AC.Power.Fast hat fast künstlerischen Wert.
(siehe Anhang / see attachement)
Will man das neue Reading AC.Power.Fast nicht in der Log-Datei sehen, ändert man den Filter für Filelog.
Hier einfach den Doppelpunkt einfügen. Würde bei AC.Power reichen, aber aus systematischen Gründen am besten überall.define Kostal.File FileLog ./log/Kostal-%Y.log Kostal:(AC.Power:|Daily.Energy:|Total.Energy:|ModeNum:|EnergyExpected:).*
AC.Power.Fast hat ja zunächst denselben Wert wie AC.Power.
Wer jedoch das schnelle Reading nutzen will setzt zunächst den Wert von delay runter z.B auf minütliche Abtastung
attr Kostal delay 60
Dann würde jedoch die LogDatei schnell anwachsen, was nicht jeder will.
Daher gibts ein neues optionales Attribut delayCounter.
Optional heisst, es muss nicht definiert sein, es kann definiert sein.
attr Kostal delayCounter 5
Nun wird nur AC.Power.Fast minütlich abgetastet, alle anderen mit 5 * 60 sec. =300 sec, also alle 5 Minuten.
Wer nun mit dem schnellen AC.Power.Fast nutzen will kann ein notify definieren, das praktisch jede Minute gefeuert wird.
(Um z.B. damit Verbraucher zu schalten)
define Kostal.Event notify Kostal:AC.Power.Fast.* {Log (3,"%EVTPART0 wurde gefeuert mit Wert: %EVTPART1");;}
John
Hallo John,
ich hab die neue PM jetzt online. Nach X mal hin und her.
Ich weiß echt nicht was bei mir nicht stimmt mit dem Kram.
Erst sagt er das er die PM nicht findet, dann soll ich ein KOSTALPIKO define machen?!?
Dabei hab ich nur den Inhalt der datei getauscht.
Dann konnte er urplötzlich die Datei nicht mehr finden oO.
Dann hab ich die Datei neu erstellt...
Naja letzendlich geht es jetzt wohl.
Solche Probleme hatte ich mit meiner leider durch Blitz zerstörten 1&1 7390 nicht. Nur mit der neuen Fritzbox 7390.
Offtopic.
Ich lass mir auch ne Mail schreiben wenn ich nicht da bin und eine Tür oder Fenster geöffnet werden.
Es wird nur ein event generiert, aber es kommen 2 Mails.
Frag mich mal einer warum. ???
Das Modul wird erwachsen. Echt geiles Ding ;)
Ich hab mir das Modul mal gerade angeschaut.
# state noch hinzufuegen
$rdValue = "W: ".$hashValues{"AC.Power.Fast"}." - ".$hashValues{"Mode"};
$hashValues{state} = $rdValue;
Das da oben funktioniert nicht. Vllt. kannst du mir jetzt doch helfen und erklären wo mein Denkfehler ist?
Hi Andre,
es gibt eine bei weitem elegantere Methode dies zu erreichen.
Du musst dazu nicht einmal das Modul selbst ändern.
Lies mal im CommandRef zum Thema stateFormat nach.
Beispiel:
attr Kostal stateFormat MyPowerFast:AC.Power.Fast - MyMode:Mode
liefert im State nach der ersten Aktualisierung eines Readings:
MyPowerFast:1428 - MyMode:Einspeisen MPP
oder um das zu erreichen was du willst:
attr Kostal stateFormat W:AC.Power.Fast - Mode
John
Hallo
Erstmal ein SUPERFETTES Lob an matsefisi und John.
Aber leider stehe ich auf meiner eigenen Leitung.
Bei mir kommt egal was ich mache, ob mit oder ohne
GR.Link
Folgender Fehler
Use of uninitialized value $URL in concatenation (.) or string at /opt/fhem//FHEM/23_KOSTALPIKO.pm line 225.
Im Code selber will er ja die URL, oder?
Ich verstehe nicht was ich da falsch mache?
Habe Folgendes eingetragen:
GR.Link http://www.proplanta.de/Wetter/Ludwigsburg-Wetter-Heute.html
Weiterhin schreibt er nichts ins Logfile. Angelegt wird es aber.
Hier der Teil der Config:
#
# Photovoltaik
#
define Sonnenschein2011 KOSTALPIKO 192.168.0.19 xxxxx yyyyy
attr Sonnenschein2011 delay 300
attr Sonnenschein2011 loglevel 4
attr Sonnenschein2011 room Energie
define FileLog_KOSTAL_PV FileLog ./log/KOSTAL_PV-%Y.log KOSTAL:(AC.Power|Daily.Energy|Total.Energy|ModeNum|EnergyExpected).*
attr FileLog_KOSTAL_PV logtype text
attr FileLog_KOSTAL_PV room Logfiles
define Link_Sonnenschein2011 weblink fileplot FileLog_KOSTAL_PV:CURRENT
attr Link_Sonnenschein2011 label "Sonnenschein2011 Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr Link_Sonnenschein2011 room Diagramme
define FileLog_KOSTAL_PV_M FileLog ./log/KOSTAL_PV_M-%Y-%m.log KOSTAL:(Daily.Energy.Last).*
attr FileLog_KOSTAL_PV_M logtype text
define Link_Sonnenschein2011_1 weblink fileplot FileLog_KOSTAL_PV:FileLog_KOSTAL_PV_M:CURRENT
attr Link_Sonnenschein2011_1 fixedrange month
attr Sonnenschein2011 userReadings EnergyExpected:Global.Radiation { return ReadingsVal("Sonnenschein2011","Global.Radiation",0)*37*0.10;;}
Die Werte in der letzten Zeile habe ich einfach so zum Test übernommen.
Er zeigt mir auch den momentanen Ertrag in den Werten an.
Wo sitzt nur der Fehler (Ja, ja; zwischen meinen Ohren)?
Gruß
Uli
Also das Problem mit dem leeren Log habe ich selbst herausgefunden.
So war es
.
.
define FileLog_KOSTAL_PV FileLog ./log/KOSTAL_PV-%Y.log KOSTAL:(AC.Power|Daily.Energy|Total.Energy|ModeNum|EnergyExpected).*
.
.
.
define FileLog_KOSTAL_PV_M FileLog ./log/KOSTAL_PV_M-%Y-%m.log KOSTAL:(Daily.Energy.Last).*
.
.
Abgeändert auf folgende Zeilen
.
.
define FileLog_KOSTAL_PV FileLog ./log/KOSTAL_PV-%Y.log KOSTAL
.
.
.
define FileLog_KOSTAL_PV_M FileLog ./log/KOSTAL_PV_M-%Y-%m.log KOSTAL
.
.
Jetzt klappt es auch mit dem Nachbar.
Der Fehler mit dem
GR.Link
Use of uninitialized value $URL in concatenation (.) or string at /opt/fhem//FHEM/23_KOSTALPIKO.pm line 225.
Besteht weiterhin.
Gruß
Uli
Hast du die aktuelle Version von der .pm?
Bei mir funktioniert das.
Wenn du die alte und jetzt die neue benutzt, hast du dein reload der pm gemacht?
Du hast den Filter gelöscht und schreibst somit viele Informationen in dein Logfile. Ist das so gewünscht?
#########Wechselrichter#####################################
define Wechselrichter KOSTALPIKO 192.168.X.X pvserver pvwr
attr Wechselrichter GR.Link http://www.proplanta.de/Wetter/DeinORT-Wetter-Heute.html
attr Wechselrichter alias Wechselrichter
attr Wechselrichter delay 60
attr Wechselrichter delayCounter 4
attr Wechselrichter loglevel 4
attr Wechselrichter room Keller,Alarmanlage
attr Wechselrichter userReadings EnergyExpected:Global.Radiation { return ReadingsVal("Wechselrichter","Global.Radiation",0)*39*0.16;;}
define PowerLog FileLog ./log/powerlog-%Y.log Wechselrichter:(AC.Power:|Daily.Energy:|Total.Energy:|ModeNum:|EnergyExpected:).*
attr PowerLog logtype text
attr PowerLog room Keller
####Plot###################################################
define wl_PowerLog_1 weblink fileplot PowerLog:wl_PowerLog_1:CURRENT
attr wl_PowerLog_1 room Keller
Danke Dir,
jetzt gerade habe ich gesättigt und frischen Mutes getankt, den Fehler gefunden.
Wenn ich direkt im fhem den Code
attr Wechselrichter GR.Link http://www.proplanta.de/Wetter/DeinORT-Wetter-Heute.html
eingebe, so macht er den Mist.
Wenn ich jedoch die Zeile ins File schreibe, so passt es. Naja bei vielen Sachen geht es, und hier eben nicht.
Ne das mit dem FileLog ohne Filter war die Notlösung auf die Schnelle. Aber so ist der Ansatz da.
Ich schraube noch ein wenig am Code. Mal sehen ob ich die Bude abfackel.
Danke Dir auf jeden Fall.
Bye
Uli
So habe den Fehler gefunden.
Die nicht in der Config eingegebene Zeile
attr Wechselrichter_Name GR.Link http://www.proplanta.de/Wetter/DeinORT-Wetter-Heute.html
Verhindert das Generieren der erforderlichen Werte in den LogFiles.
Daraufhin Fehlfunktionen des wirklich guten Moduls.
Danke und weiter so.
Gruß
Uli
Ich hab den von Uli gefunden Fehler bereinigt, die aktuelle Version liegt bei.
Wenn nicht zuviele Wolken vorüberziehen klappt die Prognose relativ gut.
(siehe Anhang / see attachement)
Bei Woken hingegen, nicht so gut
(siehe Anhang / see attachement)
Wie sind eure Erfahrungen ?
John
Moin John,
ja kann ich bestätigen. Bei durchgehender Sonne ist alles gut, sobald es aber diesig oder bewölkt wird, stimmt die Prognose nicht mehr.
Das hatte ich ja schon am anfang dieses Threads befürchtet. Ich werde mal weiter beobachten und gucke mal ob ich evtl. noch eine andere Quelle für eine solche Prognose (mit Wetterdaten) finde.
MfG
Matthias
Hier die Prognosen seht selbst
Der Wert für die pro m² energie, bezieht sich ja auf die Energie die auf einen m² Erde fallen mit dem jeweiligen Einstrahlwinkel.
Was ich damit sagen möchte, meine Anlage ist nach Süden ausgerichtet. Ist es von 8-16 Uhr bewölkt und dann kommt die Sonne raus, kann meine Anlage die eig. anstehende Energie nicht mehr umsetzen.
Nur wenn ich die Anlage der Sonne entgegen ausrichten würde. Leider kann ich das Dach nicht passend drehen ;)
Dem m² Boden ist das aber gleich wo die Sonne steht.
Heute könnte ein vollständiger Sonnentag werden, den kann ich dann auch nochmal Posten. Energy Expected bis jetzt 48,048 kw
Sonnig:
(siehe Anhang / see attachement)
Leicht bewölkt:
(siehe Anhang / see attachement)
Wolkig
(siehe Anhang / see attachement)
SUPER,
Vielen vielen Dank fuer dieses Modul.
Klappt hervorragend, ich bin total begeistert.
Man kann auch eine Monatsanzeige realisieren:
(siehe Anhang / see attachement)
Die Definition für File_2 sieht wie folgt aus:
define Kostal.File_2 FileLog ./log/Kostal_2-%Y.log Kostal:(Daily.Energy.Last:).*
attr Kostal.File_2 logtype text
define wl_Kostal.File_2 weblink fileplot Kostal.File_2:wl_Kostal.File_2:CURRENT
attr wl_Kostal.File_2 fixedrange month
Die Definition des Charts:
(siehe Anhang / see attachement)
John
Hi,
waere es nicht sinnvoller auf ein Zusaetzliches Log zu verzichten und im Monatsreport besser den Letzten Wert der Daily Eergy eines jeden Tages zu verwenden?
Neben dem gesparten Log koennte man dann im Monatsgraph auch den aktuellen Tag mit dem bisher erreichten Stand erkennen. Ich hab nur keine Ahnung wie ich diesen letzten Wert eines Tages abfrage....
Kriegt man darin auch eine agregierte Linie mit der Summe der im Monat erzeugten Energie? Eventuell auch noch im Vergleich der prognostizierten Energie?
Hi, kann man irgendwie für die X-Achse den Wertebereich vorgeben?
Ich möchte die Tages Einstellung von 5-22 Uhr begrenzen, an den restlichen Stunden passiert eh nix. Eventuell kann man auch das logfile so aufzeichnen lassen das es diese Zeiten ausspart, nur wie geht das?
Dann wäre es noch super wenn man den Graphen in der Höhe vergrößern könnte, wo finde ich den Parameter der das Format vorgibt?
Danke für die Hilfe.
ZitatHi, kann man irgendwie für die X-Achse den Wertebereich vorgeben?
Ich kenne nur die Möglichkeit Zeitbereiche wie Tage, Wochen, Monate vorzugeben.
ZitatIch möchte die Tages Einstellung von 5-22 Uhr begrenzen, an den restlichen Stunden passiert eh nix. Eventuell kann man auch das logfile so aufzeichnen lassen das es diese Zeiten ausspart, nur wie geht das?
Wenn du dir die Logfiles genau ansiehst, wirst du erkennen, dass zu gewünschten "Aussparungen" praktisch keine Daten einlaufen.
Um 23:00 wird der Tageswert geschrieben.
ZitatDann wäre es noch super wenn man den Graphen in der Höhe vergrößern könnte, wo finde ich den Parameter der das Format vorgibt?
Die Y-Achse lässt sich wie
hier (http://forum.fhem.de/index.php?topic=13508.msg87614#msg87614)
gezeigt unter "Range as [min:max] einstellen.
John
Hi danke fuer das Feedback.
also keine chance die Zeitachse auf z.B. 5-22 Uhr zu skalieren, ich muss mir die Nulllinie in der Zeit bis 5:00 und ab 22:00 angucken. Schade.
Und bei der y-Achse meinte ich nicht die Skalierung sondern die absolute Hoehe des Graphen, ist aber vermutlich ebenso fest wie die Breite des Graphen, vermute ich mal.
Nochmal Schade
Hallo, noch ne Frage.
Ich moechte gern von der Sonneneinstrahlung (Wechselrichter.AC-Power) abhaengig einen Aktor (Pumpe) schalten und in einem Plot beide Werte monitoren. ( die Pumpe hat noch wietere Regeln wann sie auch noch schalten soll)
Das schalten krieg ich ja noch hin, aber fuer den Plot brauche ich ein Log das aus zwei Quellen gefuettert wird, naemlich dem Aktor( Pumpe an oder aus) und Wechselrichter (Ac.Power)
Wie mach ich das?
Hi, obige Frage kann ich mir dann doch einfach selbst beantworten. sorry.
Die Loesung ist ein Log nur fuer die AC.Power zu bauen und dann in dem Log fuer den Aktor ein
Set Absorb logfile2
zu machen, damit gibt es nur noch ein Log in dem beides augezeichnet wird.
Ja ich weiss wer lesen kann ist klar im Vorteil.
....nun aber noch ne richtige Frage.
Wenn ich denn nun in Abhaengigkeit von AC.Power schalten will wie lautet dann die Syntax?
Das hier funktioniert nicht, bringt aber auch keinen Fehler
define Pool2 notify Wechselrichter.AC.Power: >1000 Set Poolpumpe on
und das ergibt einen Fehler da die Klammern keinen Sinn machen:
define Pool2 notify (Wechselrichter AC.Power:) >1000 Set Poolpumpe on
hi,
...und noch ne Frage....
Ist da irgendeinweg um noch die Steuerkontakte des Wechselrichters abzufragen? Dareueber kann man ja z.B. die Temeperatur der module messen.
Probier das mal so
define Pool2 notify Wechselrichter AC.Power: > 1000 set Poolpumpe on
Nur ich weiß nicht ob das so geht wie oben geschrieben.
Wenn nicht dann musst du das so machen:
define Pool2 notify Wechselrichter:.* {\
if (ReadingsVal("Wechselrichter", "AC.Power.Fast", "") > 1000) {\
fhem ("set Poolpumpe on");;\
}\
else {\
fhem ("set Poolpumpe off");;\
}\
}
Blöd ist nur das er bei jedem Event von dem KOSTALPIKO.pm die Routine abarbeitet.
Kannst noch ein paar Ifs einbauen um unnötige Abschaltbefehle zu vermeiden.
Hi, Danke das einschalten funktioniert. Daneben hab ich noch feste einschaltzeiten....
Nun gehts ans ausschalten das nur zwischen 15-17 Uhr erfolgen darf und ur wenn wenig bis keine sonne scheint.
Das hab ich so versucht zu realisieren:
Wechselrichter:.* {if ($now> 15:00)&&($now< 17:00)&&(ReadingsVal("Wechselrichter", "AC.Power", "") < 2500) { fhem ("set Poolpumpe off")}}
Leider gibt es aber probleme mit dem $now
Was mach ich hier falsch?
nimm Anstatt $now $hour als Wert dann z.B. 17
{if ($hour > 15)&&($hour < 17)&&(ReadingsVal("Wechselrichter", "AC.Power", "") < 2500) {fhem ("set Poolpumpe off")}}
Hab es nicht getestet. Sollte aber klappen.
Ich weiss nicht wie $now definiert ist.
hi, klappt leider noch nicht.
Also der erste Befehl funktioniert, der zweite leider nicht. wie muss ich den zweiten Befehl aendern?
define PoolbeiSonne notify Wechselrichter:.* {if (ReadingsVal("Wechselrichter", "AC.Power", "") > 1500) {if("Poolpumpe" eq "off"){fhem ("set Poolpumpe on")}}}
define PoolkeineSonne notify Wechselrichter:.* {if ((ReadingsVal("Wechselrichter", "AC.Power", "") < 1400)&&($hour> 15)&&($hour< 17)) { fhem ("set Poolpumpe off")}}
Der einzige Unterschied ist eigentlich nur der das ich 3 Bedingungen habe statt nur einer wie im ersten Beispiel. Klingt so simpel und ist doch so schwierig.
die Fehlermeldung lautet:
2013.08.28 09:03:51 3: PoolkeineSonne return value: Unknown command {if, try help
define PoolkeineSonne notify Wechselrichter:.* {if (ReadingsVal("Wechselrichter", "AC.Power", "") < 1400 && $hour > "15" && $hour < "17") {fhem ("set Poolpumpe off")}}
Probier es mal so. Ich hoffe da sind keine Zeichenfehler mehr drin. Für mich ist das in einer Zeile schreiben unübersichtlich.
Hi klappt leider nicht.
ich hab nun beide Versionen in einer Zeile die nicht funktionieren mal im Vergleich, nehme aber auch gerne die mit Zeielnumbruch
nochmal das geht (eine Bedingung)
define Pool5 notify Wechselrichter:.* {if (ReadingsVal("Wechselrichter", "AC.Power", "") < 1400) { fhem ("set Poolpumpe off")}}
und das mit 3 Bedingungen nicht. (egal ob die 3 in Klammern stehen oder nicht)
define PoolkeineSonne notify Wechselrichter:.* {if ((ReadingsVal("Wechselrichter", "AC.Power", "") < 1400)&& ($hour> 15)&& ($hour< 17)) { fhem ("set Poolpumpe off")}}
define PoolkeineSonne notify Wechselrichter:.* {if (ReadingsVal("Wechselrichter", "AC.Power", "") < 1400 && $hour > "15" && $hour < "17") {fhem ("set Poolpumpe off")}}
Was ich eh nocht nicht in dem code kapiere ist das: Wechselrichter:.*
Was soll das? Ist das der Killer?
Eigentlich ist doch: ReadingsVal("Wechselrichter", "AC.Power", "") < 1400
eine vernuenftige Abfrage. Warum muss dieses "Wechselrichter:.*" noch vor dem IF stehen? Bewege ich mich eventuell nun nur innerhalb des Wechselrichters und somit klappt "$hour" nicht mehr?
mit Zeielenumbruch solle es dann das sein, richtig?:
define PoolkeineSonne notify Wechselrichter:.* {\
if (ReadingsVal("Wechselrichter", "AC.Power", "") < 1400)&&\
($hour> 15)&&\
($hour< 17) {\
fhem ("set Poolpumpe off");;\
}\
}
Das Wechselrichter:.* bedeutet soviel wie das jedes Event vom Wechselrichter was gefeuert wird diese Routine abarbeiten lässt.
Mit ReadginsVal liest du aus die Readings aus. Die in deinem definierten Wechselrichter stehen.
Die generierten Events sind nicht eindeutig da der State irgendwas mit W: 1220 MPP einspeisen ist, klick mal auf Eventmonitor und schau was da so kommt.
Deswegen der Weg:
Wechselrichter sendet irgendwas -> notify löst aus -> mit dem IF wird geprüft ob in den Readings AC.Power der Wert X steht wenn true mach das in dem Fall set Poolpumpe off.
Den Code hab ich getestet mal flott. der geht. Weiß ja nicht wie das Wetter bei dir ist, hier ist gerade über 1400 Watt deswegen gt du möchtest ja lt.
define notify_Test notify Wechselrichter:.* {\
if (ReadingsVal("Wechselrichter", "AC.Power", "") gt 1400 && $hour > "15" && $hour < "17")\
{\
fhem ("set Poolpumpe off");;\
}\
Log 3, "True @ $hour";;\
}
Achso was ich vergas, der code zieht natürlich nur zwischen 15 und 17 Uhr bedeutet nur von 16:00 - 16:59Uhr. >= <= wäre dann die Abwandlung ;)
hi, funktioniert soweit uasser das ich statt GT doch das Zeichen ">" benutzen muss. keine Ahnung warum....
Um jetzt die Funkbefhele zu minimieren wollte ich in die IF Schleife auch och einfuegen das er nur EIN schaltet wenn der Schalter aud AUS steht, dann braucht er nicht alle paar Minuten zu wiederholen, nur weil die Sonne scheint. Klappt aber auch wieder nicht.
Mein code sieht so aus:
define PoolbeiSonne notify (5min_check|global:INITIALIZED) {\
if ("Poolpumpe" eq "on") &&(ReadingsVal("Wechselrichter", "AC.Power", "") > 2500))\
{\
fhem ("set Poolpumpe on");;\
}\
}
Es gibt keine Fehlermeldung, aber die Pumpe schaltet nicht. Loesche ich hingegen den kursiven Teil, dann klappts. Was mach ich denn nun shcon wieder falsch?
Zitatdas ich statt GT doch das Zeichen ">" benutzen muss. keine Ahnung warum
weil 1400 numerisch ist und kein String "1400"
Zitatif ("Poolpumpe" eq "on")
Das Wort Poolpumpe ist nunmal ein völlig anderes Wort als das Wort "on", deshalb kann der Vergleich mit "eq" (und damit Deine gesamte mit logischem UND verknüpfte Bedingung) niemals wahr werden. Der Vergleich an sich ist syntaktisch völlig richtig, wenn auch sinnlos, deshalb gibt es keine Fehlermeldung.
Vermutlich willst Du den WERT von "Poolpumpe" abfragen, also Value("Poolpumpe"), das würde ein bißchen mehr Sinn machen ;)
Hallo Betateilchen,
kannst mir das nochmal erklaeren?
Ist gt und lt nicht das gleiche wie > < ?
Bei mir lief der code mit gt.
Grundsätzlich ist entscheidend, ob Du numerische Werte oder Zeichenketten vergleichen willst.
Dafür gibt es unterschiedliche Vergleichsoperatoren.
14 ist eine Zahl (numerischer Wert), da vergleichst Du mit < > = !=
"14" ist ein Text (Zeichenkette), da vergleichst Du mit lt gt eq ne
Hier findest Du ausführliche Erklärungen:
http://de.selfhtml.org/perl/sprache/operatoren.htm (//de.selfhtml.org/perl/sprache/operatoren.htm)
---
hi, vielen dank, so langsam komme ich dahinter.
Ich habe nun die Poolpumpe im Griff. sie schaltet immer ein wenn genug Sonne scheint und wenn der Poolrolladen offen ist sowie zu bestimmten Schaltzeiten.
Nun waere perfekt wenn ich irgendiwe die Zeit messen kann in der die Pumpe laeuft. Dann koennte ich die zeitabhaengige Regelung anpassen da diese eigentlich nur sicherstellen soll das eine gewisse mindestdauer pro Tag eingehalten wird.
Es gibt doch da siche reine moeglichkeit eine Variable zu definieren und irgendwie einen Zaehler mit zu verknuepfen, oder?
Danke fuer die Tipps.
natürlich. Vom Timestamp des Ausschaltens den Timestamp des Einschaltens abziehen und schon hast Du die Laufzeit. Und die addierst speicherst Du irgendwo, z.B. in einem userreading oder zur Not sogar in einem Attribut.
Hi, klase Idee,
da ich ja an einem Tag unbekannt viele Schaltvorgaengehabe ( immer bei Sonne ein, und bei sonne weg aus) summiere ich dann also alle ausschaltzeiten und ziehe davon die summe aller einschaltzeiten ab und shcon hab ich die Laufzeit, cool. Werd ich mal ausprobieren.
hä?
Du musst die Summe bei jedem Abschalten ermitteln. Alles andere dürfte kompliziert werden.
Hi, nun die ganze schalterei der Pumpe wird ziemlich kompliziert, also hab ich mich entschlossen das lieber in die 99_myUtils.pm zu packen. Was ich soweit habe ist das hier:
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
##########################################################
# Poolpumpensteuerung
# Aufruf in fhem.cfg mit
# define Poolpumpenparameter notify (5min_check|global:INITIALIZED) ..
# ..{Pool(an1, aus1, an2, aus2, Tagesdauer, minPV)}
# an1 und aus1 ist das erste Zeitschaltpaar zwischen der die Poolpumpe an sein muss
# an2 und aus2 ist das zweite Zeitschaltpaar zwischen der die Poolpumpe an sein muss
# Tagesdauer gibt die maximale Laufzeit pro Tag an, sobald erreicht schaltet Pumpe aus
# die Pumpe geht auch an wenn die PV anlage mindestens x kwh Stom produziert,
# abschalten erfolgt dann bei 10% weniger
# damit alles funktioniert sind folgende Geraete in fhem.cfg
# define Poolpumpe CUL_HM xxxxx das zu steuernde Geraet
# define Wechselrichter KOSTALPIKO xxxx liefert den PV Strom als reading "AC.Power"
# define Poolog Filelog xxxxx liefert die Laufzeit der Pumpe
##########################################################
sub Pool($$$$$$){
my ($an1, $aus1, $an2, $aus2, $Tagesdauer, $minPV) = @_;
$Laufzeit_Poolpumpe_erreicht = ????
if (((Value("Poolpumpe") eq "off") && $hour == $an1)||
((Value("Poolpumpe") eq "off") && $hour == $an2))||
((Value("Poolpumpe") eq "off") && (ReadingsVal("Wechselrichter", "AC.Power", "") > $minPV))||{
fhem("set Poolpumpe on");
}
if (((Value("Poolpumpe") eq "on") &&
($hour <= $an1||($hour >= $aus1 && $hour <= $an2) || $hour >= $aus2) &&
(ReadingsVal("Wechselrichter", "AC.Power", "") < ($minPV * 0.9) ||
(Laufzeit_Poolpumpe_erreicht){
fhem("set Poolpumpe off");
}
}
1;
Leider ist der code nicht getestet. Gibt es dafuer sowas wie einen debug modus das man schritt fuer schritt durchspielt und sieht wie welche Variable reagiert? waere toll.
Nun aber zurueck zu dem Problem. Ich habe hier noch offen die Laufzeit der Pumpe zu ermitteln. Mein Logfile hat folgende Eintraege:
2013.09.04 15:02:56 2: CUL_HM set Poolpumpe on
Ich habe auch noch ein Poolspezifisches Logfile definiert mit:
define Log_Pool FileLog ./log/Homematic-Pool-%Y.log Pool.*level.*
das liefert diesen eintrag:
2013-08-20_18:05:34 Poolpumpe level: 100 %
2013-08-20_18:05:40 Poolpumpe level: 0 %
Aber wie lese ich die Werte nun aus?
Das hier klappt ja wohl nicht so ganz:
$Logzeit = (ReadingsVal("Log_Pool", "2013-$month-$day_", "")
Ich hab da leider nix imForum gefunden, ich hoffe ich bin einigermassen nah dran, aber ohne tipps komm ich hier leider nicht weiter.
Danke nochmals fuer die Unterstuetzung
Hallo Heiner,
ich habe für einen Max-Fensterkontakt einen Betriebsstundenzähler programmiert.
Ich messe damit die Einschaltdauer meines Brenners und die Brennerstarts.
Das Reading cntOntimePerDayHours ist der Betriebsstundenzähler über den Tag.
Der Zähler wird bei Tageswechsel automatisch zurückgesetzt.
Man kann statt des Stundenzählers auch den Sekundenzähler cntOntimePerDaySeconds verwenden.
Der Link zum Thema
Link (http://forum.fhem.de/index.php?topic=12216.msg72596#msg72596)
Vielleicht hilft dir das etwas weiter.
Gruß
John
Hallo zusammen,
ich beschäftige mich erst seit kurzem mit FHEM.
Ich habe das Kostal Modul bei mir eingerichtet bekommen, allerdings werden bei mir ALLE Werte geloggt, statt nur den gewolten.
Vielleicht kann mir ja einer sagen was ich falsch gemacht habe.
Danke für das super Modul.
Gruß Jan
Hier mein Code
##################################
# KOSTAL PICO
##################################
define Kostal KOSTALPIKO 192.****** pvserver pvwr
attr Kostal GR.Link http://www.proplanta.de/Wetter/************-Wetter-Heute.html
attr Kostal delay 300
attr Kostal loglevel 4
attr Kostal room 80_Steuerung
attr Kostal userReadings EnergyExpected:Global.Radiation { return ReadingsVal("Kostal","Global.Radiation",0)*66*0.10;;}
# log-files definieren
define Kostal.File FileLog ./log/Kostal-%Y.log Kostal
attr Kostal.File logtype Kostal:AC.Power|Daily.Energy|Total.Energy|ModeNum|EnergyExpected,text
attr Kostal.File room 90_Log_Files
define SVG_Kostal.File_1 weblink fileplot Kostal.File:SVG_Kostal.File_1:CURRENT
attr SVG_Kostal.File_1 room 20_PV_Anlage
define Kostal.File_2 FileLog ./log/Kostal_2-%Y.log Kostal
attr Kostal.File_2 logtype Kostal:Daily.Energy.Last,text
attr Kostal.File_2 room 90_Log_Files
define SVG_Kostal.File_2 weblink fileplot Kostal.File_2:SVG_Kostal.File_2:CURRENT
attr SVG_Kostal.File_2 fixedrange month
attr SVG_Kostal.File_2 room 20_PV_Anlage
Hallo Jan
verssuchs mal damit:
define Kostal.File FileLog ./log/Kostal-%Y.log Kostal:(AC.Power:|Daily.Energy:|Daily.Energy.Last:|Total.Energy:|ModeNum:|EnergyExpected:).*
attr Kostal.File logtype text
attr Kostal.File room 90_Log_Files
John
Hi John,
scheint zu klappen, DANKE!
Vielleicht nochmal für mein Verständnis:
define Kostal.File FileLog ./log/Kostal-%Y.log Kostal:(AC.Power:|Daily.Energy:|Daily.Energy.Last:|Total.Energy:|ModeNum:|EnergyExpected:).*
Ich definiere ein FileLog mit dem Namen Kostal.File, was in den Ordner log unter Kostal-2013.log gespeichert wird. Nun will ich aus meinem Kostal (der vorher als KOSTALPIKO) definiert wird, nur die Werte in der Klammer haben.
Was aber bedeutet das .* ?
Regexp.png:
Da sehe ich jetzt meine gefilterten Werte richtig?
Nur sehen für mich der erste und letzte Wert nicht richtig aus mit den Klammern :o :D
Was bedeutet der Blog im Anhang: Logfile Übersicht.png?
Sorry für ganzen Fragen, aber ich persönlich lerne die solche Sachen schneller durchs machen und ausprobieren, statt durchs lesen :P ;)
Hallo Jan,
viele Definitionen unter FHEM kann man mit RegularExpressions vornehmen.
Perl unterstützt diese sehr gut.
Also empfehle ich dir, dich damit auseinanderzusetzen.
Ich teile dein Unverständnis zu Regexp.png.
zum Thema:
im Comandref zu Filelog findet man
ZitatThe regexp will be checked against the device name devicename:event
<devicename> : hier ist das Device einzutragen, von dem wir die Events speichern wollen, also
Kostal; könnte wohl auch
ein regexp sein, wenn wir mehrere Kostals hätten
":" der Separator für die Beschreibung der Events, die wir haben wollen
<event> : das ist die Beschreibung für die Events, die wir haben wollen als REGEXP
<event> betrachten wir näher:
Zitat(AC.Power:|Daily.Energy:|Daily.Energy.Last:|Total.Energy:|ModeNum:|EnergyExpected:).*
() bedeutet, dass nun mehrere Varianten an dieser Textstelle möglich sind , um einen Treffer zu landen
| ist eine logische Oderung der einzelnen Ausdrücke
. steht für ein belieges Zeichen
* das 0-n-mal auftreten kann (es ist also egal was hinterher noch an Zeichen kommt)
Als Hilfe nehmen wir einen Auszug aus dem Event-Monitor:
2013-11-07 13:37:39 KOSTALPIKO Kostal AC.Power: 3952
2013-11-07 13:37:39 KOSTALPIKO Kostal AC.Power.Fast: 3952
2013-11-07 13:37:39 KOSTALPIKO Kostal W: 3952 - Einspeisen MPP
Wir betrachten die erste Zeile: KOSTALPIKO ist das device.
es geht also um folgenden Ausdruck: "AC.Power: 3952"
"AC.Power:" Ist eine Variante in unserem Ausdruck (AC.Power:|Daily.Energy:|Daily.Energy.Last:|Total.Energy:|ModeNum:|EnergyExpected:)
" 3952" mit .* akzeptieren wir alles was danach kommt.
Ergebnis: die Zeile ist ein Treffer für unseren Filter.
John
Ahhaaaa!
Na das hab ich jetzt verstanden. ;D
Großen Dank an dich für die super Beschreibung.
Die RegularExpressions sehe ich mir dann nochmal genauer an.
Danke nochmals.
Hallo,
ich hab auch den Kostal Piko im einsatz. Um die Leistung pro String zu plotten muesste ich die gegebenen Readings Spannung String 1 Strom String 1 usw. mit einander multiplizieren. Wie geht das?
Geht das nur in der Kostal.pm oder auch innerhalb der fhem.cfg mit einem Dummy oder so oder sogar innerhalb des SVG Plot?
Vielen Dank fuer die Hilfe.
Hallo Heiner,
da solltest du dir die UserReadings in der Commandref genauer ansehen.
Hier kann man eigene Readings von bestehenden ableiten.
John
hi ich versuchs aber schaffe es leider nicht.
mein
attr Wechselrichter userreadings Generator.1.power:generator.1.current { return ReadingsVal("Wechselrichter","generator.1.current",0) * return ReadingsVal("Wechselrichter","generator.1.voltage",0)}
erzeugt noch nicht einmal das neue Reading Generator.1.power
geschweige denn das es die Berechnung ausführen würde.
Danke für die Hilfe
Hallo Heiner,
ich hab das mal selbst probiert und es gibt das tatsächlich einige Hürden.
Folgendes funktioniert: (immer alles in einer Zeile)
attr Kostal userReadings generator_3_power {return ReadingsVal("Kostal","generator.3.current",0)*ReadingsVal("Kostal","generator.3.voltage",0);;}
Das geht nicht: (scheinbar darf der Name für das neue Reading keine Punkte enthalten)
attr Kostal userReadings generator.3.power {return ReadingsVal("Kostal","generator.3.current",0)*ReadingsVal("Kostal","generator.3.voltage",0);;}
Wenn wir die Triggerbedingung noch sinnvoll einschränken siehts so aus:
attr Kostal userReadings generator_3_power:generator.3.* {return ReadingsVal("Kostal","generator.3.current",0)*ReadingsVal("Kostal","generator.3.voltage",0);;}
Wenn das ganze zusammen mit EnergyExpected funktionieren soll: (alles in einer Zeile)
attr Kostal userReadings EnergyExpected:Global.Radiation {return ReadingsVal("Kostal","Global.Radiation",0)*37*0.10;;},generator_3_power:generator.3.* {return ReadingsVal("Kostal","generator.3.current",0)*ReadingsVal("Kostal","generator.3.voltage",0);;}
Ich hoffe das hilft weiter.
John
Hallo, nochmal was ganz anderes. Ich hab einen HMLAN im Einsatz und meinen Kostalwechelrichter. DER HMLAN erzeugt immer wieder disconnects weil ein KeepAlive Signal um mehr als 5 Sekunden verzoegert wird.
Nach einigen Analysen mit den Experten in Homemmatic stellten wir fest das die Ursache beim Kostalmodul zu liegen scheint, Hier sagt
apptime maxDly
name function max count total average maxDly
tmr-KOSTALPIKO_GetStatus HASH(0xd14da8) 6194 1233 752921 610.64 674 HASH(0xd14da8)
das bedeutet das die Abfrage bis zu 6.2 Sekunden dauert.
Kann man daran was aendern?
Im Moment habe ich den delay auf 60, und den delaycounter auf 5, ich wird das mal auf 300 und 1 aendern auch wenn ich dann die Fastabfrage verliere.( Soolte aber nichts ändern oder?)
Kann man sonst noch was machen?
Moin Heiner,
ich habe zwar keinen Kostalwechelrichter, aber eine Lösung wäre, den Wechselrichter in eine eigene FHEM-Instanz auszulagern, und die Daten dann mit FHEM2FHEM und cloneDummy an die Hauptinstanz zu übergeben.
Passende Links, auch wenn es nicht um einen Kostalwechselrichter geht:
http://forum.fhem.de/index.php/topic,21654.0.html
http://forum.fhem.de/index.php/topic,23638.0.html
http://forum.fhem.de/index.php/topic,22469.0.html
Gruß Joachim
Hallo Heiner,
ich vermute, das Problem liegt bei der Erfassung der Globalstrahlung.
Damit wir die Ursache finden, solltest du ab Zeile 498 folgende Zeilen auskommentieren
# stündlich Globalstrahlung aktualisieren
# if ( $hour != $hash->{"GR.Hour"} || !defined($hash->{READINGS}{"Global.Radiation"}{VAL})) {
# KOSTAL_GetGlobalRadiation($hash);
# $hash->{"GR.Hour"} =$hour;
# }
Wenn das beschriebene Problem danach verschwunden ist, kennen wir den Grund und können weiter sehen.
John
Hi,
ich habs auskomentiert und das Ergebnis lautet:
tmr-KOSTALPIKO_GetStatus HASH(0xd24098) 579 1 579 579.00 4 HASH(0xd24098)
etwas schneller aber immer noch sehr langsam.
Hi Heiner,
wenn du die WEB-Seite http://<ip-kostal>/index.fhtml
aufrufst, wie lange dauert das ?
Schick mal bitte ein
list <dein-Kostal>
John
Hi, der Aufruf geht wie der Blitz, dann Name und Passwort eingeben und nochmal ca. 1/4 sekunde und schon seh ich die Seite.
Ich nutze FHEM auf der Fritzbox 7390 und an einem LAN-Port ist der Wechselrichter.
und hier der List:
ZitatInternals:
DEF 192.xxx.xxx.xxx xxxx xxx
GR.Hour 25
Host 192.xxx.xxx.xx
NAME Wechselrichter
NR 83
Pass pvwr
STATE W: 748 - Einspeisen MPP
TYPE KOSTALPIKO
User pvserver
delayCounter 1
Readings:
2014-05-27 17:54:50 AC.Power 748
2014-05-27 17:54:50 AC.Power.Fast 748
2014-05-27 17:54:50 Daily.Energy 14.25
2014-05-26 23:04:47 Daily.Energy.Last 19.05
2014-05-24 14:01:03 EnergyExpected 34.2528
2014-05-24 14:01:03 Global.Radiation 6.4
2014-05-27 05:54:48 Mode Einspeisen MPP
2014-05-27 05:54:48 ModeNum 2
2014-05-27 17:09:50 Total.Energy 9346
2014-05-27 17:54:50 generator.1.current 1.05
2014-05-27 17:54:50 generator.1.voltage 533
2014-05-27 05:39:48 generator.2.current 0.00
2014-03-15 17:43:18 generator.2.voltage 0
2014-05-27 17:54:50 generator.3.current 1.02
2014-05-27 17:54:50 generator.3.voltage 234
2014-05-27 17:54:50 generator1power 559.65
2014-05-27 17:54:50 generator3power 238.68
2014-05-27 17:54:50 output.1.power 253
2014-05-27 17:54:50 output.1.voltage 230
2014-05-27 17:54:50 output.2.power 249
2014-05-27 17:49:50 output.2.voltage 229
2014-05-27 17:54:50 output.3.power 246
2014-05-27 17:39:50 output.3.voltage 229
2014-05-27 17:54:50 state W: 748 - Einspeisen MPP
Attributes:
GR.Link http://www.proplanta.de/Wetter/Mainz-Wetter.html
alias Wechselrichter
delay 300
delayCounter 1
group KOSTALPIKO
loglevel 4
room Photovoltaik
userReadings generator1power:generator.1.* {return ReadingsVal("Wechselrichter","generator.1.current",0)*ReadingsVal("Wechselrichter","generator.1.voltage",0);},generator3power:generator.3.* {return ReadingsVal("Wechselrichter","generator.3.current",0)*ReadingsVal("Wechselrichter","generator.3.voltage",0);},EnergyExpected:Global.Radiation { return ReadingsVal("Wechselrichter","Global.Radiation",0)*44.6*0.12;}
Hallo Heiner,
ich habe das Problem erkannt.
Das Parsen der HTML-Seite dauert auf meinem Raspi ca. 3 Sekunden. Die Fritzbox wird deutlich langsamer sein.
Das Problem liegt also vermutlich nicht bei der Erfassung der Web-Seiten, sondern bei deren Auswertung.
Ich denke über eine Lösung nach.
John
Ich habe nun die Version 2.0 von KostalPiko aufgelegt und damit ein neues Thema begonnen.
Informationen hierzu unter
http://forum.fhem.de/index.php/topic,24409.0.html (http://forum.fhem.de/index.php/topic,24409.0.html)
Alle weiteren Fragen und Änderungen werden von nun an dort behandelt.
@Heiner
ich hoffe damit sind nun die von dir geschilderten Probleme erledigt.
Über Rückmeldungen freue ich mich.
John
Hallo,
sorry hat ein wenig gedauert aber ja alle Probleme sind erledigt, passt jetzt. super Vielen lieben Dank.