Hallo,
habe folgendes Problem, ich möchte aus meiner Homematic mit dem RPI Daten auslesen und in eine Datenbank schreiben, das funktioniert soweit, bis ich die Daten schreiben möchte. Hier erstmal das PHP-Programm:
[code=php]
<?php
error_reporting (E_ALL | E_STRICT);
ini_set ('display_errors' , 1);
setlocale (LC_TIME, "de_DE");
include ("phpDBfunction.php");
$SQLITEdb = "../var/www/homematic.sqlite";
$db = db_con($SQLITEdb);
exec("curl -o /var/www/homematic.xml \"http://192.168.xxx.xxx/config/xmlapi/statelist.cgi\"");
$xml = simplexml_load_file( "homematic.xml" );
foreach ( $xml->device as $geraet )
{
If (substr($geraet['name'], 0,2)<> "HM")
{
foreach ( $geraet->channel as $kanal_1 )
{
If (substr($kanal_1['name'], 0,2)<> "HM")
{
foreach ($kanal_1->datapoint as $dp)
{
if ($dp['type'] == "LEVEL"
OR $dp['type'] == "STATE"
OR $dp['type'] == "TEMPERATURE"
OR $dp['type'] == "HUMIDITY")
{
echo "<b>Id: " . $geraet['name'] . "</b><br>";
echo "IseID: " . $geraet['ise_id'] . "<br>";
echo "Channel: " . $kanal_1['name']. "<br>" ;
echo "Type: ". $dp['type']. "<br>" ;
echo "Wert: ". $dp['value']. "<br>" ;
echo "Einheit: ". $dp['type'] . "<br>" ;
echo "Zeit: ". strftime("%a %d.%m.%Y %H:%M:%S", intval($dp['timestamp']) ) . "<br>" ;
echo "INSERT INTO status VALUES ( ". $geraet['ise_id'].", ". $dp['timestamp'] .", ". $kanal_1['name'] .", ". $dp['type'] .", ". $dp['type'] .", ". $dp['value'] ;
$insertTable = $db->exec("INSERT INTO status VALUES ( ". $geraet['ise_id'].", ". $dp['timestamp'] .", ". $kanal_1['name'] .", ". $dp['type'] .", ". $dp['type'] .", ". $dp['value'] );
}
}
}
}
echo "<br><br>" ;
}
}
?>
[/php]
Die PHP-DB-Funktionen habe ich aus dem Tutorial von Meigrafd (Vielen Dank für die ausführliche Anleitung ). Hier nochmal mit meinen Anpassungen:
[code=php]
<?php
//Quelle: Datenbanken mit SQLite
setlocale (LC_TIME, "de_DE");
// DB connect
function db_con($DBfile) {
if (!$db = new PDO("sqlite:$DBfile")) {
$e="font-size:23px; text-align:left; color:firebrick; font-weight:bold;";
echo "<b style='".$e."'>Fehler beim öffnen der Datenbank $DBfile:</b><br/>";
echo "<b style='".$e."'>".$db->errorInfo()."</b><br/>";
die;
}
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $db;
}
// DB Query
function db_query($sql) {
global $db;
$result = $db->query($sql) OR db_error($sql,$db->errorInfo());
return $result;
}
// DB errors
function db_error($sql,$error) {
die('<small><font color="#ff0000"><b>[DB ERROR]</b></font></small><br/><br/><font
color="#800000"><b>'.$error.'</b><br/><br/>'.$sql.'</font>');
}
// Add HTML character incoding to strings function db_output($string) {
return htmlspecialchars($string);
}
// Add slashes to incoming data
function db_input($string) {
if (function_exists('mysql_real_escape_string')) {
return mysql_real_escape_string($string);
}
return addslashes($string);
}
?>[/php]
Wenn ich das jetzt aufrufe, bekomme ich folgenden Fehler, ohne die Datenbank-Anbindung gibt er mir die "echos" so aus, wie ich es erwarte:
[code=php]Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [14] unable to open database file' in /var/www/phpDBfunction.php:7 Stack trace: #0 /var/www/phpDBfunction.php(7): PDO->__construct('sqlite:../var/w...') #1 /var/www/homematic2sqlite.php(15): db_con('../var/www/home...') #2 {main} thrown in /var/www/phpDBfunction.php on line 7[/php]
Das klingt für mich nach einem Rechteproblem, aber die Datenbank gehört dem User "PI" und auch das Verzeichnis gehört "PI". Die DB hat die Rechte "-rw-rw-rw-" und das Verzeichnis "drwxrwsrwx", so dass eigentlich es keine Rechteprobleme geben dürfte...
Kann mir da einer weiterhelfen?
Vielen Dank!
Markus
PS.: Was ich auch nicht verstehe, mich aber nicht wirklich stört, ist dass [code=php]exec("curl -o /var/www/homematic.xml \"http://192.168.xxx.xxx/config/xmlapi/statelist.cgi\"");[/php] im Webbrowser keine Datei schreibt, aber wenn ich es im bash ausführe schreibt er die Datei :s