Einfache Rollladensteuerung... Warum gehts bei einem Rllln nicht?

Hallo Profis,

Ich habe mal ein ganz simples Script für meine Rollladensteuerung gestrickt (Bitte nicht lachen… alles Alphaphase :smiley: )…

Unterschieden wird zwischen Wochentag (Woche u. Wochenende mit unterschiedlichen Öffnungszeiten) und der Sonnenaufgang ($tag) ist mit einbezogen.

Folgendes Heute früh:

Wohnzimmer öffnet um 7:30 Uhr ->OK!
Kinderzimmer öffnet um 7:15 Uhr -> OK!
Küche öffnet um 6:15 Uhr -> OK!
Schlafzimmer öffnet um 6:30 Uhr ->:eek: Sollte aber erst um 8:00 Uhr öffnen!
WARUM?

Ich kann den Fehler nicht finden…

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     :  Rollladen.ips.php
Trigger  :  Variable: AKT_MINUTE
Interval :  1 Minute
*/

// Abfrage
      $minute = date("i");
      $stunde = date("H");
      $wochentag = GetValueString("WOCHENTAGNR");
      $tag = GetValueBoolean("IST_TAG");


// WOHNZIMMER auf

if ((($tag == true) and GetValueBoolean("WZI_ROLLLADEN_AB") == true)       // Sonnenaufgang                                // Sonnenaufgang
   and
         ((($stunde >= 07)                                                 // Stunde Woche
         and ($minute >= 30)                                               // Minute Woche
         and ($wochentag < 6))                                             // Wochentag

      or
         (($stunde >= 07)                                                  // Stunde Wochenende
         and ($minute >= 30)                                               // Minute Wochenende
         and ($wochentag >= 6))))                                          // Wochenende
{
   FS20_SwitchMode(59443, false);
   IPS_Sleep(500);
   FS20_SwitchDuration(40264,true,30);
}

sleep(1);

// KINDERZIMMER auf

if ((($tag == true) and GetValueBoolean("KZI_ROLLLADEN_AB") == true)       // Sonnenaufgang
   and
         ((($stunde >= 07)                                                 // Stunde Woche
         and ($minute >= 15)                                               // Minute Woche
         and ($wochentag < 6))                                             // Wochentag

      or
         (($stunde >= 08)                                                  // Stunde Wochenende
         and ($minute >= 45)                                               // Minute Wochenende
         and ($wochentag >= 6))))                                          // Wochenende
{
   FS20_SwitchMode(29501, false);
   IPS_Sleep(500);
   FS20_SwitchDuration(51092,true,30);
}

sleep(1);

// KÜCHE auf

if ((GetValueBoolean("KUE_ROLLLADEN_AB") == true)
   and
         ((($stunde >= 06)                                                 // Stunde Woche
         and ($minute >= 15)                                               // Minute Woche
         and ($wochentag < 6))                                             // Wochentag

      or
         (($tag == true)                                                   // Sonnenaufgang
         and ($stunde >= 06)                                               // Stunde Wochenende
         and ($minute >= 30)                                               // Minute Wochenende
         and ($wochentag >= 6))))                                          // Wochenende
{
   FS20_SwitchMode(19591, false);
   IPS_Sleep(500);
   FS20_SwitchDuration(22530,true,30);
}

sleep(1);

// SCHLAFZIMMER auf

if ((($tag == true) and GetValueBoolean("SZI_ROLLLADEN_AB") == true)       // Sonnenaufgang
   and
         ((($stunde >= 08)                                                 // Stunde Woche
         and ($minute >= 00)                                               // Minute Woche
         and ($wochentag < 6))                                             // Wochentag

      or
         (($stunde >= 09)                                                  // Stunde Wochenende
         and ($minute >= 30)                                               // Minute Wochenende
         and ($wochentag >= 6))))                                          // Wochenende
{
   FS20_SwitchMode(34577, false);
   IPS_Sleep(500);
   FS20_SwitchDuration(16718,true,30);
}

?>

Mach mal die Stunden und die Minuten in Anführungszeichen…

Date gibt einen String zurück. Du schaust ob „08“ gleich 8 ist statt, wie du es vermutlich vorhattest, 8 mit 8, denn bei Integer spielen führende Nullen keine Rolle.

Das erklärt natürlich noch nicht wirklich das Phänomen, aber manchmal benimmt sich PHP auch einfach komisch…

Gruß,

Toni

Ach ich Esel…

$minute = date("i");
$stunde = date("H");

sollte ja eigentlich auch heissen…

$minute = GetValueString("AKT_MINUTE");
$stunde = GetValueString("AKT_STUNDE");

denn die habe ich als Variablen.

So ist das, wenn man das zwischen 1 u. 2 Uhr nachts macht:rolleyes:
Aber ob das, den Fehler beseitigt?

Hat noch jemand eine Idee?
ich werde zudem mal die Öffnungszeit im SZI auf 8:05 Uhr setzen.
Mal schau´n was dann passiert.

Das frühe Öffnen ist darin begründet, dass IPS nach der Devise „Morgen’Stund hat Gold im Mund“ lebt.:stuck_out_tongue:

Nein, ich würde mal prüfen, ob du sicherstellen kannst, dass du nicht versehentlich die ID in einem anderen Script eingetragen hast. Somit solltest du prüfen, welche Scripte um 06:30 laufen könnten.

Ich kann nur empfehlen entweder in einer „Konstantenliste“ sprechende Variablen mit den ID’s zu verknüpfen oder, so hab ich es gelöst, die ID’s direkt in Variablen vernünftig kategorisiert abzulegen. Dadurch sind händische Fehler insbesondere bei Mehrfachverwendungen ausgeschlossen und sparen auf Dauer auch sehr viel Zeit.

PS: Warum benutzt du eigentlich nicht den Befehl „SetPosition“ für die Rolladensteuerung ? Wird bei deiner Variante der Parser nicht blockiert und ist deshalb vorteilhafter ?:rolleyes:

Ich benutze einen FS20-Universalempfänger http://www.elv.de/output/controller.aspx?cid=74&detail=10&detail2=8746 , da die von mir verwendeten Gurtwickler ecg-elektro.de von Haus nicht für Fernsteuerung vorgesehen sind, dafür aber das FS20-Uni und die Gurtwickler mit 24VDC funktionieren.
Also eine nachträgliche Bastellösung.
Für die 24VDC habe ich aber unter jedem Fenster einen Anschluss, gleichzeitig zum Belimo MP-Bus, der ebenfalls mit 24V versorgt wird.
So kann ich die Rollladenöffnung nur über die Zeit (SwitchDuration) steuern.

Ich kann nur empfehlen entweder in einer „Konstantenliste“ sprechende Variablen mit den ID’s zu verknüpfen

Das werde ich nochmal drüber nachdenken.

Die IDs sollten jedoch passen, denn die habe ich mehrfach überprüft.
Variablen und Instanzen habe ich ebenso alle in einheitlichen Kategorien abgelegt.

Kann es einfach nur sein, dass die hier fett rot markierten Klammern fehlen, dass die Funktion aufgeht, so wie es sein soll?

if ((($tag == true) && [b]([/b]GetValueBoolean("SZI_ROLLLADEN_AB") == true)[b])[/b] && ((($stunde >= 08) && ($minute >= 00) && ($wochentag < 6)) or (($stunde >= 09) && ($minute >= 30) && ($wochentag >= 6)))) 

Wenn dem so ist, dann wundert mich nur, dass es bei den anderen Zimmer funktionierte und hier nicht, da die Klammern überall gleich sind?!

Vielleicht liegts auch an der „Weckzeit“ von 8:00?

Noch zum „Ideenfang“…
Sonnenaufgang war heute bei mir um 6:29 Uhr und dieser Rollladen fuhr ausgerechnet um 6:30 Uhr hoch…:confused:

Also deine Klammerung ist nahezu undurchsichtig. Ich denke da könnte durchaus noch der Eine oder andere Fehler drin sein, ist mir echt zu anstrengend grad da durchzusteigen ;). Aber vor Allem ist & vollkommen falsch. Eine logische UND Verknüpfung passiert mit && oder AND.

Wie wärs wenn du das ganze Ding mal überdenkst?

Edit: Hab das mal eben etwas strukturiert, aber nicht getestet


if ( ($tag == true) AND (GetValueBoolean("SZI_ROLLLADEN_AB") == true) )
{
  if ( ( ($stunde >= "08") AND ($minute >= "00") AND ($wochentag <  "6") ) OR
       ( ($stunde >= "09") AND ($minute >= "30") AND ($wochentag >= "6") ) )
  {
     FS20_SwitchMode(34577, false);
     IPS_Sleep(500);
     FS20_SwitchDuration(16718,true,30);
  }
}

Gruß,

Toni

Das habe ich nur der Übersicht halber so eingetragen, wegen der Veröffentlichung dieser Zeile, noch steht im Script, wie o. gepostet, „and“ (geschrieben) als Verknüpfung.

Die Klammerung und die Arbeit mit diesen Blöcken kommt einfach daher, dass ich mir damit „noch“ leichter tue, da ich die Digitaltechnik und Logik mit Blöcken so in meiner Lehrzeit eingebleut bekommen habe. Steckt halt einfach noch so drin.

Somit wäre

A (($tag == true) & (GetValueBoolean(„SZI_ROLLLADEN_AB“))

B (($stunde >= 08) & ($minute >= 00) & ($wochentag < 6))

C (($stunde >= 09) & ($minute >= 30) & ($wochentag >= 6))

jeweils eine Bedingung

und so

(A & (B or C)) = D(Schalten) zusammengefasst (nach digitaler Logik).

EDIT/
Das sieht natürlich wesentlich schöner aus, wie du das machst:o
Werde ich so probieren.
Also bist du auch der Meinung, dass mir eventuell die zwei (roten) Klammern gefehlt haben?

Damit hab ich auch mal angefangen… „Digitaltechnik I“ mit Hern Scholle. Boolsche Algebra mag ich bis heute nicht… :wink:

Hab deine Klammerung mal eben durch den Syntaxhighlighter gejagt und der hat keine Fehler gefunden. Das bestätigt was ich schon befürchtet habe. Du hast nen Logikfehler drin. Und wenn du mich so fragst muss ich sagen ist die linke rote Klammer wohl richtig und die rechte falsch denn du hast innerhalb der roten Klammern mehr schließende als öffnende. Das bedeutet dass mindestens eine dritte auch falsch ist, sonst wär mein Highlighter angesprungen und hätt gemeckert.

Toni

So oft ich darüber schaue, kann ich keinen Logikfehler erkennen.

Ich habe nur nochmal meinen Beitrag weiter oben (die Zeile mit den roten Klammern) geändert, da ich hier eine Klammer falsch gesetzt habe.
Du hattest das aber in deiner „Verschönerung“ schon richtig gesetzt.

Probier meinen Code ruhig mal… Ich hab noch mehr Fehler berichtigt :wink:

Muss nu aber Feierabend machen.

Gruß,

Toni

Jo, mache ich auf alle Fälle. Danke bis hier her!

Morgen weiss ich mehr;)

P.S. Wenn das läuft, dann kommen auch noch die Feiertag mit rein…

Hallo Toni,

das hat heute super geklappt, mit dem abgeänderten Script.
Bin extra bisschen länger liegen geblieben:D

Vielen Dank!

P.S.

Ich hab noch mehr Fehler berichtigt

Habe ich bemerkt:cool:

fein… freu

Der Vollständigkeit halber nochmal das „neue“ Script:


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     :  Rollladen_auf.ips.php
Trigger  :  Variable: AKT_MINUTE
Interval :  1 Minute
*/

// Abfrage
      $minute = date("i");
      $stunde = date("H");
      $wochentag = GetValueString("WOCHENTAGNR");
      $tag = GetValueBoolean("IST_TAG");


// WOHNZIMMER auf

if ( ($tag == true) AND (GetValueBoolean("WZI_ROLLLADEN_AB") == true) )		// Sonnenaufgang u. Abfrage ist unten?	
{
  if ( ( ($stunde >= "07") AND ($minute >= "30") AND ($wochentag <  "6") ) OR	// Woche Stunde Minute
       ( ($stunde >= "07") AND ($minute >= "30") AND ($wochentag >= "6") ) )	// Wochenende Stunde Minute
  {
     FS20_SwitchMode(59443, false);
     IPS_Sleep(500);
     FS20_SwitchDuration(40264,true,30);
  }
} 


sleep(1);


// KINDERZIMMER auf

if ( ($tag == true) AND (GetValueBoolean("KZI_ROLLLADEN_AB") == true) )		// Sonnenaufgang u. Abfrage ist unten?	
{
  if ( ( ($stunde >= "07") AND ($minute >= "15") AND ($wochentag <  "6") ) OR	// Woche Stunde Minute
       ( ($stunde >= "08") AND ($minute >= "45") AND ($wochentag >= "6") ) )	// Wochenende Stunde Minute
  {
     FS20_SwitchMode(29501, false);
     IPS_Sleep(500);
     FS20_SwitchDuration(51092,true,30);
  }
} 


sleep(1);


// KÜCHE auf

if  ( ($stunde < "08") AND (GetValueBoolean("KUE_ROLLLADEN_AB") == true) )	// Vor Uhrzeit u. Abfrage ist unten?	
{
  if ( ( ($stunde >= "06") AND ($minute >= "15") AND ($wochentag <  "6") ) OR	// Woche Stunde Minute
       ( ($stunde >= "06") AND ($minute >= "45") AND ($wochentag >= "6") ) )	// Wochenende Stunde Minute
  {
     FS20_SwitchMode(19591, false);
     IPS_Sleep(500);
     FS20_SwitchDuration(22530,true,30);
  }
} 



sleep(1);


// SCHLAFZIMMER auf

if ( ($tag == true) AND (GetValueBoolean("SZI_ROLLLADEN_AB") == true) )		// Sonnenaufgang u. Abfrage ist unten?	
{
  if ( ( ($stunde >= "08") AND ($minute >= "00") AND ($wochentag <  "6") ) OR	// Woche Stunde Minute
       ( ($stunde >= "09") AND ($minute >= "30") AND ($wochentag >= "6") ) )	// Wochenende Stunde Minute
  {
     FS20_SwitchMode(34577, false);
     IPS_Sleep(500);
     FS20_SwitchDuration(16718,true,30);
  }
} 







?>

Nun mache ich dran, noch die Feiertage mit einzuarbeiten.
Ich habe mich noch nicht weiter mit den Toni-Tools beschäftigt.
Ist es damit möglich, dass ich z.B. ,wie bei mir, die Variable "„WOCHENTAGNR“ setzen kann, also wie für Sonntag die 7?

Hallo nancilla,

wenn ich das Skript richtig verstehe, willst Du Deine Jalousien zu einer bestimmten Uhrzeit oder zum Sonnenaufgang hochfahren, je nach dem, welches der beiden Ereignisse das spätere ist.

Ist das richtig?

Gruß
HJH

@Nancilla
Klar kannst du das. Die Funktion gibt dir das Datum von Ostern - Als Beispiel - zurück. Was du dann mit dem Datum machst ist deine Sache. Klar kannst du an Ostern eine 7 in eine variable schreiben.

Toni

@HJH
genau!

@Toni
Ich werde mich damit auseinander setzen:)

Ich denke ich weiss was HJH meint.

So wie es jetzt gescriptet ist werden die Rolläden nicht vor der eingestellten Zeit und nicht vor Sonnenaufgang hochgefahren. Sollte es also um 7:30 Uhr noch dunkel sein bleiben die Rolläden unten. Ist es vor 7:30 schon hell, bleiben sie ebenfalls unten (Eine Ausschlafen-Funktion sozusagen ;)). Ist das so wie du es wolltest?

Ist das so wie du es wolltest?

Genau so ist das gewollt.

Bis auf die Küche, wie man im Script sieht.
Das wollte meine „Regierung“ so, um wenigstens früh zusehen, wie das Wetter draußen ist, wenn die Kinder für die Schule fertig gemacht werden. :wink: Damit habe ich dann einen besseren WAF geschaffen.