Hallo,
ich benutze inzwischen MySqlData wie im Beitrag http://www.ip-symcon.de/forum/f16/mysqldata-v2-fuer-ip-symcon-v2-6142/?highlight=MySqlData beschrieben.
Für die Datenübernahme von der SqLite Datenbank in die MySql Datenbank habe ich mir folgendes Script geschrieben.
<?
//==================================================================================
// Datei.......: Read_Archive
// Beschreibung: Daten aus SQLite Archive auslesen und
// als Minutenwerte in MySQL Datenbank schreiben
// H. Hennek 13.05.2010
// Version.....: V2.0.3 - 001
//==================================================================================
$MySQLHost = "localhost";
$username = "uuuuuu"; //Auf eigenes System anpassen
$password = "pppppp"; //Auf eigenes System anpassen
$ArchiveHandler = 59257 /*[Archive Handler]*/; //Auf eigenes System anpassen
//$von = mktime($hh,$mm,$ss,$monat,$tag,$jahr);
$von = mktime( 0, 0, 0, 1, 1,2010); //Anfang Zeit/Datum für Datenübernahme
$bis = mktime(23,59,59, 1,31,2010); //Ende Zeit/Datum für Datenübernahme
$day = 60 * 60 * 24; //Länge eines Tages
$start = $von; //Start Zeitpunkt für Funktion AC_GetLoggedValues
$ende = $von + $day - 1; //Ende Zeitpunkt für Funktion AC_GetLoggedValues
$polltime = 1;
// Datenbank oeffnen
$link = mysql_connect($MySQLHost, $username, $password) or die("Keine Verbindung möglich!");
mysql_select_db("ipsdata") or die("Auswahl der Datenbank fehlgeschlagen");
while ($ende <= $bis) //Schleife für jeden Tag
{
echo date("Ymd His",$start)." ".date("Ymd His",$ende)."
";
unset($insert);
$insert = array();
// Zu bearbeitende IPS-Var-ID's aus MySQL dataconf aulesen
$select = "SELECT * FROM dataconf";
$vardat = mysql_query($select);
while ($row = mysql_fetch_array($vardat)) //Schleife für jede IPS-Variable
{
// $row['ipsvar'] = IPS-Variable-Nr, $row['vartype'] = IPS-Variable-Type (Float, Integer, Boolean)
$Data = AC_GetLoggedValues($ArchiveHandler,(int)$row['ipsvar'],$start,$ende, 0);
echo date("Ymd His",$start)." ".date("Ymd His",$ende)." : ";
echo $row['ipsvar']." mit ".count($Data)." Archive-Werte
";
krsort($Data); //Array umdrehen da sonst absteigendes Datum
$NTime = $start; //Zeit für Eintrag in MySql Datenbank
foreach($Data as $Dat) //Schleife für jeden Archive-Eintrag
{
$DTime=(int)$Dat['TimeStamp']; //Zeitpunkt des Variableneintrags im Archive
$DVal=$Dat['Value']; //Wert des Variableneintrags im Archive
$DDauer=$Dat['Duration']; //Dauer des Variableneintrags im Archive
// Nicht vorhandene Messwerte überspringen
while ( $NTime < $DTime ) { $NTime += 60; }
// Messwerte ins Minutenraster umwandeln
while ( ($NTime <= $DTime+$DDauer) and ($NTime <= $ende) ) //Schleife für jede Minute
{
$idx = date("H",$NTime) * 60 + date("i",$NTime);
//var_dump($insert[$idx]);
if (!isset($insert[$idx]))
//$polltime alle 5 Min auf 5 sonst auf 1 setzen
$xm = (int)substr(date("i",$NTime),-1); // Einerstelle der Minuten
If ($xm == 0 or $xm == 5) {$polltime = 5;} else {$polltime = 1;}
//SQL String für Insert in MySql Datenbank erzeugen Datum, Variablename, Wert
$insert[$idx] = "INSERT INTO data SET date='".date("Ymd",$NTime)."', time='".date("His",$NTime)."', polltime='".$polltime."'";
$insert[$idx] = $insert[$idx].", `".$row['ipsvar']."`='".$DVal."'";
$NTime += 60; //Zeit für Eintrag in MySql Datenbank + 1 Minute
} //Schleife für jede Minute Ende
} //Schleife für jeden Archive-Eintrag Ende
} //Schleife für jede IPS-Variable Ende
echo count($insert)." von ". 24*60 ."
"; //Testanzeige Anzahl erzeugter Minutenwerte für einen Tag
foreach($insert as $sql)
{
//echo $sql."
";
$query = mysql_query($sql);
}
$start += $day; //Start Zeitpunkt für Funktion AC_GetLoggedValues + 1 Tag
$ende += $day; //Ende Zeitpunkt für Funktion AC_GetLoggedValues + 1 Tag
} //Schleife für jeden Tag Ende
mysql_close($link);
?>
Im Script müssen am Anfang die Daten für die MySql Datenbank, die Object-ID vom Archive Handler und der Zeitraum ($von, $bis) an das eigene System angepasst werden.
Das Script läuft abhänig von der Datenmenge (Anzahl der Variablen, Zeitraum) sehr lange. Deshalb habe ich für die Zeit der Datenübernahme in der php.ini den Wert für max_execution_time drastisch erhöht.
Bei mir konnte ich einen Zeitraum von 1 Monat in einem Scriptdurchlauf (1 Stunde) übernehmen und habe das Script dann nach Anpassen von $von und $bis entsprechend oft gestartet.
Um mein Echtsystem nicht zu sehr zu stören habe ich die Datenübernahme auf einem Testsystem durchgeführt.
Gruß
Helmut