DS2408 und 24V Ausgang

Hallo elektrofreak,

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.

Gruß
HJH

Hallo HJH,

Prinzip verstanden, ausführung unklar :frowning:

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. :frowning:

Naja,viele Fragen. Hoffe ich belästige dich nicht zu stark.

Danke

ef

Hallo elktrofreak,

es ist alles halb so schlimm.

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

Das war’s schon.

Gruß
HJH

hm …

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 …

1 Script Rauf
1 Script Runter
1 Script Timer Rauf/Runter Stop 30 sek

3 * 16 = 48 Scripts.

Und noch einer andere Frage: Sind die Variablen innerhalb der Script global gesetzt oder nur pro Aufruf ?

Gruß

ef

Hallo elektrofreak,

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
}
?>

Hallo,

das Output Modul mit 16 Ports 24V galvanischer Trennung ist fertig :smiley: und funktioniert einwandfrei :slight_smile: . Habe mal ein paar Bilder angehangen.

Gruß

ef

DSC00403.JPG

DSC00404.JPG

DSC00405.JPG

Hallo HJH,

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.:slight_smile:
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? :confused: 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.

Danke
Gruß

ef

Hallo elektrofreak,

wie sieht den Deine IF-Abfrage aus?

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.

Gruß
HJH

Hallo HJH,

von primzip her Funktioniert das hier so nicht if (GetValueBoolean($Motor) == false) aber if (GetValueBoolean($Motor) == 0) oder if (GetValueBoolean($Motor) == „“) funktioniert.

Gruß

ef

Hallo elektrofreak,

schreib mal den Namen Deiner Variablen einschließlich Anführungszeichen an stelle von $motor:

if (GetValueBoolean(„Variablenname“) == false) …

was passiert dann?

Gruß
HJH

Hallo,

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.

Gruß

ef

Hallo elektrofreak,

da haben wir uns beide in die Irre führen lassen.

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.

Gruß
HJH

Hallo HJH,

also ich kann nur mit 0 und 1 arbeiten (in den if schleifen) mit true und false geht das nicht.

hier mal mein script.

<?

$OutInstance = 17940;
$PortZu = 4;
$Rollo = „J17“;
$StopTime=45;

$PortAuf = $PortZu+1;
$VarInZu = „Rollo_In_“.$Rollo.„zu";
$VarInAuf = "Rollo_In
“.$Rollo.„auf";
$TasterZu = GetValueBoolean($VarInZu);
$TasterAuf = GetValueBoolean($VarInAuf);
$VarOutZu = "Rollo_Out
“.$Rollo.„zu";
$VarOutAuf = "Rollo_Out
“.$Rollo.„auf";
$Script = "Rollo
“.$Rollo;

If (GetValueBoolean($VarOutZu) == 0 or GetValueBoolean($VarOutAuf) == 0) {
If (GetValueBoolean($VarOutZu) == 0) {
TMEX_F29_SetPin($OutInstance, $PortZu, true);
SetValueBoolean($VarOutZu,true);
}
If (GetValueBoolean($VarOutAuf) == 0) {
TMEX_F29_SetPin($OutInstance, $PortAuf, true);
SetValueBoolean($VarOutAuf,true);
}
IPS_SetScriptTimer($Script, 0);
}

else {
If ($TasterZu == 1 and $TasterAuf == 1){}
else {
If ($TasterZu == 1) {
TMEX_F29_SetPin($OutInstance, $PortZu, false);
SetValueBoolean($VarOutZu, false);
IPS_SetScriptTimer($Script, $StopTime);
}
If ($TasterAuf == 1) {
TMEX_F29_SetPin($OutInstance, $PortAuf, false);
SetValueBoolean($VarOutAuf, false);
IPS_SetScriptTimer($Script, $StopTime);
}
}
}

?>

Gruß

ef

Hallo ef,

 <?

$OutInstance = 17940;
$PortZu = 4;
$Rollo = "J17";
$StopTime=45;


$PortAuf = $PortZu+1;
$VarInZu = "Rollo_In_".$Rollo."_zu";
$VarInAuf = "Rollo_In_".$Rollo."_auf";
$TasterZu = GetValueBoolean($VarInZu);
$TasterAuf = GetValueBoolean($VarInAuf);
$VarOutZu = "Rollo_Out_".$Rollo."_zu";
$VarOutAuf = "Rollo_Out_".$Rollo."_auf";

// diese beiden Variablen sind doch keine Bool Variablen ??????

$Script = "Rollo_".$Rollo;

If (GetValueBoolean($VarOutZu) == 0 or GetValueBoolean($VarOutAuf) == 0) {
        If (GetValueBoolean($VarOutZu) == 0) {
           TMEX_F29_SetPin($OutInstance, $PortZu, true);
           SetValueBoolean($VarOutZu,true);
           }
        If (GetValueBoolean($VarOutAuf) == 0) {
           TMEX_F29_SetPin($OutInstance, $PortAuf, true);
           SetValueBoolean($VarOutAuf,true);
           }
        IPS_SetScriptTimer($Script, 0);
       }

 else {
       If ($TasterZu == 1 and $TasterAuf == 1){}
       else {
             If ($TasterZu == 1) {
              TMEX_F29_SetPin($OutInstance, $PortZu, false);
              SetValueBoolean($VarOutZu, false);
              IPS_SetScriptTimer($Script, $StopTime);
             }
             If ($TasterAuf == 1) {
              TMEX_F29_SetPin($OutInstance, $PortAuf, false);
              SetValueBoolean($VarOutAuf, false);
              IPS_SetScriptTimer($Script, $StopTime);
             }
         }
 }

?>

irgendwie mixt Du hier text und anderes zusammen, das kann doch nicht funktionieren ???

Gruss Torro

Hallo Torro,

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.

ef

Hallo ef,

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.

Gruss Torro

Aha,

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.

ef

Hallo ef,

ich glaube, es war schon zu spaet fuer mich, sowas passiert, wenn man nur mal schnell drauf schaut…

Also, klar kannste das so machen, aber ich wuesste trotzdem gern, woher der Wert der Variablen kommt. Kannste das mal noch zeigen?

Gruss Torro

Hallo,

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?

Gruß
HJH

Hallo ef,

versuche doch die Abfrage mal so zu machen und schau, was Du dabei als Ergebnis erhaelst:


$Motor = True;
SetValueBoolean("Motor",$Motor);

$var = "Motor";

IF ( !is_bool ( $$var ) ) {
   echo "Variable ist keine boolesche Variable!";
} else {
  IF ( GetValueBoolean ( $var ) ) {
     echo "TRUE";
  } else {
     echo "FALSE";
  }
}

Dieses Script funktioniert so, wie man es erwartet, wenn also die Variable $Motor True ist, wird der True Zweig abgearbeitet, anderenfalls False.

Die Variable „Motor“ muss man natuerlich erst in IPS anlegen, damit man es im Scripteditor nachvollziehen kann.

Gruss Torro