Variable zu früh gelöscht :(

Hallo Gemeinde,

ich habe meinen Homematic Temperaturfühler gegen einen Shelly Sensor getauscht. Leider habe ich zu früh meine alte Variable gelöscht bzw auch das ganze logging von 11 Jahren.

In einem Backup von letzter Woche habe ich die Variable noch in der Datenbank. Allerdings ist die Variablen ID gefühlt hundert mal in allen möglichen Ordnern eines jeden Jahrs (Ordnerstruktur der db)

Ich habe gerade versucht, uber die Suche nach meiner ID zu suchen und dann alle Treffer heraus zu kopieren. Aber leider heißen die Dateien fast alle gleich :frowning:

Habt ihr eine Idee, wie ich aus meiner backupd db (die physischen Ordner und dateien) meine Variable in die aktuelle db zurückspielen kann?

Liebe Grüße
Sascha

… altes BackUp einspielen, neuen Shelly nochmal neu installieren ….

Man kann auch das Archiv von einer Variable zurückschieben.
Ich glaube du musst die Dateien dann umbenennen. Genau weiß ich das gerade nicht mehr.

@paresy, reichte umbenennen der Dateien?

Grüße,
Kai

Das mit dem Backup einspielen will ich umgehen, da ich jetzt eine Woche lang alle Homematic Devices gegen Shelly getauscht habe und es mir jetzt zum Schluß aufgefallen ist.
Das würde für mich eine Woche Arbeit bedeuten.

Daher würde ich gerne noch auf @paresy seinen Vorschlag warten :slight_smile:
Vielleicht zaubert er (wie so oft) noch was aus seinem Hut ^^

Grüße,
Sascha

Ich meine du kannst einfach nur die Dateien vom Archiv zurückspielen, wenn du noch weißt welche ID das war.
Das könntest du sonst aus der alten Settings.json herausfinden.

Dann kannst du die Dateien soweit umbenennen, dass diese zur neuen ID passen. Das sollte meines Wissens nach funktionieren.

@Nall-chan weiß das bestimmt auch. :smiley:

Grüße,
Kai

Ich hatte mir sogar irgendwo ein Skript zusammen gezimmert (wirklich nur rudimentär) was die Jahre und Monate durchgeht und die Dateien umbenennt. Muss ich morgen mal suchen ob ich das noch finde.

Obwohl das sollte z.b. Total Commander mit mehrfach umbenennen auch können.

Wichtig sind die Daten aus dem Ordnern mit Jahr und Monat.
Steht auch hier genauere beschrieben:

Die Aggregationsdaten sind wurscht, die kann man im Archive Control neu erstellen lassen.

Edit: aber die ID der Variable muss man schon haben, sonst weiß man ja nicht welche Dateien aus einem Backup man braucht :wink:

Genau, so meinte ich das auch.

Grüße,
Kai

Mein Vorschlag wäre es auf einem Testsystem kurz das Backup einzuspielen. Dann per CSV Export die Daten der Variable extrahieren und die extrahierte Datei im Produktivsystem einspielen.

4 „Gefällt mir“

Hallo zusammen,

vielen Dank für eure Lösungsvorschläge.

Die ID weiß ich zum Glück noch ^^

@Nall-chan Wenn du den Code Schnipsel noch irgendwo hast, wäre das klasse :slight_smile:

Ansonsten wäre dass das zurückspielen vom Backup auf ein Testsystem mein zweiter Weg.

Liebe Grüße

Sascha

Ich empfehle auch das vorgehen über ein Testsystem…

Das Skript war sehr mit der heißen Nadel gestrickt.
Außerdem ist der Pfad zum lesen der Daten auch das Symcon DB Verzeichnis und kein externes Backup. Also entweder anpassen, oder die Dateien im db Ordner ablegen.

Auf eigene Gefahr:

<?php

$DryRun = true;     // true, nur Ausgabe ohne Aktionen, false => alles ausführen
$StartYear = 2012;  // Start Jahr
$StartMonth = 1;    // Start Monat im Start Jahr
$Factor = 1;        // 1 für Dateien kopieren, Sonst Faktor zum Umrechnen von Werten (z.B. 1000 oder 0.001 .
$VarId = 51596;     // VariablenID
$NewVarId = -1;     // -1 VariablenID bleibt unverändert, sonst 5 stellige ID
$Backup = true;

######### Ab hier nicht ändern ####################
$DbPfad = IPS_GetKernelDir().'db'.DIRECTORY_SEPARATOR;
$M = $StartMonth;
$Y = $StartYear;
$NewVarId = ($NewVarId == -1 ? $VarId : $NewVarId);
do {
    do {
        $FileBackup = $DbPfad.$Y.DIRECTORY_SEPARATOR.sprintf('%02d',$M).DIRECTORY_SEPARATOR.$VarId.'.old';
        $FileRead = $DbPfad.$Y.DIRECTORY_SEPARATOR.sprintf('%02d',$M).DIRECTORY_SEPARATOR.$VarId.'.csv';
        $FileWrite = $DbPfad.$Y.DIRECTORY_SEPARATOR.sprintf('%02d',$M).DIRECTORY_SEPARATOR.$NewVarId.'.csv';
        if (file_exists($FileRead)) {
            if (!$DryRun) {
                rename($FileRead, $FileBackup); // Backup erstellen mit .old -> Das wird auch gelesen oder kopiert
            }
            if ($Factor == 1){
                echo 'Copy: '.$FileRead.' -> '.$FileWrite.PHP_EOL;
                if (!$DryRun) {
                    copy($FileBackup, $FileWrite);
                }
            } else {
                echo 'Transfrom: '.$FileRead.' -> '.$FileWrite.PHP_EOL;
                if (!$DryRun) {
                    if (($write = fopen($FileWrite, "w")) === FALSE) {
                        die('ERROR');
                    };
                    if (($read = fopen($FileBackup, "r")) !== FALSE) {
                        while (($data = fgetcsv($read, 1000, ",")) !== FALSE) {
                            $data[1] = $data[1]*$Factor;
                            fputcsv($write,$data);
                        }
                        fclose($read);
                    }
                    fclose($write);
                }
            }
            if (!$Backup){
                echo 'Delete Backup: '.$FileBackup.PHP_EOL;
                if (!$DryRun) {
                    unlink($FileBackup);
                }
            }
        }
        $M++;
    } while($M<=12);
    $M=1;
    $Y++;
} while($Y<=2025);
echo "----------------------\r\n";
echo "done";

Dafür könnte man echt ein Modul bauen. :smiley:
Ach hätte ich mal mehr Zeit.

Grüße,
Kai

Bloß nicht. :rofl:
Mal eben an der Datenbank rumschrauben sollte wirklich die Ausnahme sein.

Ist doch toll, wenn jeder sein System zerstören kann. :smiley:

Grüße,
Kai

Vielen Dank für das Script :slight_smile:
Ja, ich setze mal ein Testsystem auf :slight_smile: Die Warnung war deutlich und ist angekommen :slight_smile:

Ganz lieben Gruß
Sascha