Neuigkeiten:

Am Sonntag den 8.12.2024 kann es ab ca. 8:00 Uhr zu kurzzeitigen Einschränkungen / Ausfällen bei den Diensten des FHEM Vereines kommen.
Die Server müssen mal gewartet und dabei neu gestartet werden ;)

Hauptmenü

FHEM-Config aus ConfigDB in privatem Git-Repo automatisiert einchecken

Begonnen von bstaeheli, 01 Juli 2024, 11:47:11

Vorheriges Thema - Nächstes Thema

bstaeheli

Hey ihr lieben

Da ich gerne eine bessere Übersicht der Konfigurationsänderungen haben wollte, bastelte ich mir ein DOIF welches bei jedem speichern der FHEM Konfiguration diese aus der ConfigDB exportiert, in einem Git-Repository pro Device eine eigene Datei erstellt, einen Commit ausführt und dieses auf ein externens Repository pusht.

Unsere Devices sind nach dem Muster GebäudeEbene.Zimmer.DeviceTyp.Beschreibung angelegt, daraus erstelle ich noch Unterordner. So habe ich alle Geräte eines Raumes in einem Ordner.

Du darfst diesen Dateianhang nicht ansehen.
Du darfst diesen Dateianhang nicht ansehen.

Vielleicht findet es jemand nützlich.

defmod NN.xx.DI.CommitFhemConfig DOIF ## TODO: Befehle nonblocking machen, mit set_Exec\
init {\
$_output_dir = 'fhem.cfg-git';;\
$_fhem_cfg_path = 'fhem.cfg';;\
}\
\
autoSave {\
if ([global:"SAVE"]) {\
x658576b2_exportFhemConfigFromConfigDB();;\
x658576b2_removeLastThreeLinesFromFhemConfig\
x658576b2_cleanOutputDir();;\
x658576b2_parseFhemConfig();;\
x658576b2_commitAndPushGitRepo();;\
}\
}\
\
parseFhemConfig {\
x658576b2_parseFhemConfig();;\
}\
\
subs {\
## Bereite das git Repo vor\
sub x658576b2_cleanOutputDir {\
system("rm -rf $_output_dir/*");;\
}\
\
sub x658576b2_commitAndPushGitRepo {\
my $now = ::TimeNow();;\
my $command = "cd $_output_dir;; "\
. "git add --all;; " \
. "git commit -m 'Triggered by FHEM config save ($now)';; " \
. "git push";; \
system("/bin/sh -c \"$command\" &");;\
}\
\
sub x658576b2_exportFhemConfigFromConfigDB {\
my $fhemcfg = fhem("configdb rawList");;\
open(FH, '>', $_fhem_cfg_path);;\
print FH $fhemcfg;;\
close(FH);;\
}\
\
sub x658576b2_removeLastThreeLinesFromFhemConfig {\
use Tie::File;;\
\
# Öffne die Datei und binde sie an das Array\
tie my @lines, 'Tie::File', $_fhem_cfg_path or die "Konnte die Datei nicht öffnen: $!";;\
\
# Lösche die letzten drei Zeilen\
splice @lines, -3;;\
\
# Schließe die Datei\
untie @lines;;\
}\
\
## Funktion zum Schreiben der Geräteinformationen\
sub x658576b2_write_device_info {\
use File::Path qw(make_path);;\
use experimental qw( switch );;\
\
my ($current_device) = @_;;\
\
my $deviceName = $current_device->{'name'};;\
\
my ($subfolder, $subfolder2) = $deviceName =~ /^(\w{2})\.(\w{2})\./;;\
        $subfolder //= '';;  # Wenn kein erster Unterordner gefunden wurde, setze auf leeren String\
        $subfolder2 //= '';;  # Wenn kein zweiter Unterordner gefunden wurde, setze auf leeren String\
\
if (! $subfolder) {\
given ($deviceName) {\
when (/^(\w{2})\./) { $subfolder = $1 }\
when (/^(Haus)\./)  { $subfolder = $1 }\
when (/^(rg|rr|rgr|rp)_/) { $subfolder = "Residents" }\
default { $subfolder = 'div' }\
}\
}\
\
if ($subfolder2) {\
$subfolder = "$subfolder/$subfolder2";;\
}\
\
my $output_path = "$_output_dir/$subfolder/$deviceName.cfg";;\
\
## Erstelle Verzeichnis, falls nicht vorhanden\
make_path("$_output_dir/$subfolder");;\
\
open my $out_fh, '>', $output_path or die "Konnte Datei nicht schreiben: $!";;\
print $out_fh join("\n", @{$current_device->{'lines'}}), "\n";;\
close $out_fh;;\
}\
\
sub x658576b2_parseFhemConfig { \
## Lese die FHEM-Konfigurationsdatei\
open my $fh, '<', $_fhem_cfg_path or die "Konnte Datei nicht öffnen: $!";;\
\
## Initialisiere Variablen\
my $current_device = { 'name' => 'global', 'lines' => [] };;\
\
## Iteriere über jede Zeile der Konfigurationsdatei\
while (my $line = <$fh>) {\
chomp $line;;\
\
## Überprüfe, ob die Zeile ein Gerät definiert\
if ($line =~ /^define\s+([^\s]+)\s+/) {\
my $device_name = $1;;\
\
## Wenn ein neues Gerät gefunden wurde, schreibe die Informationen des vorherigen in die Datei\
x658576b2_write_device_info($current_device);;\
\
## Setze das aktuelle Gerät\
$current_device = { 'name' => $device_name, 'lines' => [] };;\
}\
\
## Füge die Zeile zu den Geräteinformationen hinzu\
push @{$current_device->{'lines'}}, $line;;\
}\
\
## Schließe die Eingabedatei\
close $fh;;\
\
## Schreibe die letzten Geräteinformationen in die Datei\
x658576b2_write_device_info($current_device);;\
}\
\
}
attr NN.xx.DI.CommitFhemConfig room DEV