Ich habe mal ein ganz simples Script für meine Rollladensteuerung gestrickt (Bitte nicht lachen… alles Alphaphase )…
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…
Das frühe Öffnen ist darin begründet, dass IPS nach der Devise „Morgen’Stund hat Gold im Mund“ lebt.
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.
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);
}
}
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“))
(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…
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.
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.
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?
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.
@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.
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?
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. Damit habe ich dann einen besseren WAF geschaffen.