Logikproblem Raffstoren/Jalousiensteuerung (mit Windwächter)

Hab seit kurzem die Zwave FGR-221 die unsere Raffstoren rauf/runterfahren bei Wind.
Das Windsignal kommt vom 1 Wire Bus S0 Zähler.
Bisher einfaches Skript das durch Werteaktualisierung des S0 Zählers aktiviert wird.
Der 1 Wire Bus wird alle 30 Sekunden abgefragt. D.h. alle 30 Sek. werden evtl. Windwerte eingelesen.
Dabei wird ausgerechnet wie stark der Wind ist, und in eine Variable geschrieben.
Diese Variable wird ereignisgesteuert bei überschreiten von 14m/s ausgelesen und ein Skript fährt die Jalousien hoch.

Nun stellt sich die Frage, wie ich eine Intelligenz reinbringe?
D.h. Es sollte - nachdem- die Jalousien aufgrund des Windwächters hochgefahren sind,
z.b. nach 1Std. nochmals geprüft werden ob der Wind weg ist.
Ansonsten könnte es im Sommer sein, dass sich das Haus unnötig aufheizt, weil es mal kurzfristig windig war.
Falls der Wind dann für 1 Std. weg ist, sollten die Jalousien wieder runterfahren.

D.h. nach 1 Std + Windstärke unter 14 m/s sollen die Jalousien wieder runter?

Das längere Skript ist das „Abfrage/Windstärkerechner“ Skript -> Dies schreibt die Variable 20444 Windmesser m/s .
Sobald der Wert 14 m/s übersteigt startet ein zweites Skript mit der einfachen Funktion:

 <?
ZW_ShutterMoveUp(Jalousie1); //Nach oben bewegen
ZW_ShutterMoveUp(Jalousie2); //Nach oben bewegen
ZW_ShutterMoveUp(Jalousie3); //Nach oben bewegen usw.
?>

Abfrag/rechenskript

        <?
        // Debug-Modus an=true / aus=false
        $debug = false;

        //Berechung der Windgeschwindigkeit
        $Faktor_Windrad = 71.00; //70,83 Impulse = 1m/s bei 30 sek. Einlesezyklus

        //Drehzahl Windrad (4 Impulse pro Umdrehung)
        $counter = $_IPS['OLDVALUE']; // Impulse Windrad einlesen - Alter Wert
        $counter_neu = $_IPS['VALUE']; // Impulse Windrad - Neuer Wert
        $delta = $counter_neu - $counter; //Neuer Wert minus Alter Wert
        SetValueInteger(59050 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Differenz Alt - Neu]*/, $delta ); //Ausgabe "Differenz Alt-Neu"
        SetValueInteger(41822 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Zählerwert Zwischenspeicher]*/, $counter ); //Alte Impulse des Windrads ablegen "Counter"
        if($debug) {echo "Counter-alt: $counter
";}
        if($debug) {echo "Wind-Delta: $delta
";}

        //Berechnung Einspeisung pro Stunde
        $delta_wind = ((($delta / $Faktor_Windrad) * 3600)/1000) ; //0.00285
        $delta_wind_ms = $delta / $Faktor_Windrad;
        $round_delta_wind = round ($delta_wind, 1); // auf 1 Stellen runden
        $round_delta_wind_ms = round ($delta_wind_ms, 1); // auf 1 Stellen runden

        SetValueFloat (52346 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Windmesser km/h]*/, $round_delta_wind. " Km/h"); // "Windmesser km/h"
        SetValueFloat (20444 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Windmesser m/s]*/, $round_delta_wind_ms. " m/s"); // "Windmesser m/s"
        SetValueFloat (15146 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Delta Wind - Abfrage]*/ , $round_delta_wind); // "Delta Wind - Abfrage"
        if($debug) {echo "Windgeschwindigkeit aktuell:
 Km/h: $round_delta_wind
 m/s: $delta_wind_ms ";}

        ?>
 


So hab mir mal eine Logik überlegt:
da ich mich mit if / … abfragen leider nicht auskenne, sieht jemand Fehler?
Habs abstrakt mal in meiner Pause zusammengeschrieben - ohne IPS.

  • Ich möchte beim auslösen des Windwächters abfangen, dass bei längerem Wind, die FGR-221 den
    hochfahrbefehl permanent bekommen (die relais klacken sonst regelmäßig) :slight_smile:
    Hochfahrskript soll nur alle 30 Minuten angeworfen werden.
  • gleichzeitig, soll vor dem hochfahren der Jalousien der Stand der Jalousien zwischengespeichert werden (also 0%, 50%,…)
  • Diesen wert verwende ich dann eine halbe Std. später um die Jalousien in die ausgangsposition zurückzufahren

Skript1 = Abfrage des Windwertes
Skript2: Dieses Skript wird ausgelöst, wenn Windwert 14 m/s überschreitet

<?
// Windwächterskript
// ID von diesem Jalousien Hochfahrskript ermitteln
$event = IPS_GetObject($IPS_SELF);
$id = $event['ObjectID']; 
echo "Skript-ID: $id
";

$data = IPS_GetScript($id);
$last_up = $data[LastExecute];

// Unix Timestamp des letzten Aufrufs  
// --------------------------------------------
echo "Letzte Ausführung Unix: $last_up
";
// --------------------------------------------
// zur Kontrolle + siehe auch: http://de.php.net/manual/de/function.date.php
// --------------------------------------------
echo "Letzte Ausführung (His): ".date("H:i:s", $last_up)."
";

$deltaT = time() - $last_up;
echo "Letzte Ausführung in sec. : $deltaT
";


if ($deltaT > 1800)
// das nur alle 1800 Sekunden bzw. 30 Minuten ausgeführt werden darf
// damit wird das Knacken der Relais verhindert - falls Jalousie bereits hochgefahren ist
// Abfrage Jalousiestand Status mit Rückmeldung in weiterverwertbare Variable
// Falls Jalousie zu 50% geöffnet, soll dies nachdem der Wind für 30Minuten wieder weg ist, in die Ausgangsposition 50% zurückfahren.
// Die Jalousien werden in einem weiteren Skript in dem hier erfassten Stand der Jalousie zurückgefahren
{
     $Jalousie1 = getValueInteger (24553) // Kueche Abfrage Stand der Jalousie
     $Jalousie2 = getValueInteger (xxxxx) // Essen Abfrage Stand der Jalousie
     $Jalousie3 = getValueInteger (xxxxx) // Wohnen Abfrage Stand der Jalousie
     SetValueInt (22222, $Jalousie1); // Übergabe des alten Jalousienstand zur Abfrage in anderem Skript
     SetValueInt (22223, $Jalousie2); // Übergabe des alten Jalousienstand zur Abfrage in anderem Skript
     SetValueInt (22224, $Jalousie3); // Übergabe des alten Jalousienstand zur Abfrage in anderem Skript
     ZW_DimSet (31642, 100); //NACH OBEN fahren 0 zu - 100 auf
     ZW_Dimset (31643, 100); //NACH OBEN fahren 0 zu - 100 auf
     ZW_DimSet (31644, 100); //NACH OBEN fahren 0 zu - 100 auf
     SetValueBoolean (12345, TRUE); //TRUE Skript ausgeführt -> Sobald diese Routine ausgeführt ist, wird ein Wert mit 0 geschrieben.
     SetValueInt (44444, $deltaT); // Datumrückmeldung, wann Skript zuletzt ausgeführt wurde.
} 

?>

Zurückfahren der Jalousien in Ausgangsposition
(Wird nur ausgeführt, wenn voriges Skript den Wert True der Variable (12345) setzt.
Erfolgt 30 Minuten nach hochfahren durch Windwächterskript

<?
// Zurückfahrskript
$windauslesen = GetValueFloat (20444)
if ($windauslesen >=14); //Prüfung ob Wind immer noch da ist, falls ja goto exit:
     {
     goto sprungmarke_exit:;
     }
     else
     {
     sleep(1800); // Es wird 30 Minuten gewartet bis Jalousien wieder runter fahren.
     ZW_DimSet(31642, $22222); // zurückfahren der Jalousien auf ausgangsposition
     ZW_DimSet(31643, $22223); // zurückfahren der Jalousien auf ausgangsposition
     ZW_DimSet(31644, $22224); // zurückfahren der Jalousien auf ausgangsposition
     SetValueBoolean (12345, FALSE); //Rücksetzung auf nicht ausgeführt
     }
sprungmarke_exit:
exit;
?>

Kann das funktionieren?

Hallo,

ich weiß nicht wie viele Winddaten du schon gesammelt hast.
Du kannst dir dann eine Intelligents aus denken und an Hand der alten Daten überprüfen
was passiert währe.
Du kannst dir dann natürlich auch überlegen wann würde ich selber rausgehen und sie wieder auffahren, woran würdest du das festmachen?
Nur wenn kein Wind mehr da ist?
Oder sollte auch die Sonne scheinen oder der Himmel Wolken frei sein.
Was wenn kein Wind mehr da ist, aber die Temperatur fällt gerade, kommt jetzt ein Gewitter?

Schöne Grüße
Thomas

Danke für den Hinweis.

Ich denke die Logik fange ich damit ab, dass ich den vorigen Stand der Jalousien abfrage.
Die Zwave FGR-221 wissen ja den aktuellen Status von 0 - 100% .
D.h. ich entscheide mich ja -selbst-, möchte ich heute beschatten, möchte ich die Sonne rein lassen,
oder möchte ich das Haus max. vor Sonneneinstrahlung schützen.

Da meine Frau immer mal wieder anderst einstellt, wäre es recht kompliziert das abzubilden.
Daher - für mich - am einfachsten. Wenn der Wind 30 Minuten lang weg ist, soll die Jalousie in den Ursprungszustand zurück.

Einzigster Nachteil der mir gerade auffällt:
Sollte der Wind konstant länger als 30 minuten da sein (also mehr als 14 m/s), dann wäre meine Jalousienstatusabfrage falsch.
Bei uns sind Gewitter zu 99% kurzfristig d.h. max. 10 - 15 Minuten.
Hierfür möchte ich einen Schutz, wenn ich nicht zuhause bin.

Wir benützen die Jalousien im Sommer als Beschattung des Hauses.

Da ist dies schon die Mercedeslösung - denke ich.

Hab mein Windwächterskript angepasst…
leider fahren unsere Jalousien nun nicht mehr hoch. Das Skript wird als fehlerhaft markiert.
Ich hab irgendwo bei

$hochfahrskript = GetValueBoolean(26358);
if ($hochfahrskript == TRUE)

einen Logikfehler…

Leider zeigts mir keinen Fehler an :frowning:

Das Skript selbst wird durch ein Ereignis angestossen… nur leider verhängt sich das in dem Skript…
Hat mir jemand einen heissen Tip?

// Windwächterskript 
// ID von diesem Jalousien Hochfahrskript ermitteln 
$event = IPS_GetObject($IPS_SELF); 
$id = $event['ObjectID'];  

$SkriptID = 30026 /*[Raffstoren\Hochfahrskript]*/;
$SkriptInfo = IPS_GetScript($SkriptID)['LastExecute'];
$last_up = $SkriptInfo;
// echo "Skriptinfo: Letzte Ausfuehrung $SkriptInfo
";
// Unix Timestamp des letzten Aufrufs   
// -------------------------------------------- 
// echo "Letzte Ausführung Unix: $last_up
";
// -------------------------------------------- 
// zur Kontrolle + siehe auch: http://de.php.net/manual/de/function.date.php 
// -------------------------------------------- 
// echo "Letzte Ausführung (His): ".date("H:i:s", $last_up)."
";

$deltaT = time() - $last_up;
$zeit = time();

// echo "Delta-T = time - lastup in sec.
$deltaT Sek. = $zeit - $SkriptInfo";
$altkueche = GetValueInteger(24553 /*[Raffstoren\1.Küche Raffstore\100% oben - 0% unten]*/);
$altessen = GetValueInteger(51374 /*[Raffstoren\2.Essen Raffstore\100% oben - 0% unten]*/);
$altwohnen = GetValueInteger(17226 /*[Raffstoren\3.Wohnen Raffstore\100% oben - 0% unten]*/);
$hochfahrskript = GetValueBoolean(26358);
if ($hochfahrskript == TRUE)
	  {
	  goto sprung_exit;
     }
     else
     {
	  goto sprung_hoch;
	  }
sprung_hoch:
if ($deltaT > 1800)
// das nur alle 1800 Sekunden bzw. 30 Minuten ausgeführt werden darf 
// damit wird das Knacken der Relais verhindert - falls Jalousie bereits hochgefahren ist 
// Abfrage Jalousiestand Status mit Rückmeldung in weiterverwertbare Variable 
// Falls Jalousie zu 50% geöffnet, soll dies nachdem der Wind für 30Minuten wieder weg ist, in die Ausgangsposition 50% zurückfahren. 
// Die Jalousien werden in einem weiteren Skript in dem hier erfassten Stand der Jalousie zurückgefahren 
{
     SetValueInteger(43159 /*[Raffstoren\1.Küche Raffstore\Alter Stand]*/, $altkueche); // Übergabe des alten Jalousienstand zur Abfrage in anderem Skript
	  SetValueInteger(51374 /*[Raffstoren\2.Essen Raffstore\100% oben - 0% unten]*/, $altessen); // Übergabe des alten Jalousienstand zur Abfrage in anderem Skript
     SetValueInteger(20320 /*[Raffstoren\3.Wohnen Raffstore\Alter Stand]*/, $altwohnen); // Übergabe des alten Jalousienstand zur Abfrage in anderem Skript
	  sleep(2);
	  ZW_Dimset(31642 /*[Raffstoren\1.Küche Raffstore]*/, 100); //NACH OBEN fahren
	  sleep(5);
	  ZW_Dimset(48945 /*[Raffstoren\2.Essen Raffstore]*/, 100); //NACH OBEN fahren 0 zu - 100 auf
	  sleep(5);
	  ZW_DimSet(15030 /*[Raffstoren\3.Wohnen Raffstore]*/, 100); //NACH OBEN fahren 0 zu - 100 auf
     SetValueBoolean(26358 /*[Raffstoren\Hochfahrskript durchlaufen]*/, TRUE); //TRUE Skript ausgeführt -> Sobald diese Routine ausgeführt ist, wird ein Wert mit 0 geschrieben. 
     SetValueString(40067 /*[Raffstoren\1.Küche Raffstore\Delta T]*/, $deltaT); // Datumrückmeldung, wann Skript zuletzt ausgeführt wurde.
     $uhrzeit = date("H:i.s");
     $wind = GetValueInteger(57196 /*[Windmesser\DS2423 Windzaehler\Zähler Wind\Wind m/s]*/);
     $mailcontent = "Der Windwaechter faehrt die Jalousien hoch um $uhrzeit Uhr da die Windstaerke $wind m/s erreicht hat.
 Delta T: $deltaT sekunden = $last_up Zeit - $zeit; Time";
	  SMTP_SendMail(26464 /*[sonstiges\E-Mail senden (SMTP)]*/, "Windwaechterskript durchlaufen", "$mailcontent");
} else {
	   goto sprung_exit;
}
sprung_exit:
exit;
?>