Hallo zusammen
ich habe vor ein paar Wochen im Forum ein Sricpt für Gardena Bewässerung gefunden und dies noch ein wenig geändert. Es funktioniert soweit klasse, ich habe nur ein Problem beim Erstellen der neue Ereigniszeit. Wenn ich eine Wiederholen von jeden Tag eingeben dann klappt alles. Wenn ich aber alle 2 Tage bewässern will, wird nach dem ausführen die nächstest Startzeit auf 1970 gesetzt. Die Ereignisse werden im Script mit erstellt. Ich komme aber nicht auf den Fehler. Könnt ihr mir hier weiterhelfen? Ich lasse das Event über Timebound und cyle anlegen. und durch eine Variable gebe ich die nächste Laufzeit vor.
<?
$ID_HMInstanz = 11776 /*[Garten\Gartenhaus\Pumpe Manuell]*/;
$ID_HMInstanz_Status = 51336 /*[Garten\Gartenhaus\Pumpe Manuell\Pumpe Manuell]*/;
$ID_Evapotranspiration = 38683 /*[Wetter\Verdunstung]*/;
$ID_Regenmelder = 42639 /*[Regenzisterne\Regensensor]*/;
$ID_Niederschlag = 41030 /*[Wetter\Regenmenge letzte 24 Stunden]*/;
//================================================================
//---Variable erstellen-------------------------------------------
$ID_zeit1_aktiv = CreateVariableByName($IPS_SELF, "Zeit 1 aktiv", 0, "", "false");
$ID_zeit2_aktiv = CreateVariableByName($IPS_SELF, "Zeit 2 aktiv", 0, "", "true");
$ID_zeit1 = CreateVariableByName($IPS_SELF, "Zeit 1", 3, "", "11:00");
$ID_zeit2 = CreateVariableByName($IPS_SELF, "Zeit 2", 3, "", "03:05");
$ID_laufzeit_MIN = CreateVariableByName($IPS_SELF, "Laufzeit Minimum", 1, "Zeit_MIN", 2);
$ID_laufzeit_MAX = CreateVariableByName($IPS_SELF, "Laufzeit Maximum", 1, "Zeit_MIN", 15);
$ID_laufzeit_tage = CreateVariableByName($IPS_SELF, "Laufzeit Wiederholung Tage", 1, "", 2);
$ID_laufzeit_ges_SEC = CreateVariableByName($IPS_SELF, "Laufzeit Dauer gesamt (sec)", 1, "Zeit_SEC", 0);
$ID_laufzeit_ges_MIN = CreateVariableByName($IPS_SELF, "Laufzeit Dauer gesamt", 1, "Zeit_MIN", 0);
$ID_laufzeit_aktuell = CreateVariableByName($IPS_SELF, "Laufzeit Dauer aktuell", 1, "Zeit_SEC", 0);
$ID_laufzeit_faktor = CreateVariableByName($IPS_SELF, "Laufzeit Faktor", 1, "", 60);
$ID_laufzeit_letzte = CreateVariableByName($IPS_SELF, "Laufzeit Letzte", 3, "", "");
$ID_laufzeit_next = CreateVariableByName($IPS_SELF, "Laufzeit Nächste", 3, "", "");
$ID_Regenmelder_aktiv = CreateVariableByName($IPS_SELF, "Regenmelder Überwachung aktiv", 0, "~Switch", "true");
//---Variable einlesen---------------------------------------------
$zeit1_aktiv = getValue($ID_zeit1_aktiv);
$zeit2_aktiv = getValue($ID_zeit2_aktiv);
$laufzeit_MIN = getValue($ID_laufzeit_MIN);
$laufzeit_MAX = getValue($ID_laufzeit_MAX);
$laufzeit_tage = getValue($ID_laufzeit_tage);
$Evapotranspiration = getValue($ID_Evapotranspiration);
$laufzeit_faktor = getValue($ID_laufzeit_faktor);
$laufzeit_ges_SEC = getValue($ID_laufzeit_ges_SEC);
$HMInstanz_Status = getValue($ID_HMInstanz_Status);
$Regenmelder = getValue($ID_Regenmelder);
$Regenmelder_aktiv = getValue($ID_Regenmelder_aktiv);
$Niederschlag = (INT)getValue($ID_Niederschlag);
//---Ereignis erstellen-----------------------------------------
$IDe_zeit1 = @IPS_GetEventIDByName("Startzeit 1", $IPS_SELF); // == Startzeit 1 ==
If ($IDe_zeit1 === false){ // Üperprüfen ob Ereignis gibt
$IDe_zeit1 = IPS_CreateEvent(1); // Ausgelöstes Ereignis
IPS_SetName($IDe_zeit1, "Startzeit 1"); // Namen zuordenen
IPS_SetParent($IDe_zeit1, $IPS_SELF); // Eregnis zuordnen
IPS_SetEventActive($IDe_zeit1, true); // Ereignis aktivieren
}
$IDe_zeit2 = @IPS_GetEventIDByName("Startzeit 2", $IPS_SELF); // == Startzeit 2 ==
If ($IDe_zeit2 === false){ // Üperprüfen ob Ereignis gibt
$IDe_zeit2 = IPS_CreateEvent(1); // Ausgelöstes Ereignis
IPS_SetName($IDe_zeit2, "Startzeit 2"); // Namen zuordenen
IPS_SetParent($IDe_zeit2, $IPS_SELF); // Eregnis zuordnen
IPS_SetEventActive($IDe_zeit2, true); // Ereignis aktivieren
}
$IDe_Laufzeit = @IPS_GetEventIDByName("STOP Laufzeit", $IPS_SELF); // == Laufzeit ==
If ($IDe_Laufzeit === false){ // Üperprüfen ob Ereignis gibt
$IDe_Laufzeit = IPS_CreateEvent(1); // Ausgelöstes Ereignis
IPS_SetName($IDe_Laufzeit, "STOP Laufzeit"); // Namen zuordenen
IPS_SetParent($IDe_Laufzeit, $IPS_SELF); // Eregnis zuordnen
IPS_SetEventActive($IDe_Laufzeit, true); // Ereignis aktivieren
}
$IDe = @IPS_GetEventIDByName("Überwachung EVA Wert", $IPS_SELF); // == Überwachung ==
If ($IDe === false){
$IDe = IPS_CreateEvent(0); // Ausgelöstes Ereignis
IPS_SetName($IDe, "Überwachung EVA Wert"); // Namen zuordenen
IPS_SetEventTrigger($IDe, 1, $ID_Evapotranspiration); // Bei Änderung von Variable
IPS_SetParent($IDe, $IPS_SELF); // Ereignis zuordnen
IPS_SetEventActive($IDe, true); // Ereignis aktivieren
}
$IDe = @IPS_GetEventIDByName("Überwachung Regenmelder", $IPS_SELF); // == Überwachung ==
If ($IDe === false){
$IDe = IPS_CreateEvent(0); // Ausgelöstes Ereignis
IPS_SetName($IDe, "Überwachung Regenmelder"); // Namen zuordenen
IPS_SetEventTrigger($IDe, 1, $ID_Regenmelder); // Bei Änderung von Variable
IPS_SetParent($IDe, $IPS_SELF); // Ereignis zuordnen
IPS_SetEventActive($IDe, true); // Ereignis aktivieren
}
//---Tastatur / Bottom abfrage-------------------------------------
If (!isset($IPS_COMPONENT)) $IPS_COMPONENT =""; // Dashboard Bottom abfrage
//---Zeiten ändern-------------------------------------------------
If($IPS_COMPONENT == "Zeit1 AUS"){
If ($zeit1_aktiv == true){ // Zeit 1 AUS
$zeit1_aktiv = false;
}
ElseIf ($zeit1_aktiv == false){ // Zeit 1 EIN
$zeit1_aktiv = true;
}
SetValue($ID_zeit1_aktiv,$zeit1_aktiv);
}
If($IPS_COMPONENT == "Zeit2 AUS"){
If ($zeit2_aktiv == true){ // Zeit 2 AUS
$zeit2_aktiv = false;
}
ElseIf ($zeit2_aktiv == false){ // Zeit 2 EIN
$zeit2_aktiv = true;
}
SetValue($ID_zeit2_aktiv,$zeit2_aktiv);
}
If($IPS_COMPONENT == "Zeit1 +" and $zeit1_aktiv == true){ // Zeit 1 höher
$zeit1 = ZeitEdit($ID_zeit1, +15);
SetValue($ID_zeit1, $zeit1);
}
If($IPS_COMPONENT == "Zeit1 -" and $zeit1_aktiv == true){ // Zeit 1 tiefer
$zeit1 = ZeitEdit($ID_zeit1, -15);
SetValue($ID_zeit1, $zeit1);
}
If($IPS_COMPONENT == "Zeit2 +" and $zeit2_aktiv == true){ // Zeit 2 höher
$zeit2 = ZeitEdit($ID_zeit2, +15);
SetValue($ID_zeit2, $zeit2);
}
If($IPS_COMPONENT == "Zeit2 -" and $zeit2_aktiv == true){ // Zeit 2 tiefer
$zeit2 = ZeitEdit($ID_zeit2, -15);
SetValue($ID_zeit2, $zeit2);
}
If($IPS_COMPONENT == "Faktor +"){ // Faktor höher
$laufzeit_faktor = WertEdit($ID_laufzeit_faktor, +10, 700);
SetValue($ID_laufzeit_faktor, $laufzeit_faktor);
}
If($IPS_COMPONENT == "Faktor -"){ // Faktor tiefer
$laufzeit_faktor = WertEdit($ID_laufzeit_faktor, -10, 10);
SetValue($ID_laufzeit_faktor, $laufzeit_faktor);
}
If($IPS_COMPONENT == "Laufzeit MIN +"){ // Laufzeit Minimum höher
$laufzeit_MIN = WertEdit($ID_laufzeit_MIN, +1, $laufzeit_MAX - 1);
SetValue($ID_laufzeit_MIN, $laufzeit_MIN);
}
If($IPS_COMPONENT == "Laufzeit MIN -"){ // Laufzeit Minimum tiefer
$laufzeit_MIN = WertEdit($ID_laufzeit_MIN, -1, 0);
SetValue($ID_laufzeit_MIN, $laufzeit_MIN);
}
If($IPS_COMPONENT == "Laufzeit MAX +"){ // Laufzeit Maximum höher
$laufzeit_MAX = WertEdit($ID_laufzeit_MAX, +1, 60);
SetValue($ID_laufzeit_MAX, $laufzeit_MAX);
}
If($IPS_COMPONENT == "Laufzeit MAX -"){ // Laufzeit Maximum tiefer
$laufzeit_MAX = WertEdit($ID_laufzeit_MAX, -1, $laufzeit_MIN + 1);
SetValue($ID_laufzeit_MAX, $laufzeit_MAX);
}
If($IPS_COMPONENT == "Laufzeit Tage +"){ // Laufzeit Wiederholong Tage höher
$laufzeit_tage = WertEdit($ID_laufzeit_tage, +1,14);
SetValue($ID_laufzeit_tage, $laufzeit_tage);
}
If($IPS_COMPONENT == "Laufzeit Tage -"){ // Laufzeit Wiederholong Tage tiefer
$laufzeit_tage = WertEdit($ID_laufzeit_tage, -1, 1);
SetValue($ID_laufzeit_tage, $laufzeit_tage);
}
If($IPS_COMPONENT == "Start"){ // Manueller Start
$manuell_start = true;}
Else {$manuell_start = false;}
If($IPS_COMPONENT == "Ein"){ // Manuelle Dauer
$manuell_ein = true;}
Else {$manuell_ein = false;}
If($IPS_COMPONENT == "Stop"){ // Manueller Stop
$manuell_stop = true;}
Else {$manuell_stop = false;}
//---Variable einlesen--------------------------------------------
$zeit1_STD = (INT) SubStr(GetValue($ID_zeit1),0,2);
$zeit1_MIN = (INT) SubStr(GetValue($ID_zeit1),3,2);
$zeit2_STD = (INT) SubStr(GetValue($ID_zeit2),0,2);
$zeit2_MIN = (INT) SubStr(GetValue($ID_zeit2),3,2);
//---Zeit Ereignis setzten---------------------------------------------
If ($zeit1_aktiv == true){ // StartZeit 1
IPS_SetEventCyclic($IDe_zeit1, 2, $laufzeit_tage, 0, 0, 0, 0); // Zeittyp einstellen
IPS_SetEventCyclicTimeBounds($IDe_zeit1, mktime($zeit1_STD, $zeit1_MIN, 0),0);// Startzeit
IPS_SetEventActive($IDe_zeit1, true);
}
Else{
IPS_SetEventActive($IDe_zeit1, false);
}
If ($zeit2_aktiv == true){ // StartZeit 2
IPS_SetEventCyclic($IDe_zeit2, 2, $laufzeit_tage, 0, 0, 0, 0); // Zeittyp einstellen
IPS_SetEventCyclicTimeBounds($IDe_zeit2, mktime($zeit2_STD, $zeit2_MIN, 0),0);// Startzeit
IPS_SetEventActive($IDe_zeit2, true);
}
Else{
IPS_SetEventActive($IDe_zeit2, false);
}
//---Nächste Startzeit (INFO)------------------------------------
If ($Regenmelder_aktiv == true and $Regenmelder == true)
{
$Regen_AUS = true;
SetValue($ID_laufzeit_next, "Regen AUS");
}
Else
{
$Regen_AUS = false;
If ($zeit1_aktiv == false and $zeit2_aktiv == false)
{
SetValue($ID_laufzeit_next, "AUS");
}
Else
{
$EreignisZeitInfo1 = IPS_GetEvent($IDe_zeit1); // Ereignis Zeit1(Nächste Startzeit) auslesen
$EreignisZeitInfo2 = IPS_GetEvent($IDe_zeit2); // Ereignis Zeit2(Nächste Startzeit) auslesen
If (($EreignisZeitInfo1['NextRun']-time()) > ($EreignisZeitInfo2['NextRun']-time()))
{
$laufzeit_next = (date(("d.m.Y H:i"),$EreignisZeitInfo1['NextRun']+1));
SetValue($ID_laufzeit_next, $laufzeit_next);
}
Else
{
$laufzeit_next = (date(("d.m.Y H:i"),$EreignisZeitInfo2['NextRun']+1));
SetValue($ID_laufzeit_next, $laufzeit_next);
}
}
}
//---Berechung Laufzeit gesamt----------------------------------
If ($ID_Regenmelder_aktiv == true)
{
$laufzeit_ges_SEC = $laufzeit_faktor * ($Evapotranspiration - $Niederschlag); // Berechung Laufzeit gesamt nach (Evapotranspiration)
}
Else
{
$laufzeit_ges_SEC = $laufzeit_faktor * $Evapotranspiration; // Berechung Laufzeit gesamt nach (Evapotranspiration)
}
If ($zeit1_aktiv == true and $zeit2_aktiv == true) // Berechung Laufzeit bei 2mal Täglich
{
$laufzeit_ges_SEC = $laufzeit_ges_SEC / 2;
}
If ($laufzeit_ges_SEC < $laufzeit_MIN * 60 ) //Berechnung Laufzeit MIN / MAX überwachen
{
$laufzeit_ges_SEC = $laufzeit_MIN * 60 ;
}
If ($laufzeit_ges_SEC > $laufzeit_MAX * 60)
{
$laufzeit_ges_SEC = $laufzeit_MAX * 60;
}
SetValue($ID_laufzeit_ges_SEC, $laufzeit_ges_SEC); // Laufzeit speichern
SetValue($ID_laufzeit_ges_MIN, $laufzeit_ges_SEC / 60);
//---START über (IPS TIMER EREIGNIS)---------------------------
If($IPS_SENDER == "TimerEvent") // Start über Stratzeiten
{
If (($IPS_EVENT == $IDe_zeit1 and $zeit1_aktiv == true) or // == Ventil EIN ==
($IPS_EVENT == $IDe_zeit2 and $zeit2_aktiv == true) and
($Regen_AUS == false))
{
HM_WriteValueBoolean($ID_HMInstanz, "STATE", true);
IPS_SetEventCyclic($IDe_Laufzeit, 1, 0, 0, 0, 0, 0); // Zeittyp einstellen
IPS_SetEventCyclicDateBounds($IDe_Laufzeit,time()+$laufzeit_ges_SEC,0); // Startdatum
IPS_SetEventCyclicTimeBounds($IDe_Laufzeit,time()+$laufzeit_ges_SEC,0); // Startzeit
IPS_SetEventActive($IDe_Laufzeit, true);
IPS_SetScriptTimer($IPS_SELF, 30); // Dieses Skript nach ablauf der Zeit neu starten
setValue($ID_laufzeit_letzte,(date(("d.m.Y H:i"),Time()))); // Letzte Laufzeit speichern
setValue($ID_laufzeit_aktuell, 1); // Aktuelle Laufzeit 0 setzen
}
If ($HMInstanz_Status == true) // == Aktuelle Laufzeit ==
{
$Variable = IPS_GetVariable($ID_HMInstanz_Status);
$Variable = $Variable['VariableChanged'];
$laufzeit_aktuell = round((time()- $Variable)) + 1; // Aktuelle Laufzeit berechnen speichern
setValue($ID_laufzeit_aktuell, $laufzeit_aktuell);
}
If ($IPS_EVENT == $IDe_Laufzeit or $laufzeit_aktuell > $laufzeit_ges_SEC) // == Ventil AUS ==
{
HM_WriteValueBoolean($ID_HMInstanz, "STATE", false);
IPS_SetEventActive($IDe_Laufzeit, false);
IPS_SetScriptTimer($IPS_SELF, 0);
setValue($ID_laufzeit_aktuell, $laufzeit_ges_SEC);
}
}
//---Manueller Start mit Auto STOP------------------------------
If($manuell_start == true and $HMInstanz_Status == false)
{
HM_WriteValueBoolean($ID_HMInstanz, "STATE", true);
IPS_SetEventCyclic($IDe_Laufzeit, 1, 0, 0, 0, 0, 0); // Zeittyp einstellen
IPS_SetEventCyclicDateBounds($IDe_Laufzeit,time()+$laufzeit_ges_SEC,0); // Startdatum
IPS_SetEventCyclicTimeBounds($IDe_Laufzeit,time()+$laufzeit_ges_SEC,0); // Startzeit
IPS_SetEventActive($IDe_Laufzeit, true);
IPS_SetScriptTimer($IPS_SELF, 30); // Dieses Skript nach ablauf der Zeit neu starten
setValue($ID_laufzeit_letzte,(date(("d.m.Y H:i"),Time()))); // Letzte Laufzeit speichern
setValue($ID_laufzeit_aktuell, 1); // Aktuelle Laufzeit 0 setzen
}
//---Manuelle EIN-----------------------------------------------
If($manuell_ein == true and $HMInstanz_Status == false)
{
HM_WriteValueBoolean($ID_HMInstanz, "STATE", true);
IPS_SetEventActive($IDe_Laufzeit, false);
IPS_SetScriptTimer($IPS_SELF, 0);
}
//---Manueller AUS ---------------------------------------------
If($manuell_stop == true and $HMInstanz_Status == true)
{
HM_WriteValueBoolean($ID_HMInstanz, "STATE", false);
IPS_SetEventActive($IDe_Laufzeit, false);
IPS_SetScriptTimer($IPS_SELF, 0);
}
//================================================================
//---Zahlen Wert ändern +/- --------------------------------------
function WertEdit($ID, $wert, $endwert){ // ID=ZeitString Wert(INT) , Wert(INT)= Änderungs Wert "+1" oder "-1" , Endwert(INT)
$zahl = GetValue($ID);
If ($wert > 0){ // Wert änder (höher)
$zahl = $zahl + $wert;
If ($zahl > $endwert) {
$zahl = $endwert;
}
}
If ($wert < 0){ // Wert änder (tiefer)
$zahl = $zahl + $wert;
If ($zahl < $endwert) {
$zahl = $endwert;
}
}
return $zahl;
}
//---Zeitwert ändern +/- -----------------------------------------
function ZeitEdit($ID, $wert){ // ID=ZeitString "14:00" , Wert(INT)= Änderungs Wert "+1" oder "-1"
$zeit_STD = (INT) SubStr(GetValue($ID),0,2);
$zeit_MIN = (INT) SubStr(GetValue($ID),3,2);
If ($wert > 0){ // Zeit änder (höher)
$zeit_MIN = $zeit_MIN + $wert;
If ($zeit_MIN > 59){
$zeit_MIN = $zeit_MIN - 60;
$zeit_STD = $zeit_STD + 1;
}
If ($zeit_STD > 23){
$zeit_MIN = 0;
$zeit_STD = 0;
}
}
If ($wert < 0){ // Zeit änder (tiefer)
$zeit_MIN = $zeit_MIN + $wert;
If ($zeit_MIN < 0){
$zeit_MIN = 60 + $zeit_MIN;
$zeit_STD = $zeit_STD - 1;
}
If ($zeit_STD < 0){
$zeit_MIN = 60 + $wert;
$zeit_STD = 23;
}
}
$zeit = STR_PAD($zeit_STD,2,"0",STR_PAD_LEFT).":".STR_PAD($zeit_MIN,2,"0",STR_PAD_LEFT);
return $zeit;
}
//---Funktion Variablen anlegen ----------------------------------
function CreateVariableByName($id, $name, $type, $profile = "", $wert){
global $IPS_SELF;
$vid = @IPS_GetVariableIDByName($name, $id);
If($vid === false)
{
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
If($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
SetValue($vid, $wert); // Variabel, mit WERT füllen
}
return $vid;
}
?>