Hauptmenü

Poolpumpe

Begonnen von Heiner, 23 August 2013, 09:47:49

Vorheriges Thema - Nächstes Thema

Heiner

Hi,

ich mochte die Poolpumpe automatsich schalten. Dabei gilt es zu beruecksichtigen das diese mindestens 5 Stunden am Tag laeuft (1), immer an ist, wenn der Poolrolladen auf ist(2), und moeglichst dann an ist wenn die Sonne scheint und Solare Energie produziert wird (3).

Nun ist die Frage wie geht das?

Man koennte (1)einfach mit
    define PoolpumpeMittagsAn at *13:00 set Poolpumpe on
    define PoolpumpeMittagsAus at *15:00 set Poolpumpe off
    define PoolpumpeAbendsAn at *17:00 set Poolpumpe on
    define PoolpumpeAbendsAus at *20:00 set Poolpumpe off
erledigen. Die Zeiten hab ich gewaehlt weil mittags die meisste Sonne Scheint und den freuhen Abend weil ich das meisstens schwimme.


Dann kann man noch sagen (2)
    if ($Poolrolladen){set Poolpumpe on}
    if ("$Poolrolladen" eq "off"){set Poolpumpe off}

Und (3) koennte man erledigen mit
    if ("$Wechselrichter.AC.Power" > 2000){set Poolpumpe on}
    if ("$Wechselrichter.AC.Power" < 2000){set Poolpumpe off}

Aber nun wuerde ja der eine Event den anderen ueberschreiben, das ist ja bedingt werwuenscht aber nicht komplett.
Es waere doof wenn eine Wolke kommt und (3) die Pumpe um 13:05 ausschaltet. Dann besteht das Risiko die minimum Zeit nicht zu erreichen.
Gleiches gilt wenn der Rolladen auf ist, dann MUSS die Pumpe laufen.

Wie kriege ich das geloesst?
Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

betateilchen

Mit nachdenken, systematischem Vorgehen und Dummies, in denen Du Dir ggf. Schaltzustände speicherst. Ausserdem wirst Du um eine gewisse Menge If() Abfragen nicht rumkommen, um die ganze Logik zu verknüpfen. (Eine Uhrzeit läßt sich z.B. problemlos abfragne, damit zwischen 13 und 15 Uhr kein Abschalten erfolgt)

Mach Dir am besten mal eine Entscheidungsmatrix, in der Du darstellst, wann geschaltete werden MUSS, wann geschaltet werden KANN und wann NICHT geschaltet werden DARF.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

justme1968

genau. das diagramm ist der anfang. damit baust du dir eine routine die dir zurück gibt ob die pumpe jetzt laufen muesste. die routine rufst du alle x minuten auf und wenn sie meldet das die pumpe an sein muss schaltest du sie mit on-for-timer für 2 oder 3 mal x minuten an. am besten mit einem aktor der on-for-timer nativ unterstützt.

und das müsste fast ganz ohne dummys gehen. eventuell einen um die laufzeit aufzusummieren. aber die könnte man auch als reading in den pumpenaktor stecken.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

mcfly71

Servus, genau so etwas habe ich mir schon gemacht:

Nicht verunsichern lassen:

REGELUNGHAUPTPUMPE ist der eigentliche Knopf, wo du per z.B. http deine Regelung an und aus machst
Wenn das an ist, dann geht die Intervall-Sache los....

1) SetzeNetio ist ein SET Befehl (Also in deinem Fall direkt set Steckdose an....)
2) ValueUndUndef testen auf den Wert und undefinierte Zustände (reicht auch ein Value () )
3) Hauptpumpe

config file:

define REGELUNGHAUPTPUMPE dummy
attr REGELUNGHAUPTPUMPE setList on off

define HAUPTPUMPE dummy <--- In deinem Fall hier die Steckdose oder was auch immer an gehen soll
attr HAUPTPUMPE room hidden
attr HAUPTPUMPE setList on off


define ZUSTANDHAUPTPUMPE notify REGELUNGHAUPTPUMPE {\
   HauptpumpenRegelung ( "REGELUNGHAUPTPUMPE/HAUPTPUMPE/true" );;\
}

99_myUtils.pm:
(sorry ich komme von c++ deswegen "unnatürliches" perl :-)

im myUtils_Initialize:

   # Regelung Hauptpumpe
   my $HauptpumpeUnterbrechungAlleSek;
   my $HauptpumpeUnterbrechungsDauerSek;
   
   $main::HauptpumpeUnterbrechungAlleSek= 1 * 60*60;
   $main::HauptpumpeUnterbrechungsDauerSek= 5 * 60;
   #
( Jede Stunde unterbrechen ( 1 !! * 60*60) für jeweils 5 Minuten ( 5 !! * 60)


Dann irgendwo folgende Fkt.:


sub HauptpumpenRegelung ($)
{
   # $UebergabeArray[0] = Dummy Variablenname der Regelung der Hauptpumpe
   # $UebergabeArray[1] = Dummy Variablenname der Hauptpumpe ansich
   # $UebergabeArray[2] = Initialisierung Durchfuehren

   my ($Uebergabe) = @_;
   
   my @UebergabeArray= split('/', $Uebergabe);

   
   # Den automatisierten Timer immer löschen
   RemoveInternalTimer( $UebergabeArray[0]."/".$UebergabeArray[1]."/false" );
   #
   
   if ( Value($UebergabeArray[0]) eq "off")
   {
      SetzeNETIO ( $UebergabeArray[1], "off" );
   }
   if ( Value($UebergabeArray[0]) eq "on")
   {
      if ( ValueAndUndef ( $UebergabeArray[1], "off" ) || ($UebergabeArray[2] eq "true") )
      {
         SetzeNETIO ( $UebergabeArray[1], "on" );
         InternalTimer ( gettimeofday()+$main::HauptpumpeUnterbrechungAlleSek, "HauptpumpenRegelung", $UebergabeArray[0]."/".$UebergabeArray[1]."/false", 1 );
      } else
      {
         SetzeNETIO ( $UebergabeArray[1], "off" );
         InternalTimer ( gettimeofday()+$main::HauptpumpeUnterbrechungsDauerSek, "HauptpumpenRegelung", $UebergabeArray[0]."/".$UebergabeArray[1]."/false", 1 );
      }
   }
   return;
}


Hoffe es hilft dir...

VG
mcfly
- HMLAN / Raspberry auf hmmode
- Homematic