Impressum Startseite Grund Installation Grundlagen Hilfreiches Projekte Querschläger Meckerecke

Projekt: Ein simpler Terminplaner auf dem Raspberry Pi

Schön wenn man einen Kalender hat, wo man zukünfitge Termine eintragen kann. Leider ist es ja so das nicht immer alles irgendwie kompatibel ist; Kalender lassen sich nicht Synchronisieren, oder man muss irgendwo erst mal einen Account anlegen, damit die eigenen Daten in eine Cloud hochgeladen werden...

Irgendwann hatte ich die Idee einen Terminplaner zu programmieren, der über das Internet über jedes Gerät "programmierbar" ist und der mich per email und SMS an einen Termin erinnert. Also Geräte unabhängig unabhängig von diesen seltsamen "Clouds"....

Nach kurzer Entwicklungzeit kann diese beiden PHP Dateien dabei, die genau das ermöglichen. Die können eigentlich auch auf irgendeinen Webspace liegen, es ist nur erforderlich das die Datei index+.php einmal pro Minute aufgerufen wird. Aber wenn man schon mal einen Raspberry Pi am laufen hat, kann man ihn auch damit etwas beschäftigen.

Diese Datei index+.php wird durch einen Cronjob jede Minute einmal aufgerufen und prüft ob es einen gültigen Termin gibt, wenn ja, wird der Termin entweder in den Ordner "Termine_Erledig" verschoben (gelöscht) oder verbleibt im Termin Ordner wenn es ein Variabler wiederkehrender Termin ist. Weiterhin wird von hier eine email versendet - wenn man jetzt noch einen praktischen email Anbieter hat, z.b. GMX, an den das ganze geschickt wird, kann man dort einen Filter aktivieren und so auf bestimmte Absender und bestimmte Wörter im Betreff sich eine SMS schicken lassen. 15 SMS pro Monat sind frei, für den Terminplaner völlig ausreichend.

Bitte die ROT gedruckten Texte bearbeiten (IP, Passwort, Email Adressen).

Es müssen folgende Ordner angelegt werden: "Termine" und "Termine_Erledigt", beide mit Schreib und Leserechten (sudo chmod 0777 /var/www/Termine under sudo chmod 0777 /var/www/Termine_Erledigt )

Datei: /var/www/index+.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Termin Reminder Check</title>
</head>

<body>
<?php

// Terminerinnerungtool auf PHP Basis

//Ordner wo die Termine drin liegen
$TerminDir="Termine";
date_default_timezone_set('Europe/Berlin');
$datum=date("Y-m-d");$uhrzeit=date("H_i");

do {
$termingefunden=0;$delete="0";

//Check Datum + Uhrzeit Genau
if($termingefunden==0) { $datum=date("Y-m-d");
$filename=$TerminDir."/".$datum."_um_".$uhrzeit."_Uhr.txt";
if (file_exists($filename)) {$termingefunden=1; $delete="1"; }}

//Check Jahr egal + Uhrzeit Genau
if($termingefunden==0) {$datum="XXXX-".date("m-d");
$filename=$TerminDir."/".$datum."_um_".$uhrzeit."_Uhr.txt";
if (file_exists($filename)) {$termingefunden=1; }}

//Check Monat egal + Uhrzeit Genau
if($termingefunden==0) {$datum=date("Y")."-XX-".date("d");
$filename=$TerminDir."/".$datum."_um_".$uhrzeit."_Uhr.txt";
if (file_exists($filename)) {$termingefunden=1; }}

//Check Tag egal + Uhrzeit Genau
if($termingefunden==0) {$datum=date("Y-m")."-XX";
$filename=$TerminDir."/".$datum."_um_".$uhrzeit."_Uhr.txt";
if (file_exists($filename)) {$termingefunden=1; }}

//Check Tag egal + Monat egal + Uhrzeit Genau
if($termingefunden==0) {$datum=date("Y")."-XX-XX";
$filename=$TerminDir."/".$datum."_um_".$uhrzeit."_Uhr.txt";
if (file_exists($filename)) {$termingefunden=1; }}

//Check Tag egal + Monat egal + Jahr egal + Uhrzeit Genau
if($termingefunden==0) {$datum="XXXX-XX-XX";
$filename=$TerminDir."/".$datum."_um_".$uhrzeit."_Uhr.txt";
if (file_exists($filename)) {$termingefunden=1; }}

//Check Tag egal + Jahr egal + Uhrzeit Genau
if($termingefunden==0) {$datum="XXXX-".date("m")."-XX";
$filename=$TerminDir."/".$datum."_um_".$uhrzeit."_Uhr.txt";
if (file_exists($filename)) {$termingefunden=1; }}

//Check Monat egal + Jahr egal + Uhrzeit Genau
if($termingefunden==0) {$datum="XXXX-XX-".date("d");
$filename=$TerminDir."/".$datum."_um_".$uhrzeit."_Uhr.txt";
if (file_exists($filename)) {$termingefunden=1; }}

 

if($termingefunden==1) {
// Einlesen des Termins
$inhalt=file_get_contents($filename);
$betreffpos=strpos($inhalt,"|#1|",0);
$textpos=strpos($inhalt,"|#2|",0);
$emailpos=strpos($inhalt,"|#3|",0);
$todopos=strpos($inhalt,"|#4|",0);
$endepos=strpos($inhalt,"|#5|",0);

$betreff=substr($inhalt,$betreffpos+4,($textpos-($betreffpos+4)));
$text=substr($inhalt,$textpos+4,($emailpos-($textpos+4)));
$email=substr($inhalt,$emailpos+4,($todopos-($emailpos+4)));
$todo=substr($inhalt,$todopos+4,($endepos-($todopos+4)));

//email versenden
$empfaenger = $email;
$betreff = $betreff;
$nachricht = $text;

$optheader[] = "From: Termin-Erinnerung <A.Teichmann@NOSPAMgmx.net>";
$optheader[] = "Reply-To: Axel Teichmann <A.Teichmann@NOSPAMgmx.net>";
$header = implode("\n", $optheader);
$extheader = "-fA.Teichmann@NOSPAMgmx.net";

mail($empfaenger, $betreff, $nachricht, $header, $extheader);



if ($delete=="0") {
// todo ausführen (Datum wann es gelöscht werden soll), nur bei Variablen Terminen
if ($todo!=="-") {
$ay=date("Y"); $am=date("m"); $ad=date("d");$ty=substr($todo,0,4); $tm=substr($todo,5,2); $td=substr($todo,8,2);
if ($ay>=$ty && $am>=$tm && $ad>=$td) { $delete="1"; }
if ($delete="1") { rename($filename, $filename.".BAK"); }
}

}
if ($todo=="-") { $delete="1";}

// Fixtermin , einmalig, nach versand der email löschen
if ($delete=="1") {
$filenameNEU=str_replace("Termine/","Termine_Erledigt/",$filename);
if (file_exists($filenameNEU)) {$filenameNEU=$filenameNEU."".date("H-i-s"); }
copy($filename, $filenameNEU);
unlink($filename);
}

}

} while($termingefunden==1);

// Datei wieder zurück umbennennen
$BAK=glob($TerminDir."/*.BAK"); $anzahl=count($BAK);$x=0;
if ($anzahl!==0) {
do {
$len=strlen($BAK[$x]); $filename=substr($BAK[$x],0,$len-4);
rename($BAK[$x], $filename);
$x=$x+1;} while($x<$anzahl);}

?>
</body>
</html>

Damit auch Termine existieren, auf die die index+.php reagieren kann, müssen auch Termine erstellt werden, dafür ist die Datei index.php da.

Wenn diese Datei aufgerufen wird kommt eine simple Maske zum Vorschein, in der man einen Termin eintragen kann. Das Datum kann durch "XX" Platzhalter variert werden. Die Versandemail Adresse und der Betreff der Email stehen auch frei, sowie der eigentliche Text der email.

Durch das Feld "Code" kann man das einstellen neuer Termine etwas schützen, so das nur Leute mit demn Code neue Termine einstellen können.

Wenn ein Termin eingestellt wurde bekommt man als Bestätigung eine Email zugeschickt.

Datei: /var/www/index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Termin Reminder</title>
<style type="text/css">
body,td,th {
font-size: 10px;
color: #000;
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
}
.fourteen {
font-size: 14px;
}
</style>
</head>

<body>
<?php

$ip=$_SERVER['REMOTE_ADDR'];
date_default_timezone_set('Europe/Berlin');
$TerminDir="Termine";
//Wurde Termin übermittelt, dann Termin Eintrag erstellen.
if(isset($_POST['abschickend'])) {
$datum= strtoupper($_POST[datum]);
$uhrzeit=$_POST[uhrzeit];
$todo=$_POST[todo];
$betreff=$_POST[betreff];
$txxt=$_POST[txxt];
$email=$_POST[email];
$test=$_POST[test];

if ($ip!=="192.168.0.2") { if ($test!=="passwort") {echo '<b>*** Fehler bei Authentifizierung<br>Termin wurde nicht übernommen</b>'; exit;}}

$checkX=strpos($datum,"X");if ($checkX==true) {$todo="-"; }

$txxt=$txxt."\n\nNeuer Termin: http://192.168.0.2/index.php\n";

// Überprüfen ob Datum in der Vergangenheit liegt
$checkX=strpos($datum,"X");if ($checkX=FALSE) {
list($tag, $monat, $jahr) = explode(".", $datum);
if (mktime(0, 0 ,0, $monat, $tag, $jahr) < time()) {echo "<b>*** Fehler: Datum liegt in der Vergangenheit.</b>"; exit; }
}

//Zerlegen des Datums für neue Reihenfolge
$ry=substr($datum,6,4);$rm=substr($datum,3,2);$rd=substr($datum,0,2);

//Überprüfen ob in Todo ein Minus oder Datum vorhanden ist
$todol=strlen($todo);
if ($todol>1 && $todol<10) {$todo="-";}
if ($todol>10) {$todo="-";}

// Überprüfen ob Datum in der Vergangenheit liegt
if($todo!=="-") {
$ty=substr($todo,6,4);$tm=substr($todo,3,2);$td=substr($todo,0,2);
$todo=$ty."-".$tm."-".$td;

}

$uhrzeit=str_replace(":","_",$uhrzeit);
$filename=$TerminDir."/".$ry."-".$rm."-".$rd."_um_".$uhrzeit."_Uhr.txt";
$inhalt="|#1|".$betreff."|#2|".$txxt."|#3|".$email."|#4|".$todo."|#5|";

if (!file_exists($filename)) {
$logdatei =fopen($filename,"w+");
fwrite($logdatei, $inhalt);
fclose($logdatei);
} else {echo "ERROR: Termin existiert schon";exit; }

echo "<b>*** Termin wurde erfolgreich eingetragen</b>";

$aktion="Betreff:\n".$betreff."\n\nText:\n".$txxt."\n\nemail:\n".$email;
$from="Terminplaner <A.Teichmann@NOSPAMgmx.net>";
$betreffzeile="Termin Buchung: ".$ry."-".$rm."-".$rd."_um_".$uhrzeit."_Uhr" ;
include("SendeEmail.php");
exit;
}

$email="A.Teichmann@NOSPAMgmx.net";

// Datum vom nächsten Tag
$datum=date("d.m.Y");
list($tag,$monat,$jahr)=explode('.',$datum);
$timestamp = mktime(0,0,0,$monat,$tag+1,$jahr);
$datumZukunft=date('d.m.Y',$timestamp);

// Uhrzeit 10 Minuten später
$uhrz=date("H:i");
list($stunde,$minute)=explode(':',$uhrz);
$timestamp = mktime($stunde,$minute+10,0,0,0);
$UhrzeitZukunft=date('H:i',$timestamp);


$todo="-";
$uhrzeit=date("H:i");

?>
<form action="index.php" method="post">
<table width="600" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="left" valign="top" bgcolor="#99CC66"><strong class="fourteen">INTERNET TERMIN PLANER - Zusendung des Termins per email</strong></td>
</tr>
<tr>
<td>
<table width="600" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="131" align="left" valign="middle" bgcolor="#99FF66">Am: <input name="datum" type="text" id="datum" value="<?php echo $datum; ?>" size="15" maxlength="10" /></td>
<td width="170" align="left" valign="middle" bgcolor="#99FF66">Um:
<input name="uhrzeit" type="text" id="uhrzeit" value="<?php echo $UhrzeitZukunft; ?>" size="6" maxlength="5" />
Uhr</td>
<td width="299" align="right" valign="middle" bgcolor="#99FF66"> Gültig bis:
<input name="todo" type="text" id="todo" value="<?php echo $todo; ?>" size="10" maxlength="10" />
z.b. <?php echo $datumZukunft; ?></td>
</tr>
</table></td>
</tr>
<tr>
<td bgcolor="#99FF33">
<br />
Betreff: <input name="betreff" type="text" id="betreff" value="Termin!" size="60" maxlength="256" />
<br />
<textarea name="txxt" cols="80" rows="10" id="txxt">Text
</textarea>
<br />
eMail:<input name="email" type="text" id="email" value="<?php echo $email; ?>" size="40" maxlength="250" />
Code:<?php if ($ip!=="192.168.0.2") {echo '<input name="test" type="text" id="test" size="20" maxlength="20" />';} ?>
<input type="submit" name="abschickend" value="Termin Eintragen" style="width:124px" />
</td>
</tr>
<tr>
<td><br /><table width="600" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="53" align="left" valign="top"><strong>Datum</strong>:</td>
<td width="547" align="left" valign="top"> Eingaben durch XX ersetzen. z.b. 16.06.XXXX , erzeugt einen Termin jedes Jahr am 16.06.<br /><strong>XX</strong>.06.2014 oder 14.<strong>XX</strong>.2014 oder 14.06.<strong>XXXX</strong> sind möglich.<br /></td>
</tr>
<tr>
<td align="left" valign="top"><strong>Gültig bis</strong>:</td>
<td align="left" valign="top"> Fix Datum eingeben, an dem ein <strong>Variabler Termin</strong>(XX) endgültig gelöscht wird. Ohne Eingabe bleibt der Variable Termin für immer bestehen.</td>
</tr>
<tr>
<td align="left" valign="top"><strong>eMail:</strong></td>
<td align="left" valign="top">Bei Versendung an mehreren Empfängern, die email Adressen durch komma trennen.</td>
</tr>
<tr><td align="left" valign="top">
<?php if ($ip!=="192.168.0.2") { echo '<strong>Code:</strong></td>
<td align="left" valign="top"> Authorisierungscode für die Termin Eintragung';} ?> </td></tr>
</table></td>
</tr>
</table>
</form>
<p>&nbsp;</p>
</body>
</html>

Der Crontab wird erstmal aufgerufen:

Sudo crontab -e

und auch eingerichtet:

* * * * * /usr/bin/curl 192.168.0.2/index+.php >/dev/null 2>&1

So wird jede Minute einmal das PHP Script index+.php aufgerufen und der Ordner "Termine" wird auf gültige Termine hin untersucht. Sollte in Termin gefunden werden wird eine Email verschickt und der Termin in den Ordner "Termine_Erledig" verschoben.

Das ganze läuft hier schon länger sehr stabil und sehr Zuverlässig.

OPTIONAL:

Zwischenzeitlich hatte ich auch mal eine Version in BASH Programmiert, die das file index+php nur aufruft wenn wirklich ein Termin anliegt. In Bash sieht das dann so aus:

Das entlastet des "PI" etwas, aber notwendig ist es nicht.

#!/bin/sh

#Termin Abfrage
termine="/var/www/Termine/"
y=$(date +%Y)
M=$(date +%m)
d=$(date +%d)
h=$(date +%H)
m=$(date +%M)
datum0=$termine$y"-"$M"-"$d"_um_"$h"_"$m"_Uhr.txt"
datum1=$termine"XXXX-"$M"-"$d"_um_"$h"_"$m"_Uhr.txt"
datum2=$termine"XXXX-XX-"$d"_um_"$h"_"$m"_Uhr.txt"
datum3=$termine"XXXX-XX-XX_um_"$h"_"$m"_Uhr.txt"
datum4=$termine$y"-XX-XX_um_"$h"_"$m"_Uhr.txt"
datum5=$termine$y-$M"-XX_um_"$h"_"$m"_Uhr.txt"
datum6=$termine$y"-XX-"$d"_um_"$h"_"$m"_Uhr.txt"
if [ -f $datum0 ] || [ -f $datum1 ] || [ -f $datum2 ] || [ -f $datum3 ] || [ -f $datum4 ] || [ -f $datum5 ] || [ -f $datum6 ] ;
then curl "http://192.168.0.2/index+.php"
#fi

Impressum Startseite Grund Installation Grundlagen Hilfreiches Projekte Querschläger Meckerecke