Ausschalttimer

Hallo Gemeinde,

ich versuche einen „Ausschalttimer“ für mein gesamtes Entertaintmentsystem zu schreiben.

Das ganze soll im Webfront angezeigt werden…mir schweben da so 3-4 Schaltflächen vor z.B.: 30 Minuten, 60 Minuten, 90 Minuten, 120 Minuten.

Nach abgelaufener Zeit, sollen alle Geräte sich abschalten.
(Diesen Teil bekomme ich gut hin, denke ich)

Luxus wäre noch eine „Uhr“, die abläuft bis alles abgeschaltet wird…

Mir geht es um den generellen Skript Aufbau, über Variablen den Timer anzusprechen…

Hat einer von Euch schonmal was in der Art umgesetzt, oder kann mir eine kleine Starthilfe geben ?

Liebe Grüße
Sascha

Such mal nach Eieruhr :slight_smile:

paresy

mach ich :slight_smile: Danke

uff…fast geschafft bis auf 2 Kleinigkeiten :slight_smile:

Ich bekomme meinen Homematic SteckdosenDimmer nicht aus
(hatte den bisher immer nur im Webfront über den Slider ausgemacht)

Und kein einziges Gerät von der Entertaintmentanlage geht aus…

Da ich hier aber etwas aus einem anderen Quelltext herauskopiert habe, denke ich, das hier der Fehler liegt…

Seht ihr was ?..hab leider bei PhP immer noch so einen kleinen grauen Star :frowning:

function off() {
   IPS_LogMessage("Eieruhr", "Abgelaufen...");
   PJ_DimRGBW(41853 /*[Mein Haus\Wohnzimmer\Licht\LED Flatscreen]*/,0,2,0,2,0,2,0,2); //das ist das einzige, was sich gerade ausschaltet
	SetValueFloat(43788 /*[Mein Haus\Wohnzimmer\Licht\Wandlampen\Dimmer]*/,0);
   
   if (GetValueBoolean(27858 /*[Mein Haus\Multimedia\Geräte\HTPC\HTPC Rechts\Power HTPC]*/) == TRUE)

	 {
	 IRT_SendOnce ($irtID,"htpc","poweroff");
	 IPS_Sleep (500);
	 IRT_SendOnce ($irtID,"htpc","poweroff");
	 SetValue(27858 /*[Mein Haus\Multimedia\Geräte\HTPC\HTPC Rechts\Power HTPC]*/,FALSE);     // HTPC AUS
	 IPS_Sleep (3500);
	 }

    if (GetValueBoolean(32565 /*[Mein Haus\Multimedia\Geräte\Topfield\Topfield 2\Power Topfield]*/) == TRUE)
   {
    IRT_SendOnce ($irtID,"topfield","on/off Toggle");
    SetValue(32565 /*[Mein Haus\Multimedia\Geräte\Topfield\Topfield 2\Power Topfield]*/,FALSE);  //Topfield AUS
   }



   if (GetValueBoolean(12908 /*[Mein Haus\Multimedia\Geräte\Samsung TV\TV Rechts\Power TV]*/) == TRUE)
   {
    IRT_SendOnce ($irtID,"samsungtv","on/off toggle");
    SetValue(12908 /*[Mein Haus\Multimedia\Geräte\Samsung TV\TV Rechts\Power TV]*/,FALSE);       // TV AUS
   }



   if (GetValueBoolean(22791 /*[Mein Haus\Multimedia\Geräte\Verstärker\AmpR\Power Verstärker]*/) == TRUE)

	 {
	 IRT_SendOnce ($irtID,"onkyo","on/off toggle");
	 SetValue(22791 /*[Mein Haus\Multimedia\Geräte\Verstärker\AmpR\Power Verstärker]*/,FALSE);     // Verstärker AUS
	 }
	 
 }

ich kann gar keinen HM-Schaltbefehl erkennen. Darüber würden sich die HM-Aktoren sehr freuen :smiley:


HM_WriteValueBoolean($k_ss02, "STATE", true);

oops :slight_smile: ok…aber is ein HM Dimmer…gleicher Befehl ?

das kann ich dir nicht sagen, ich hab nur schalter :wink: aber die STRG+Leertaste kann da helfen

ok…ich probier das mal :slight_smile:

und die IF Abfrage ? für meine Stereoanlage geht im moment gar nichts aus…denke, mir fehlt da ein bisschen etwas, um die IF abfrage zum funktionieren zu bringen…

also damit bekomme ich den Dimmer schonmal nicht aus :frowning:

HM_WriteValueFloat(43788 /*[Mein Haus\Wohnzimmer\Licht\Wandlampen\Dimmer]*/,0);

Versuchs mal

HM_WriteValueBoolean(43788 /*[Mein Haus\Wohnzimmer\Licht\Wandlampen\Dimmer]*/, "STATE", false);  

so

nein, leider auch nicht :frowning:

hab in der Doku was gefunden :

HM_WriteValueFloat(43788 /*[Mein Haus\Wohnzimmer\Licht\Wandlampen\Dimmer]*/, "LEVEL", 0); // Wandlampen aus

ging aber auch nicht…die frage ist jetzt noch, welche Variable ich angeben muß ? ich hab unter dem HM dimmer ja 5-6 Variablen, die damals erstellt worden sind.

Momentan arbeite ich auf der Variablen „Dimmer“…es gibt aber auch zum Beispiel noch „working“ und diverse „error“ Variablen…

Aber danke schonmal fürs Fehler suchen helfen :slight_smile:

Nicht auf die Variablen anwenden sondern auf den Aktor selbst.

Probier mal

HM_WriteValueFloat(xxxxx, "LEVEL", 0.00)

Nicht auf die Variablen anwenden sondern auf den Aktor selbst.


Gruß
Werner

Das war die Lösung :slight_smile:

Jetzt nochmal mein ganzes Skript :

Einziger Fehler jetzt ist, nichts von der Stereoanlage wird ausgeschaltet…also nichts, was in der IF Abfrage steht…
(Aber da nur teilweise kopiert, fehlt mir wohl etwas für die IF Abfrage :frowning:

<?

 $max = 180;
 $step = 1; //Schrittgröße

 function on() {
   IPS_LogMessage("Eieruhr", "Aktiviert!");
 }
 function off() {
   IPS_LogMessage("Eieruhr", "Abgelaufen...");
   PJ_DimRGBW(41853 /*[Mein Haus\Wohnzimmer\Licht\LED Flatscreen]*/,0,2,0,2,0,2,0,2);
	HM_WriteValueFloat(58363 /*[Mein Haus\Wohnzimmer\Licht\Wandlampen]*/, "LEVEL", 0); // Wandlampen aus
	//HM_WriteValueBoolean(43788 /*[Mein Haus\Wohnzimmer\Licht\Wandlampen\Dimmer]*/, "STATE", false);
   
   if (GetValueBoolean(27858 /*[Mein Haus\Multimedia\Geräte\HTPC\HTPC Rechts\Power HTPC]*/) == TRUE)

	 {
	 IRT_SendOnce ($irtID,"htpc","poweroff");
	 IPS_Sleep (500);
	 IRT_SendOnce ($irtID,"htpc","poweroff");
	 SetValue(27858 /*[Mein Haus\Multimedia\Geräte\HTPC\HTPC Rechts\Power HTPC]*/,FALSE);     // HTPC AUS
	 IPS_Sleep (3500);
	 }

    if (GetValueBoolean(32565 /*[Mein Haus\Multimedia\Geräte\Topfield\Topfield 2\Power Topfield]*/) == TRUE)
   {
    IRT_SendOnce ($irtID,"topfield","on/off Toggle");
    SetValue(32565 /*[Mein Haus\Multimedia\Geräte\Topfield\Topfield 2\Power Topfield]*/,FALSE);  //Topfield AUS
   }



   if (GetValueBoolean(12908 /*[Mein Haus\Multimedia\Geräte\Samsung TV\TV Rechts\Power TV]*/) == TRUE)
   {
    IRT_SendOnce ($irtID,"samsungtv","on/off toggle");
    SetValue(12908 /*[Mein Haus\Multimedia\Geräte\Samsung TV\TV Rechts\Power TV]*/,FALSE);       // TV AUS
   }



   if (GetValueBoolean(22791 /*[Mein Haus\Multimedia\Geräte\Verstärker\AmpR\Power Verstärker]*/) == TRUE)

	 {
	 IRT_SendOnce ($irtID,"onkyo","on/off toggle");
	 SetValue(22791 /*[Mein Haus\Multimedia\Geräte\Verstärker\AmpR\Power Verstärker]*/,FALSE);     // Verstärker AUS
	 }
	 
 }

//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);
    }
}

?>

sorry, das ich nochmal nachfrage…aber hat noch jemand von euch eine idee,
warum die ganzen IF´s im oberen teil des skripts nicht behandelt werden ?

Lieben Dank
Sascha

Zeig uns doch mal einen Screenshot der Console mit den ensprechenden Variablen, z.B. die HTPC-Power

Hallo Werner,

diesen teil des Scripts habe ich aus einem anderen von mir kopiert…in dem anderen funktioniert es auch…nur eben gibt es da „cases“ , die die IF abfragen machen…

ich zeig dir hier mal das originalskript etwas ausgedünnt wegen der übersichtlichkeit…

ich sehe auch gerade, das da am ende immer noch ein „break“ steht…das versuche ich gerade mal noch…

Alles, was nach „case 4“ in diesem script kommt, möchte ich in meiner eieruhr ausführen, wenn der timer abgelaufen ist…

switch($IPS_VALUE) //Saugeile Methode (Made by RNW)
{
    case 0: // Alle Geräte, die zum Fernsehen nötig sind, einschalten


    if (GetValueBoolean(32565 /*[Mein Haus\Multimedia\Geräte\Topfield\Topfield 2\Power Topfield]*/) == FALSE)
   {
    IRT_SendOnce ($irtID,"topfield","on/off Toggle");
    SetValue(32565 /*[Mein Haus\Multimedia\Geräte\Topfield\Topfield 2\Power Topfield]*/,TRUE);  //Topfield AN
   }


   if (GetValueBoolean(12908 /*[Mein Haus\Multimedia\Geräte\Samsung TV\TV Rechts\Power TV]*/) == FALSE)
   {
    IRT_SendOnce ($irtID,"samsungtv","on/off toggle");
    SetValue(12908 /*[Mein Haus\Multimedia\Geräte\Samsung TV\TV Rechts\Power TV]*/,TRUE);       // TV AN
   }

   if (GetValueBoolean(22791 /*[Mein Haus\Multimedia\Geräte\Verstärker\AmpR\Power Verstärker]*/) == FALSE)

	 {
	 IRT_SendOnce ($irtID,"onkyo","on/off toggle");
	 SetValue(22791 /*[Mein Haus\Multimedia\Geräte\Verstärker\AmpR\Power Verstärker]*/,TRUE);     // Verstärker AN
	 }

	if (GetValueInteger(44260 /*[Mein Haus\Multimedia\Geräte\Verstärker\AmpR\Eingänge]*/) == 1)

	{
	 // Hol mir ein Bier
	}

	else
	{
	IPS_Sleep (3000);
   IRT_SendOnce($irtID,"onkyo","topfield");   // Eingang umschalten falls nötig
   SetValueInteger(44260 /*[Mein Haus\Multimedia\Geräte\Verstärker\AmpR\Eingänge]*/,1); // Den Eingang auch in der VISU umschalten
   }


   if (GetValueInteger(59564 /*[Mein Haus\Multimedia\Geräte\Samsung TV\TV Rechts\Eingänge]*/) == 1)

   {
	 // och, eins würd ich noch nehmen....
   }

   else
   {
   IPS_Sleep (6000); // Fernseher muß erst ein wenig an sein, bevor ich den Eingang umschalten kann
   IRT_SendOnce($irtID,"samsungtv","topfield");  //Eingang umschalten
   SetValueInteger(59564 /*[Mein Haus\Multimedia\Geräte\Samsung TV\TV Rechts\Eingänge]*/,1);
   }
   WFC_SwitchPage ( 28869 /*[WebFront Configurator]*/, "item3548");
   break;

//usw.......bis "case 3"



    case 4: // Alles aus
    
    //$box_mac = "00:04:20:22:69:31";
    
    //CSCK_SendText(41329 /*[Squeezboxserver]*/, $box_mac.' power 0'.chr(13));
    //SetValue(50001 /*[Mein Haus\Multimedia\Geräte\Squeezebox Touch\Touch Rechts\Power]*/,FALSE);
    
    //HM_WriteValueBoolean(53339 /*[Mein Haus\Studio\HQI-Lampe]*/,"STATE",false);
    
    if (GetValueBoolean(27858 /*[Mein Haus\Multimedia\Geräte\HTPC\HTPC Rechts\Power HTPC]*/) == TRUE)

	 {
	 IRT_SendOnce ($irtID,"htpc","poweroff");
	 IPS_Sleep (500);
	 IRT_SendOnce ($irtID,"htpc","poweroff");
	 SetValue(27858 /*[Mein Haus\Multimedia\Geräte\HTPC\HTPC Rechts\Power HTPC]*/,FALSE);     // HTPC AUS
	 IPS_Sleep (3500);
	 }

    if (GetValueBoolean(32565 /*[Mein Haus\Multimedia\Geräte\Topfield\Topfield 2\Power Topfield]*/) == TRUE)
   {
    IRT_SendOnce ($irtID,"topfield","on/off Toggle");
    SetValue(32565 /*[Mein Haus\Multimedia\Geräte\Topfield\Topfield 2\Power Topfield]*/,FALSE);  //Topfield AUS
   }



   if (GetValueBoolean(12908 /*[Mein Haus\Multimedia\Geräte\Samsung TV\TV Rechts\Power TV]*/) == TRUE)
   {
    IRT_SendOnce ($irtID,"samsungtv","on/off toggle");
    SetValue(12908 /*[Mein Haus\Multimedia\Geräte\Samsung TV\TV Rechts\Power TV]*/,FALSE);       // TV AUS
   }



   if (GetValueBoolean(22791 /*[Mein Haus\Multimedia\Geräte\Verstärker\AmpR\Power Verstärker]*/) == TRUE)

	 {
	 IRT_SendOnce ($irtID,"onkyo","on/off toggle");
	 SetValue(22791 /*[Mein Haus\Multimedia\Geräte\Verstärker\AmpR\Power Verstärker]*/,FALSE);     // Verstärker AUS
	 }



	


   break;
}

?>

Die breaks benötigst Du nicht da diese zum case gehört und nicht zu den if-Anweisungen.

Wenn deine if-Anweisung hier funktionieren und der Status der Variable auch wirklich true ist dann sollte das Eieruhr-Skript diese Bedingung auch ausführen.

Wenn ich es richtig verstehe dann wird Dir beim Ablaufen der Eieruhr die Meldung ausgegeben und die Lampe ausgeschaltet nur die Aktionen in zwischen if funktionieren nicht.

Was ich gerade sehe…

ist den „$irtID“ irgendwo im Skript definiert???

Wenn ich es richtig verstehe dann wird Dir beim Ablaufen der Eieruhr die Meldung ausgegeben und die Lampe ausgeschaltet nur die Aktionen in zwischen if funktionieren nicht.

Ja, ganz genau so ist es…die einzeiler vor den IFs werden ausgeführt…

und…ähhhhh…zu deiner 2. Antwort…MIST !!! natürlich NICHT :frowning:

DAS habe ich quasi nicht aus dem anderen script kopiert…klar findet er in dem neuen script dann nichts mehr :frowning:

An welcher stelle des scripts müßte ich denn jetzt die definantionen schreiben ? ganz oben, oder kurz vor den IF abfragen ?