Zwei Aktuatoren mit zwei Sensoren hierarchisch schalten

Begonnen von brembs, 18 Juli 2015, 16:08:47

Vorheriges Thema - Nächstes Thema

brembs

Bin recht neu bei fhem, aber bisher habe ich es geschafft über FBDECT auf meine Schaltsteckdosen zu zu greifen, über km200 meine Wärmepumpe auszulesen/schalten und über ein selbstgeschriebenes Python Script meine Photovoltaikanlage auszulesen. Nun kommt der FHEM-spezifische Teil der mich noch etwas überfordert, auch nach Lesen der Dokumentation und einiger Threads hier.

Ich möchte, dass überschüssiger Solarstrom zunächst für die Warmwasserbereitung (als Energiespeicher), dann für eine Teichpumpe (an einer DECT Steckdose) verwendet wird. Dazu überprüfe ich den Stromüberschuss mit dem Python Skript und die Wassertemperatur mit km200. Wenn ich also mehr als 4kW Strom Überschuss habe UND die Wassertemperatur unter, sagen wir 55°C liegt, dann soll die Zusatzheizung der WP angehen (im besten Fall solange bis die Maximaltemperatur von 68° erreicht ist). Habe ich während dieser Zeit, oder wenn die WP aus ist (weil das Wasser warm genug ist), noch 1kW Strom über, soll die Teichpumpe anspringen. Kommt nun eine Wolke (was ich daran sehen kann, dass mir mein Python Skript entweder einen Strom aus der Batterie oder aus dem Netz meldet), soll zunächst die Teichpumpe ausgeschaltet werden, wenn das nicht reicht, dann auch die WP. Wie würde man so etwas am geschicktesten programmieren?

Noch ein Detail: das Python Skript liefert mir momentan drei Werte, Einspeisung, Akku-Bezug, Netz Bezug. Es funktioniert wunderbar und ich kann es über FHEM aufrufen und bekomme die drei Werte angezeigt.

Sorry, wenn man das alles nachlesen kann, ich habe es nicht gefunden - auch über entsprechende Links freue ich mich! Tausend Dank!

rudolfkoenig

Ich wuerde so vorgehen:
- als erstes die von Python-Skript erzugten Werte als Event zur Verfuegung stellen, z.Bsp. mit einem dummy und trigger im Aufruf des Python-Programmes, z.Bsp. so: define sAt at +*00:05 { fhem "trigger solar ".`solar.py` }
- diese Werte mit FileLog protokollieren und visualisieren.
- mit notify auf neue Events  (vom Skript-Dummy/Wassertemperatur/etc) reagieren, und eine Perl-Funktion aufrufen, der die Pruefung/Entscheidung faellt, und die Aktoren benachrichtigt.

Es gibt viele Alternativen, die man je nach Praeferenz auch kombinieren kann
- DbLog statt FileLog
- DOIF statt notify
- Externes Programm (python) statt Perl-Funktion fuer die Pruefung/Entscheidung.
- Eigenes Modul statt dummy und python Programm fuer die Solarstromabfrage.
- usw.

UliM

Hi,
am besten steckst Du das alles in ein perl-Script, das Du in 99_myUtils ablegst.
Deine Aufgabenstellung ist recht komplex und für mich als Außenstehenden nicht leicht nachzuvollziehen.

Wesentlicher Trigegr scheinen ja die Werte aus Deinem Python-Script zu sein. Lösen neue Werte aus dem Script einen event in fhem aus, oder willst Du es pollen (also z.B. einmal pro Minute) abfragen?
Wenn Du pollen willst, legst Du Dir ein at +*00:01 an, das die Werte aus dem python-script holt und via set auf einen dummy-device schreibt.
Auf diesen dummy legst Du dann notifies, die das o.g. perl-script mit den Werten aufrufen. Aus dem perl-script heraus schlatest Du dann die Teichpumpe, WP etc an und aus.

define python_read at +*00:01 doPythonRead()

#in 99_myUtils.pm:

sub doPythonRead() {
my $Solarstrom,$Stromueberschuss,$TeichpumpeAnAus,$WaermepumpeAnAus;$WPzusatzpumpeAnAus;
my $Wassertemperatur=Value("DeinKM200Device");
#lese die Python-Werte in Variablen
# durchlaufe eine Logik, die diese Varablen beeinflusst
if ($Stromueberschuss > 4 && $Wasserttemperatur < 55) {$WPzusatzheizungAnAus = 'on'} else {$WPzusatzheizungAnAus = 'off'};
fhem("set Teichpumpe $TeichpumpeAnAus");
fhem("set Waermepumpe $WaermepumpeAnAus");
fhem("set Waermepumpe $WaermepumpeAnAus");
fhem("set WPzusatzheizung $WPzusatzheizungAnAus");
}


So hab ich das aus Deiner Beschreibung rausinterpretiert...
Du könntest die devices auch sofort schalten, also ohne den Umweg über eine Zwischenvariable - wenn dasselbe Gerät aber in mehreren Abhängigkeiten auftaucht, könnte das in mehrfachem hin- und herschalen während desselben script-Durchlaufs resultieren. Kommt halt drauf an...

Da ich Deine device- und readingsnamen nicht kenne, hier als generisches Konstrukt, vielleicht reicht das ja als Startschuss :)

Gruß  viel Erfolg,
Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

rudolfkoenig

Kleine Korrektur:
define python_read at +*00:01 { doPythonRead() }

brembs

Au ja, das hilft mir auf jeden Fall weiter! Damit bin ich zumindest erst einmal eine Weile beschäftigt, bis ich da sehe, wo die nächsten Hürden liegen. Spitzenklasse, vielen Dank! Sobald alles funktioniert, werde ich es natürlich jedem zugängich machen, der so etwas vielleicht auch beuen möchte. Bisher hat eigentich alles, was ich bei fhem versucht habe sehr schnell und problemlos geklappt, bin schon ziemlich begeistert!

Vielen Dank für die schnellen Tipps, bin dann erstmal am Schreiben und ausprobieren. Melde mich!

brembs

So, Dank Eurer Hilfe läuft meine Steuerung nun schon seit ein paar Tagen recht zufriedenstellend  :)

Vom Hersteller meines PV-Batteriespeichers (SENEC.IES) habe ich ein Python-Skript, das ich so modifiziert habe, dass es mir die vier Werte ausliest, die ich brauche: Strom ins Netz, Strom aus dem Netz, Strom von der Batterie und Batteriefüllstand.

Dieses Skript rufe ich jede Minute (über ein 'at') in einer Routine in 99_MyUtils.pm auf und schalte entsprechend alles nach bestimmten Kriterien:

sub ReadGridExport() {
#convert python output into easy to remember variables
my @pv= qx(python /home/pi/solarpower.py 192.168.178.29) =~ /(\d+\.\d+)/g;
my ($Solarstrom, $GridImport, $BatteryDischarge, $BatteryStatus) = @pv;
#check power and switch actors
my $Wassertemp=ReadingsVal("Waermepumpe","/dhwCircuits/dhw1/actualTemp",66);
my $WPZusatzheizungAnAus=ReadingsVal("Waermepumpe","/dhwCircuits/dhw1/extraDhw/activationStatus","ERR");
my $bachpump1=ReadingsVal("TeichVorne","state","ERR");
if (($Solarstrom > 5) &&
($Wassertemp < 50)&&
($BatteryStatus > 80)&&
($WPZusatzheizungAnAus eq 'OFF') )
{
fhem ("set Waermepumpe /dhwCircuits/dhw1/extraDhw/time 1");
}
elsif ($Solarstrom > 1 && $bachpump1 eq 'off')
{
fhem ("set TeichVorne on");
}
elsif (($GridImport > 0.1) || ($BatteryStatus < 70))
{
fhem ("set Waermepumpe /dhwCircuits/dhw1/extraDhw/time 0");
fhem ("set TeichVorne off");
}
if ($Wassertemp > 65)
{
fhem ("set Waermepumpe /dhwCircuits/dhw1/extraDhw/time 0");
}
if ($BatteryDischarge > 0.1)
{
fhem ("set TeichVorne off");
}
}


Nach Eurer Hilfe hier ging das alles recht fix und war gar nicht so schwer! Tausend Dank! Vielleicht kann ja jemand etwas mit dem Code hier anfangen.