Ferengi-Masters Wecker V1

Ferengi-Masters Wecker V1

Was kann der Wecker?

[ul]
[li]Verschiedene Weckerprofile anlegen.[/li][li]es werden automatisch leere Scripte für Schaltbefehle angelegt die zur Weck- bzw. Schlummerzeit gestartet werden[/li][li]Weckerbdienung fast zu 100% Touch- / Designerfähig.[/li][li]Schlummermodus (Wecker geht mehrmals nach gewünschter Zeit nochmal an)[/li][li]Wecker kann an Feiertagen automatisch aus gehen.[/li][li]Speichern und löschen von Weckereinstellungen.[/li][li]Per Befehl aus jedem beliebigen Script heraus den Wecker verändern/abfragen.[/li][/ul]

Installation:

Freigegeben für V1 (für IPS V2 http://www.ip-symcon.de/forum/f20/ferengi-masters-wecker-v2-7383/)

[ul]
[li]Tonis Tools installieren (für Feiertage).[/li][li]Nach dem Download den Ordner „wecker“ entpacken[/li][li]Eine Kopie des Scripts „variable_anlegen.ips.php“ im „scripts“ Verzeichnis ablegen.[/li][li]Eine Kopie des Scripts „wecker.ips.php“ im „scripts“ Verzeichnis ablegen.[/li][li]Alle Bilder in das „media“ Verzeichnis kopieren.[/li][li]Jetzt in IPS zwei gleichnamige Scripte anlegen. Dadurch werden die zuvor kopierten Scripte sichtbar.[/li][li]Eine Kopie des Scripts „wecker.bin“ im „forms“ Verzeichnis ablegen.[/li][li]Pfad zu den Bild-Dateien in dem Script „Variable_anlegen.ips.php“ anpassen![/li][li]Variable_anlegen.ips.php starten.[/li][li]In der Datei „wecker.ips.php“ Pfadnamen für die wecker.txt festlegen z.B. $filename = IPS_GetKernelDir()."/wecker.txt"; (wecker.txt wird später generiert)[/li][li]In der Datei „wecker.ips.php“ Zeit in Minuten eintragen wann Wecker nochmal melden soll - $schlummer_zeit = 5;[/li][li]Die Datei wecker.bin zusätzlich zum eigenen Designerprojekt öffnen (Punkt IP-Symcon Designer in der Konsole) und Wecker in eigenes TabSheet kopieren, mit Copy&Paste.[/li][li]Damit werden automatisch alle Einträge für den Designer vorgenommen.[/li][li]Die Grafiken sind für 800x600 Bildpunkte optimiert, können aber natürlich angepasst werden.;)[/li][li]Nun die Datei „wecker.ips.php“ starten.[/li][li]Im Designer Wecker anlegen und speichern. (im Edit Feld Enter drücken, sonst wird der Weckername nicht aktualisiert)[/li][li]in angelegten leeren Scripten (Name wie Wecker) eigene Befehle, Musik, Sprachausgabe einfügen[/li][/ul]

Syntax der Befehle:

Mit diesen zwei Befehlen kann der Wecker aus einem beliebigen Script heraus gesetzt oder abgefragt werden.

set_wecker(string: „Wecker Name,Tag,Stunde,Minute,bei Feiertag aus,Schlummermodus an/aus,Wecker an/aus“);

Beispiel:


 set_wecker("Thomas Wecker,Mittwoch,06,00,true,true,true");

Stunde und Minute mit führender Null.
Bei Fehlern in der Syntax wird eine IPS_LogMessage erzeugt.

get_wecker(string: „Wecker Name,Tag“);

Beispiel Ausgabe des aktuellen Wecker:


 $tag = (date("w")); //Tag ermitteln
 $tag_arr = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
 if(get_wecker("Thomas Wecker,$tag_arr[$tag]"))
 {
   print_r($wecker);
 }
 else
 {
   echo "Fehler";
 }

Ausgabe:


Array
(
    [0] => Thomas Wecker
    [1] => Sonntag
    [2] => 10
    [3] => 15
    [4] => true
    [5] => false
    [6] => true
)

Um diese Befehle in Eueren eigenen Scripten nutzen zu können sind folgende Funktionen bereitzustellen. (z.B. durch include):


 function set_wecker($wecker_fkt_1)
 {
   SetValueString("wecker_fkt", $wecker_fkt_1);
 }
 
 function get_wecker($wecker_fkt_2)
 {
   //Hier Ablageort für wecker.txt eintragen
   $filename = IPS_GetKernelDir()."Thomas/wecker.txt";
 
   global $wecker;
   $wecker_datensatz = explode(",", $wecker_fkt_2); // nach Komma trennen und in array
   $name = $wecker_datensatz[0];
   $tag  = $wecker_datensatz[1];
 
   $wecker_inh = file_get_contents($filename); //Wecker in Variable
   $wecker_datensatz = explode(",", $wecker_inh); // nach Komma trennen und in array
 
   $i=0;
   foreach($wecker_datensatz as $value)
   {
         if($value == $name and $tag == $wecker_datensatz[$i+1])
         {
            $wecker[0] = $wecker_datensatz[$i];
            $wecker[1] = $wecker_datensatz[$i+1];
            $wecker[2] = $wecker_datensatz[$i+2];
            $wecker[3] = $wecker_datensatz[$i+3];
            $wecker[4] = $wecker_datensatz[$i+4];
            $wecker[5] = $wecker_datensatz[$i+5];
            $wecker[6] = $wecker_datensatz[$i+6];
            if($wecker[4] == 1)
            {
               $wecker[4] = "true";
            }
            else
            {
               $wecker[4] = "false";
            }
            if($wecker[5] == 1)
            {
               $wecker[5] = "true";
            }
            else
            {
               $wecker[5] = "false";
            }
            if($wecker[6] == 1)
            {
               $wecker[6] = "true";
            }
            else
            {
               $wecker[6] = "false";
            }
            return $wecker;
         }
         $i=$i+1;
    }
    return false;
 }

Viel Spaß!

V1.01b vom 06.12.08

  • Variable_anlegen.ips.php, Prüfung ImagePool eingefügt
  • Bug anlegen erster Wecker beseitigt
    V1.1 vom 13.12.08
  • set_wecker Befehl hinzugefügt
  • get_wecker Befehl hinzugefügt
  • Bug Uhrzeit behoben
  • neue globale Variable „wecker_fkt“ notwendig (wird über Variable_anlegen.ips.php angelegt)
  • Event OnUpdate „wecker_fkt“ in Wecker.ips.php notwendig (wird über Variable_anlegen.ips.php angelegt)
    V1.2 vom 29.12.08
  • Bug Feiertag behoben
  • nur noch Angabe des Pfadnamen und der Schlummerzeit in Minuten im Weckerscript notwendig, sonst nichts mehr!
  • es werden jetzt automatisch zu jedem angelegten Wecker jeweils zwei leere Scripte angelegt (1x Wecker, 1x Schlummermodus)
  • in diese Scripte können eigene Befehle eingefügt werden, die zur Weck- oder Schlummermoduszeit ausgeführt werden

Downloads bist jetzt: 82
:slight_smile:

wecker_V1.2.zip (159 KB)

Hallo Thomas,

Klasse Sache! Über einen Wecker hab ich auch schon nachgedacht aber deine Lösung ist richtig gut.
Werd ich in nächster Zeit unbedingt bei mir ausprobieren.
Sollte für V1 und V2 funktionieren, oder?

Ciao
Andrge

P.s: Hast du nun ein Display am Bett? :slight_smile:

Hallo Andrge,

habe den Wecker nur unter V1 getestet. Sollte aber auch unter V2 gehen. Vieleicht kann das jemand mal testen, werde so schnell jetzt nicht dazu kommen.

P.s: Hast du nun ein Display am Bett? :slight_smile:

Nein aber im Flur vor dem Schlafzimmer.:wink:

Hallo Thomas,
habe Dein Weckerscript mal ausprobiert. Alles nach anleitung installiert.
Wenn ich das Weckersript ausführe bekomme ich folgende Fehlermeldung.

br />
<b>Warning</b>: file_get_contents(C:\Programme\IP-SYMCON/wecker.txt) [<a href=‚function.file-get-contents‘>function.file-get-contents</a>]: failed to open stream: No such file or directory in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>435</b><br />
<br />
<b>Notice</b>: Undefined offset: 1 in <b>C:\Programme\IP-SYMCON\scripts.currentscript</b> on line <b>374</b><br />

cu uwe

Hi Thomas,
ich hab’ das auch mal schnell getestet.

Das Variablen_anlegen-Script ist nicht V2 konform.
Hab das mal schnell in V1 getestet und habe die gleiche Fehlermeldungen wie Uwe erhalten.

Liegt wohl daran, dass die wecker.txt nicht vorhanden ist und wenn man sie anlegt, dann noch leer ist.

Wenn ein wenig mehr Zeit ist, werde ich den Wecker weiter in V2 testen.

Grüße,
Neon

OK. Das mag mal wieder daran liegen, das ich auf die Schnelle mein eigenes Script um einige Teile bereinigt hatte. Werde mir den Bug sofort anschauen.:wink:

So bitte nochmal probieren, er müßte jetzt beim ersten Start einen Dummy - Wecker erzeugen. Dieser kann, nachdem Ihr Eure eigenen Wecker angelegt habt, wieder gelöscht werden.

Hallo Thomas
Fehlermeldung ist jetzt weg, aber ich kann keine neuen Wecker anlegen.
Bei Meldungen erscheint immer „Wecker schon vorhanden“

cu uwe

Ich glaube Du hast den üblichen Fehler im Editfeld gemacht. Bitte Enter drücken zum übernehmen in die Variable. :wink:

Alles klar, meine Schuld.
Danke für den Wecker, tolles Teil.

cu uwe

Werde das mal mit in die Beschreibung einfügen.

Habe mir überlegt das es noch sinnvoll ist von anderen Scripten den Wecker an und auschalten zu können. Vieleicht über einen Befehl.

Könnte so aussehen:
wecker(„Weckername“ (String), Aktiv (Bool), Feiertag (Bool), Schlummermodus (Bool))

Werde mal was basteln.

So könnte man z.B. über eine FB, per XBee, IPSdog etc. den Wecker am Bett ändern.

V1.1 vom 13.12.08

  • set_wecker Befehl hinzugefügt
  • get_wecker Befehl hinzugefügt
  • Bug Uhrzeit behoben
  • neue globale Variable „wecker_fkt“ notwendig (wird über Variable_anlegen.ips.php angelegt)
  • Event OnUpdate „wecker_fkt“ in Wecker.ips.php notwendig (wird über Variable_anlegen.ips.php angelegt)

Hallo Thomas

Habe das Wecker Script mal mit V2 ausprobiert und bekomme langsam graue Haare, da ich gerade etwas auf dem Schlauch stehe.

Da die variable_anlegen.ips.php nicht mit V2 funktioniert (zumindestens bei mir nicht), habe ich alle notwendigen Variablen gemäss dem Script manuell angelegt.

So wie es aussieht läuft das Wecker Script soweit auch und ich kann über die Designeroberfläche neue Wecker, Zeiten usw. eintragen und abspeichern. Habe auch an den entsprechenden Stellen in Deinem Script auch ein auszuführendes Ereignis eingetragen, aber leider werden diese nicht ausgeführt.

Welche Stellen im Code muss ich eigentlich löschen wenn ich die Feiertagfunktionalität nicht benutzen möchte.

Habe mal das Script angehangen. Vielleicht hast Du mal Zeit kurz reinzuschauen und kannst mir auf die Sprünge helfen.

50292.ips.zip (3.92 KB)

Hallo Andy,

werde mir das heute Abend mal anschauen, keine Panik bekommen wir gelöst.:wink:

Habe in der Feiertagsfunktion über Weihnachten bemerkt, das da auch noch ein Bug ist. Der Wecker beleibt trotz Feiertag an, habe Fehler aber schon gefunden. Gibt die nächsten Tage ein Update.

Welche Stellen im Code muss ich eigentlich löschen wenn ich die Feiertagfunktionalität nicht benutzen möchte.

Das solltest Du auskommentieren:


  //bei Feiertag Weckker aus
      if($wecker_datensatz[$i+3] == 1)
      {
         feiertag();
         if($erg == 0)
         {
            return;
         }
      }


 function feiertag()
 {
   global $erg;
   //Feiertage
   $feiertag = array
   (
   "Ostersonntag",
   "Ostermontag",
   "Karfreitag",
   "Christi Himmelfahrt",
   "Pfingstsonntag",
   "Pfingstmontag",
   "Neujahr",
   "Tag der Arbeit",
   "Tag der deutschen Einheit",
   "Reformationstag",
   "Heiligabend",
   "1. Weihnachtsfeiertag",
   "2. Weihnachtsfeiertag",
   "Silvester"
   );

   foreach($feiertag as $value)
   {
      $feiert = explode(".", TT_Feiertage($value, (int)date("Y"))); // in array (tag.monat.jahr)
      //Timestamp von heute
      $heute      = mktime (0,0,0,date("m"),date("d"),date("y"));
      //Timestamp des Feiertages
      $termin_dat = mktime (0,0,0,(int)$feiert[1],(int)$feiert[0],date("y"));
      //schauen ob Termin auf heute($erg = 0)
      $diff       = $heute-$termin_dat;
      $erg        = $diff/((60*60)*24);
   }
   return $erg;
 }

Übrigens steht ja Tonis Tools V2 in den Startlöchern, da sollte die Feiertagsfunktion dann auch in der V2 gehen.

Hallo Thomas,

Du verwendest eine Funktion namens feiertag(), die einen Wert zurückliefert. Deswegen kann man die Funktion stellvertretend für einen Wert verwenden.

Der Aufruf kann also so lauten:

$wert = feiertag();
if ($wert == 0)
 {
  // mach irgendwas ...
 }

oder in diesem Falle auch kürzer:

if (!feiertag())	// der Wert 0 wird als FALSE interpretiert
 {
  // mach irgendwas ...
 }

Im ersten Fall ist die Funktion Teil einer Zuweisung. Im zweiten Fall steht sie direkt für den Wert.

Den von Dir gewählten Aufruf (ganz ohne Zuweisung) verwendet man üblicherweise nur für Prozeduren, also Funktionen, die keinen Wert zurückliefern.

Durch die o.g. Aufrufe ersparst Du Dir die Deklaration der Variablen $erg als global. Die seltsame Handhabung von Globalen Variablen in PHP widerspricht ohnehin allen Gepflogenheiten. In allen anderen Programmiersprachen werden sie völlig anders, aber ziemlich einheitlich gehandhabt. Aus diesem Grund vermeide ich sie in PHP nach Möglichkeit.

Wenn ein if() oder for() nur eine einzelne Anweisung enthält, kann man die geschweiften Klammern auch weglassen:

if (!feiertag()) return;

Solche Kleinigkeiten machen einen Code sehr schön lesbar. :slight_smile:

Gruß
HJH

Danke HJH.
Werde ich in Zukunft so handhaben, weil besser.:wink:

Mit dem u.a. Script könnt ihr die Wecker-Variablen in V2 anlegen - schneller als manuell :wink:
Die Grafiken einfach ins Media-Verzeichnis kopieren.

Grüße,
Neon


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Wecker_Variable_anlegen.ips.php
Trigger  : 
Interval : 
*/

$WeckerCat = IPS_GetCategoryIDByName("Wecker", 0);
if ($WeckerCat == Null){
  $integer_var = array(
  "schlummer_count",
  "schlummer_start_zeit",
  "wecker_name_counter",
  "wecker_tag_counter"
  );

  $string_var = array(
  "wecker_meldung",
  "wecker_minute",
  "wecker_name",
  "wecker_name_neu",
  "wecker_stunde",
  "wecker_tag"
  );

  $bool_var = array(
  "schlummer_erlaubt",
  "wecker_aktiv",
  "wecker_feiertag",
  "wecker_schlummer"
  );

  $WeckerCat = IPS_CreateCategory();  // Kategorie anlegen
  IPS_SetName($WeckerCat, "Wecker");  // Kategorie benennen
 
  // Integer Variablen anlegen
  $counter = count($integer_var); 
  for ($x=0; $x<=$counter-1; $x++) {
    $text            = $integer_var[$x];
    $integer_var[$x] = IPS_CreateVariable(1);
    IPS_SetName($integer_var[$x], $text);
    IPS_SetParent($integer_var[$x], $WeckerCat);
  }
 
  //String Variablen anlegen
  $counter = count($string_var); 
  for ($x=0; $x<=$counter-1; $x++) {
    $text           = $string_var[$x];
    $string_var[$x] = IPS_CreateVariable(3);
    IPS_SetName($string_var[$x], $text);
    IPS_SetParent($string_var[$x], $WeckerCat);
  }
 
  //Boolean Variablen anlegen
  $counter = count($bool_var); 
  for ($x=0; $x<=$counter-1; $x++) {
    $text         = $bool_var[$x];
    $bool_var[$x] = IPS_CreateVariable(0);
    IPS_SetName($bool_var[$x], $text);
    IPS_SetParent($bool_var[$x], $WeckerCat);
  }
}

?>

Hallo Neon,

hast Du den Wecker in der V2 am laufen? Habe es selber noch nicht getestet, weil V2 Migration bei mir noch ein wenig dauert.

Hallo Thomas

Feedback für Dich. Wecker Script läuft unter V2 nachdem ich die Feiertagsfunktion auskommentiert habe (brauche ich nicht).

Das automatisch generierende Script für V2 habe ich allerdings nicht ausprobiert, da ich ja alles händisch angelegt habe.