Onlinezeit der Kinder

Hallo,

in der Fritzbox habe ich die Onlinezeiten der Kinder-PCs eingestellt. Funktioniert gut für mich, oft schlecht für die Kids. Da ich mal eine Übersicht über 1-2 Wochen machen möchte, würde ich diesem Wert am Ende des Tages gern automatisch auslesen wollen und in meines DB schreiben wollen.

Hat jemand Ideen, wie ich diese Daten aus der Fritzbox bekomme und in eine Variable im IPS schreiben kann?

Hallo Andreas,

da ich selber gerne „zocke“ kann ich dir keine Antwort geben.
Ich bin ja kein Verräter. ;););):wink:

@schablone:

Hat nichts was mit Verraten zu tun, sondern eher mit Informationen über die Dauer von den Sessions. Soll für ein ausgewogenes Freizeit-/Schul-Verhältnis sorgen. Bisher habe ich noch keine Sanktionen verhängt, aber die Sache auf der Fritzbox aktiviert. Da kann ich ja schön sehen, wie lange die Kids schon an der Kiste sitzen und sie dann an die anderen schönen Dinge im Leben erinnern.

Kann mir da jemand helfen? Möchte diese Übersicht am liebsten ins IPS übergeben (1x täglich) und dann wegsichern.

ja, du dir mit der Suche nach „Kindersicherung“ :wink: und etwas anpassen (vielleicht). Da du eine 7390 hast bin ich mir nicht sicher, ob das Script läuft.

Bei mir läuft das folgende Script. Es wird durch den Online-Status des Rechners getriggert und dann alle 180 Sekunden aufgerufen. Außerdem einmal Nachts zum „Tagesabschluß“.

Es werden diverse Variablen verwendet, die durch den Kommentar hoffentlich selbsterklärend sind. Den HTML-Teil zeige ich im Dashboard an, die Variablen werden im (eigenen) Webfront angezeigt.

Einen Fehler habe ich noch, wenn die zulässige Zeit pro Tag unterschiedlich ist. Dabei wird die Tagesgesamtzeit nicht korrekt gefunden. Außerdem kann es bei Änderungen in der Fritz.Box (hinzufügen weiterer Rechner) zu Verschiebungen kommen und die Zeile 2147 ist dann nicht mehr die Richtige.

<?
function GetTextBetween($string, $start, $end)
{
    preg_match_all("/$start(.*)$end/i", $string, $match);
   return $match[1][0];
}

$debug = true;

// array_search with partial matches and optional search by key
function array_find($needle, $haystack, $search_keys = false) {
  if(!is_array($haystack)) return false;
  foreach($haystack as $key=>$value) {
      $what = ($search_keys) ? $key : $value;
      if(strpos($what, $needle)!==false) return $key;
  }
  return false;
}

$LAN = GetValueBoolean(37469 /*[IT\Netzwerk Monitoring\Notebook--LAN]*/);
$WLAN = GetValueBoolean(30451 /*[IT\Netzwerk Monitoring\Notebook--WLAN]*/);

if ($LAN OR $WLAN) {
// Notebook im Netz
	IPS_SetScriptTimer($IPS_SELF, 180);
	if ($debug)
		IPS_LogMessage(IPS_GetName($IPS_SELF), "Notebook an (Kindersicherungsanzeige aktualisieren.)");
} else {
// Notebook aus
	IPS_SetScriptTimer($IPS_SELF, 0);
	if ($debug)
		IPS_LogMessage(IPS_GetName($IPS_SELF), "Notebook aus (Kein Kindersicherungsanzeige notwendig.)");
}


//-----------------------------
$fritzbox_ip = 'fritz.box';
$fritzgui    = 'http://fritz.box/cgi-bin/webcm';
$fritzseite  = '../html/de/menus/menu2.html';
//$fritzseite  = '../html/index_internet.html';
$filename    = IPS_GetKernelDir()."\\webfront\\user\\Fritzbox\\Kindersicherung.txt";// anpassen
$password    = 'xxx'; //PW eingeben

$ch = curl_init('http://' . $fritzbox_ip . '/cgi-bin/webcm?getpage=../html/login_sid.xml');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$login = curl_exec($ch);
curl_close($ch);
$session_status_simplexml = simplexml_load_string($login);


if ($session_status_simplexml->iswriteaccess == 1)
{
   $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
   $response = $challenge . '-' . md5(mb_convert_encoding($challenge . '-' . $password, "UCS-2LE", "UTF-8"));
   $login = array('getpage' => $fritzseite, 'login:command/response' => $response);
   $sendlogin = http_post_fields($fritzgui, $login);
   preg_match('@<input type="hidden" name="sid" value="([A-Fa-f0-9]{16})" id="uiPostSid">@i', $sendlogin, $matches);
   if (isset($matches[1]) && $matches[1] != '0000000000000000')
   {
      $SID = $matches[1];
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen";
      return;
    }
}


// Kindersicherung
$newlist = array('getpage' => $fritzseite, 'sid' => $SID, 'var:menu' => 'internet', 'var:pagename' => 'userlist');
$getnewlist = http_post_fields($fritzgui, $newlist);

$fileHandle = @fopen($filename, 'wb+');
fwrite($fileHandle, $getnewlist);
fclose($fileHandle);

$lines = file("../webfront/user/Fritzbox/Kindersicherung.txt");

// ===================================

$verbraucht = (int)GetTextBetween($lines[array_find('name:"NameKind",hostname:"",today_time:"', $lines)], 'name:"NameKind",hostname:"",today_time:"', '",icon:getNetIcon')/60;
//$gesamt = (int)GetTextBetween($lines[array_find('case "user1": return "', $lines)], 'case "user1": return "', '";')/60;
$gesamt = (int)GetTextBetween($lines['2147'], 'case "user1": return "', '";')/60;
$verfuegbar = $gesamt - $verbraucht;

//SetValueString(29163 /*[Kommunikation\Fritz.Box\FB Kindersicherung Onlinezeit\Dashboard Ausgabe]*/ , "<table border='1' width='990' style='text-align:left; margin: 5;'><tr><th>Gesamt [Minuten]</th><th>Verbraucht [Minuten]</th><th>Verfügbar [Minuten]</th></tr><tr><td>$ausgabe1</td><td>$time1</td><td>$verfuegbar1</td></tr></table>");
SetValueString(29163 /*[Kommunikation\Fritz.Box\FB Kindersicherung Onlinezeit\Dashboard Ausgabe]*/ , $gesamt."	gesamt [Minuten]
".$verbraucht."	verbraucht
".str_pad ( $verfuegbar, 3, ' ', STR_PAD_LEFT )."	verfügbar");
SetValueString(57471 /*[Kommunikation\Fritz.Box\FB Kindersicherung Onlinezeit\KiSiCheckTime]*/ , date("H:i"));
SetValueString(47232 /*[Kommunikation\Fritz.Box\FB Kindersicherung Onlinezeit\Gesamt]*/,$gesamt);
SetValueString(42629 /*[Kommunikation\Fritz.Box\FB Kindersicherung Onlinezeit\Verbraucht]*/,$verbraucht);
SetValueString(20459 /*[Kommunikation\Fritz.Box\FB Kindersicherung Onlinezeit\Verfügbar]*/,$verfuegbar);



if($IPS_SENDER == "Execute") {
	echo $gesamt." gesamt
".$verbraucht." verbraucht
".str_pad ( $verfuegbar, 3, ' ', STR_PAD_LEFT )." verfügbar  [Minuten]

";
	print_r($lines);

} else {
	// Wenn Aufruf zum Tagesabschluß, dann Onlinezeit schreiben
	if ($IPS_EVENT == 17254 /*[Kommunikation\Fritz.Box\FB Kindersicherung Onlinezeit\]*/ )
		SetValueInteger(54136 /*[Kommunikation\Fritz.Box\FB Kindersicherung Onlinezeit\Onlinezeit]*/ , $verbraucht);
}

?>

@Ralf,

habe mal die $LAN und $WLAN auskommentiert, die sich mir noch nicht erschließt, wie diese Variablen gesetzt werden; vermutlich sysping oder auch aus der Fritzbox?

@alle:
Da tut sich auch schon das nächste Problem auf:

Fatal error: Call to undefined function curl_init() in [Fritzbox\Onlinezeit] on line 28

EDIT: habe 3 dlls aus diesem Thread http://www.ip-symcon.de/forum/f53/fritzbox-7270-wlan-repeater-scripts-8267/#post67958

Curl scheint damit zu laufen, ich bekomme zumindest kein Fehlermeldungen mehr wegen curl. Dennoch kein nutzbares Ergebnis und Fehler im Script, dessen Ausführung ich mit JA oder NEIN bestätigen kann.

curl findest du z.B. hier im zweiten Beitrag.

Die DLLs gehören in den Ordner „ext“ unterhalb vom IPS.

Hallo Ralf,

nach einigem Testen habe ich leider keinen Erfolg:

function GetTextBetween($string, $start, $end)
{
    preg_match_all("/$start(.*)$end/i", $string, $match);
   return $match[1][0];
}
Undefined offset: 0 in [Fritzbox\Onlinezeit1\Onlinezeit] on line 5

Das ist die Zeile mit return …

Was mache ich da falsch?

Baue am Anfang der Funktion oder nach dem preg_match (besser davor) mal ein print_r($string); ein und poste hier das Ergebniss - das sollte eine erste Analyse ermöglichen.

Offset 0 heißt „nur“ das kein Ergebnis gefunden wurde.

Du hast die folgende Zeile nicht angepasst

$verbraucht = (int)GetTextBetween($lines[array_find(‚name:„NameKind“,hostname:"",today_time:"‘, $lines)], ‚name:„NameKind“,hostname:"",today_time:"‘, ‚",icon:getNetIcon‘)/60;

speziell den fetten Teil ;).

Wenn du das Script manuell ausführst, kommt das Ergebnis vom print_r automatisch ;). Dort dann die entsprechende Zeile suchen.

Hallo,

den Namen des Kindes hatte ich eingetragen, so wie in der FB unter der Spalte „Benutzer und Computer“ geschrieben: pc-julia.

Es wird dann folgendes angezeigt:

Notice:  Undefined offset: 0 in [Fritzbox\Onlinezeit1\Onlinezeit] on line 5
630 gesamt
0 verbraucht
630 verfügbar  [Minuten]

EDIT: noch den Code dazu:

// ===================================

$verbraucht = (int)GetTextBetween($lines[array_find('name:"pc-julia",hostname:"pc-julia",today_time:"', $lines)], 'name:"pc-julia",hostname:"pc-julia",today_time:"', '",icon:getNetIcon')/60;
//$gesamt = (int)GetTextBetween($lines[array_find('case "user1": return "', $lines)], 'case "user1": return "', '";')/60;
$gesamt = (int)GetTextBetween($lines['2147'], 'case "user1": return "', '";')/60;
$verfuegbar = $gesamt - $verbraucht;

Da habe ich auch bei Hostname den Namen aus der FB übernommen - gleiches Ergebnis. Kann es sein, dass die Zeile 2147 irgendwie nicht in meiner FB vorhanden ist?

Woher weißt Du denn, da die Zeile 2147 die richtige ist? Bei Ansicht → Quelle im IE8 wird auf der Seite „Kindersicherung“ der FB nur das angezeigt:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html>
<head>
<title>FRITZ!Box</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="expires" content="0">
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
<script type="text/javascript"> 
var g_HelpWin = null;
</script>
</head>
<frameset id="frame_set" rows="*">
<frame src="/logincheck.lua" id="frame_content" scrolling="auto" frameborder="0" />
</frameset>
<noframes>
<body>
<p>Ihr Browser unterstützt keine XHTML-Frames.</p>
<p>Sie können die <a href="/logincheck.lua">FRITZ!Box Benutzeroberfläche</a> aber trotzdem ohne Einschränkung nutzen.</p>
</body>
</noframes>
</html>

Wenn du das Script manuell ausführst, dann wird das komplette Array (die gelesene Seite) ausgegeben. Davor stehen die „Zeilennummern“, in denen musst du die Sollzeit suchen.

Wie geschrieben habe ich leider noch Probleme, wenn die Zeiten pro Tag verschieden sind. Die Zeile "case „user1“: return " tritt leider öfter auf.