Variablenwerte zu beliebigen Zeiten in DB speichern

Aktuell werden Variablenwerte immer mit dem aktuellen Zeitstempel (time()!) in der Datenbank gespeichert.

Schön wäre, wenn man optional eine beliebige Zeit setzen könnte.

Bei Plugwise ist der historische Verbrauch im Buffer abgelegt. Dieser ist aber nicht direkt nach IPS übertragbar, da Werte nicht der historischen Zeit zugeordnet werden können (allenfalls mit einer Verzögerung von einer Stunde).

Könnte auch für das verdichten von historischen Werten in der DB sinnvoll sein, zumindest könnte man dann per Script Werte aggregieren (Stunden- bzw Tagesmittel ablegen + den restliche Stunden- bzw. Tageswerte löschen).

Danke & Gruß,
Axel

Hallo zusammen,

diesen Feature Request würde ich gerne pushen.

Ich habe eine Weichwasseranlage bekommen, die einmal pro Stunde eine Logdatei mit den Wasserverbräuchen der letzten Stunde, aufgeschlüsselt nach Minuten, schreibt.

Ich kann diese Werte nun aufsummieren und einmal pro Stunde wegschreiben aber ich würde natürlich gerne die minutengenauen Werte.

Viele Grüße

Dieser Wunsch ist schon öfters geäußert worden.
Da sich da aber momentan bwegt und ich das auch gebraucht habe, hab ich mir eine eigene Lösung für mein Problem gebaut.
Ich pflege Daten mehrere Windkraftanlagen in IPS ein. Die Daten kommen manchmal um Tage versetzt.

Wenn man bestimmte Dinge beachtet, dann kann man das selber für sein Problem lösen.

Gruß
Schuggi

Hallo Schuggi,

ich freu mich, dass Du Dein Problem gelöst hast.

Falls es Dich interessiert: Ich habe mein Problem auch gelöst, ich halte die Werte jetzt eben in einer separaten Datenbank und mache nur noch die Anzeige in IPS.

Aber diese Kategorie im Forum heiß „Funktionswünsche“. In dieser Kategorie können Benutzer den Programmierern mitteilen, welche Funktionen sich sich für IPS wünschen. Es zwingt sie niemand, diese Funktionen dann auch einzubauen und sie haben die Möglichkeit, mit den Fragestellern in Kontakt zu treten um den Funktionswunsch zu konkretisieren, die Dokumentation ausführlicher zu gestalten, …

Warum will ich die Daten z.B. nicht in einer separaten Lösung haben:

  • mein IPS läuft auf einem Raspberry mit nur dem nötigsten an Software. Das will ich nicht unnötig aufblähen
  • ich möchte auch andere IPS-Funktionen für diese Daten nutzen: Graphen, Events, Statistiken über Zeiträume

Der Grund warum ich mir IPS zugelegt habe ist, dass ich alle Dinge, die mein Haus betreffen, an einer Stelle haben will. Im Moment geht das für diesen einen Anwendungsfall nicht und ich baue mir IPS-Funktionen in einer anderen Software nach.

Aber was jetzt daran falsch gewesen sein soll, das hier in dieser Kategorie zu posten verstehe ich beim Besten Willen nicht.

Wenn man das Archiv kurzzeitig abschaltet und nie die eigentliche Variable vom IPS aus schreibt, so kann man die Werte auch in die IPS-DB Files einpflegen. Nach dem Einpflegen muss man dann aber die Aggregation der entsprechenden Variable auslösen.
So habe ich es gemacht.

Eine IPS eigene Funktion wäre mir auch viel lieber.

Das ist ja cool, das muss ich gleich mal ausprobieren. Danke für den Tip.

Das Ausprobieren hat mich mehrere Stunden gekostet. Alleine die Infos zuzsammenzutragen wie man es machen muß/soll war schon einiges an Arbeit. Die Dateien richtig zu schreiben war auch nicht so einfach. Du mußt auch die Datentypen der Variablen beachten. Wenn du in eine „Integer“ Datei einen Punkt schreibst, nimmt er das als 1000er!

Bei mir läuft das Ganze seit mehreren Monaten problemlos!

Hier mal der Code meiner Schreibfunktion.
Du mußt darauf achten das die Zeitwerte immer aufsteigend sind und du solltest keine doppelten Werte hintereinander schreiben.

Function DatenSpeichern($ID,$array,$altwert)
    {
      global $Log;
  
  
      $pfad = 'C:\\IP-Symcon\\db\\';
      $altjahr  = '' ;
      $altmonat = '' ;
      $offen = false;

      if(count($array)==0) return;
	  echo "
".count($array)." Werte werden verarbeitet
";
	  $Log .= "  ( ".count($array)." / ";
	  
      AC_SetLoggingStatus (52542 /*[Archive]*/, $ID,False);
      IPS_ApplyChanges(52542 /*[Archive]*/);
	  $Anz = count($array);
	  $n=0;
 	  $VT = IPS_GetVariable($ID)['VariableType'];
	  
      foreach ($array as $tag) 
	  {
        $zeit = $tag["zeit"];
        $jahr  = date('Y', $zeit);
        $monat = date('m', $zeit);
        $wert = $tag["wert"];
		if ($VT==1) $wert = intval($wert);
		
		
		
		if (($wert!=$altwert)||($Anz==0))
		{ 
		  if (($jahr!=$altjahr) || ($monat!=$altmonat))
		  {  
		 
            if ($offen) fclose($hout);
            $fileout = $pfad.$jahr."\\". $monat . "\\" . $ID . ".csv";
			echo "   ".$pfad.$jahr."\\". $monat . "\\" . $ID . ".csv
";
            mkdir(($pfad.$jahr."\\". $monat . "\\"), null, true);
            $hout = fopen($fileout, 'a');
		    $offen=true;
		    $altjahr = $jahr;
		    $altmonat = $monat;
		  }
		  //echo $zeit . "," . $wert . "
";
		  echo ".";
		  fwrite($hout, ($zeit . "," . $wert . "
"));
     	  $n++;
		  $altwert=$wert;
		}
      }
      if ($offen) fclose($hout);
	  
	  switch ($VT) 
	  {
        case 0: SetValueBoolean($ID,boolVal($wert));   break;
        case 1: SetValueInteger($ID,intval($wert));    break;
		case 2: SetValueFloat($ID,floatVal($wert));    break;
		case 3: SetValueString($ID,$wert);             break;
      }
      AC_SetLoggingStatus (52542 /*[Archive]*/, $ID,True);
      IPS_ApplyChanges(52542 /*[Archive]*/);
	  AC_ReAggregateVariable(52542 /*[Archive]*/, $ID);
	  $Log .=$n." )";
    }