Pro und Contra verschiedener Datenbanken.

Wäre es möglich, sich diesen Script anzusehen? Ich glaube, ich würde auch lieber mit standard SQL-Befehlen arbeiten, als mit den weitgehend undokumentierten AC-Befehlen der internen SQLite-Datenbank…

Ich schreibe so in meine MySQL DB.

# Variablen ####################################################################

	$time = strftime("%Y.%m.%d %H:%M:%S");                                              //time("d.m.Y H:M:S");
   $temp = GetValue (57704 /*[Klima\Temp\Temp AW\Außen West]*/ );
   $lux = GetValue (51257 /*[Klima\Helligkeit\Helligkeit]*/ );
   $rain = GetValue (58435 /*[Klima\Regen\Regensensor\wetter]*/ );


# MySql Aufbau #################################################################

    $mysqlhost="xxx.xxx.xxx.xxx"; // MySQL-Host angeben
    $mysqluser="xxxxxx"; // MySQL-User angeben
    $mysqlpwd="xxxxxx"; // Passwort angeben
    $mysqldb="ipsdata"; // Gewuenschte Datenbank angeben

    $connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die
    ("Verbindungsversuch fehlgeschlagen");

    mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht
    waehlen.");

# MySql Datei schreiben ########################################################

	$sql = "
	  INSERT INTO `wetter`
	  (
	  `time` , `temp` , `lux` , `rain`
	  )
	  VALUES
	  (
	  '$time' , '$temp', '$lux', '$rain'
	  );
	";
	$db_erg = mysql_query($sql)
	   or die("Anfrage fehlgeschlagen: " . mysql_error());

// Speicher wieder freigeben und Verbindung zur DB schließen.
#mysql_free_result($db_erg);
mysql_close($connection);

Danke Markus, das ist super. Nun brauche ich aber etwas Beratung.

Ich habe bisher viele Variablen in die integrierte SQLite-DB geloggt, und zusätzlich seit 8 Monaten ein Paar Variablen (aber nicht alle) parallel in eine MS-Access DB über ODBC geloggt. Meine Lösung ist ähnlich wie Deine: ein SqlAppend-Befehl wird getriggert wenn die Variable sich ändert. Für die Erzeugung von Graphen habe ich aber immer nur die SQLite-Daten verwendet.

Jetzt wünsche ich mir aber, etwas komplexere Dinge aus den Daten zu extrahieren, z.B. statistische Parameter wie STDV, LINREG, Trends, etc. Das könnte theoretisch mit PHP und AC_Get Befehlen gehen, aber mir scheint, dass SQL wahrscheinlich dafür geeigneter ist.

Weil die Firma IPS offiziell gesagt hat, dass sie niemals eine direkte Abfrage der Logging.db erlauben werden, und sogar jegliche Forum-Posts zu diesem Thema als unerwünscht deklariert hat, will ich mich von SQLite weg bewegen. Ich suche deswegen nach Alternativen.

MS-Access gefällt mir wegen der sehr komfortablen Generierung von validierten SQL-Strings mittels GUI. Datenbanken sind nicht mein Beruf, und deswegen sind Komfort und Einfachkeit wichtige Kriterien für mich. Und mit Access kenne ich mich gut aus seit >15 Jahren. Andererseits weiss ich, dass die meisten DB-Profis die Nase rümpfen, wenn Sie an Access denken.

Die anstehende Entscheidung ist für mich folgenreich und sollte „verheben“ für mindestens 5 Jahre. Wenn ich die (für meine Anwendung) falsche Lösung wähle, werde ich dies bitter bereuen! Deswegen ist meine heutige Frage: was spricht für und gegen MS-Access? Jegliche Meinungen (vor allem kritische!) sind erwünscht.

Jepp DAS ist so…und hat auch Gründe…incl Glaubenskrieg.

Aber mit Access wirst du früher oder später, ähnlich wie das bei SQL-Lite auch passiert in Performanceprobleme laufen. Access ist eine DB zum mitnehmen, d.h. alles was sich größentechnisch zwischen einer Diskette oder mittleren USB-Stick bewegt ist in Ordnung.

Ich persönlich habe mit Mysql angefangen, weil meine NAS den schon dabei hatte und es sehr einfach ist rein zukommen, bin aber mittlerweile auf dem Weg zu Oracle. Für Home-User ist sie ja kostenfrei ( die Limitierungen sollten in einer Hausinstallation nicht einschränken). Zu mal ich vor habe mehr Logik aus IPS in Oracle PL/SQL zu verlagern, da die Anpassungen die ich allein für IPS 3.0 machen muss erheblich sind und ich die Last dynamischer verteilen kann. IPS kann ja nicht Clustern ^^

Ich schmeiße hier mal die Suchbegriffe Active Queuing, Historisierung, Auditing, Job Control usw in den Raum. Ziel ist es IPS aufs Steuern zu konzentrieren und den Loggingaufwand in IPS zu minimieren.

Sehe ich auch so. Ich hatte vor 12 Jahren eine komplexere AccessDB für mein Labor programmiert, und die wurde mit der Zeit immer langsamer. Nun haben unsere Informatik-Profis die DB auf Oracle portiert, und alles läuft nun wieder schnell und prima. Das war in der Tat ein ziemliches „eye opener“ für mich!

Es gibt aber auch gegenteilige Ueberlegungen. Bei meinen IPS-Anwendungen geht es wirklich nur um ein Paar Tabellen mit ganz wenigen Joints. Da wird m.E. der Performance-Unterschied zwischen den verschiedenen Lösungen nicht dramatisch sein, zumindest solange alle wichtigen Felder indiziert sind (aber wer weiss, vielleicht täusche ich mich!).

Was potentiell eher für Access spricht:

  1. Meine Queries könnten allenfalls etwas komplex werden, vor allem mit Rechnungen und Statistik. Nach meinem Verständnis sind diese queries viel einfacher zu gestalten mit Access, als mit den professionellen DBs.

  2. Die Grösse der DB wird vermutlich bei den USB-Stick-Dimensionen bleiben. Ich rechne mit ca. 30-40’000 Datenpunkten/Jahr.

  3. Der andere (wichtige!) Punkt ist, dass ich mit Access bereits umgehen kann. Ich bin aber nicht abgeneigt, Neues zu lernen - falls sich überzeugende Vorteile ergeben.

Die Würfel sind aber nicht gefallen, und ich bin immer noch am grübeln, was ich machen soll…

Hallo aag,

Mach beides!
MySql und die Tabelle mit Access verknüpfen.

Meine bescheidene Anwendung ist xamplite mit MySQL auf dem ips-Rechner.
Auf meinem PC läuft Access mit einer Tabellenverknüpfung (odbc??). Accessauswertungen klappen prima.

Gruß NBA

Guten Abend,

Ich bin mit MYSQL in Kombination mit PHP und IPS seit 2008 sehr zufrieden und habe mal gerade nachgeschaut:

Die größte Tabelle in der Datenbank sind Sollwert/Istwerttemperaturen mit seit dem 23.03.2008 15-minütig aufgeziehcneten inzwischen zu 145.854 Datensätzen angewachsenen je 18 Feldern.

Die Abfrage erfolgt über selbstgeschriebene PHP-Seiten als grafische Aufbereitung.

Ansonsten sind weitere kleinere Tabellen in der Datenbank mit Gasverbrauch etc, Vorlauf-Nachlauftemperaturen, Bbewegungsmeldern etc. , die Ereignisgetriggert über IPS in die Datenbank geschrieben werden.

Ich schreibe vom Prinzip wie Marcus in meine MySQL DB Tabellen.
Die Wartung und Pflege der DB mache ich aber über HeidiSQL.
Sicher muss man sich mit SQL zunächst beschäftigen. Für diejenigen, die sich in SQL und in PHP was einfuchsen, kann ich es nur empfehlen.

Ich bin gerade selber erstaunt, wie lange das schon 24/12 läuft.

Gruß Rolf

Schmeiß mal meine 2 cents rein…

Temperaturtabelle: 4.2 Mio Datensätz allein von 2012

Stromtabelle 2.3 Mio Datensätze von 2012

Rechne so mit ca 2 GB/Jahr an Daten - wobei von konstanten Variablen ausgegangen wird - jeder weiss das das nicht stimmt !!! :loveips:

nun bin ich schon etwas weitergekommen, brauche aber dennoch etwas Beratung. Meine Ueberlegungen sind die folgenden:

[ul]
[li]Access: die Queries lassen sich via GUI bilden und in SQL umsetzen, was toll ist. Aber Access ist quälend langsam. Kommt mir nicht mehr ins Haus!
[/li][li]SQLite: klein und schnell! Wird zwar nativ durch PHP unterstützt, aber IPS hat alle SQLITE_Befehle aus seiner PHP-Version gekippt. Somit nur über ODBC erreichbar, was viele Nachteile hat. Z.B. ODBC_Fetch gibt immer nur strings heraus, unabhängig von den zugrundeliegenden Fields!
[/li][li]MySQL. Kann mit Extension ab PHP betrieben werden. Ist aber wie auch SQLite begrenzt. Für mich besonders gravierend: keine PIVOT-Queries, und keine advanced statistical functions (z.B. STDEV).
[/li][/ul]

Damit stellt sich die Frage nach Oracle. Der könnte nämlich alle Dinge die ich haben will. Aber wie mühsam ist es denn, Oracle zu installieren? Oracle tönt ein bisschen nach einem „800-pound gorilla“ und ist für mich vielleicht overkill. Andererseits, wenn ich das lese, scheint mir die Steuerung nicht so schwer zu sein. Gibt es kritische Meinungen dazu?

Ach ja, und wenn ich auf eine externe Datenbank umsteige, dann muss ich logischerweise bei jeder geloggten Variable einen Aktionsscript anlegen, welches den Eintrag triggert. Bei 200 Variablen ist dies ziemlich mühsam - hat eine gute Seele auch schon einen Script geschrieben, der dies automatisch erledigt???

Ach ja, und wenn ich auf eine externe Datenbank umsteige, dann muss ich logischerweise bei jeder geloggten Variable einen Aktionsscript anlegen, welches den Eintrag triggert. Bei 200 Variablen ist dies ziemlich mühsam - hat eine gute Seele auch schon einen Script geschrieben, der dies automatisch erledigt???
Bei mir sieht das so aus, allerdings für Postgres. Hier wird einfach eine Variable hinzugefügt, je nach Ereignis.

<?
$debug = true;
if(!$debug) return;
// Verbindungsaufbau und Auswahl der Datenbank
$dbconn = pg_connect("host=192.168.1.51 port=5432 dbname=ipsgraphenlogging user=xxx password=xxx") or die ('Verbindungsaufbau fehlgeschlagen: ' . pg_last_error());

/*
if($_IPS['SENDER'] == "Execute")
{
    $objekt = IPS_GetObject(22008 /*[Energieverbrauch\WA TR TE HE\Trockner]*/);
    //print_r($objekt);

    for($i=0; $i<count($objekt['ChildrenIDs']); $i++)
    {
       $eid = IPS_CreateEvent(0); //Ausgelöstes Ereignis
        IPS_SetEventTrigger($eid, 0, $objekt['ChildrenIDs'][$i]); //Bei Aktualisierung von Variable mit ID
        IPS_SetParent($eid, $_IPS['SELF']); //Ereignis zuordnen
        IPS_SetEventActive($eid, true); //Ereignis aktivieren
    }
}
*/

// Tabelle wird automatisch über die Variable erstellt, sofern noch nicht vorhanden!
if($_IPS['SENDER'] == "Variable")
{
   $create = "    CREATE TABLE IF NOT EXISTS VarID{$_IPS['VARIABLE']} (
                    ID SERIAL,
                    VARNAME TEXT NOT NULL,
                    VARSUFFIX TEXT,
                    VARVALUE REAL,
                    TYP INTEGER,
                    UPDATEZEIT TIMESTAMP,
                    PRIMARY KEY(ID)
                    );";
    pg_query($dbconn, $create);

    // Datenbank mit Werten von Variablen füllen
    $variablenName = IPS_GetObject($_IPS['VARIABLE']);
    $variable = IPS_GetVariable($_IPS['VARIABLE']);
    $varType = $variable['VariableValue']['ValueType'];
    if($varType == 0) $_IPS['VALUE'] = (int)$_IPS['VALUE'];
    //$profil = IPS_GetVariableProfile($variable['VariableCustomProfile']);
    if($variable['VariableCustomProfile'] === false)
    {
       $profil = IPS_GetVariableProfile($variable['VariableProfile']);
    }
    else
    {
        $profil = IPS_GetVariableProfile($variable['VariableCustomProfile']);
    }
    $suffix = $profil['Suffix'];
    setDataSql(utf8_encode($variablenName['ObjectName']), utf8_encode($suffix), $_IPS['VALUE'], $varType, date('Y-m-d H:i'));
    pg_close($dbconn);
}



function setDataSql($varName, $suffix, $value, $typ, $time)
{
    global $dbconn;
    $setSQL = "INSERT INTO VarID{$_IPS['VARIABLE']}(varname, varsuffix, varvalue, typ, updatezeit) VALUES ";
    $setSQL .= "('".$varName."','".$suffix."','".$value."','".$typ."','".$time."');";
    pg_query($dbconn, $setSQL);
}


?>

Lieber Rainer

vielen herzlichen Dank für diesen fertigen (und v.a. hervorragend dokumentierten) Script!

Ich hatte an Postgres garnicht gedacht, aber ich stelle fest, dass viele von Euch Cracks in diesem Forum eigentlich Postgres verwendet, wenn Ihr die Daten auslagert. Das muss wohl einen Grund haben!

Ich habe gerade ein bisschen in die Postgres-Doku gestöbert. Mir scheint, dass Pivots mit Postgres möglich sind, mit der crosstab-Funktion. Könnt Ihr dies bestätigen? Ausserdem scheinen wesentlich mehr statistische Funktionen verfügbar zu sein, als in MySQL und SQLite - stimmts?

Herzlichen Dank
AAG

Oracle Express ist kostenlos, erlaubt 10GB Daten und ist für Linux und Windows auch nicht schwer zu installieren (rpm bzw. msi), und für die Basic Tasks gibt es auch eine Weboberfläche. Wer will, kann auch tiefer einsteigen, brauch dann aber auch ein „bisschen“ Zeit. Aber letzteres trifft auf ja auf alle DBs zu

Tommi