IPS SQLLite Daten exportieren

Hallo.

Ich habe seit Anfang des Jahres mein aktuellen Stromverbrauch mitgeloggt. Dies habe ich direkt in IPS gemacht und als Graph dargestellt.
leider sind die daten mitlerweile sehr umfangreich geworden. Die SQL-Lite datenbank von IPS ist nun ca. 3 GB groß. Ich will aber die alten Daten nicht löschen, da ich diese noch weiterverarbeiten möchte.

Daher die Frage: Kann man die daten exportieren ?
Am liebsten wäre mir ein import in meine MSSQL-Datenbank. Da spielt die größe keine Rolle.

Für Ideen wäre ich sehr dankbar.

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

Hallo Helmut,

Das Projekt hört sich interessant an. Leider verstehe ich aber noch nicht ganz,was dieses Projekt denn nun macht.

Sehe ich das richtig, dass man dann MySQL als Datenbank verwenden kann, aber trotzdem normal die Graphen in der WEB-Oberfläche verwenden kann?

Geht das auch mit MSSQL?

Hallo,
Das MySqlData Projekt dient dazu, ausgewählte (oder alle) IPS-Variable in einer MySql Datenbank zu loggen. Siehe auch die Beschreibung der Anfänge von MySqlData Reporting mit Graphen und MySQL on Demand - IP-Symcon Community Forum.
Die ausgewählten Daten werden Minütlich (anpassbar) in die MySql Datenbank übertragen.
Ich habe bei mir die index.php als externe Seite im WebFrontKonfigurator eingetragen, dadurch erhalte ich im WebFront einen zusätzlichen Reiter über dem ich die on-Demand Generierung der Graphen aufrufen kann.
Solange das Datenbank-Logging bei den einzelnen IPS-Variablen noch aktiviert ist, kann man sowohl die WebFront-Graphen als auch die MySqlData-Graphen anzeigen. Ich hatte aber Probleme mit einer viel zu großen SQLite-Datenbank und habe daher das Datenbank-Logging bei den IPS-Variablen komplett abgeschaltet und nutze nur noch die MySqlData-Datenbank und MySqlData-Graphen. Es ist aber auch denkbar beide Datenbanken parallel zu nutzen und in der SQLite-Datenbank zyklisch ältere Einträge zu löschen damit die Datenbank nicht zu groß wird.
Das Script das ich hier gepostet habe, dient zum Export der in der SQLite-Datenbank vorhandenen Daten in die MySql-Datenbank.

Mit etwas Anpassarbeit sollte es auch möglich sein statt der MySql-Datenbank eine MSSQL-Datenbank zu verwenden. Ich habe es bisher aber nicht ausprobiert.

Gruß
Helmut