Unterstützung für kleines Script gesucht

Hallo Gemeinde,

ich bin auf verzweifelter Suche nach einem kleinen Script mit folgendem Funktionsumfang:

Modus a: Licht runterdimmen (Intensity 0% in 15min bzw. 900sek.)
Modus b: Licht runterdimmen (Intensity 0% in 5min bzw. 300sek.)
Modus c: Licht hochdimmen (Intensity 100% in 5min bzw. 300sek.)

In meinem Dimmer sind folgende Knotenpunkte gegeben:

  • Geräteinstanz
  • Variable für Zustand (Boolean false/true)
  • Variable für Helligkeit (Integer 0-100)
  • Variable für Steuerung (Integer 0-100)

Um die gewünschte Zeit zu erreichen müsste vermutlich zwischen jeder Beleuchtungsstufe das Script angehalten werden (IPS_SetScriptTimer?).
Ich habe verschiedene Timer in IPS angelegt und in jedem Timer soll das Script aufgerufen werden mit dem gewünschten Dimm-Modus (Modus a, Modus b oder Modus c).

Soweit die Theorie, allerdings für mich als Laie eine zu große Herausforderung um dieses alleine zu generieren und benötige deshalb Unterstützung von einem der hier anwesenden Profis und alte Hasen. Wäre auch für eine kleine Aufwandsentschädigung bereit.

Viele Grüße, Yansoph.

Beim initialen Starten setzt du dir eine Integer Variable „Modus“, welche ggf. sicherheitshalber auch noch die Option „aus“ haben könnte. Und eine Integer Variable „Durchgelaufene Schritte“

Wird das Script nicht durch den ScriptTimer gestartet $_IPS[‚SENDER‘]!=„TimerEvent“(z.B. ausgelöst durch das Setzen der Modus Variable) berechnest du die Anzahl notwendiger Steps sowie deren Abstand. Du setzt den Scripttimer auf die notwendige Zeit bis zur nächsten Ausführen (also Gesamtzeit/Anzahl Schritte). Wird das Script nun durch das Timerevent ausgelöst zählst du den Stepcounter runter. Im Sonderfall StepCounter=0 deaktivierst du das Timerevent.

Pseudocode:


$countsA=15; $countsB=20; $countsC=30;
$zeitA=20;$zeit...
if($_IPS['SENDER']!="TimerEvent"){
	SetValue($idStepcounter, $countsX /*setze durch weitere Prüfung ein A-C*/);
	IPS_SetScriptTimer($_IPS['self'],$zeitX/$countsX);
}else{
	SetValue($idStepcounter,GetValue($idStepcounter)-1);
	if(GetValue($idStepcounter)==0){
		IPS_SetScriptTimer($_IPS['self'],0);
	}
	RequestAction($IntensitySetID, 100-100/$steps)

Hallo tobiasr,
bin gerade etwas erschlagen und dennoch froh, das es doch nicht ganz unmöglich ist dieses Projekt zu realisieren.
Ich Versuche dir mal in kleinen Schritten zu folgen.

Ich habe die Variable Modus angelegt, allerdings kann ich nicht als Integer den Zustand mit true oder false angeben, nur als Boolean…
Oder habe ich hier was falsch verstanden?

Die nächste Frage wäre, wie starte ich das Script? Habe verschiedene Ereignisse (Ausgelöst bzw. Zyklisch) und hier dann unter Aktion „Führe PHP Code aus“ einen Verweis auf das Script??

Gruß Yansoph.

Du willst ja im Modus speichern A, B, C. Dies geht über Integer Assoziationen (z.B. 1 entspricht Modus A, 2 B und 3 C). Das sind also mindestens 3 Zustände, welche du mit den maximal zwei Zuständen von boolean Variablen nicht speichern kannst.

Wenn du die Variable angelegt hast, kannst du in dem „bearbeiten“ Popup einerseits ein Profil (Assoziation) anlegen, als auch das sogenannte Action Script verlinken.

Vielen Dank für die Erklärung, ich kenne zwar noch nicht viele der IPS-Funktionen bin aber sehr erstaunt was alles möglich ist.

Die zwei Variablen wurden angelegt, bei der Variable Modus habe ich vier Zustände hinterlegt (0=aus, 1=Modus a, 2=Modus b und 3=Modus c).
Wozu wird die Variable „Durchgelaufene Schritte“ benötigt? Wer greift auf die Variable zu?

Wird das Script nicht durch den ScriptTimer gestartet $_IPS[‚SENDER‘]!=„TimerEvent“(z.B. ausgelöst durch das Setzen der Modus Variable)

Hier habe dich die nächste Verständnisfrage: wie ist das zu verstehen? Wie starte ich den ScriptTimer? Oder ist das gleiche gemeint wie wenn ich über ein Zyklisches Ereignis das Script über die Variable Modus starte?

Zum Code selbst:
Warum gibt es hier verschiedene Counts (Schritte?) von 15, 20 und 30? Ich hätte hier vermutet, das es bei einer Intensität von 0-100% 100 Schritte wären, also bei jedem Schritt das Script pausieren…oder auch ein Gedankenfehler meinerseits.

Wenn ich nun die Variable z.B. im Modus B starte, woher weiß das Script welcher Dimm-Modus gewünscht ist?

Viele Grüße, Yansoph.

Das Script pausiert, aber nicht in dem es „wartet“ sondern indem es sich wenige Sekunden (bei 300 Sekunden und 100 Schritten (wobei du idr. nur ca. 30-60 sichtbare Schritte haben wirst) alle 3 Sekunden) erneut aufruft.

Jetzt kann ich das Script also über die Aktion der Variable starten (initial) oder es startet sich alle ca. 3 Sekunden selbst neu. Damit es dann weiß, ob es auf 90 oder auf 50 setzen soll, die Zwischenvariable StepCount (aus der du dann errechnen kannst, auf welchen Wert es jetzt als nächstes Schalten wird).

Die Unterschiedlichen Counts stammen daher: Will ich von 100% auf 0% in 600 Sekunden, mache ich dies z.B. in 100 Schritten (100x alle 6 Sekunden das Script starten), wenn ich aber nur 100 Sekunden habe, reicht ggf. eine Auflösung von 50 Schritten alle 2 Sekunden.

Den Scripttimer setzt du mit folgendem Code:
IPS_SetScriptTimer($_IPS[‚self‘],$zeitX/$countsX);

Achtung: Um ihn wieder auszuschalten hatte ich einen Fehler im vorherigen Post. Den werde ich in wenigen Sekunden bearbeiten.

Hallo tobiasr, vielen Dank für die Erklärung!

Ich habe nun mal Schritte und Zeiten im Code angepasst:
Modus A: 100 Schritte x 6 Sek.= 600 Sek. (10min hochdimmen)
Modus B: 100 Schritte x 3 Sek.= 300 Sek. (5min runterdimmen)
Modus C: 100 Schritte x 9 Sek.= 900 Sek. (15min runterdimmen)

<?php
$countsA=100; $countsB=100; $countsC=100;
$zeitA=6;$zeitB=3;$zeitB=9;
if($_IPS['SENDER']!="TimerEvent"){
    SetValue($idStepcounter, $countsX /*setze durch weitere Prüfung ein A-C*/);
    IPS_SetScriptTimer($_IPS['self'],$zeitX/$countsX);
}else{
    SetValue($idStepcounter,GetValue($idStepcounter)-1);
    if(GetValue($idStepcounter)==0){
        IPS_SetScriptTimer($_IPS['self'],0);
    }
        RequestAction($IntensitySetID, 100-100/$steps) 

Ich vermute mal, $idStepcounter muss ersetzt werden mit dem Knotenpunkt der Variable „Durchgelaufene Schritte“, also $id12345 /Variable durchgelaufene Schritte/ ??

Da muss dann nur die fünf stellige Zahl hin. Ohne $. Oder eine extra Variable definieren.
CountX müsstest du setzen. Denn countX != countA. Da du immer 100 wählst, würde ich $countX=100 setzen.
und stattdessen $zeitA bis $zeitC einführen und dann in einer Abfrage ähnlich

Ersetze $zeitX/$countsX und setze dort $zeit ein. Und vorher folgenden Code:

switch($_IPS['VALUE']){
1: /* Modus A*/
$zeit= 6;
break;
2: 
$zeit=3;
break;
3:
$zeit=9;
}

Habe den Code mal nach meinem besten Gewissen angepasst, allerdings bereits in 4 Zeile einen Fehler:

Parse error: syntax error, unexpected ‚[‘ in /var/lib/symcon/scripts/17468.ips.php on line 4

und die letzte Zeile habe ich auch eigenmächtig erstellt, da eine Klammer fehlte (passt vermutlich auch nicht).

<?php
$countsx=100;

switch(51743/*Variable Modus*/['VALUE']){
1: /* Modus A*/
$zeit=6;
break;
2: /* Modus B*/
$zeit=3;
break;
3: /* Modus C*/
$zeit=9;
} 

if($_IPS['SENDER']!="TimerEvent"){
    SetValue(10438/*Variable Durchgelaufene Schritte*/, $countsX;
    IPS_SetScriptTimer($_IPS['self'],$zeit);
}else{
    SetValue(10438/*Variable Durchgelaufene Schritte*/,GetValue(10438/*Variable Durchgelaufene Schritte*/)-1);
    if(GetValue(10438/*Variable Durchgelaufene Schritte*/)==0){
        IPS_SetScriptTimer($_IPS['self'],0);
    }
        RequestAction(19275/*Variable Helligkeit*/, 100-100/$steps)
}

Es wäre schon gut, du würdest dich etwas mehr mit den PHP Basics auseinandersetzen.
Gerne helfe ich (und auch andere) bei IPS Problemen. Aber die Basics durchzukaufen wird mühsam.
Du hast bei dem SetValue countsx die schließende Klammer vergessen.
Und den Switch setzt du entweder in den 1. Teil des IFs (ausgelöst durch das Aktion Script) und kopierst das mit $_IPS[‚VALUE‘], oder du machst das so wie du angedeutet. Dann aber mit switch(GetValue(ID)){

Es wäre schon gut, du würdest dich etwas mehr mit den PHP Basics auseinandersetzen.

Das werde ich auch noch nachholen, aber das kann ich nicht auf die schnelle alles lernen (dieser Code wird aber dringend benötigt).

Gerne helfe ich (und auch andere) bei IPS Problemen. Aber die Basics durchzukaufen wird mühsam.

Dessen bin ich mir bewusst, ich bin dir auch hierfür unendlich Dankbar.

Du hast bei dem SetValue countsx die schließende Klammer vergessen.

Die Klammer muss mir beim kopieren entfallen sein…

Code nochmals angepasst, Fehler:

Parse error: syntax error, unexpected ‚1‘ (T_LNUMBER), expecting case (T_CASE) or default (T_DEFAULT) or ‚}‘ in /var/lib/symcon/scripts/17468.ips.php on line 5

<?php
$countsx=100;

switch(GetValue(51743/*Variable Modus*/)){
1: /*Modus A*/
$zeit=6;
break;
2: /*Modus B*/
$zeit=3;
break;
3: /*Modus C*/
$zeit=9;
} 

if($_IPS['SENDER']!="TimerEvent"){
    SetValue(10438/*Variable Durchgelaufene Schritte*/), $countsX;
    IPS_SetScriptTimer($_IPS['self'],$zeit);
}else{
    SetValue(10438/*Variable Durchgelaufene Schritte*/,GetValue(10438/*Variable Durchgelaufene Schritte*/)-1);
    if(GetValue(10438/*Variable Durchgelaufene Schritte*/)==0){
        IPS_SetScriptTimer($_IPS['self'],0);
    }
        RequestAction(19275/*Variable Helligkeit*/, 100-100/$steps)
}

Sorry. Ich habe offenbar einen Fehler beim Schreiben des Switch Anweisung demacht.
Da muss immer ein case 1: case 2: case 3: hin. Und ggf. noch ein break; auch ans Ende.

Vielen Dank für den Hinweis!

neuer Fehler:

Parse error: syntax error, unexpected ‚,‘ in /var/lib/symcon/scripts/17468.ips.php on line 17

<?php
$countsX=100;

switch(GetValue(51743/*Variable Modus*/)){
case 1: /*Modus A*/
$zeit=6;
break;
case 2: /*Modus B*/
$zeit=3;
break;
case 3: /*Modus C*/
$zeit=9;
break;
} 

if($_IPS['SENDER']!="TimerEvent"){
    SetValue(10438/*Variable Durchgelaufene Schritte*/),$countsX;
    IPS_SetScriptTimer($_IPS['self'],$zeit);
}else{
    SetValue(10438/*Variable Durchgelaufene Schritte*/,GetValue(10438/*Variable Durchgelaufene Schritte*/)-1);
    if(GetValue(10438/*Variable Durchgelaufene Schritte*/)==0){
        IPS_SetScriptTimer($_IPS['self'],0);
    }
        RequestAction(19275/*Variable Helligkeit*/, 100-100/$steps)
}

SetValue(10438/Variable Durchgelaufene Schritte/),$countsX;

Ersetzen durch

SetValue(10438/Variable Durchgelaufene Schritte/,$countsX);

Uli

Gesendet von iPhone mit Tapatalk

Schau in die Doku von SetValue. SetValue — IP-Symcon :: Automatisierungssoftware
Oder einfach mal einige Zeilen weiter oben.
Und bevor du dich in zwei Minuten mit dem nächsten simplen Fehler meldest, in der RequestAction Zeile fehlt das Semikolon am Ende.

Und sorry, ich habe noch einen kleinen Fehler gemacht. Es heißt $_IPS[‚SELF‘] mit großem SELF. Das bitte auch entsprechend anpassen.

Ich hatte wirklich gehofft, das alle simplen Fehler nun beseitigt wären, aber leider nein:

Notice: Undefined variable: zeit in /var/lib/symcon/scripts/17468.ips.php on line 18

<?php
$countsX=100;

switch(GetValue(51743/*Variable Modus*/)){
case 1: /*Modus A*/
$zeit=6;
break;
case 2: /*Modus B*/
$zeit=3;
break;
case 3: /*Modus C*/
$zeit=9;
break;
} 

if($_IPS['SENDER']!="TimerEvent"){
    SetValue(10438/*Variable Durchgelaufene Schritte*/,$countsX);
    IPS_SetScriptTimer($_IPS['SELF'],$zeit);
}else{
    SetValue(10438/*Variable Durchgelaufene Schritte*/,GetValue(10438/*Variable Durchgelaufene Schritte*/)-1);
    if(GetValue(10438/*Variable Durchgelaufene Schritte*/)==0){
        IPS_SetScriptTimer($_IPS['SELF'],0);
    }
        RequestAction(19275/*Variable Helligkeit*/, 100-100/$steps);
}

Dann trifft der case bei bei der switch Anweisung nicht zu…

Denn $zeit ist nur innerhalb der cases deklariert.

Uli

Gesendet von iPhone mit Tapatalk

Vielen Dank!
jetzt muss ich nur noch herausfinden was ich mit dem Hinweis anfangen kann.

Viele Grüße

Dein Wert trifft nicht zu…

Welcher Variablentyp ist das mit welchen Werten?

Uli

Gesendet von iPhone mit Tapatalk

Ich bin mir nicht sicher ob ich deine Frage richtig verstanden habe, aber der Variablentyp der Variable „Modus“ ist Integer mit folgenden Werten:
0 = aus
1 = Modus A
2 = Modus B und
3 = Modus C