Komfortables Dimmscript ?

Hallo Leute,

ich vermisse eine k o m f o r t a b l e Dimmfunktion für FS20DU Schalter, die ich aus der leider sehr begrenzten FHZ Standard ELV Software kenne.

Mit dieser war es möglich auf einen Taster den Befehl für „hochdimmen“ zu legen, der in der Praxis folgendermaßen funktionierte :

Taster wurde gedrückt, Licht dimmte sich langsam (ca. 1 sek. pro Stufe) hoch und wenn ich den selben Taste noch einmal drückte, blieb der das Licht auf der gerade erreichten Intensität stehen.
Genauso funktionierte es auch mit dem runterdimmen auf einem weiteren Taster, das war eine echt praktische Geschichte, da es dimmen und schalten in einem knopf vereint.

Hat jemand eine Skript Idee, wie ich das selber programmieren kann ?

Grüsse,

Nico

http://www.ipsymcon.de/wiki/index.php/FS20_SetIntensity

Hallo Steiner,

eventuell hab ich mich ein bißchen blöd ausgedrückt :

Ich suche ein skript mit dem ich die verschiedenen Stufen des Dimmers, sowie das anhalten des hochdimmens mit nur einem Knopf betätigen kann.

  1. Taster Drücken
  2. Licht dimmt sich langsam hoch (0…1…2…3…4…5…)
  3. Wenn die von mir gewünschte Stufe erreicht ist drücke ich den Taster nochmals und das Licht hält an genau dieser Stufe an.

Das selbe dann auf den zweiten knopf zum runterdimmen.

Hallo Nico,

das ist mit einigem Aufwand programmierbar. Das Problem besteht darin, dass man den
Befehl „FS20_SetIntensity“ nicht stoppen kann.
Am einfachsten ist es, wenn man mit der FB direkt dimmt.

MST

Man könnte ein script machen, dass immer eine Stufe höher fährt und nach einer ruhephase (1sec) sich selbst triggert und erst aufhört wenn eine Taste gedrückt wird. Ist aber heikel. Musst ne endabschaltung für oberen und unteren grenzwert einbauen, so dass es sich nie mehr als 10 mal, oder so, aufrufen kann. sonst haste dir ne Rechner-Bremse oder gar ne endlosschleife gebastelt.

Toni

Müsste doch ganz einfach sein - zumidest bei Fernbedienungen, die pro Taste mit einem Kanal belegt sind und togglen - und das sind alle bei mir :rolleyes:

Hab’ zwar keine Dimmer im Einsatz, benutze solche FUnktionen aber um mehrere Funktionen auf einen Taster der FB zu legen (kurz drücken -> Aktion 1, lang drücken -> Aktion2)

Also:

Skript, das auf Status UND Data eines Tasters reagiert

  • Auslesen, woher getriggert wurde ($IPS_Variable)
  • wenn durch taste.Status getriggert -> umschalten
  • wenn durch taste.Data getriggert hoch oder runterdimmen (in einer globalen variable festhalten, ob zuletzt rauf oder runtergedimmt wurde und entsprechend umkehren)

wodrauf man achten muss:

  1. Data wird (wenn man die Taste festhält) immer wieder getriggert (ca. 4 mal pro Sekunde), das muss man abfangen !!! Ich mache das so, dass ich mir wegschreibe, wann der letzte Trigger war und erst neue Aktionen triggere, wenn die Taste mal 3 Sekunden nicht gedrückt war - solange wird nur die „alte“ Aktion erlaubt)

  2. Bei 0 und 16 muss man die Grenzwerte beachten und entsprechend reagieren (also voll einschalten, oder voll aus)

Das sollte dann doch funktionieren.

Vielleicht bastel ich mir heute mal just for fun so ein Skript - dann habe ich wenigstens einen Grund, mir mal einen Dimmer zu kaufen :smiley:

Gruß

cAtMaX

Hier mal ein Script, dass vor einiger Zeit so ähnlich im Forum gefunden habe:

<?
/*


IP-SYMCON Event Scripting


File : FS20DI_manu2.ips.php
Trigger :
Interval :
Hoch-/Runterdimmen mit einer Taste der FB
*/
$bLichtAn = GetValueBoolean(„FS20S8_Taste4“) ;
$iData = GetValueInteger(„FS20S8_Taste4_Data“) ;
$bDimmRichtung = GetValueBoolean(„FS20S8_Taste4_Dimmrichtung“) ; // 0 = runter; 1 = hoch
$iIntensity = GetValueInteger(„FS20DI01.Intensity“) ;
$iLastUpdate = time() - IPS_GetUpdateTime(„FS20S8_Taste4_Dimmrichtung“);
IF (($bLichtAn == True) && ($iData == 19)) {
// setze Dimmrichtung
IF ($iLastUpdate > 1) {
IF ($bDimmRichtung == True) {
$bDimmRichtung = False ;
} Else {
$bDimmRichtung = True ;
}
}
}
IF (($bDimmRichtung == True) && ($iIntensity <16)) { // heller
$iIntensity = $iIntensity + 1;
}
IF (($bDimmRichtung == False) && ($iIntensity > 0)) { // dunkler
$iIntensity = $iIntensity - 1;
}
SetValueBoolean(„FS20S8_Taste4_Dimmrichtung“, $bDimmRichtung);
SetValueInteger(„FS20DI01.Intensity“, $iIntensity);
FS20_SetIntensity(58219, $iIntensity, -1);
?>

So, hab’ gerade mal ein Skript gebastelt, mit dem ich zumindest mein Testdevice einigermaßen komfortabel ein- und ausschalten und dimmen kann. Leider fehlt mir die Visualisierung, da ich keinen Dimmer habe :frowning:

Vielleicht macht sich ja jemand die Mühe, das/die Skripte mal zu testen ? [EDIT] Vorher Datensicherung machen g [/Edit]

Geht natürlich nur bei Fernbedienungen, die auf doppelter Kanalzahl stehen !!! Alle anderen können ja sowieso komfortabel dimmen :wink:

Also, erstmal das Hauptskript (s. Kommentare bzgl. anzulegende Variablen etc - Instance und andere Skriptnamen müssen natürlich angepasst werden !):


 /*
*******************************
IP-SYMCON Event Scripting
*******************************
Trigger: Taste7.Data, Taste7.Status
Voraussetzung: Taste7 fällt nicht nach langem drücken in den Programmiermodus !!

*/


/*
Benutzte Variablen:
Testdevice.Status
Testdevice.Intensity


Variablen, die noch angelegt werden müssen:

Testdevice.lastswitch - Integer
Testdevice.Dim.direction - String


zusätzliche Skripte:
Testdevice_ON
Testdevice_OFF
Testdevice_TOGGLE

*/
$zeit = time();
//Trigger des Skripts ausfindig machen
$trigger = "none";
if (isset($IPS_VARIABLE)) {
   $trigger = $IPS_VARIABLE;
}
echo "----- $trigger ----";
//Skript beenden, wenn durch sich selbst getriggert
if(GetValueBoolean("Taste7.Status") == false) {
   if ($trigger == "Taste7.Data") {
      if(GetValueInteger("Taste7.Data") == 18) {
         exit;
      }
   }
}
//Skript nur ausführen, wenn es nicht in der letzten 1/2 Sekunde gelaufen ist
//Damit kann man dann endlich mal zwischen data=18 und data=21 unterscheiden, ohne
//dass das skript permanent dazwischenfunkt ;-)
$lastrun = GetValueInteger("Testdevice.lastswitch");
$timediff = $zeit - $lastrun;
if ($timediff <= 0.5 ) {
   //Taste sofort wieder auf False stellen
   if(GetValueBoolean("Taste7.Status") == true) {
     SetValueBoolean("Taste7.Status",false);
   }
   exit;
}
//Wenn über kurz drücken getriggert
  if(GetValueBoolean("Taste7.Status") == true) {
      if (GetValueInteger("Taste7.Data") == 18) {
         //kurz gedrückt -> Ein/Ausschalten
         echo "Testdevice toggle";
         IPS_RunScript("Testdevice_TOGGLE");
      }
  }
//}
if ($trigger == "Taste7.Data") {
      if (GetValueInteger("Taste7.Data") == 21) {
         //Taste lang gedrück -> DIMMEN
         //Dimmrichtung des letzten dimmens auslesen
         //wenn Zeitabstand Skriptaufruf < 1 Sekunde, dann selbe Richtung dimmen
         $richtung = GetValueString("Testdevice.Dim.direction");
         if ($richtung == "up") {
            $dimwert = 1;
         } else {
            $dimwert = -1;
         }
         $alte_intensity = GetValueInteger("Testdevice.Intensity");
         if ($timediff <= 1 ) {
            //gleiche Richtung
            $neuer_dimwert = $alte_intensity + $dimwert;
            if ($neuer_dimwert > 16) {
               //Endposition erreicht
               $neuer_dimwert = 16;
            }
            if ($neuer_dimwert < 0) {
               //Endposition erreicht
               $neuer_dimwert = 0;
            }
            FS20_SetIntensity(38166,$neuer_dimwert,-1);
         } else {
            //andere Richtung
            $neuer_dimwert = $alte_intensity - $dimwert;
            FS20_SetIntensity(38166,$neuer_dimwert,-1);
            //richtungswechsel in die Variable schreiben
            if ($richtung == "up") {
               SetValueString("Testdevice.Dim.direction", "down");
            } else {
               SetValueString("Testdevice.Dim.direction", "up");
            }
         }

      }
}
//Taste wieder auf False setzen
SetValueInteger("Testdevice.lastswitch", $zeit);
SetValueBoolean("Taste7.Status",false);

Toggle-Skript:


/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Testdevice_TOGGLE.ips.php
Trigger  : 
Interval : 
*/
IPS_LogMessage("TestdeviceSkript","Testdevice TOGGLE");
if (GetValueBoolean("Testdevice.Status") == true) {
   IPS_RunScript("Testdevice_OFF");
} else {
   IPS_RunScript("Testdevice_ON");
}

und das OFF-Skript (ON schaltet genau andersrum und setzt die Intensity auf 16) :


IPS_LogMessage("TestdeviceSkript","Testdevice OFF");
FS20_SwitchMode(38166,false);

Hi,
ich denke hier könntest du finden was du suchst!

Gruß Hofi