Eieruhr im WebFront

Dieses Skript erstellt eine Variable, die dann als Eieruhr genutzt werden kann. Beim Drücken von + wird der Befehl aus der on-Funktion gestartet und zählt so lange runter, bis 0 erreicht wurde. Daraufhin wird die off-Funktion gestartet wird und die Eieruhr wechselt auf Aus. Während die Eieruhr läuft, kann diese per +/- adjustiert werden, ohne dass die on-Funktion erneut gestartet wird. Bei erreichen von 0 oder drücken der Aus-Taste, wird der Timer sofort deaktiviert und die off-Funktion ausgeführt.

Grüße,
paresy

PS: Wurde für die 2.4 entwickelt, sollte aber (ohne Farben) auch mit der 2.3 schon laufen.
PPS: Diese spezielle Darstellung wird im iFront nicht vollständig unterstützt, ist aber trotzdem nutzbar :slight_smile:


<?

 $max = 25;
 $step = 5; //Schrittgröße

 function on() {
   IPS_LogMessage("Eieruhr", "Aktiviert!");
 }
 function off() {
   IPS_LogMessage("Eieruhr", "Abgelaufen...");
 }

//Ab hier nichts mehr verändern
 $min = 0;
 $suffix = "min";
 $vpn = "EggTimer.".$max.".".$step;
 if($IPS_SENDER == "Execute")
 {
   if(IPS_VariableProfileExists($vpn))
		IPS_DeleteVariableProfile($vpn);
	IPS_CreateVariableProfile($vpn, 1);
	IPS_SetVariableProfileValues($vpn, $min, $max, 0);
	IPS_SetVariableProfileIcon($vpn, "Clock");
	IPS_SetVariableProfileAssociationEx($vpn, $min-2, "Aus", "", 0xFF0000);
	IPS_SetVariableProfileAssociationEx($vpn, $min-1, "-", "", -1);
	IPS_SetVariableProfileAssociationEx($vpn, $min, "%d ".$suffix, "", 0x00FF00);
	IPS_SetVariableProfileAssociationEx($vpn, $max+1, "+", "", -1);
   $vid = CreateParentVariable($IPS_SELF, "Timer", 1);
   IPS_SetVariableCustomProfile($vid, $vpn);
   IPS_SetVariableCustomAction($vid, $IPS_SELF);
   SetValue($vid, $min-2);
 }
 else if($IPS_SENDER == "WebFront")
 {
		switch($IPS_VALUE)
		{
		   case $min-2:
		      doOff();
		      break;
		   case $min-1:
		      $IPS_VALUE = GetValue($IPS_VARIABLE) - $step;
		      if($IPS_VALUE <= 0)
		      {
					$IPS_VALUE = -2;
					doOff();
		      }
		      break;
		   case $max+1:
		      $IPS_VALUE = min($max, max(0, GetValue($IPS_VARIABLE)) + $step);
	         doOn();
	         break;
			default:
				return;
		}
      SetValue($IPS_VARIABLE, $IPS_VALUE);
 }
 else if($IPS_SENDER == "TimerEvent")
 {
   $vid = CreateParentVariable($IPS_SELF, "Timer", 1);
	$v = GetValue($vid);
	$v--;
	if($v <= 0)
	{
	   doOff();
		IPS_SetScriptTimer($IPS_SELF, 0);
		$v = $min-2;
	}
	SetValue($vid, $v);
 }

function doOn()
{
   global $IPS_SELF;
	if(IPS_GetScriptTimer($IPS_SELF) == 0)
	{
		IPS_SetScriptTimer($IPS_SELF, 60);
		on();
	}
}

function doOff()
{
   global $IPS_SELF;
	IPS_SetScriptTimer($IPS_SELF, 0);
	off();
}

function CreateParentVariable($id, $name, $type)
{
    global $IPS_SELF;
    $vid = IPS_GetParent($IPS_SELF);
	 if(!IPS_VariableExists($vid))
	 {
		 $vid = false;
	 }
	 else
	 {
	   $v = IPS_GetVariable($vid);
	   if($v['VariableValue']['ValueType'] != $type)
	      $vid = false;
	 }
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, IPS_GetParent($IPS_SELF));
        IPS_SetParent($id, $vid);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
        IPS_SetHidden($id, true);
    }
    return $vid;
}

function IPS_SetVariableProfileAssociationEx($vpn, $av, $an, $ai, $ac)
{
	if(floatval(IPS_GetKernelVersion()) <= 2.3)
	{
		IPS_SetVariableProfileAssociation($vpn, $av, $an, $ai);
	} else {
		IPS_SetVariableProfileAssociation($vpn, $av, $an, $ai, $ac);
	}
}

?>

Bildschirmfoto 2011-05-15 um 19.49.39.png

Hallo,

Gibt es bei erreichen von 0 auch eine Soundausgabe (BingBong:D), habe im Script nichts gefunden.

…mit 2.3 funktioniert es!

Dankeschön:)

Gruß

Wieder ein WAF +1.

Danke paresy.

Irgendwie habe ich einen Denkfehler: Beim Aufruf „execute“ des Skripts, wird die Variable „timer“ immer in mein IPS root gelegt, das Skript kopiert sich unterhalb von timer (Soll es ja auch)

Sollte nicht eigentlich Timer unterhalb der Kategorie erstellt werden, aus der das Skript durch execute aufgerufen wird?

Hallo Ingo,
war bei mir auch so. Habe es dann aber rüberschieben können.

Ev. hast du den Effekt nur bei „execute“, weil es dann „angelegt“ wird, von Webfront getriggert, bleibt es.

Gruß Helmut

Hallo Helmut,

hHatte ich auch versucht, allerdings ging das nur mit einem timer/skript.
Sobald ich mehrere von diesen var/skript Kombinationen hatte, d.h. das Skript 3x laufen lassen habe und jedesmal die entstandene timer/skript Kombi wegkopiert habe gehts nicht mehr.

Sobald ich einen Timer aktiviere, haut es den kopierten Timer direkt auf 1636036 min…
Und bei jedem neu aktivieren des Timers durch das WF wird mein kopierter gelöscht und der ursprüngliche im root wieder neu erstellt. :frowning:

Probiers mal.

Ingo

Du hast 3 Eierkocher? :wink:

Verstehe nicht was du da vorschlägst…hast du das Script mehrfach kopiert?

Gruß Helmut

Ja, ich will eigentlich meine 3 Beregnungskreise der Gartenbewässerung manuell ansteuern.

D.h. durch +/- die Zeit von jedem Kreis einstellen -> doOn Funktion dann um das Öffnen des Ventils erweitern und dann runterzählen lassen bis doOff -> Ventilschliessen.

Dafür brauche ich dann 3 Eieruhren, für jeden Kreis eine.

Der Installer war etwas buggy und hat die Variable immer im Root (0) erstellt. Die neue Version erstellt sich korrekt am aktuellen Ort.

paresy

Hi,

super Tool …

ich habe noch folgendes ergänzt:


else if($IPS_SENDER == "TimerEvent")
 {
  .......
 }
else if($IPS_SENDER == "Variable")
 {
 if($IPS_OLDVALUE == -2)
  {
  doOn();
  }
 }

und das Skript zusätzlich auf die Variable getriggert …

so kann ich die Eieruhr durch setzen der Variable starten …

Grüße

Andreas

ziemlich cooles Teil.
Hab ich bei mir als Einschlaftimer für die Sonos eingebaut. Etwas modifiziert so dass das Teil beim-ins-Bett-legen durch einen enocean-Funkstuhlschalter (in der Matratze) getriggert mit 120 Minuten startet.
Allerdings scheint der Timer nicht über 23:59:59 zu kommen. Der Timer ist da heute Nacht mit 44 Restminuten stehen geblieben. Das Timer-Ereignis steht mit 23:59:59 deaktiviert im Objektbaum.

Hat jemand ne Idee wie man den Timer über den Datumswechsel bekommt?

Hallo miteinander

Bei mir wird das Tool Eieruhr im Keller benutzt damit der Kompressor nur maximal 15 Minuten läuft und dann selebr abstellt. Funktionierte bis zu 2.5 auch tadellos.
Ich habe als PHP dummie halt alle $IPS_* umzuschreiben versucht.
bei den function’s wird die Variable global gesetzt und genau da gibts nun error’s
Wie mus der Syntax hier denn sein?

alt:


function doOn()
{
   global $IPS_SELF;
    if(IPS_GetScriptTimer($IPS_SELF) == 0)
    {
        IPS_SetScriptTimer ($IPS_SELF, 60);
        on();
    }
}

neu:


function doOn()
{
   global $_IPS['SELF'];
    if(IPS_GetScriptTimer($_IPS['SELF']) == 0)
    {
        IPS_SetScriptTimer$_IPS['SELF'], 60);
        on();
    }
}

Ich hoffe ein PHP crack kann das beantworten.

thx
tschewie

Die global Zeile weglassen :wink:

Hallo Ralf

Hat funktioniert.:slight_smile:
Vielen Dank für die schnelle Hilfe.

gruss
tschewie

Hallo die Eieruhr ist echt super nur sobald ich die Max Zeit verändere oder sie Schrittweite hoch setze Passiert beim drücken von + garnim mehr, ich würde gerne max 120 und Schrittweite 30 machen.

Danke

Markus

Hallo Markus,

ich habe das Skript nochmal überprüft - es läuft ohne Probleme.
Bitte beachte, dass es bei jeder Änderung der Schrittgröße bzw. Maximalzeit einmal ‚per Hand‘ ausgeführt werden muss.
Nur so werden die Variablenprofile aktualisiert - ein Speichern reicht nicht aus.

MST

Meinst du das ich das Script einmal im editor manuel ausführen soll?

Danke

Markus

Genau :slight_smile:

paresy

ALles klar werde es testen

Danke

Super danke funktioniert.

Jetzt wollte ich mal noch fragen warum diese nicht in der Android App angezeigt wird?

Danke

Markus