Variablenwerte korrigieren

Hallo zusammen,

gibt es inzwischen eine Möglichkeit fehlerhafte Werte in Variablen zu korrigieren?
Sprich: wenn z.B. durch nicht sauber funktionierende Scripte in Variablen falsche Werte geloggt werden, können diese entfernt bzw. an den letzten gültigen Wert angepasst werden?

Beispiel: in meiner Heizungssteuerung logge ich die Vorlauf Temperatur. Der normale Bereich ist 20-60°C. Beim Basteln an den Scripten (nobody is perfect :D) sind da aber auch Werte von z.B. 8000, 65000 oder 5,3 drin gelandet.

Ich suche also eine Möglichkeit bei der ich sagen kann: Variable xyz, alle Werte unter X oder über Y löschen oder alternativ mit dem letzten gültigen Wert ersetzen.
Das würde mir sehr helfen und die Graphen auch viel besser aussehen lassen.
Hat da jemand eine Idee?

Gruß, Lutz

Hallo,

könnte man nicht die CSV Dateien ändern, in der die Daten gespeichert werden?
Ob das klappt weiß ich nicht, aber ich denke da würde ich evtl. als erstes mal schauen.

Vorher natürlich ein Backup machen.

Grüße,
Kai

Hallo Lutz,

ich habe mich damals dazu in Python eingearbeitet und ein Skript dazu verfasst:

https://www.symcon.de/forum/threads/33327-Daten-in-der-Datenbank-mit-LibreOffice-ver%C3%A4ndern-welches-Speicherformat?p=308941#post308941

Damit könnte man relativ einfach deine Werte korrigieren, z.B.
„wenn Wert über 40 oder unter 10, dann übernehme den vorherigen Wert“

Nur so zur Anregung.

Viele Grüße
Wickie

Hi Wickie,

schon mal danke für den Ansatz, das wäre mein Plan B wenn nicht noch jemand was für mich einfacheres aus dem Hut zaubert.:wink:
Ich muß nämlich gestehen: programmieren ist nicht meine Kernkompetenz :D, mit PHP komm ich inzwischen so klar aber Phyton ist schon wieder böhmisch.

Mir wär am liebsten etwas direkt in Symcon integiert, mit Eingabemaske. Weil, das wird in meinem Basteltrieb immer wieder vorkommen dass ich hier was korrigieren muss…

Gruß, Lutz

Kann dir gerne bei Python helfen.
Melde dich einfach bei Bedarf.
Viele Grüße
Wickie

Ich habe mir jetzt ein Script geschrieben dass diese Arbeit direkt aus IPS übernimmt.
Im Code ist eine Mini Doku und es wird verhindert den aktuellen Monat zu bearbeiten um Datenverlust zu vermeiden. Keine Ahnung ob das tatsächlich so ist - es erschien mir aber sinnvoll :smiley:

Die Orginaldatei bleibt als .old beibehalten, man kann also den Ursprungszustand wiederherstellen.Im Anschluss wird die Variable neu aggregiert.

Da ich kein PHP Profi bin und dies meine Erstlingsveröffentlichung ist - bitte ich um Nachsicht :rolleyes:
Windows User, bzw. Linux User die den Standardpfad geändert haben, müssen die Pfadangabe entsprechend anpassen.

Vielleicht kanns jemand gebrauchen - viel Spaß damit :cool:

Gruß, Lutz


<?php
// Script zur Korrektur von fehlerhaften Einträgen im Variablenarchiv (csv)
// HowTo:
// $varianblenID  -   Hier die zu korrigierende Variable eintragen (12345)
// $archivID  	  -   Damit die Neuaggregierung funktioniert muss die ID der Archiv Instanz angegeben werden 
// $monat         -   Den zu korrigierenden Monat zweistellig Eintragen (01-12)
// $jahr		  -   Das Jahr des zu korrigierenden Monats eintragen (2017)
// $max			  -   Oberer Grenzwert (alles gleich oder darüber wird korrigiert)
// $min           -   Unterer Grenzwert (alles gleich oder darunter wird korrigiert)
// $austausch	  -   Hier eintragen durch welchen Wert korrigiert werden soll

// Die Originale csv Datei bleibt als .old erhalten (Sicherheitskopie)

$variablenID="20249";
$archivID="55983";
$monat="03";
$jahr="2018";
$max=50;
$min=(-20);
$austausch="0";


// Ab hier nichts mehr ändern

$aktuellermonat=date("m");
$aktuellesjahr=date("Y");
if ($monat==$aktuellermonat and $jahr==$aktuellesjahr)
{
echo "Warnung!
Script kann nicht für den aktuellen Monat ausgeführt werden. Datenverlust möglich falls Symcon parallel in die CSV schreibt.
Bitte nur abgeschlossene Monate korrigieren.
Bearbeitung wurde abgebrochen.";
}
else
{
$zaehler=0;

$quelldatei= "/var/lib/symcon/db/".$jahr."/".$monat."/".$variablenID.".csv";
$zieldatei= "/var/lib/symcon/db/".$jahr."/".$monat."/".$variablenID.".csv.old";
rename($quelldatei,$zieldatei);

$lesen = fopen($zieldatei, "r");
$schreiben= fopen($quelldatei, "w");


while (($data = fgetcsv($lesen, 100000, ";")) !== FALSE) {
        $schreiben= fopen($quelldatei, "a");
		$string=implode(',',$data)."
";
		$wert=substr($string,11);
		if ($wert>=$max or $wert<=$min)
		{
		$string=substr($string,0,11).$austausch."
";
		print "Wert ".$wert." durch ".$austausch." ersetzt.";
		$zaehler=$zaehler+1;
		}
		else
		{}
		
		fwrite($schreiben, $string);
		
    }
fclose($lesen);
fclose($schreiben);
if ($zaehler==0)
	{
	echo"
Keine zu korrigierenden Einträge gefunden
";
	}
else
	{
	echo "
Insgesamt ".$zaehler." Einträge korrigiert
";
	}
AC_ReAggregateVariable ($archivID, $variablenID);
}
?>


Hallo Lutz,

habe dein Skript nicht getestet, aber ich denke, du hättest das gleiche Problem, wie ich bei meinem Skript:
wenn das Skript zweimal hintereinander ausgeführt wird, dann ist die Orginaldatei verschwunden… nur so als Warnung.


$quelldatei= "/var/lib/symcon/db/".$jahr."/".$monat."/".$variablenID.".csv";
$zieldatei= "/var/lib/symcon/db/".$jahr."/".$monat."/".$variablenID.".csv.old";

Schön, dass du deine Problemstellung auf eine andere Art gelöst hast. Evtl. greife ich mal darauf zurück.

Viele Grüße
Wickie

Hi Wickie,

da hast du natürlich recht, vielleicht füge ich das noch zum Script hinzu. Bin bisher davon ausgegangen dass derjenige, der an Archiven rumbastelt, a) weiß was er tut und b)ein Backup hat.

Kein Backup - kein Mitleid :smiley:

Viele Grüße,
Lutz

Beitrag ist zwar alt aber funktioniert. Habe gerade mal eine Variable korrigiert.
Damit es auch auf anderen Systemen läuft, sollte es besser so sein:

$quelldatei= IPS_GetKernelDir()."/db/".$jahr."/".$monat."/".$variablenID.".csv";
$zieldatei= IPS_GetKernelDir()."/db/".$jahr."/".$monat."/".$variablenID.".csv.old";