Polling bedeutet einen unbekannten Zustand durch abfragen zu ermitteln. Folglich werden nur Eingänge so behandelt. Das Polling übernimmt IPS für Dich. Die Variablen, die Du den Eingängen zugeordnet hast, zeigen den jeweils aktuellen Zustand.
Bei Ausgängen hast Du es über Dein Script selbst in der Hand welchen Zustand sie wann einnehmen sollen.
Hierzu wird der Befehl TMEX_F29_SetPin() verwendet. Dabei wird die dem Ausgang zugeordnete bool’sche Variable übergeben, deren Zustand in den Ausgang übernommen wird. Falls Du alle Ausgänge oder zumindest mehrere auf einmal (rück)setzen willst (z.B. nach PowerUp), dann kannst Du den Befehl TMEX_F29_SetPort() verwenden. In diesem Fall wird ein Byte (Integer) übergeben, dessen Bits die Ausgangszustände darstellen.
Zu Deiner Rollo-Steuerung:
Wenn ich Dich richtig verstanden habe, dann soll ein Tastendruck das Hochfahren des Rollos auslösen. Ein weiterer Tastendruck stoppt den Vorgang wieder. Außerdem wird er ebenfalls gestoppt, wenn der zweite Tastendruck nicht spätestens nach 30 Sekunden gekommen ist.
Das sieht dann so aus:
Polling-Intervall 1s;
a) Ein Script erfasst den Tastendruck, setzt den zugehörigen Ausgang und setzt seinen eigenen Script-Timer auf 30s.
b) Der nächste Aufruf des Scripts erfolgt nun entweder über einen zweiten Tastendruck oder über den Timer. Auf jeden Fall sollte es nun den Ausgang wieder rücksetzen und auch den Script-Timer wiederlöschen.
Welcher der beiden Fälle abzuarbeiten ist, kann das Script leicht aus dem Zustand der Ausgangsvariablen ersehen.
Wie setze ich den Script Timer der dann das Script neu aufruft zum löschen.
Ich muss doch das Script immer beenden oder. Wie rufe ich ein neues auf und beende das Script welches es aufgerufen hat. Und wie beende ich das Timer Script vorzeitig. Wieviele Scripts können denn gleichzeitig laufen wenn ich alle Jalousien gleichzeitig ruterfahre ? Und was passiert wenn es ein Script zuviel aufgerufen wird.
Naja,viele Fragen. Hoffe ich belästige dich nicht zu stark.
Du hast es nur mit einem einzigen Script zutun.
Das Script wird getriggert (gestartet) durch ein Ereignis.
Erste Aktion des Scripts:
Feststellen, welches Ereignis das war. In Deinem Falle ist das ganz einfach:
Fall 1: Motor läuft nicht. Das Ereignis war der erste Tastendruck.
Fall 2: Motor läuft. Das Ereignis war der zweite Tastendruck oder ein Trigger vom Timer.
Zweite Aktion:
Im Fall 1: Motor einschalten und Script-Timer auf 30s setzen;
Im Fall 2: Motor ausschalten und Script-Timer auf 0s setzen (löschen);
Die zwei wichtigsten Befehle:
TMEX_F29_SetPin(InstanceID, Motor-Port, Status) zum Schalten des Motors
IPS_SetScriptTimer(Zeitintervall) zum Setzen des Script-Timers
kann ich dann auch im Script abfragen durch welchen event (on change einer Variable) das script aufgerufen wurde, bzw. Variablen an das Script übergeben ?
Sonst hätte ich ja bei 16 Rollos …
Du benötigst für jede Jalousie 2 Scripts, eines zum Runterfahren und eines zum Hochfahren. Wofür Du das dritte vorgesehen hast, kann ich mir nicht erklären.
Es ist bei Weitem am einfachsten 32 einzelne Scripts zu verwenden. Andernfalls wird es wesentlich komplizierter (vor Allem der Test).
Alle Variablen in einem Script sind lokal. Globale Variablen sind diejenigen, die Du in IPS unter „Variablen“ anlegst. Davon benötigst Du auf jeden Fall einige, da sie die Verbindung zur Außenwelt herstellen. Auf globale Variablen (also IPS-Variablen) greifst Du mit den „GetValuexxx(„Name“)“ oder „SetValuexxx(„Name“)“-Funktionen zu.
Ich habe hier ein Beispiel-Script angefügt. Du musst es noch an den gekennzeichneten Stellen an Deine Umgebung anpassen. Getestet habe ich es nicht, da ich keine geeignete Hardware besitze. Aber vom Prinzip her sollte es funktionieren.
Gruß
HJH
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : Jalousie_2_auf.ips.php
Trigger : J2T_auf // Taster für Jalousie 2 "auf"
Interval :
********************************************************************************
Dieses Script ist für das Hochfahren der Jalousie Nr. 2 zuständig
********************************************************************************
Voraussetzung
dem Taster-Port Bit1 wurde die Bool-Variable "J2T_auf" zugeordnet : Eingang vom Taster kommend
die Variable "J2T_auf" ist auch der Haupt-Trigger für dieses Script (wird im Menue "Event" gesetzt)
dem Motor-Port Bit1 wurde die Bool-Variable "J2M_auf" zugeordnet : Ausgang zum Motor führend
*/
// die folgende Zeile ist für die Jalousien 1...8 identisch (ID anpassen!)
$MotorPIO = 44627; // InstanceID des Motor-Ports (hochfahren) für die Jalousien 1...8 (Ausgänge)
// die folgenden 3 Zeilen müssen für jede Jalousie angepasst werden
$Port = 1; // Nummer des Ausgangs am Motor-Port für Jalousie 2
$Motor = "J2M_auf"; // Name der Motor-Variablen für Jalousie 2
$Script = "Jalousie_2_auf"; // Name dieses Scripts
// alle restlichen Zeilen bleiben unverändert
if (GetValueBoolean($Motor) == false) { // Motor läuft noch nicht
SetValueBoolean($Motor, true);
TMEX_F29_SetPin($MotorPIO, $Port, GetValueBoolean($Motor)); // Motor einschalten
IPS_SetSriptTimer($Script, 30); // TimeOut auf 30s setzen
}
else { // Motor läuft bereits
SetValueBoolean($Motor, false);
TMEX_F29_SetPin($MotorPIO, $Port, GetValueBoolean($Motor)); // Motor abschalten
IPS_SetSriptTimer($Script, 0); // TimeOut löschen
}
?>
ich habe jetzt das Script für mich optimiert, so das ich ein Script für hoch und runter auf den Trigger onvalue=true der beiden Varibalen hoch und runter verwenden kann.
Was mir nur komisch vorkommt ist, das ich in meinen if Abfragen nicht mit True und false sondern nur mit 0 und 1 arbeiten kann.:eek: Hast Du da eine Idee woher das kommt? Wenn ich die Variablen per echo Ausgebe bekomme ich entweder eine 1 (True) oder eine Leere (False) Variable zurück. Ich dacht in PHP brauche ich eeine Variablendefinitionen.
Es scheint, dass Du durch eine Zuweisung die betreffende Variable versehentlich zu einem Integer gemacht hast. Da Variablen in PHP nicht deklariert werden müssen, wird der Typ automatisch bei der ersten Zuweisung festgelegt.
Aber grundsätzlich funktioniert es auch mit Integer. Du musst nur für Dich selbst definieren, welchen Wert Du als „TRUE“ und welchen Du als „FALSE“ verwenden willst.
von primzip her Funktioniert das hier so nicht if (GetValueBoolean($Motor) == false) aber if (GetValueBoolean($Motor) == 0) oder if (GetValueBoolean($Motor) == „“) funktioniert.
genau das gleiche. Habe auch schon eine Testvariable genommen und die per Hand verändert. Leider keine Änderung. Ich glaube auch das er nur False nicht zuordnen kann da ich denke das 0 das gleiche für php beim if ist wie „“, und die 1 ja das glieche wie True. „“ ist aber anscheinend nicht das gleiche wie False.
Nach meinen Tests funktioniert es mit true und false einwandfrei.
Bei der Ausgabe mit echo gibt PHP aber entweder „1“ oder „“ aus.
Nur die Ausgabe ist von dieser merkwürdigen Darstellung betroffen.
Das Skript läuft aber ganz normal ab.
Du bestätigst ja auch, dass es funktioniert.
Also: einfach ignorieren.
da hast du wohl recht, nur damit generiere ich den Variablen Namen. Macht die Sache beim Kopieren für die einzelnen Rollos viel einfacher. Auserdem funktioniert das Script so einwandfrei. Ich habe nur True und False beanstandet.
Dieses Script funktioniert ! Der Befehl GetValue Boolean($generierter var name) kann eigentlich nur Boolean zurückgeben.
das Script mag vielleicht jetzt noch funktionieren, aber glaube mir, nur eine andere neuere Version von PHP, und das ganze funktioniert nicht mehr, weil Du es einfach unsauber programmiert hast. PHP wird mit neueren Versionen immer strikter bei der Variablen Behandlung (endlich) - und dann suchst Du Dir den Wolf nach dem Fehler, weil Du nicht mehr weisst, woran es liegen koennte.
Du musst das ganze einfach in Funktionen oder Klassen packen, dann kriegste auch die gleichen Ergebnisse mit wenig Code, aber uebersichtlicher unter Umstaenden und codemaessig sauber.
Und beanstanden kannste das nicht, es ist einfach nicht korrekt implementiert, damit sind undefinierte Zustaende vorprogrammiert. PHP bringt also genau das Ergebnis, was hier zu erwarten ist.
also wir php irgendwann sagen ich darf keine Variablen namen aus Strings generieren oder wie ?
Das das glaub ich ja nie. Bitte schau Dir das Script mal genau an. Was ich da mache ist schon OK! Selbst wenn ich die Variable im Klartext int die GetValueBoolean Abfrage Eintrage kommt das gleiche dabei raus. Das was Du da gerade geschrieben hast kann ich nicht nachvollzien. Darf ich dann demnächst keine Zeichen Verketten ? Klar kann ich Funktionen bauen, aber das ändert nichts an meinem Problem.
die Variablen „$VarOutZu“ und „$VarOutAuf“ sind natürlich keine Bool-Variablen sondern String-Variablen. Sie dienen als Argument für die Funktion „GetValueBoolean(Name)“, die an dieser Stelle einen String erwartet.
Das ist also völlig in Ordnung.
Rätselhaft bleibt jedoch, warum in der „if“-Abfrage die 0 (Null) nicht durch false ersetzt werden kann.
Meine Frage lautet daher:
Gibt es dann eine Fehlermeldung, oder reagiert das Script einfach nicht oder vielleicht falsch?